Zuerst schließen wir nach der Anleitung die Motoren an.
int motor1_A=11; int motor1_B=10; int motor1_enable=9; int motor2_A=5; int motor2_B=6; int motor2_enable=3; int v= 200; void setup(){ pinMode(motor1_A,OUTPUT); pinMode(motor1_B,OUTPUT); pinMode(motor1_enable, OUTPUT); pinMode(motor2_A,OUTPUT); pinMode(motor2_B,OUTPUT); pinMode(motor2_enable, OUTPUT); } void loop(){ digitalWrite(motor1_A,LOW); digitalWrite(motor1_B,HIGH); analogWrite(motor1_enable,v); digitalWrite(motor2_A,HIGH); digitalWrite(motor2_B,LOW); analogWrite(motor2_enable,v); delay(1000); }
Teste deine Moteren mit Hilfe des vorgegebenen Quelltextes.
Schließe zuerst einen Lichtsensor an. Nimm untenstehenden Quelltext und teste deinen Lichtsensor. Drehe am Rad und notiere deine Werte für hell bzw. dunkel. Ändere im Quelltext die Werte für HellDunkelSchranke
und d
entsprechend ab.
Welche Bedeutung hat der Wert d
?
int LS_Motor1 = A5; // Analoger EingansPIN int HellDunkelSchranke = 500; // hell hoher Wert int d = 10; // int a1=0; // Messwert des Lichtsensors int Status1=0; // heller oder weißer Bereich int Differenz =0; void setup(){ Serial.begin(9600); } void loop(){ // Helligkeitswerte der Kreischscheibe auslesen a1 = analogRead(LS_Motor1); //Motor 1 if((a1 > HellDunkelSchranke + d) && (Status1 == 0)){ Differenz++; Status1=1;} if((a1 < HellDunkelSchranke - d) && (Status1 == 1)){ Differenz++; Status1=0;} Serial.print(a1); Serial.print(" "); Serial.print(Differenz); Serial.print(" "); Serial.print(Status1); Serial.println(" "); }
Funktioniert der Lichtsensor, so teste genauso auch den zweiten Lichtsensor. Ändere den Quelltext so ab, dass beide Lichtsensor ihre Messwerte über die serielle Schnittstelle ausgeben.
Nimm das folgende Quellprogramm.
int motor1_A=11; int motor1_B=10; int motor1=9; int motor2_A=5; int motor2_B=6; int motor2=3; int LS_Motor1 = A5; int LS_Motor2 = A0; int v= 200; //Standardgeschwindigkeit int HellDunkelSchranke = 500; // hell hoher Wert int d = 10; int a1=0; int a2=0; String Feld1="weiss"; String Feld2="weiss"; int Drehung1=0; int Drehung2=0; void setup(){ pinMode(motor1_A,OUTPUT); pinMode(motor1_B,OUTPUT); pinMode(motor1, OUTPUT); pinMode(motor2_A,OUTPUT); pinMode(motor2_B,OUTPUT); pinMode(motor2, OUTPUT); } void loop(){ // Helligkeitswerte der Kreischscheibe auslesen a1 = analogRead(LS_Motor1); a2 = analogRead(LS_Motor2); //Motor 1 if((a1 > HellDunkelSchranke + d) && (Feld1 == "schwarz")){ Drehung1++; Feld1="weiss";} if((a1 < HellDunkelSchranke - d) && (Feld1 == "weiss")){ Drehung1++; Feld1="schwarz";} // Motor 2 if((a2 > HellDunkelSchranke + d) && (Feld2 == "schwarz")){ Drehung2++; Feld2="weiss";} if((a2 < HellDunkelSchranke - d) && (Feld2 == "weiss")){ Drehung2++; Feld2="schwarz";} digitalWrite(motor1_A,LOW); digitalWrite(motor1_B,HIGH); digitalWrite(motor2_A,HIGH); digitalWrite(motor2_B,LOW); analogWrite(motor1,v); analogWrite(motor2,v); }
Zum Synchronisieren der Motoren muss man sich die Anzahl der Umdrehungen, bzw. die Differenz zwischen den Hell/Dunkelwechsel der beiden Motoren anzeigen lassen. Optimalerweise ist die Differenz 0, d.h. beide Motoren drehen sich gleich schnell. Zur Regulierung läßt man den schnelleren Motor langsamer und den langsameren Motor schneller drehen.
int motor1_A=11; int motor1_B=10; int motor1=9; int motor2_A=5; int motor2_B=6; int motor2=3; int LS_Motor1 = A5; int LS_Motor2 = A0; int v= 200; //Standardgeschwindigkeit int HellDunkelSchranke = 500; // hell hoher Wert int HellDunkelSchlauch = 10; int a1=0; int a2=0; String Status1="w"; String Status2="w"; int AnzahlWechsel1 =0; int AnzahlWechsel2 = 0; int Differenz=0; void setup(){ pinMode(motor1_A,OUTPUT); pinMode(motor1_B,OUTPUT); pinMode(motor1, OUTPUT); pinMode(motor2_A,OUTPUT); pinMode(motor2_B,OUTPUT); pinMode(motor2, OUTPUT); Serial.begin(9600); } void loop(){ // Helligkeitswerte der Kreischscheibe auslesen a1 = analogRead(LS_Motor1); a2 = analogRead(LS_Motor2); //Motor 1 if((a1 > HellDunkelSchranke + HellDunkelSchlauch) && (Status1 == "w")){ AnzahlWechsel1++; Differenz++; Status1="s";} if((a1 < HellDunkelSchranke - HellDunkelSchlauch) && (Status1 == "s")){ AnzahlWechsel1++; Differenz++; Status1="w";} //Motor 2 if((a2 > HellDunkelSchranke + HellDunkelSchlauch) && (Status2 == "w")){ AnzahlWechsel2++; Differenz--; Status2="s";} if((a2 < HellDunkelSchranke - HellDunkelSchlauch) && (Status2 == "s")){ AnzahlWechsel2++; Differenz--; Status2="w";} digitalWrite(motor1_A,LOW); digitalWrite(motor1_B,HIGH); digitalWrite(motor2_A,HIGH); digitalWrite(motor2_B,LOW); if(Differenz ==0){ analogWrite(motor1,v); analogWrite(motor2,v); } if(Differenz>0){ //Differenz positiv: Motor1 schneller als Motor 2 //Umrechnung z.B. 10 experimentell bestimmen analogWrite(motor1,v -10*Differenz); // Motor 1 langsamer analogWrite(motor2,v +10*Differenz); // Motor 2 schneller } if(Differenz<0){ //Differenz negativ: Motor2 schneller als Motor 1 analogWrite(motor1,v+10*Differenz); // Motor 1 schneller analogWrite(motor2,v-10*Differenz); // Motor 2 langsamer } // Zum Experimentieren alle Daten anzeigen lassen. Serial.print("M 1: "); Serial.print(a1); Serial.print(" "); Serial.print("M 2: "); Serial.print(a2); Serial.print(" "); Serial.print(AnzahlWechsel1); Serial.print(" "); Serial.print(AnzahlWechsel2); Serial.print(" "); Serial.print(Differenz); Serial.print(" M 1: "); Serial.print(Status1); Serial.print(" M 2: "); Serial.print(Status2); Serial.println(" "); }