Go Down

Topic: 2 stappenmotors Without Delay (Read 1 time) previous topic - next topic

Nataschabakker

Goededag,

Na het lezen van vast gezette topic van MAS3 hierboven in ben ik aan het stoeien gegaan met millis ipv Delay, topic Blink Without Delay. In programma zelf ook aan spelen geweest en begrijp dat als bij voorbeeld led uit is dat x millis later led weer aan gaan en daarna weer uit ect ect.

Ook de topic Using Millis timing for beginners guide is een leuke topic en ook daar snap ik het een en ander wel. Maar nu probeer ik dat te gebruiken in mijn stappenmotor programma. Hierin is een msDelay nog in verwerkt en wil daar vanaf omdat ik beide motor tegelijk wil draaien, of kunnen draaien.

Deze stappen motors werken nu, zoals programma er nu uit ziet perfect, zowel aantal stappen, snelheid, ect (deze motors worden gebruikt voor miniatuur movinghead lichteffecten). Fotos zal ik een deze dagen even plaatsen voor het idee.

Je ziet tussen deze stappen de msDelay zitten met waarde van 50. Dat gaat prima.

Maar nu snap ik gewoon niet hoe ik dit moet vervangen met Millis. Ik vind het erg moeilijk, ook omdat de msDelay vaker voorkomt en niet alle msDelay hetzelfde zijn. Kan iemand mij hier in helpen?

De huidige goed werkende code met msDelay:


Code: [Select]

int Pin0 = 11; //Head/LED Motor
int Pin1 = 10; //Head/LED Motor
int Pin2 = 9; //Head/LED Motor
int Pin3 = 8; //Head/LED Motor

int Pin4 = 7; //Vork Motor
int Pin5 = 6; //Vork Motor
int Pin6 = 5; //Vork Motor
int Pin7 = 4; //Vork Motor

int msDelay1 = 50;
int msDelay2 = 60;
int msDelay3 = 90;

void setup(void)
{

  pinMode(Pin0, OUTPUT); //Output Head/LED motor pin
  pinMode(Pin1, OUTPUT); //Output Head/LED motor pin
  pinMode(Pin2, OUTPUT); //Output Head/LED motor pin
  pinMode(Pin3, OUTPUT); //Output Head/LED motor pin
  pinMode(Pin4, OUTPUT); //Output Vork Motor
  pinMode(Pin5, OUTPUT); //Output Vork Motor
  pinMode(Pin6, OUTPUT); //Output Vork Motor
  pinMode(Pin7, OUTPUT); //Output Vork Motor
}

void loop() {


  for (byte i = 0; i < 5; i++) //Head/LED Motor 300 graden met de klok mee draaien
    function1();

  for (byte i = 0; i < 5; i++) //Head/LED Motor 300 graden tegen de klok in draaien
    function2();

  for (byte i = 0; i < 5; i++) //Vork Motor 300 graden met de klok mee draaien
    function3();

  for (byte i = 0; i < 5; i++) //Vork Motor 300 graden tegen de klok in draaien
    function4();

}


void function1() //Head/LED Motor 300 graden met de klok mee draaien met delay waarde 50
{

  digitalWrite(Pin0, HIGH);
  digitalWrite(Pin1, LOW);
  digitalWrite(Pin2, LOW);
  digitalWrite(Pin3, LOW);
  delay(msDelay1);
  digitalWrite(Pin0, HIGH);
  digitalWrite(Pin1, HIGH);
  digitalWrite(Pin2, LOW);
  digitalWrite(Pin3, LOW);
  delay(msDelay1);
  digitalWrite(Pin0, LOW);
  digitalWrite(Pin1, HIGH);
  digitalWrite(Pin2, LOW);
  digitalWrite(Pin3, LOW);
  delay(msDelay1);
  digitalWrite(Pin0, LOW);
  digitalWrite(Pin1, HIGH);
  digitalWrite(Pin2, HIGH);
  digitalWrite(Pin3, LOW);
  delay(msDelay1);
  digitalWrite(Pin0, LOW);
  digitalWrite(Pin1, LOW);
  digitalWrite(Pin2, HIGH);
  digitalWrite(Pin3, LOW);
  delay(msDelay1);
  digitalWrite(Pin0, LOW);
  digitalWrite(Pin1, LOW);
  digitalWrite(Pin2, HIGH);
  digitalWrite(Pin3, HIGH);
  delay(msDelay1);
  digitalWrite(Pin0, LOW);
  digitalWrite(Pin1, LOW);
  digitalWrite(Pin2, LOW);
  digitalWrite(Pin3, HIGH);
  delay(msDelay1);
  digitalWrite(Pin0, HIGH);
  digitalWrite(Pin1, LOW);
  digitalWrite(Pin2, LOW);
  digitalWrite(Pin3, HIGH);
  delay(msDelay1);
}

