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

Donnerstag, 20. März 2014

RCTimer Voltage & Current Sensor 90A (suit MultiWii, APM, etc) mit Multiwii and Megapirate AIO Flight Controller w/FTDI (ATmega 2560) V2.0

In diesem Post geht es um den Anschluss  und der Konfiguration des Spannungs und Strom Sensor 90 Ampere von RCTimer an eine MegaPirate AIO Flight Controller (Atmega 2560) von Hobbyking mit der MultiWii Version 2.3.

Im folgenden installieren/verbinden wir die Hardware und kümmern uns dann um die Softwarekonfiguration. Die Boards CRIUS AIO Pro V1.0 und MultiWii Mega legen die Anschlüsse/Pins A0,A1,..,A3, usw. auf den entsprechend markierten Socket A0..A5(A8) am Controller. Wir können unseren Strom und Spannungs Sensor also direkt mit diesen Anschluss verbinden. Per Default erwartet MultiWii (Version 2.3) den Stromsensor auf A2 und den Spannungssensor auf A3 (siehe Foto).

Das Softwaresetup erfolgt in den folgenden Schritten:
  1. Löschen des EEPROM auf den Controller
    • Ardunio->Beispiele->EEPROM->eeprom_clear
    • Programm kompilieren und uploaden
    • (Das Löschen ist notwendig damit die neuen Werte auch korrekt übernommen werden)
  2. Anpassen der MultiWii Konfiguration - config.h
    • Aktivieren von #define POWERMETER_HARD
    • Setzen von #define PSENSORNULL auf 0
    • Setzen von #define PINT2mA auf 132, lt. Datenblatt müsste dieser Wert korrekt sein
  3. Hochladen des Programms auf den Controller
Nun kann man prüfen ob der Controller korrekt konfiguriert ist, d.h. die Messwerte stimmen. Hierfür einen absolut vollgeladenen Akku anschliessen und anschliessend fliegen gehen und nach dem Fliegen über die GUI den Powerwert auslesen und notieren. Jetzt einfach den Akku laden und prüfen ob die nachgeladene Kapazität mit der entnommenen identisch sind. Falls nicht, dann kann man über folgende Formel eine Anpassung/Finetuning vornehmen.
PINT2mA (neu) = PINT2mA (alt) * Ladegerät_Kapazität / GUI_Kapazität.
PINT2mA nun einfach nach oben beschriebenen Muster updaten.


TIP: Falls man seinen Sensor debuggen will, so kann man im Multiwii Code die Sensorwerte/Zwischenwerte und auch Parameter auf die Debugsensoren in der GUI legen. Hierzu muss man in der Multiwii.cpp nach POWERMETER_HARD suchen und dort unter case 0: (hier wird der Powersensor gelesen), z.B. debug[0] = p; aktivieren. Analog kann man dann auch mit debug[1], usw., die Werte powerValue, conf.psensornull, conf.pint2ma ausgeben.

Btw. Multiwii hat auch einen Tuningguide für den Powersensor - hier zu finden.




Viel Spass :)