Motorsteuerung

Für das Ansteuern der Motoren wird ein selbstgebauter Motortreiber genutzt, der zwei 
Motoren ansteuern kann. Da ein Servo für die Regulierung verwendet wird, reicht ein
Motortreiber aus. Ein Motortreiber beansprucht neben der Stromversorgung pro Motor drei Pins des Arduino Boards.
Zwei digitale Pins für die Richtung und einen analogen Pin für die Geschwindigkeit.
Die Richtung unterscheidet dabei zwischen Standby (beide LOW), rechtslauf & linkslauf
(einer LOW, einer HIGH) und bremsen (beide HIGH).

Die Geschwindigkeit wird über ein PWM Signal gesteuert, welches das Arduino Board
generieren kann.
Die Funktion zur Generierung eines PWM Signals ist analogWrite(Pin, Value), wobei Pin 
den PWM Pin angibt und Value ein Wert zwischen 0 und 255 ist. Null entspricht einem
duty cycle von 0% und 255 einem duty cycle von 100%.
http://arduino.cc/it/Tutorial/PWM(external link)

Servo servo;


// Initialisierungsfunktion für setup() in main
void initAktoren(){
  //Pinkonfiguration:
  pinMode(PWM_A,OUTPUT);
  pinMode(Ain_1,OUTPUT);
  pinMode(Ain_2,OUTPUT);

  pinMode(PWM_B,OUTPUT);
  pinMode(Bin_1,OUTPUT);
  pinMode(Bin_2,OUTPUT);

  //Servo:
  servo.attach(servo_pin);
  servo.writeMicroseconds(SERVO_MID);

  //Standby:
  digitalWrite(PWM_A,HIGH);
  digitalWrite(PWM_B,HIGH);
}

Nun kann das System über die Werte 
-motorRechts
-motorLinks
-servoWert
angesprochen werden.
Die zwei Funktionen motorRechts und motorLinks sind bis auf die Pinbelegung und den
Namen identisch.

void setzeAktoren(int servoWert, int motorLinks, int motorRechts){
  servo.writeMicroseconds(servoWert);
  servoWert_alt=servoWert;

  motorLinks *=255;
  motorLinks /=100;
  A_richtung(motorLinks);
  motorLinks *= (motorLinks>0)? 1:-1;
  analogWrite(PWM_A, motorLinks);
  motorLinks_alt=motorLinks;

  motorRechts *=255;
  motorRechts /=100;
  B_richtung(motorRechts);
  motorRechts *= (motorRechts>0)? 1:-1;
  analogWrite(PWM_B, motorRechts);
  motorRechts_alt=motorRechts;
}


void A_richtung(int richt_a)
{
  if (richt_a>0)        //Drehe links
  {
    digitalWrite(Ain_1,LOW);
    digitalWrite(Ain_2,HIGH);
  }
  else if (richt_a<0)  //Drehe rechts
  {
    digitalWrite(Ain_1,HIGH);
    digitalWrite(Ain_2,LOW);
  }
  else                   //Bremse
  {
    digitalWrite(Ain_1,LOW);
    digitalWrite(Ain_2,LOW);
  }
}


void B_richtung(int richt_b)
{
  if (richt_b>0)        //Drehe links
  {
    digitalWrite(Bin_1,LOW);
    digitalWrite(Bin_2,HIGH);
  }
  else if (richt_b<0)  //Drehe rechts
  {
    digitalWrite(Bin_1,HIGH);
    digitalWrite(Bin_2,LOW);
  }
  else                   //Bremse
  {
    digitalWrite(Bin_1,LOW);
    digitalWrite(Bin_2,LOW);
  }
}

Zusätzlich zu der Implementation der Motorsteuerung, muss ein Abwurfmechanismus
implementiert werden. Dieser wurde wie folgt realisiert:

void abwurfmechanismus()
{
  analogWrite(PWM_A, 0);
  analogWrite(PWM_B, 0);
  
  
  servo.writeMicroseconds(SERVO_ABWURF);
  delay(2000);
}
Dabei werden als erstes die Pins auf 0 gesetzt und somit die Motoren gestoppt. 
Als nächstes wird der Servo soweit gedreht, damit das Paket abgeworfen werden kann.