USB-Flight-Controller


Als Modellflieger freut man sich besonders auf solche Weihnachtsgeschenke, die die Ausübung des Hobbys auch bei schlechtem Winterwetter ermöglichen. Mit dem Aerofly RC7 Simulator kann ich nun am sonnigen kärntener Hang fliegen während es draußen stürmt und regnet.
Allerdings braucht man ein für ein realistisches Modellflugerlebnis einen Fernsteuersender. Das kann der normale Sender sein, der über ein USB Interface an den PC angeschlossen wird. Da keins der Software beilag, musste also über die Weihnachtstage schnell etwas selber gebaut werden...

Bild "USBFlightCtrl_Aerofly.jpg"

Alter Sender

Moderne Sender geben ein Summensignal aller Kanäle auf einer externen Buchse aus. Dieses pulsbreitenkodierte Signal kann man dann mit einem Mikrcontroller auswerten.
Da ich aber noch einen alten 35MHz Sender hatte, den ich auf einer Modellbaumesse für 5 Euro erstanden hatte, bin ich einen noch einfacheren Weg gegangen: Das direkte Auslesen der Knüppel-Potis mit einem Arduino.

Bild "USBFlightCtrl_SenderOffen.jpg"
Damit das alles alltagstauglich wird, soll der Arduino im Sender verschwinden und und die Antenne durch ein USB Kabel ersetzt werden. Das große Batteriefach ist der ideale Platz für einen Arduino Leonardo.

Bild "USBFlightCtrl_Kontakte.jpg"
Die Kontakte und Federn habe ich herausgenommen, da die Chemie von ausgelaufenen Batterien ihnen sowieso sehr zugesetzt hatte.

Bild "USBFlightCtrl_Potikabel.jpg"
Um Beeinflussungen der Signale durch die originale Elektronik zu verhindern, habe ich die Geberkabel ausgesteckt. Parallel dazu habe ich die Litzen zum Mikrocontroller angelötet...

Bild "USBFlightCtrl_NeueKabel.jpg"
Alle Knüppel-Potis liegen mit ihren äußeren Kontakten an GND und VDD des Arduinos. Die Mittelkontakte (Schleifer) werden individuell zu den Analog-Eingängen des Arduinos geführt.

Bild "USBFlightCtrl_NeueKabelArduino.jpg"
Aufgrund der Bauhöhe des Batteriefachs konnte ich keine Steckverbinder verwenden. So habe ich die Schaltlitzen einfach direkt an die Kontakte des Arduinos angelötet.

Bild "USBFlightCtrl_ArduinoEinbau.jpg"
Ein paar M3 Gewinde ins Kunstoffakkufach geschnitten zur Fixierung des Arduinos. Das USB Kabel habe ich durch das Gehäuse gefädelt, so dass es vorne an der ursprünglichen Antennenöffnung herauskommt.

Bild "USBFlightCtrl_SenderGeschlossen.jpg"
Passt! - Das Batteriefach lässt sich wieder ganz normal schließen.

HID Library

Ich verwende den Controller als Gamepad - also als Human Interface Device (HID), für das es eine sehr gute Library gibt: https://github.com/NicoHood/HID.
Damit man diese Bibliothek nutzen kann, braucht man einen Arduino, mit einer MCU, die USB integriert hat. Bei mir lag noch ein passender Leonardo herum.

Die Software auf dem Arduino ist daher extrem simpel:
Auslesen der vier analogen Eingänge und übersetzen in eine Controller-Position.
Man könnte auch noch Schalter anbringen am Sender um weitere Funktionen wie Fahrwerk, Klapptriebwerk usw. zu steuern. Ich habe diese Funktionen aber erst mal auf der Computertastatur gelassen.


#include "HID-Project.h"

void setup() {
  pinMode(A0, INPUT);
  pinMode(A1, INPUT);
  pinMode(A4, INPUT);
  pinMode(A5, INPUT);

  // Sends a clean report to the host. This is important on any Arduino type.
  Gamepad.begin();
}

void loop() {

    // Move x/y Axis to a new position (16bit)
    Gamepad.xAxis(analogRead(A0)*32);
    Gamepad.yAxis(analogRead(A1)*32);
    Gamepad.rxAxis(analogRead(A4)*32);
    Gamepad.ryAxis(analogRead(A5)*32);

    // This writes the report to the host.
    Gamepad.write();

    delay(30);
  }


Kalibrierung und Kanalzuordnung


Im Flugsimulator muss man zum Schluss noch die Fernsteuerkanäle abgleichen, so dass die gesendeten Werte den Vollausschlägen und Mittelstellungen entsprechen. Auch die Zuordnung der Kanäle zu den verschiedenen Rudern passiert hier.

Bild "USBFlightCtrl_Kanaleinstellungen.png"

Auf geht's an den sonnigen Hang...