void function2() //Head/LED Motor 300 graden tegen de klok in draaien met delay waarde 50
{
  digitalWrite(Pin0, LOW);
  digitalWrite(Pin1, LOW);
  digitalWrite(Pin2, LOW);
  digitalWrite(Pin3, HIGH);
  delay(msDelay1);
  digitalWrite(Pin0, LOW);
  digitalWrite(Pin1, LOW);
  digitalWrite(Pin2, HIGH);
  digitalWrite(Pin3, HIGH);
  delay(msDelay1);
  digitalWrite(Pin0, LOW);
  digitalWrite(Pin1, LOW);
  digitalWrite(Pin2, HIGH);
  digitalWrite(Pin3, LOW);
  delay(msDelay1);
  digitalWrite(Pin0, LOW);
  digitalWrite(Pin1, HIGH);
  digitalWrite(Pin2, HIGH);
  digitalWrite(Pin3, LOW);
  delay(msDelay1);
  digitalWrite(Pin0, LOW);
  digitalWrite(Pin1, HIGH);
  digitalWrite(Pin2, LOW);
  digitalWrite(Pin3, LOW);
  delay(msDelay1);
  digitalWrite(Pin0, HIGH);
  digitalWrite(Pin1, HIGH);
  digitalWrite(Pin2, LOW);
  digitalWrite(Pin3, LOW);
  delay(msDelay1);
  digitalWrite(Pin0, HIGH);
  digitalWrite(Pin1, LOW);
  digitalWrite(Pin2, LOW);
  digitalWrite(Pin3, LOW);
  delay(msDelay1);
  digitalWrite(Pin0, HIGH);
  digitalWrite(Pin1, LOW);
  digitalWrite(Pin2, LOW);
  digitalWrite(Pin3, HIGH);
  delay(msDelay1);
}


void function3() //Vork Motor 300 graden met de klok mee draaien met delay waarde 60
{
  digitalWrite(Pin4, HIGH);
  digitalWrite(Pin5, LOW);
  digitalWrite(Pin6, LOW);
  digitalWrite(Pin7, LOW);
  delay(msDelay2);
  digitalWrite(Pin4, HIGH);
  digitalWrite(Pin5, HIGH);
  digitalWrite(Pin6, LOW);
  digitalWrite(Pin7, LOW);
  delay(msDelay2);
  digitalWrite(Pin4, LOW);
  digitalWrite(Pin5, HIGH);
  digitalWrite(Pin6, LOW);
  digitalWrite(Pin7, LOW);
  delay(msDelay2);
  digitalWrite(Pin4, LOW);
  digitalWrite(Pin5, HIGH);
  digitalWrite(Pin6, HIGH);
  digitalWrite(Pin7, LOW);
  delay(msDelay2);
  digitalWrite(Pin4, LOW);
  digitalWrite(Pin5, LOW);
  digitalWrite(Pin6, HIGH);
  digitalWrite(Pin7, LOW);
  delay(msDelay2);
  digitalWrite(Pin4, LOW);
  digitalWrite(Pin5, LOW);
  digitalWrite(Pin6, HIGH);
  digitalWrite(Pin7, HIGH);
  delay(msDelay2);
  digitalWrite(Pin4, LOW);
  digitalWrite(Pin5, LOW);
  digitalWrite(Pin6, LOW);
  digitalWrite(Pin7, HIGH);
  delay(msDelay2);
  digitalWrite(Pin4, HIGH);
  digitalWrite(Pin5, LOW);
  digitalWrite(Pin6, LOW);
  digitalWrite(Pin7, HIGH);
  delay(msDelay2);
}

