Go Down

Topic: Hoe kan ik uit de "while loop" komen? (Read 328 times) previous topic - next topic

EngineerStudent

Ik ben bezig met een projectje om een karretje met servo's voor en achteruit te laten lopen. Het probleem is echter dat ik mijn While niet meer uit kom. (Dik gedrukt)

Is er iemand die mij hier bij kan helpen?

Dit is mijn code:

const int mindelay = 200;  //wijzigen om de minimale snelheid aan te passen (hoe hoger hoe langzamer)  LET OP! dient lager te zijn dan maxdelay
const int maxdelay = 1000; //wijzigen om de minimale snelheid aan te passen (hoe hoger hoe langzamer)  LET OP! dient hoger te zijn dan mindelay
const int steppin = 3;
const int dirpin = 4;
const int forward = 5;
const int backward = 6;
const int estop = 7;
int potvalue = 0;

int Pin7 = 0;
int Pin6 = 0;
int Pin5 = 0;

void setup() {
  pinMode(steppin, OUTPUT);   //stapoutput drivers
  pinMode(dirpin, OUTPUT);    //draairichting
  pinMode(forward, INPUT);    //input PLC vooruit
  pinMode(backward, INPUT);   //input PLC achteruit
  pinMode(estop, INPUT);      //Noodstop
  pinMode(potvalue, INPUT);   //potmeter
  Serial.begin(9600);
 
}

void loop() {

Serial.println(" ");          // serial monitor nieuwe regel

Pin7 = digitalRead(7);        //uitlezen van pin 7
Serial.print("estop: ");      //serial monitor
Serial.println(Pin7);         //serial monitor
Pin6 = digitalRead(6);        //uitlezen van pin 6
Serial.print("backward: ");   //serial monitor
Serial.println(Pin6);         //serial monitor
Pin5 = digitalRead(5);        //uitlezen van pin 5
Serial.print("forward: ");    //serial monitor
Serial.println(Pin5);         //serial monitor

int Delay = map(potvalue, 0, 1023 , mindelay, maxdelay);  //verhouding mappen 0 = mindelay, 1023 = maxdelay
potvalue = analogRead(A0);                                //potmeter uitlezen
Serial.print("Delay: ");                                  //serial monitor
Serial.println(Delay);                                    //serial monitor
Serial.print("Potwaarde: ");                              //serial monitor
Serial.println(potvalue);                                 //serial monitor

 if (Pin5 == HIGH and Pin7 == HIGH and Pin6 == LOW){
    delay (1000);
    digitalWrite (dirpin, HIGH); //vooruit lopen
    Serial.println("Vooruit if");   //serial monitor
   
   
while (Pin5 == HIGH and Pin7 == HIGH and Pin6 == HIGH){
    digitalWrite(steppin, HIGH);
    delayMicroseconds (Delay);
    digitalWrite(steppin, LOW);
    delayMicroseconds (Delay);
     Serial.println("Vooruit");   //serial monitor
    if (Pin5 != 1 and Pin7 != 1 and Pin6 != 0) //does not work
      break;                                   //does not work
   

    }}
 

 else if (Pin5 == LOW and Pin7 == HIGH and Pin6 == HIGH){
    delay (1000);
    digitalWrite (dirpin, LOW);   //achteruit lopen
    Serial.println("Achteruit");  //serial monitor
   
  while (Pin5 == LOW and Pin7 == HIGH and Pin6 == HIGH){
    digitalWrite(steppin, HIGH);
    delayMicroseconds (Delay);
    digitalWrite(steppin, LOW);
    delayMicroseconds (Delay);
   
    }
    }
}

MAS3

#1
Jul 21, 2017, 04:12 pm Last Edit: Jul 21, 2017, 04:14 pm by MAS3
Hoi EngineerStudent, welkom.

Graag even de tijd nemen om de gebruiksaanwijzing (klik !) en de daarin genoemde links te lezen.
Je leert dan hoe je het best code plaatst, en ook waarom.
En andere tips over hoe het forum te gebruiken.

Gezien je naam, maakt dit deel uit van je studie.
Daarom zul je hier geen hapklare antwoorden en code krijgen, maar zal je geholpen worden om oplossingen te vinden.
Dat helpt je namelijk wel bij je studie.

