recopter3 – Kommunikation von Graupner über Arduino zum Raspberry Pi

Wie bereits erwähnt, soll nun die Technik bzw. der Sourcecode hinter dem gezeigten schematischen Aufbau meines Projekt eines autonomen Mikrokopters recopter3 erläutert werden.

Hier als erstes noch einmal das Bild zur Verdeutlichung:

Aufbau_recopter3_V2_small

Wie man sieht, gehen fünf Kanäle des Graupner-Empfängers (8, 9, 10, 11 und 12) direkt an die Eingänge des Arduinos (12, 8, 7, 4 und 2).

Anmerkung: Das KK-Board im Diagramm entfällt in Zukunft und wird durch das Crius-Board ersetzt!

Der Arduino liest die PWM-Signale des Empfängers an seinen Eingängen direkt aus (Code-Auszüge!):

// pins from the RC receiver
int rcPinTakeControl   = 12;

void setup()
{
  // pins which get signal from RC reciever
  pinMode(rcPinTakeControl, INPUT);
}

void loop()
{
  // read PPM signals from RC receiver
  value = pulseIn(rcPinTakeControl, HIGH);

  // map read values to servo compatible values
  ServoValue = map(value, 1089, 1880, 0, 255);
}

Die letzte Zeile wandelt übrigens die gelesenen Pulse-Dauern in bequeme 0-255 Werte.

Die so gelesenen Stellungen von Schaltern auf der Fernbedienung werden dann in Variablen im Arduino gespeichert:

// for storing the last state of the RC switches or knobs
  int controlState = 0;

  static int NOTCONTROLLED    = 0;
  static int REMOTECONTROLLED = 1;

  // map read values
  if (ServoValue < 10) // off
  {
    // off
    controlState = NOTCONTROLLED;
  }
  else
  {
      // on
    controlState = REMOTECONTROLLED;
  }

Die Variable controlState sagt in meinem Code zum Beispiel aus, ob die Elektronik jetzt „unter Kontrolle“ der Fernbedienung ist, also weitere „Befehle“ annimmt, wie z.B. die Augen bewegen oder Musik oder Sprachausgabe über den Raspberry Pi ausgeben – aber dazu später mehr.

Wenn wir „unter Kontrolle“ der Fernbedienung sind (denn später soll der Kopter ja vielleicht mal autonom reagieren / fliegen), werden weitere Regler von der RC-Fernsteuerung ausgelesen und unmittelbar darauf reagiert. Zum Beispiel werden zwei Drehregler ausgelesen – der eine lässt die Augen nach links/rechts schauen, der andere nach oben/unten. Damit die Augen nicht mechanisch an den Rahmen anstoßen, werden zuvor noch Maximalwerte abgefragt, und die Servos nicht darüber hinaus bewegt. Eine Art „Endanschlag“ per Software:

  // are we under control?
  if (controlState == NOTCONTROLLED)
  {
    look(DOWN);
  }
  else
  {
    // -----------------------------------
    // look LEFT, RIGHT
    // -----------------------------------
    // read PPM signals from RC receiver
    value = pulseIn(rcPinEyesLeftRight, HIGH);

    // map read values to servo compatible values
    ServoValue = map(value, 1089, 1880, 0, 255);

    // fix servo values to their indidivual maximum
    if (ServoValue < servoRightLRstart)     {       newServoValue = servoRightLRstart;     }     else     {       if (ServoValue > servoRightLRend)
      {
        newServoValue = servoRightLRend;
      }
      else
      {
        newServoValue = ServoValue;
      }
    }

    // write to servo
    // left eye, left/right, watched _from_ head
    servoRightLR.write(newServoValue);

Wie es dann weiter geht mit der I2C Kommunikation zum Raspberry Pi mittels Python, wird hier in meinem Beitrag beschrieben.

Ach ja, der Sourcecode liegt übrigens vollständig hier bei Bitbucket als Git-Repository!

 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert