Void Cyclus Repeat

Arduino specifieke Software
Berichten: 23
Geregistreerd: 06 Dec 2016, 18:03

Void Cyclus Repeat

Berichtdoor Juullennaerts » 06 Dec 2016, 18:26

Beste Arduino gebruikers!!

Ik heb met 2 mede klasgenoten zitten op het Mechatronica leerjaar 4.
Nu zijn we ons project aan het programeren maar stuiten op een probleem.
Ik hoop dat jullie ons kunnen helpen, omdat de docent het niet kan oplossen(of wil oplossen):?

Als eerst de besturing:


cpp code
#include <Servo.h>

#include <Adafruit_NeoPixel.h>
#define PIN 10

Servo servoMain;
int wheels1high = 4;
int wheels1 = 5;
int wheels2 = 6;
int wheels2high = 7;
int doserenhigh = 8;
int doseren = 9;
Adafruit_NeoPixel strip = Adafruit_NeoPixel(60, PIN, NEO_GRB + NEO_KHZ800);

char command;


void setup(){

Serial.begin(9600);
servoMain.attach(10);

strip.begin();
strip.show(); // Initialize all pixels to 'off'

pinMode (wheels1high, OUTPUT);
pinMode (wheels1, OUTPUT);
pinMode (wheels2, OUTPUT);
pinMode (wheels2high, OUTPUT);
pinMode (doserenhigh, OUTPUT);
pinMode (doseren, OUTPUT);

}

void loop(){

if (Serial.available() > 0){
command = Serial.read();
Serial.write(command);

switch(command){



case 'W':
servo1()
break;
}
}
}





void wielen1(){

digitalWrite (wheels1high,HIGH);
analogWrite (wheels1, 200);
digitalWrite (wheels2high,HIGH);
analogWrite (wheels2, 200);
delay (2000);
digitalWrite (wheels1high,HIGH);
analogWrite (wheels1, 100);
digitalWrite (wheels2high,HIGH);
analogWrite (wheels2, 200);
delay (2000);

}

void wielen2(){

digitalWrite (wheels1high,HIGH);
analogWrite (wheels1, 100);
digitalWrite (wheels2high,HIGH);
analogWrite (wheels2, 200);
delay (2000);
digitalWrite (wheels1high,HIGH);
analogWrite (wheels1, 150);
digitalWrite (wheels2high,HIGH);
analogWrite (wheels2, 100);
delay (2000);

}

void wielen3(){

digitalWrite (wheels1high,HIGH);
analogWrite (wheels1, 250);
digitalWrite (wheels2high,HIGH);
analogWrite (wheels2, 250);
delay (2000);
digitalWrite (wheels1high,HIGH);
analogWrite (wheels1, 100);
digitalWrite (wheels2high,HIGH);
analogWrite (wheels2, 250);
delay (2000);

}

void wielen4(){

digitalWrite (wheels1high,HIGH);
analogWrite (wheels1, 150);
digitalWrite (wheels2high,HIGH);
analogWrite (wheels2, 100);
delay (2000);
digitalWrite (wheels1high,HIGH);
analogWrite (wheels1, 200);
digitalWrite (wheels2high,HIGH);
analogWrite (wheels2, 250);
delay (2000);

}

void servo1(){


servoMain.write(45); // Turn Servo Left to 45 degrees
delay(500); // Wait 1 second
servoMain.write(60); // Turn Servo Left to 0 degrees
delay(500); // Wait 1 second
servoMain.write(90); // Turn Servo back to center position (90 degrees)
delay(500); // Wait 1 second
servoMain.write(115); // Turn Servo Right to 135 degrees
delay(500); // Wait 1 second
servoMain.write(135); // Turn Servo Right to 180 degrees
delay(500); // Wait 1 second
servoMain.write(90); // Turn Servo back to center position (90 degrees)
delay(500); // Wait 1 second


}

void servo2(){

servoMain.write(45); // Turn Servo Left to 45 degrees
delay(500); // Wait 1 second
servoMain.write(60); // Turn Servo Left to 0 degrees
delay(500); // Wait 1 second
servoMain.write(90); // Turn Servo back to center position (90 degrees)
delay(500); // Wait 1 second
servoMain.write(115); // Turn Servo Right to 135 degrees
delay(500); // Wait 1 second
servoMain.write(135); // Turn Servo Right to 180 degrees
delay(500); // Wait 1 second
servoMain.write(90); // Turn Servo back to center position (90 degrees)
delay(500); // Wait 1 second

}