Een while loop (of beter gezegd een trap/valkuil) is een slechte keuze en in dit geval lijkt me die niet echt nodig.
Een while is blokkerende code  en daarmee te vermijden wanneer maar enigszins mogelijk.

In zo'n while ga je iets doen zolang (==while) er aan een bepaalde voorwaarde word voldaan.
In jouw geval dus dat pin 5, 6 en 7 HIGH zijn.
Het stukje tussen de {} wat achter de while komt zal steeds in het geheel worden uitgevoerd, totdat aan die voorwaarde niet meer word voldaan.

Code: [Select]
if (Pin5 == HIGH and Pin7 == HIGH and Pin6 == LOW){
    delay (1000);
    digitalWrite (dirpin, HIGH); //vooruit lopen
    Serial.println("Vooruit if");   //serial monitor
   
   
while (Pin5 == HIGH and Pin7 == HIGH and Pin6 == HIGH){
    digitalWrite(steppin, HIGH);
    delayMicroseconds (Delay);
    digitalWrite(steppin, LOW);
    delayMicroseconds (Delay);
     Serial.println("Vooruit");   //serial monitor
    if (Pin5 != 1 and Pin7 != 1 and Pin6 != 0) //does not work
      break;                                   //does not work
   
    }}


Het gaat jou om dit stukje.
Jij zegt dat je de while niet uitkomt.
Hoe weet je dat ?
Zie je de hele tijd in je serial monitor "Vooruit" voorbij komen ?
Volgens mij is dat niet mogelijk.
Want je kunt alleen bij de while aankomen als pin 5 en 7 HIGH zijn, en pin 6 LOW is.
Vervolgens zet je dan pin4 in een andere stand, en gaat de while doen als pin 5,6 en 7 HIGH zijn.
Maar die zijn dat niet want dat had je net al gecontroleerd.
Daarmee zal nooit aan de voorwaarde voor de while voldaan worden.

Als je je code een heel klein beetje slimmer maakt, dan heb je heel die while niet nodig.
En de delays kunnen overigens ook veel minder als je dat doet.
Lees vooral ook mijn handtekening hieronder (of onder elk van mijn berichten).
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

EngineerStudent

Bedankt voor je uitgebreide reactie! ik zal de gebruiksaanwijzingen gelijk doornemen.

Deze opdracht maakt geen deel uit van mijn studie, op mijn bijbaan ben ik met een projectje bezig.

Zoals je aangaf lijkt het onmogelijk dat er te hele tijd "vooruit" voorbij komt in de serial monitor. dit is helaas wel het geval ook als hij niet meer aan de voorwaarden voldoet.

Heb je hier misschien een suggestie voor?

Zoals je waarschijnlijk wel gemerkt ben ik nog niet zo goed met het programmeren in Arduino. Hier probeer ik me de komende tijd wel meer in te gaan verdiepen zodat ik me ook op dit vakgebied uit de voeten kan komen. (WTB student...)

nicoverduin

Google eens op cursus arduino nederlands pdf
Er zwerft een pdf van het roc rond. Zeker voor de beginners
Met vriendelijke groet / kindest regards
Nico Verduin
www.verelec.nl
Do not PM me for personal consultancy unless you are willing to pay for it.

MAS3

Dan heb ik nog wel een andere tip.
Een and is een wiskundige handeling.
Is dat wat je hier probeert te bewerkstelligen ?

Maak maar een bookmark naar de reference page.
Die vind je door hierboven in de balk LEARNING aan te wijzen, en vervolgens op REFERENCE te klikken.
Dan zie je wat er fout gegaan is.

Over een tijdje leer je nog wel dat dat stukje ook nog een stuk korter kan (minder typewerk).
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

nee dat werrkt inderdaad niet want je vraagt de pinstatus niet op, dus hij blijft in deze while loop.
verder moet je kijken naar de plaats van alle {} en je break een if en niet de while.
hou het logisch en hou je aan 1 type programma.
daarnaast heeft mas ook gelijk met zijn voorwaarden.
als je pinnen test doe dan eerst een digitalread.
Daarnaast is het slim om eens naar blink without delay te kijken, dan reageert het allemaal een stuk sneller.
delay is namelijk ook blocking en dus staat je programma heel veel stil en zal niet reageren.

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