void function4() //Vork Motor 300 graden tegen de klok in draaien met delay waarde 90
{
  digitalWrite(Pin4, LOW);
  digitalWrite(Pin5, LOW);
  digitalWrite(Pin6, LOW);
  digitalWrite(Pin7, HIGH);
  delay(msDelay3);
  digitalWrite(Pin4, LOW);
  digitalWrite(Pin5, LOW);
  digitalWrite(Pin6, HIGH);
  digitalWrite(Pin7, HIGH);
  delay(msDelay3);
  digitalWrite(Pin4, LOW);
  digitalWrite(Pin5, LOW);
  digitalWrite(Pin6, HIGH);
  digitalWrite(Pin7, LOW);
  delay(msDelay3);
  digitalWrite(Pin4, LOW);
  digitalWrite(Pin5, HIGH);
  digitalWrite(Pin6, HIGH);
  digitalWrite(Pin7, LOW);
  delay(msDelay3);
  digitalWrite(Pin4, LOW);
  digitalWrite(Pin5, HIGH);
  digitalWrite(Pin6, LOW);
  digitalWrite(Pin7, LOW);
  delay(msDelay3);
  digitalWrite(Pin4, HIGH);
  digitalWrite(Pin5, HIGH);
  digitalWrite(Pin6, LOW);
  digitalWrite(Pin7, LOW);
  delay(msDelay3);
  digitalWrite(Pin4, HIGH);
  digitalWrite(Pin5, LOW);
  digitalWrite(Pin6, LOW);
  digitalWrite(Pin7, LOW);
  delay(msDelay3);
  digitalWrite(Pin4, HIGH);
  digitalWrite(Pin5, LOW);
  digitalWrite(Pin6, LOW);
  digitalWrite(Pin7, HIGH);
  delay(msDelay3);
}




Nataschabakker

Dan hier de code wat ik geprobeerd heb of denk te begrijpen hoe het plaatje eruit moet gaan zien maar hier loop ik dus stuk. Geen idee hoe ik dit moet aanpakken, iemand die mij kan corrigeren of beter skecth?

Code: [Select]


int Pin0 = 11; //Head/LED Motor
int Pin1 = 10; //Head/LED Motor
int Pin2 = 9; //Head/LED Motor
int Pin3 = 8; //Head/LED Motor

int Pin4 = 7; //Vork Motor
int Pin5 = 6; //Vork Motor
int Pin6 = 5; //Vork Motor
int Pin7 = 4; //Vork Motor

unsigned long startMillis; 
unsigned long currentMillis;
const unsigned long period1 = 50;  //de waarde van millisecondes
const unsigned long period2 = 60;  //de waarde van millisecondes
const unsigned long period3 = 90;  //de waarde van millisecondes
void setup(void)
{

  pinMode(Pin0, OUTPUT); //Output Head/LED motor pin
  pinMode(Pin1, OUTPUT); //Output Head/LED motor pin
  pinMode(Pin2, OUTPUT); //Output Head/LED motor pin
  pinMode(Pin3, OUTPUT); //Output Head/LED motor pin
  pinMode(Pin4, OUTPUT); //Output Vork Motor
  pinMode(Pin5, OUTPUT); //Output Vork Motor
  pinMode(Pin6, OUTPUT); //Output Vork Motor
  pinMode(Pin7, OUTPUT); //Output Vork Motor
  startMillis = millis();  //Start millis
}

void loop() {


  for (byte i = 0; i < 5; i++) //Head/LED Motor 300 graden met de klok mee draaien
    function1();

  for (byte i = 0; i < 5; i++) //Head/LED Motor 300 graden tegen de klok in draaien
    function2();

  for (byte i = 0; i < 5; i++) //Vork Motor 300 graden met de klok mee draaien
    function3();

  for (byte i = 0; i < 5; i++) //Vork Motor 300 graden tegen de klok in draaien
    function4();

}


void function1() //Head/LED Motor 300 graden met de klok mee draaien met delay waarde 50
{
  currentMillis = millis();  //Haal huidige tijd op
  digitalWrite(Pin0, HIGH);
  digitalWrite(Pin1, LOW);
  digitalWrite(Pin2, LOW);
  digitalWrite(Pin3, LOW);
  if (currentMillis - startMillis >= period1)  //Hier pauzeren, stoppen en doorgaan of....
  digitalWrite(Pin0, HIGH);
  digitalWrite(Pin1, HIGH);
  digitalWrite(Pin2, LOW);
  digitalWrite(Pin3, LOW);
  if (currentMillis - startMillis >= period1)  //Hier pauzeren, stoppen en doorgaan of....
  digitalWrite(Pin0, LOW);
  digitalWrite(Pin1, HIGH);
  digitalWrite(Pin2, LOW);
  digitalWrite(Pin3, LOW);
  if (currentMillis - startMillis >= period1)  //Hier pauzeren, stoppen en doorgaan of....
  digitalWrite(Pin0, LOW);
  digitalWrite(Pin1, HIGH);
  digitalWrite(Pin2, HIGH);
  digitalWrite(Pin3, LOW);
  if (currentMillis - startMillis >= period1)  //Hier pauzeren, stoppen en doorgaan of....
  digitalWrite(Pin0, LOW);
  digitalWrite(Pin1, LOW);
  digitalWrite(Pin2, HIGH);
  digitalWrite(Pin3, LOW);
  if (currentMillis - startMillis >= period1)  //Hier pauzeren, stoppen en doorgaan of....
  digitalWrite(Pin0, LOW);
  digitalWrite(Pin1, LOW);
  digitalWrite(Pin2, HIGH);
  digitalWrite(Pin3, HIGH);
  if (currentMillis - startMillis >= period1)  //Hier pauzeren, stoppen en doorgaan of....
  digitalWrite(Pin0, LOW);
  digitalWrite(Pin1, LOW);
  digitalWrite(Pin2, LOW);
  digitalWrite(Pin3, HIGH);
  if (currentMillis - startMillis >= period1)  //Hier pauzeren, stoppen en doorgaan of....
  digitalWrite(Pin0, HIGH);
  digitalWrite(Pin1, LOW);
  digitalWrite(Pin2, LOW);
  digitalWrite(Pin3, HIGH);
  if (currentMillis - startMillis >= period1)  //Hier pauzeren, stoppen en doorgaan of....
}