void servo3(){

servoMain.write(45); // Turn Servo Left to 45 degrees
delay(500); // Wait 1 second
servoMain.write(60); // Turn Servo Left to 0 degrees
delay(500); // Wait 1 second
servoMain.write(90); // Turn Servo back to center position (90 degrees)
delay(500); // Wait 1 second
servoMain.write(115); // Turn Servo Right to 135 degrees
delay(500); // Wait 1 second
servoMain.write(135); // Turn Servo Right to 180 degrees
delay(500); // Wait 1 second
servoMain.write(90); // Turn Servo back to center position (90 degrees)
delay(500); // Wait 1 second

}
void servo4(){

servoMain.write(45); // Turn Servo Left to 45 degrees
delay(500); // Wait 1 second
servoMain.write(60); // Turn Servo Left to 0 degrees
delay(500); // Wait 1 second
servoMain.write(90); // Turn Servo back to center position (90 degrees)
delay(500); // Wait 1 second
servoMain.write(115); // Turn Servo Right to 135 degrees
delay(500); // Wait 1 second
servoMain.write(135); // Turn Servo Right to 180 degrees
delay(500); // Wait 1 second
servoMain.write(90); // Turn Servo back to center position (90 degrees)
delay(500); // Wait 1 second

}

void doseren1(){

digitalWrite (doserenhigh,HIGH);
analogWrite (doseren, 10);
delay (2000);

}

void doseren2(){

digitalWrite (doserenhigh,HIGH);
analogWrite (doseren, 10);
delay (2000);

}

void doseren3(){

digitalWrite (doserenhigh,HIGH);
analogWrite (doseren, 10);
delay (2000);

}

void doseren4(){

digitalWrite (doserenhigh,HIGH);
analogWrite (doseren, 10);
delay (2000);

}


Zoals er u staat zal wanneer W hoog word het programma van servo1 draaien.
Echter het probleem is dat na 1 maal W hoog het programma ook maar 1 keer zijn cyclus maakt!
We willen dat na 1 maal W hoog het programma servo1 telkens in zijn cylcus blijft tot dat kleine w hoog word --> Kleine w hoog reset de groote W

Ik hoop dat jullie ons kunnen helpen!!!!

Advertisement

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Void Cyclus Repeat

Berichtdoor nicoverduin » 06 Dec 2016, 20:11

Ik geef jullie leraar groot gelijk. Het is de bedoeling van studenten (en zeker 4e jaars) om zelf ook wat onderzoek te doen. De fout zit hem hier:
cpp code
if (Serial.available() > 0){
command = Serial.read();
Serial.write(command);

switch(command){



case 'W':
servo1()
break;
}
}


Je stelt hier namelijk dat als er een toets is ingedrukt EN het blijkt een W te zijn dat je dus servo1 uitvoert. Je moet het probleem uit elkaar trekken. Je ontvangt toetsen en die leiden tot een commando. Dus waar je nu servo1() aan roept moet je bijvoorbeeld dit doen:
cpp code
case 'W':   
opdracht = DOE_SERVO_1
break;


waarbij je boven in het programma dit doet
cpp code
enum {
DOE_NIETS,
DOE_SERVO_1,
STOP_SERVO_1,
enz
};


En dan maak je een 2e switch case waarin je dus opdracht gaat aftesten

cpp code
switch case (opdracht) {
case DOE_NIETS:
//
// doe niets
//
break;

case DOE_SERVO_1:
servo_1();
break;

enz....

Jullie maken hier dus een denk fout. Enerzijds wacht je tot je iets ontvangt. Komt er niets binnen gebeurt er niets. Komt er wel iets binnen dan lees je dat teken (waardoor de leesbuffer weer leeg is) en verwerk je deze.
Je moet het vraagstuk dus splitsen in
a) verwerken van een ontvangen teken en deze vertalen naar een opdracht
b) verwerken van een opdracht in een servo beweging
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 4067
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Void Cyclus Repeat

Berichtdoor shooter » 06 Dec 2016, 23:29

nico heeft gelijk, en dat splitsen doe je door een } vlak voor de switch opdracht.
verder staat in servo 1 hetzelfde als in servo2 dus dat heeft geen zin, of je moet andere posities kiezen of nog een servo maar die moet je dan wel een andere naam geven.
maak verder een flowschema wat je wilt bereiken.
en denk nu al na over hoe je al die delays zult gaan weghalen, want ik weet zeker dat de leraar er iets van gaat zeggen dat de loop erg langzaam is.
je kunt nu geen nieuw commando geven als de oude nog loopt.
paul deelen
shooter@home.nl

