Samstag, 22. März 2014

MultiWii AIOP Mega mit Fatshark Trinity V2.0 Headtracker und PPM-SUM Empfänger, FPV Servo/Gimbal Passthrough

In diesem Artikel beschreibe ich wie man MultiWii Version 2.3 so modifiziert das man die Servosignale für einen 3 Achsen Headtracker (FPV Brille Fatshark Attitude V2.0 mit Trinity Headtracker) über einen PPM-Sum Empfänger (z.B. Jeti Duplex RSat2) mit empfangen und dann auf an den Flightcontroller angeschlossene Servos durchschleifen kann.
Als FlightController muss z.B. ein Multiwii Mega bzw. Crius AIOP vorhanden sein - z.B. MegaPirate AIO Flight Controller (Atmega 2560) von Hobbyking. Nur ein Atmega 2560 hat genügend Ausgänge um neben den flugbetrieb auch zusätzlich noch genug externe Servos ansteuern zu können.

Den Headtracker der Fatshark Attitude habe ich über Lehrer Schüler Eingang in meine MC-22 von Graupner eingeschleift. Die Signale selbst lege ich dann im Gebermenü auf die Kanäle 10 (PAN), 11(TILT) und 12(ROLL), so das diese am RSat2 Empfänger auf den hinteren obersten Kanälen landen und ich trotzdem noch zusätzlich alle 4 Aux Kanäle nutzen kann. Mit diesem Setup haben wir das Signal schonmal prinzipiell auf den Flightcontroller - nun müssen wir jedoch noch die MultiWii Software so modifizieren das diese auch das Signal durchreicht. Auf  folgenden Link sehen wir das auf einen Mega mit aktivierten Hardware PWM folgende Anschlüsse als Servoausgänge genutzt werden können.
  • Servos HW_PWM : 44,45,46,11,12,6,7,8
Ich entscheide mich also die Ausgänge 44,45 und 46 zu benutzen, da diese bei mir ungenutzt sind und auf den Controller günstig liegen. Ich möchte also folgendes Mapping/Signalfluss erreichen.
  • Empfänger Kanal 10 -> Controller Ausgang 44 (PAN)
  • Empfänger Kanal 11 -> Controller Ausgang 45 (TILT)
  • Empfänger Kanal 12 -> Controller Ausgang 46 (ROLL)
Ebenfalls auf der MultiWii Wiki Seite können wir das interne MultiWii Servo Mapping ableiten.
  • Ausgang 44 -> Position 0, d.h., Servo[0]
  • Ausgang 45 -> Servo[1]
  • Ausgang 46 -> Servo[2]
Wir haben nun alle Informationen zusammengetragen um mit wenig Aufwand den Quellcode anzupassen. Als erstes stellen wir sicher das PPM-SUM richtig konfiguriert ist und funktioniert, es gibt hierzu genügend Informationen im Netz, deswegen gehe ich darauf nicht genauer ein. Als nächstes aktivieren wir
  •     #define MEGA_HW_PWM_SERVOS
und fügen ein neues define hinzu für unseren Headtracker hinzu.
  •     #define SERVO_HEADTRACKER
Nun machen wir die ersten Anpassungen in der Output.cpp. Entsprechend des ausgewählten Copters (bei mir VTAIL4) passen wir die Stelle mit dem elif defined(VTAIL4) folgendermassen an.
  #elif defined( VTAIL4 )
    motor[0] = PIDMIX(-8/10,+1, +1); //REAR_R
    motor[1] = PIDMIX(-1, -1, +0); //FRONT_R
    motor[2] = PIDMIX(+8/10,+1, -1); //REAR_L
    motor[3] = PIDMIX(+1, -1, -0); //FRONT_L
    //3-axis trinity headtracker
    servo[0] = rcData[9]; // PAN signal on ppm-sum channel 9
    servo[1] = rcData[10]; // TILT signal on ppm-sum channel 10
    servo[2] = rcData[11]; // ROLL signal on ppm-sum channel 11
  #elif defined( FLYING_WING )
Diese Anpassung sorgt dafür das die Servosignale welche in rcData bereitliegen auf die Servoausgänge servo[0-2] gemapped werden. Nun sorgen wir noch dafür das unsere Servosignale auch verarbeitet/ausgegeben werden, hierfür muss u.a. #define SERVO gesetzt sein (def.h). Um dies zu erreichen habe ich mich entschieden folgende Stelle anzupassen.
#if defined(COPTER_WITH_SERVO) || defined(SERVO_TILT) || defined(GIMBAL) || defined(CAMTRIG) || defined(SERVO_MIX_TILT)
  #define SERVO
#endif
Wir erweitern dieses define um unseren Headtracker define switch.
#if defined(COPTER_WITH_SERVO) || defined(SERVO_TILT) || defined(GIMBAL) || defined(CAMTRIG) || defined(SERVO_MIX_TILT) || defined(SERVO_HEADTRACKER)
  #define SERVO
#endif
Nun müssen wir nur noch an einer Stelle dafür sorgen das auch ein entsprechendes internes Servo Mapping realisiert wird, dies erreichen wir über folgende Anpassung.
#if (defined(SERVO_TILT)|| defined(SERVO_MIX_TILT))&& defined(CAMTRIG)
  #define SEC_SERVO_FROM   1 // use servo from 1 to 3
  #define SEC_SERVO_TO     3
#else
Diesen Teil erweitern wir ebenfalls mit unseren define SERVO_HEADTRACKER...
#if (defined(SERVO_TILT)|| defined(SERVO_MIX_TILT))&& defined(CAMTRIG) || defined(SERVO_HEADTRACKER)
  #define SEC_SERVO_FROM   1 // use servo from 1 to 3
  #define SEC_SERVO_TO     3
#else

Wir sind nun in der Lage unsere Kamera gesteuert durch einen Headtracker über das PPM-SUM Signal am Flightcontroller zu betreiben.

Quellen:
  • http://www.hobbyking.com/hobbyking/store/uploads/684736734X7478X34.pdf
  • http://www.rctimer.com/download/Crius_AIOP_Manual_MWC.pdf 
  • https://wiki.fs-et.de/student-lab/MC22s

Kommentare:

  1. Dieser Kommentar wurde vom Autor entfernt.

    AntwortenLöschen
  2. wurde das auch gehn mit einen spektrum sattelite empfänger???

    AntwortenLöschen
  3. Hallo,

    ja, das müsste im Prinzip auch mit einen Spektrum Empfänger funktionieren, da der FC das Signal vom Spektrum entsprechend aufbereitet und die Kanäle dann in den entsprechenden Variablen (rcData siehe oben) bereitstellt...

    Auf Wunsch kann ich meine Version auch ins GitHub stellen...

    Beste Grüsse,

    AntwortenLöschen