void function2() //Head/LED Motor 300 graden tegen de klok in draaien met delay waarde 50
{
  digitalWrite(Pin0, LOW);
  digitalWrite(Pin1, LOW);
  digitalWrite(Pin2, LOW);
  digitalWrite(Pin3, HIGH);
  if (currentMillis - startMillis >= period1)  //Hier pauzeren, stoppen en doorgaan of....
  digitalWrite(Pin0, LOW);
  digitalWrite(Pin1, LOW);
  digitalWrite(Pin2, HIGH);
  digitalWrite(Pin3, HIGH);
  if (currentMillis - startMillis >= period1)  //Hier pauzeren, stoppen en doorgaan of....
  digitalWrite(Pin0, LOW);
  digitalWrite(Pin1, LOW);
  digitalWrite(Pin2, HIGH);
  digitalWrite(Pin3, LOW);
  if (currentMillis - startMillis >= period1)  //Hier pauzeren, stoppen en doorgaan of....
  digitalWrite(Pin0, LOW);
  digitalWrite(Pin1, HIGH);
  digitalWrite(Pin2, HIGH);
  digitalWrite(Pin3, LOW);
  if (currentMillis - startMillis >= period1)  //Hier pauzeren, stoppen en doorgaan of....
  digitalWrite(Pin0, LOW);
  digitalWrite(Pin1, HIGH);
  digitalWrite(Pin2, LOW);
  digitalWrite(Pin3, LOW);
  if (currentMillis - startMillis >= period1)  //Hier pauzeren, stoppen en doorgaan of....
  digitalWrite(Pin0, HIGH);
  digitalWrite(Pin1, HIGH);
  digitalWrite(Pin2, LOW);
  digitalWrite(Pin3, LOW);
  if (currentMillis - startMillis >= period1)  //Hier pauzeren, stoppen en doorgaan of....
  digitalWrite(Pin0, HIGH);
  digitalWrite(Pin1, LOW);
  digitalWrite(Pin2, LOW);
  digitalWrite(Pin3, LOW);
  if (currentMillis - startMillis >= period1)  //Hier pauzeren, stoppen en doorgaan of....
  digitalWrite(Pin0, HIGH);
  digitalWrite(Pin1, LOW);
  digitalWrite(Pin2, LOW);
  digitalWrite(Pin3, HIGH);
  if (currentMillis - startMillis >= period1)  //Hier pauzeren, stoppen en doorgaan of....
}