Berichten: 23
Geregistreerd: 06 Dec 2016, 18:03

Re: Void Cyclus Repeat

Berichtdoor Juullennaerts » 07 Dec 2016, 00:21

Bedankt voor jullie reacties, dat waarderen we heel erg.
Het echt programeren van Arduino hebben we dit jaar pas gekregen daarom af toe de vraagtekens. Ik snap het principe en de werking van de programering die jullie formuleren.
De code taal is nog niet duidelijk. Hoe verwerk je de enum met de switchcase? De enum code is nog niet helemaal duidelijk.
Heel veel ervaring hebben we niet, ik hoop dat jullie ons kunnen helpen.

ps: waardes van de servo programmas worden nog aangepast:p

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Void Cyclus Repeat

Berichtdoor nicoverduin » 07 Dec 2016, 00:47

Juullennaerts schreef:Bedankt voor jullie reacties, dat waarderen we heel erg.
Het echt programeren van Arduino hebben we dit jaar pas gekregen daarom af toe de vraagtekens. Ik snap het principe en de werking van de programering die jullie formuleren.
De code taal is nog niet duidelijk. Hoe verwerk je de enum met de switchcase? De enum code is nog niet helemaal duidelijk.
Heel veel ervaring hebben we niet, ik hoop dat jullie ons kunnen helpen.

ps: waardes van de servo programmas worden nog aangepast:p
Wel eens van google gehoord? Vast wel en anders een goede reden om dat eens te ontdekken. FF beter beter jullie best doen lui......
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 23
Geregistreerd: 06 Dec 2016, 18:03

Re: Void Cyclus Repeat

Berichtdoor Juullennaerts » 07 Dec 2016, 10:38

Jaa we proberen het via Google te zoeken maar komen er niet uit.

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Void Cyclus Repeat

Berichtdoor nicoverduin » 07 Dec 2016, 12:54

En waar komen jullie dan niet uit?
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 23
Geregistreerd: 06 Dec 2016, 18:03

Re: Void Cyclus Repeat

Berichtdoor Juullennaerts » 07 Dec 2016, 14:32

We komen niet uit met de volgorde en codering.
We begrijpen niet hoe we het moeten verwerken in ons programma.
Het PSD,structuur principe snappen we alleen de opzet geeft vraagtekens.

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Void Cyclus Repeat

Berichtdoor Koepel » 07 Dec 2016, 15:55

Je kunt een aparte test sketch maken om het splitsen voor elkaar te krijgen. Het is normaal om een stuk of 5 test sketches te hebben tijdens een project.

Het gaat om het stukje waar nicoverduin schreef: "De fout zit hem hier".
Maak een een test-sketch die de inkomende data leest, dat verwerkt, en dat omzet naar een variabele voor een commando/opdracht. Dus alleen een kleine test-sketch die de seriële monitor gebruikt en niet de digitale uitgangen en niet de motors.

Als je het voor je probeert te zien en wat meer op je gevoel programmeert, dan is het misschien zo te omschrijven:
Via de seriële monitor komt van alles binnen, het is een stroom van data met misschien een 'W' of een 'w', maar ook alle andere tekens en zelfs CarriageReturn en LineFeed. Het is dus geen stroom van helder water maar meer een riool van bagger. Om daar een commando uit te filteren, dat is typisch iets voor een onbelangrijke lokale variabele. Als die hele stroom gefilterd is en er echt een commando uit komt, dan kan dat opgeslagen worden in een belangrijke variabele.
Op het moment dat je dit doet: "command = Serial.read();", dan laat je het hele riool door die ene variabele lopen, en die variabele is dan te vies om beet te pakken, yaggh! Wat nicoverduin voorstelde is een mooie glimmende variabele 'opdracht' die via de 'enum' ook nog eens zelf aangeeft wat er gebeurt.
P.S.: Als je 'enum' niet begrijpt, dan mag je ook een paar #define doen.

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Void Cyclus Repeat

Berichtdoor nicoverduin » 07 Dec 2016, 18:16

Juullennaerts schreef:Het PSD,structuur principe snappen we alleen de opzet geeft vraagtekens.

Dan ben ik toch wel benieuwd hoe jullie PSD eruit ziet. Zet hier maar eens een foto van neer.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Volgende

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 28 gasten