Testen der Motoren

Zuerst schließen wir nach der Anleitung die Motoren an.

Quelltext
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.

  1. Verändere den Quelltext so und notiere deine Veränderungen, so dass
    1. die Motoren 1 Sekunde nach vorne fahren und anschließend 1 Sekunde zurück fahren.
    2. sich ein Motor nach vorne, der andere sich rückwärts dreht.
    3. die Motoren langsamer laufen.
  2. Ändere den Quelltext so ab, dass man sich die Drehrichtung über den seriellen Ausgang anzeigen lassen kann.
  3. Informiere dich über die Pulsweitenmodulation (PWM).
  4. Schreibe eigene Funktionen (z.B. Motor1_vor(), Motor1_zurueck(), ...) wie in der Anleitung beschrieben.

Testen der Lichtsensoren

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 ?

Quelltext
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.

Zusammenspiel von Motor und Lichtsensor

Nimm das folgende Quellprogramm.

  1. Ändere vorher den Text entprechend deiner Messwerte ab.
  2. Lass dir die Drehungen der Motoren über die serielle Schnittstelle anzeigen.
  3. Berechne die Differenz der Drehungen der beiden Räder un gib auch diese über die serielle Schnittstelle aus.
  4. Ändere das Programm so ab, dass sich die Räder nur einmal drehen.
Testprogramm
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); 
  }

Sychronisieren der Motoren

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.

Synchronisation der Motoren
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(" ");
}