void function3() //Vork Motor 300 graden met de klok mee draaien met delay waarde 60
{
  digitalWrite(Pin4, HIGH);
  digitalWrite(Pin5, LOW);
  digitalWrite(Pin6, LOW);
  digitalWrite(Pin7, LOW);
  if (currentMillis - startMillis >= period2)  //Hier pauzeren, stoppen en doorgaan of....
  digitalWrite(Pin4, HIGH);
  digitalWrite(Pin5, HIGH);
  digitalWrite(Pin6, LOW);
  digitalWrite(Pin7, LOW);
  if (currentMillis - startMillis >= period2)  //Hier pauzeren, stoppen en doorgaan of....
  digitalWrite(Pin4, LOW);
  digitalWrite(Pin5, HIGH);
  digitalWrite(Pin6, LOW);
  digitalWrite(Pin7, LOW);
  if (currentMillis - startMillis >= period2)  //Hier pauzeren, stoppen en doorgaan of....
  digitalWrite(Pin4, LOW);
  digitalWrite(Pin5, HIGH);
  digitalWrite(Pin6, HIGH);
  digitalWrite(Pin7, LOW);
  if (currentMillis - startMillis >= period2)  //Hier pauzeren, stoppen en doorgaan of....
  digitalWrite(Pin4, LOW);
  digitalWrite(Pin5, LOW);
  digitalWrite(Pin6, HIGH);
  digitalWrite(Pin7, LOW);
  if (currentMillis - startMillis >= period2)  //Hier pauzeren, stoppen en doorgaan of....
  digitalWrite(Pin4, LOW);
  digitalWrite(Pin5, LOW);
  digitalWrite(Pin6, HIGH);
  digitalWrite(Pin7, HIGH);
  if (currentMillis - startMillis >= period2)  //Hier pauzeren, stoppen en doorgaan of....
  digitalWrite(Pin4, LOW);
  digitalWrite(Pin5, LOW);
  digitalWrite(Pin6, LOW);
  digitalWrite(Pin7, HIGH);
  if (currentMillis - startMillis >= period2)  //Hier pauzeren, stoppen en doorgaan of....
  digitalWrite(Pin4, HIGH);
  digitalWrite(Pin5, LOW);
  digitalWrite(Pin6, LOW);
  digitalWrite(Pin7, HIGH);
  if (currentMillis - startMillis >= period2)  //Hier pauzeren, stoppen en doorgaan of....
}

void function4() //Vork Motor 300 graden tegen de klok in draaien met delay waarde 90
{
  digitalWrite(Pin4, LOW);
  digitalWrite(Pin5, LOW);
  digitalWrite(Pin6, LOW);
  digitalWrite(Pin7, HIGH);
  if (currentMillis - startMillis >= period3)  //Hier pauzeren, stoppen en doorgaan of....
  digitalWrite(Pin4, LOW);
  digitalWrite(Pin5, LOW);
  digitalWrite(Pin6, HIGH);
  digitalWrite(Pin7, HIGH);
  if (currentMillis - startMillis >= period3)  //Hier pauzeren, stoppen en doorgaan of....
  digitalWrite(Pin4, LOW);
  digitalWrite(Pin5, LOW);
  digitalWrite(Pin6, HIGH);
  digitalWrite(Pin7, LOW);
  if (currentMillis - startMillis >= period3)  //Hier pauzeren, stoppen en doorgaan of....
  digitalWrite(Pin4, LOW);
  digitalWrite(Pin5, HIGH);
  digitalWrite(Pin6, HIGH);
  digitalWrite(Pin7, LOW);
  if (currentMillis - startMillis >= period3)  //Hier pauzeren, stoppen en doorgaan of....
  digitalWrite(Pin4, LOW);
  digitalWrite(Pin5, HIGH);
  digitalWrite(Pin6, LOW);
  digitalWrite(Pin7, LOW);
  if (currentMillis - startMillis >= period3)  //Hier pauzeren, stoppen en doorgaan of....
  digitalWrite(Pin4, HIGH);
  digitalWrite(Pin5, HIGH);
  digitalWrite(Pin6, LOW);
  digitalWrite(Pin7, LOW);
  if (currentMillis - startMillis >= period3)  //Hier pauzeren, stoppen en doorgaan of....
  digitalWrite(Pin4, HIGH);
  digitalWrite(Pin5, LOW);
  digitalWrite(Pin6, LOW);
  digitalWrite(Pin7, LOW);
  if (currentMillis - startMillis >= period3)  //Hier pauzeren, stoppen en doorgaan of....
  digitalWrite(Pin4, HIGH);
  digitalWrite(Pin5, LOW);
  digitalWrite(Pin6, LOW);
  digitalWrite(Pin7, HIGH);
  if (currentMillis - startMillis >= period3)  //Hier pauzeren, stoppen en doorgaan of....
}




MAS3

Hoi.

In het stukje dat ik er over geschreven heb, staat ook vermeld dat er uitzonderingen zijn waardoor delay() toch de betere keuze zou kunnen zijn.

De vraag hier is nu, of je weet waarom die delay() daar staat.
Want als je dat weet, dan kun je gaan bedenken of die (voor jouw toepassing) ook noodzakelijk is.

Daarom dus:
De motor is een stuk mechaniek dat in beweging moet komen, en dat kost tijd.
Geef je 'm die tijd niet, dan kan de beweging niet tot stand komen en kun je ook niet al beginnen met het zetten van de volgende stap.