EngineerStudent

het is al weer een tijdje geleden, maar ik ben eruit gekomen.

Ik wil jullie allemaal bedanken voor jullie tijd en moeite! ik heb weer wat geleerd :)

Dit is hem uiteindelijk geworden:

Code: [Select]
const int mindelay = 800;  //wijzigen om de minimale snelheid aan te passen (hoe hoger hoe langzamer)  LET OP! dient lager te zijn dan maxdelay
const int maxdelay = 3200; //wijzigen om de minimale snelheid aan te passen (hoe hoger hoe langzamer)  LET OP! dient hoger te zijn dan mindelay

const int steppin = 3;
const int dirpin = 4;
const int dirpin2 = 2;
const int forward = 5;
const int backward = 6;
const int estop = 7;
int potvalue = 0;
int stapgrootte = 50;
int Estop = 0;
int Backward = 0;
int Forward = 0;
int x = 0;

void setup() {
  pinMode(steppin, OUTPUT);   //stapoutput drivers
  pinMode(dirpin, OUTPUT);    //draairichting
  pinMode(dirpin2, OUTPUT);   //draairichting motor 2
  pinMode(forward, INPUT);    //input PLC vooruit
  pinMode(backward, INPUT);   //input PLC achteruit
  pinMode(estop, INPUT);      //input PLC enable
  pinMode(potvalue, INPUT);   //potmeter
  Serial.begin(9600);
 
}

void loop() {

//Serial.println(" ");            // serial monitor nieuwe regel

Estop = digitalRead(estop);       //uitlezen van pin 7
//Serial.print("estop: ");        //serial monitor
//Serial.println(Estop);          //serial monitor
Backward = digitalRead(backward); //uitlezen van pin 6
//Serial.print("backward: ");     //serial monitor
//Serial.println(Backward);       //serial monitor
Forward = digitalRead(forward);   //uitlezen van pin 5
//Serial.print("forward: ");      //serial monitor
//Serial.println(Forward);        //serial monitor

int Delay = map(potvalue, 1023, 0 , mindelay, maxdelay);  //verhouding mappen 0 = mindelay, 1023 = maxdelay
potvalue = analogRead(A0);                                //potmeter uitlezen
//Serial.print("Delay: ");                                //serial monitor
//Serial.println(Delay);                                  //serial monitor
//Serial.print("Potwaarde: ");                            //serial monitor
//Serial.println(potvalue);                               //serial monitor

 if (Forward == HIGH && Estop == HIGH && Backward == LOW){
  x = 0;
  digitalWrite (dirpin, HIGH);    //vooruit lopen
  digitalWrite (dirpin2, LOW);    // vooruit lopen  motor 2
    while (x < stapgrootte){
    digitalWrite(steppin, HIGH);
    delayMicroseconds (Delay);
    digitalWrite(steppin, LOW);
    delayMicroseconds (Delay);
    //Serial.println("Vooruit");  //serial monitor
    x++;
    }}
 
 else if (Forward == LOW && Estop == HIGH && Backward == HIGH){
  x = 0;   
  digitalWrite (dirpin, LOW);     //achteruit lopen
   digitalWrite (dirpin2, HIGH);  // vooruit lopen  motor 2
    while (x < stapgrootte){
    digitalWrite(steppin, HIGH);
    delayMicroseconds (Delay);
    digitalWrite(steppin, LOW);
    delayMicroseconds (Delay);
    //Serial.println("A");        //serial monitor
    x++;
    }}
   
    //Serial.println(x);
}


Ik heb nog wel één vraag, de stappenmotoren hebben moeite met opgang komen. als ze eenmaal in beweging zijn draaien ze prima (en rijd de kar soepel). heeft er iemand een tip om het aanloopkoppel te verhogen?

Nogmaals bedankt!

nicoverduin

#7
Aug 07, 2017, 07:01 pm Last Edit: Aug 07, 2017, 07:02 pm by nicoverduin
Stoppen met wat je nu doet, een goede stepperdriver nemen en motordie een beetje power kan leveren, een ruime oversized voeding nemen en accel library gebruiken
Met vriendelijke groet / kindest regards
Nico Verduin
www.verelec.nl
Do not PM me for personal consultancy unless you are willing to pay for it.

Go Up