Motoren

Das Getrieberad kann mit einer Gleichspannung zwischen 3V und 6 V betrieben werden. Die Drehzahl ist von der Spannung abhängig: bei 3V werden 50 Umdrehungen pro Minute; bei 5V sind es 83 Umdrehungen pro Minute.

Das Rad hat einen Durchmesser von 6,6 cm und kann so ca. 10 m in einer Minute fahren.

Das Getriebe hat eine Untersetzung von 1: 120.

Synchronisation der Motoren zum Geradeausfahren

Ohne eine Steuerung kann der Roboter schwerlich geradeaus fahren, denn dazu müssten beide Motoren sich exakt gleich schnell drehen. Dies wird in der Realität nie vorkommen. 

Hierzu wird an jedem Motor ein Lichtsensor (CNY70) und im Inneren der Felge eine Kreisscheibe befestigt. Wesentlich zur Steuerung ist lediglich, dass innerhalb einer Messperiode die Anzahl der Hell-Dunkel-Wechsel jeweils gleich groß ist.  

Kreisscheibe

16er-Kreisscheibe

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 HellDunkelSchlauch = 10;
int a1=0;
int a2=0;
int Status1=0;
int Status2=0;
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); 
}
  
void loop(){
 // Helligkeitswerte der Kreischscheibe auslesen
 a1 = analogRead(LS_Motor1);
 a2 = analogRead(LS_Motor2);
 //Motor 1
 if((a1 > HellDunkelSchranke + HellDunkelSchlauch) && (Status1 == 0)){
  	Differenz++; Status1=1;}
 if((a1 < HellDunkelSchranke - HellDunkelSchlauch) && (Status1 == 1)){
   	Differenz++; Status1=0;}
 // Motor 2
 if((a2 > HellDunkelSchranke + HellDunkelSchlauch) && (Status2 == 0)){
   	Differenz--; Status2=1;}
 if((a2 < HellDunkelSchranke - HellDunkelSchlauch) && (Status2 == 1)){
   	Differenz--; Status2=0;}
   	
 Differenz=AnzahlWechsel1-AnzahlWechsel2;
 if(Differenz>255){Differenz=255;}
 if(Differenz< -255){Differenz=-255;}
 digitalWrite(motor1_A,LOW);  
 digitalWrite(motor1_B,HIGH);
  
 digitalWrite(motor2_A,HIGH); 
 digitalWrite(motor2_B,LOW);
  //Differenz negativ: Motor2 ist zu schnell
  //Differenz positiv: Motor1 ist zu schnell        
  
  if(Differenz>0){
   analogWrite(motor1,v-Differenz);  
  }
  else{
   analogWrite(motor2,v+Differenz); 
  }
}

Einlesen der Messwerte über die serielle Schnittstelle

Oftmals wird Processing parallel zum Arduino  benutzt, um Daten darzustellen. Braucht man allerdings nur ein Datenlogging, so ist es mit dem Freewareprogramm im Unterricht einfacher. Die Messwerte kann man anschließend mit Excel weiterverarbeiten.

Processing

Mit Hilfe von Processing kann man die Daten, die über die serielle Schnittstelle gesendet werden in einer Datei einlesen.

Hier sieht man die Werte bei einer 16er Scheibe während 2 Radumdrehungen.

RS232 Data Logger

Das Freewareprogramm RS232 Data Logger protokolliert den Datenverkehr der seriellen Schnittstelle und speichert ihn in einer Textdatei ab.

Processing Beispielprogramm
import processing.serial.*;
Serial mySerial;
PrintWriter output;
void setup() {
   mySerial = new Serial( this, Serial.list()[2], 9600 );
   output = createWriter( "messwerte.txt" );
}
void draw() {
    if (mySerial.available() > 0 ) {
         String x = mySerial.readString();
         if ( x != null ) {
              output.print(x );
              output.print("  ");
         }
    }
}

void keyPressed() {
  output.flush(); 
  output.close(); 
  exit();
}