Het voorbeeld Blink Without delay() heeft meer diepte dan alleen het voorkomen van de delay() die blokkerend is, en die diepte zit 'm er in dat je om hier mee weg te komen, meer moet gaan bijhouden.
Ook dat staat in het stukje kort vermeld.
In dit geval moet je je afvragen of, wanneer je motor in beweging komt, die beweging koste wat kost afgemaakt moet worden voor er iets anders gebeurt.
Want dat doe je namelijk in de 1e sketch hier boven.
Er wordt niet 1 stap gezet bij het aanroepen van de functie, maar er worden 8 stappen gezet door je motor.
En daar zit dus het blokkerende stuk code; wanneer je naar die functie gaat, ben je  dus zo'n 128.000 potentiële processor handelingen kwijt.
En als je er zo naar kijkt, dan is dat nogal wat.

Jouw uitdaging is nu dat je het niet zo moet (of kunt) oplossen als je het nu geprobeerd hebt.
Wanneer je dit zo wil doen, dan moet je elke stap apart zetten en dus niet in 1 keer een fase met 8 stappen laten doorlopen.
Dus moet je gaan bijhouden welke stap je gezet hebt, en hoeveel fasen je wil doorlopen.
Zo'n fase is dus wat je nu per keer doet als je de functie aanroept, en het betekent dat je dan je functie per iteratie van loop 8 keer moet aanroepen.
Vervolgens moet je heel vaak in je sketch naar die functie gaan.
Dat betekent dat je de functie moet gaan uitbreiden, en mogelijk het aanroepen van de functie ook.
Daarmee zet je een stapje hoger in je coding skills.


Code: [Select]

void loop() {


  for (byte i = 0; i < 5; i++) //Head/LED Motor 300 graden met de klok mee draaien
    function1();

  for (byte i = 0; i < 5; i++) //Head/LED Motor 300 graden tegen de klok in draaien
    function2();

  for (byte i = 0; i < 5; i++) //Vork Motor 300 graden met de klok mee draaien
    function3();

  for (byte i = 0; i < 5; i++) //Vork Motor 300 graden tegen de klok in draaien
    function4();

}


Dit is de loop uit de 1e post, maar in de 2e is die identiek.
Daar zitten meerdere problemen in.
Alleen al omdat het een voorbeeld sketch is, want doet doet niets anders als wat motoren laten draaien.
Maar we gaan er eens wat verder naar kijken.

1e  probleem is voor de IDE/compiler geen probleem, maar voor iemand die de code wil lezen mogelijk wel.
Want de for loops beslaan 2 regels op het scherm, maar niet voor de compiler (vanwege de positie van de ; puntkomma.
Dat zou ik niet doen, zodat ik het zelf ook beter kan lezen als ik er veel later nog eens naar zou kijken.


Je doet eigenlijk 4 keer hetzelfde, met telkens een relatief kleine wijziging.
Per keer doe je dan weer 5 keer exact hetzelfde.
De manier waarop je dat doet is een probleem.
Want je sluit jezelf telkens even op; een for.. loop is ook blokkerende code (!).
En met die blokkerende code roep je dus telkens blokkerende code op.

Ik ga nu een stukje pseudo code laten zien die duidelijk moet maken hoe je dit kunt doen zonder te blokkeren.

Code: [Select]

void loop() {


  byte i = 0;                        //Head/LED Motor 300 graden met de klok mee draaien
    function1();
    i ++;
    Pak de fluitketel;
    function1();
    Zet de kraan open;
    function1();
    Vul de fluitketel;
    function1();
    Zet de fluitketel op het fornuis;
    function1();                     // We hebben nu de functie ook 5 keer aangeroepen
    i = 0;                              //Head/LED Motor 300 graden tegen de klok in draaien
    function2();
    Zet het fornuis aan;
    function2();
    Pak de koffie pot;
    function2();
    Pak de koffie filter;
    function2();
    Doe de filter op de pot;
    function2();
    Pak de koffie;
    i = 0;                              //We hebben functie 2 nu 5 keer aangeroepen
    function3();
    Doe de koffie in het filter;
    function3();
    Giet het inmiddels kokende water in het filter;
    function3();
    Giet nog een keer water in het filter;   // Ik lust wel 2 kopjes koffie zometeen
    function3();
    Koffie is doorgelopen, haal de filter er af;
    function3();
    Pak de kopjes, schoteltjes en meer van dat spul;
    i = 0;                               // Functie 3 is alweer 5 keer uitgevoerd

}


Ik heb ineens zin in koffie, maar het is allang voorbij mijn bedtijd dus dat gaan we niet doen.

Maar ik hoop dat het een voorbeeldje is voor hoe je dit ongeveer ook kunt aanpakken maar dan in het geheel zonder blokkerende code, en dus zo efficiënt mogelijk.
Uiteraard is bovenstaande pseudo code nog helemaal niet meest efficiënt.
Maar er moet wel een beetje een uitdaging over blijven, niet ?
Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

MAS3

Hoi Nataschabakker

Kun je wat met mijn vorige antwoord ?
Snap je wat ik wilde over brengen ?
Zo niet dan stel gerust je verdere vragen hoor.
Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

shooter

micros() kun je hetzelfde mee doen als met millis(), maar millis is snel genoeg voor een stappenmotor, 1000 stappen /seconde is te snel voor de meeste motoren.

paul deelen
shooter@home.nl
making controls with codesys PLC and arduino

Nataschabakker

Beste,

Het duurde even maar eerlijk gezegd kom ik er niet zo goed uit. Ik begrijp wat je bedoel met het steeds weer zelfde aanroepen, het mooie koffie voorbeeld, je krijgt er inderdaad trek in meerdere bakjes koffie.

Maar snap niet precies hoe ik dit moet gaan implanteren in de sketch om zo maar even te noemen, sorry maar ik krijg er gewoon geen grip op. Ben ook iemand die meer bouwt en elektronica erbij doet maar we proberen, waar een wil is is een weg.

Misschien komt het ook wel om dat ik verder denk dat waar ik me hoofd moet bij houden, bij de uitleg, omdat ik nog niet precies weet wat het gaat doen, ik bedoel daarmee wat de movingheads uit eindelijk gaan doen.

Voor mij zelf moet het namelijk simpel leesbaar zijn, stap voor stap, en nodig makkelijk aan te passen.
Bijvoorbeeld de vork motor, deze heb ik inmiddels draaiend, simpel van links naar recht en weer terug, zie hier en filmpje

http://tst.webcentre.nl/movinghead/robo.mov

Dat gaat goed, maar gaat continue door, het mooie zou zijn dan hij bijvoorbeeld dit 6 keer doet, na 6 x moet hij stoppen in het midden, dan moet de led kleur verander in geel (er zit ein adressed digtitale led in neopixel), hier ben ik meer in thuis, geef hem de opdracht mee:

   strip.setPixelColor(0, 255, 0, 0);

Dan zou andere motor de behuizing waar de led in zit, naar boven moeten draaien en stoppen, vervolgens weer aantal keren links en recht draaien.

Vervolgens na 4 keer dit gedaan te hebben, veranderen naar witte kleur en zak dan weer naar beneden met de head zelf, ga dan nu 10 keer links en rechts om. Dit is even als voorbeeld hoor, dit weet ik pas exact als alles draait, dan is het per stap aan te passen wat mooiste resultaat geeft. Deze licht effecten doen in echt ook vele stappen en onverwachts bewegingen, dat maakt het ook wel weer complex

Het is uiteindelijk werken met stappen en 2 motors die niet helemaal in de rondte mogen en een digitale led.

Zag ook een rbd timer.h libray, misschien is dat een beter en duidelijker iets? Met milles werken is echt moeilijk voor me.




De sketch die ik nu even als test gebruik om de vorkmotor en led te testen is deze:

Code: [Select]

// Deze motor instelling is voor de vorkmotor
// werkt prima maar gaat steeds links naar rechts
////////////////////////////////////////////////

#include <Adafruit_NeoPixel.h>
#define PIN 12
#define NUM_LEDS 1
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, PIN, NEO_GRB + NEO_KHZ800);

//declare variables for the motor pins
int motorPin1 = 4;    // Blue   - 28BYJ48 pin 1
int motorPin2 = 5;    // Pink   - 28BYJ48 pin 2
int motorPin3 = 6;    // Yellow - 28BYJ48 pin 3
int motorPin4 = 7;    // Orange - 28BYJ48 pin 4
                        // Red    - 28BYJ48 pin 5 (VCC)
 
int motorSpeed = 1000;  //variable to set stepper speed
int count = 0;          // count of steps made
int countsperrev = 250; // number of steps per full revolution
int lookup[8] = {B01000, B01100, B00100, B00110, B00010, B00011, B00001, B01001};
 
//////////////////////////////////////////////////////////////////////////////
void setup() {
  //declare the motor pins as outputs
  pinMode(motorPin1, OUTPUT);
  pinMode(motorPin2, OUTPUT);
  pinMode(motorPin3, OUTPUT);
  pinMode(motorPin4, OUTPUT);
  Serial.begin(9600);
  strip.begin();
  strip.show();
}
 
//////////////////////////////////////////////////////////////////////////////
void loop(){
  if(count < countsperrev )
    clockwise();
  else if (count == countsperrev * 2)
    count = 0;
  else
    anticlockwise();
  count++;
}
 
//////////////////////////////////////////////////////////////////////////////
//set pins to ULN2003 high in sequence from 1 to 4
//delay "motorSpeed" between each pin setting (to determine speed)
void anticlockwise()
{
  for(int i = 0; i < 8; i++)
  {
    setOutput(i);
    delayMicroseconds(motorSpeed);
    strip.setPixelColor(0, 0, 255, 255);
    strip.show();
  }
}
 
void clockwise()
{
  for(int i = 7; i >= 0; i--)
  {
    setOutput(i);
    delayMicroseconds(motorSpeed);
    strip.setPixelColor(0, 255, 0, 0);
    strip.show();
  }
}
 
void setOutput(int out)
{
  digitalWrite(motorPin1, bitRead(lookup[out], 0));
  digitalWrite(motorPin2, bitRead(lookup[out], 1));
  digitalWrite(motorPin3, bitRead(lookup[out], 2));
  digitalWrite(motorPin4, bitRead(lookup[out], 3));
}


Hierboven zie je de code die je werkend ziet in het filmpje (led in het filmpje brand hier niet, was tijdens filmen nog niet aangesloten maar werkt wel) deze verander van ene kleur naar de andere, puur om te spelen met de code en movingheads van wat doe je nu en wat gebeurd er.

Zal een deze dagen een filmpje maken met de headmotor waar de led in zet, puur om even een idee te geven wat deze doet en voor belangstellende, deze headmotor heeft de code waar de topic mee starten, is dus anders dan deze standaard motor die we in het filmpje zien.

Hoop dat ik het een beetje duidelijk uitleg, als er vragen zijn dan hoor ik ze graag.




MAS3

Als ik je bericht lees, dan denk ik:
Die springt van de hak op de tak.

En das dus een beetje je probleem.
Je hebt vast al vaker gelezen dat je het best je problemen in je project opschrijft, en die problemen dan stuk voor stuk gaat onderverdelen in deelproblemen.
En als je dan dan vaak genoeg gedaan hebt, dat je dan ineens helemaal geen echte problemen hebt maar alleen oplossingen.

Maar dat vergt wel wat discipline.
Want je moet niet tijdens het werken (in kleine stukje hakken dus) aan 1 probleem, alvast vooruit gaan zitten denken aan het probleem dat daarna komt.
En het probleem met het probleem van het het daar weer na komende probleem.
Want dan ben je dus je huidige probleem alweer verloren en maak je het jezelf veel te moeilijk.

Als je je sketch zo schrijft dat ie iets oneindig blijft doen, dan gaat ie dat dus ook doen.
Als je wil dat ie na 6 keer in het midden stopt, dan moet je dat stukje van je wens eens gaan ontleden.
Want na zes keer in het midden stoppen, betekent dat dat ie vijf en een half maal moet bewegen, of zes en een half ?

En hoe ga je dan het midden bereiken ?
Das dus een geheel andere vraag maar die moet je dus in stukjes gaan hakken door er meerdere vragen van te maken waarvan de uiteindelijke gezamenlijke antwoorden, de oplossing van je vraagstuk zullen zijn

Het beperken tot een X aantal slagen, is niets anders als wat je in je sketch al doet.
Want in je sketch doorloop je een aantal van wat ik eerder een 'fase' noemde.
Dat kun je dus vaker zo doen.
Maar zoals ik ook eerder al vermeld had, hoe je dat nu precies doet, is ook met blokkerende code en dat willen we eigenlijk voorkomen.
Maar denk eerst maar eens zien dat je het überhaupt zo kan laten werken als jij in gedachten hebt.
En dan later verfijnen zodat het zonder onnodig tijd verspillen gaat.

In je sketch stuur je de neopixel erg vaak aan met hetzelfde commando, is dat de bedoeling ?
Door dat te doen, creëer je wel een stukje vertraging zonder dat je tijd verspilt maar dat word dan weer vooraf gegaan door wel tijd te verspillen...

Het uiteindelijk bepalen van je commando's is een kwestie van een serie getallen en ander commando's in een lijst sturen of zetten.
Daarmee maak je het jezelf dus het gemakkelijkst voor wat betreft het aanpassen van het programma voor je spots, denk ik.
Maar het vergt wel een stukkie meer programmeer werk in je sketch.
En natuurlijk is dat te doen, maar ik ga niet zeggen dat het een makkie is.


Overigens, dat is niet hoe je een gele kleur uit je neopixel krijgt.
Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

Nataschabakker

Oke, bedankt voor je reactie.
Zal me het komende weekend weer eens in verdiepen.
en stuk voor stuk een probleem vast pakken.

Go Up