Der I2C-Servoswitch wird bereits seit einigen Jahren erfolgreich in verschiendenen Prototypen des Flobo-Projekts eingesetzt. Trotz seiner Zuverlässigkeit ergibt sich durch seine Anwendung allerdings auch der Nachteil der extrem eingeschränkten Empfängerreichweite. Die Ursache sind sehr wahrscheinlich Störsignale des Hauptrechners Gumstix, die galvanisch über den I2C-Bus gekoppelt sind und so die Empfindlichkeit des RC-Empfängers beeinflussen. Zumindest konnten in einem entsprechenden Test sehr viel größere Reichweiten erreicht werden, wenn der Gumstix ausgeschaltet oder zumindest idle war (keine Lese-/Schreibzugriffe auf Flashdisk).

Die nächste Version des Servoswitch sollte also als wichtigstes Feature eine galvanische Trennung zwischen Autopilot und R/C-Stromnetz und damit eine deutliche Steigerung der Reichweite haben. Weitere Anforderungen waren:

  • Größtmögliche Wiederverwendung der Empfängerkomponenten, Servos bleiben im Empfänger
  • Funktionsfähigkeit bei Nichtverwendung / Stromlosigkeit / Ausfall Autopilot
  • Optional: Schutz vor Hijacking des Flugmodells durch fremde Fernsteuerung

Konzept

Die hier vorgestellte Lösung basiert auf dem Abgreifen des PPM-Signals im Empfänger, dessen Decodierung, Synthese und anschließendem Wiedereinspeisen in den Empfänger. Die galvanische Entkopplung geschieht dabei auf dem Weg vom bzw. zurück zum Empfänger.


Blockdiagramm RC-Empfänger und PPM-Switch
(Abbildung ähnlich der Darstellung des Paparazzi-Projekts)

Aus der Abbildung geht hervor, dass das PPM-Signal im Empfänger an der richtigen Stelle entnommen werden muss. Insbesondere muss beachtet werden, dass der PPM-Switch kein separates Sync-Signal (Reset des Dekadenzählers) erzeugt. Also muss das Signal vor der Generierungslogik des Sync-Blanks eingespeist werden. Dies kann mitunter ein Problem darstellen, wenn das Signal im Empfänger über parallele Wege verarbeitet wird.

Weiterhin ist in der Abbildung ersichtlich, dass zum Betreiben der Optokoppler neben der Schaltungsspannung (Autopilot-Stromkreis) auch die Versorgungsspannung des Empfängers benötigt wird. Empfänger und PPM-Switch sind also über 4 Kabel verbunden. Zusätzlich sorgt ein Miniaturrelais dafür, dass der Empfänger bei Ausfall der Spannung des Autopilot-Stromkreis funktionsfähig bleibt – zumindest im Fernsteuerungsmodus.

Schaltung

Die Schaltung besteht im Wesentlichen aus folgenden Komponenten:

  • AtMega88 zur Decodierung und Synthese des PPM-Signals
  • Zwei Optokoppler vom Typ HCPL 0710 (5V CMOS kompatibel, 40ns max. Delay)
  • Reedrelais DIP 9051-D
  • Zwei SMD-LEDs zur Statusanzeige
Schaltplan (Eagle)

Weil die Schaltung sehr nah am Empfänger betrieben werden soll, wurde beim Entwurf des Boards auf Elektromagnetische Verträglichkeit (EMV) geachtet. Mit Groundplane und Powerplane, ausschließlicher Verwendung von SMD-Teilen und möglichst direkte Leiterbahnführung wurde versucht, den Empfehlungen von Atmel zu folgen (siehe Atmel Application Note „EMC Design Considerations“) und Funkstörungen gering zu halten. Softwareseitig können weitere Störquellen durch Abschalten nicht benötigter Module des Mikrocontrollers vermieden werden.

Board (Eagle)

Software

Als Programmiersprache wird im Gegensatz zum Servoswitch jetzt C (WinAVR) eingesetzt. Die Software hat 3 Hauptaufgaben:

  • Analyse der ankommenen PPM-Signale
  • Senden eines validen PPM-Signals, Inhalt abhängig vom internen Status
  • Datenaustausch über I2C-Bus

Basis für die Signalanalyse und –synthese ist der Timer1 des AtMega mit 16 Bit Auflösung. Taktfrequenz und Prescaler sind so konfiguriert, dass Timerwerte direkt in Mikrosekunden vorliegen. Eingehende Signalflanken werden hardwaregestützt durch das Input Capture Register (ICR1) erfasst, ausgehende Pulse werden ebenfalls hardwarenah mittels Output Capture (OCRA1) generiert. Das Hauptprogramm besteht demnach einfach aus einer Busy-Loop, in der regelmäßig auf Veränderungen der Timer-Register geprüft und entsprechend reagiert wird. Die Vorteile dieser Loop sind das Vermeiden zu vieler globaler Variablen und das Einsparen einiger Taktzyklen, die beim Ausführen von Interrupt-Serviceroutinen (ISR) notwendig wären. Lediglich die I2C-Kommunikation wird derzeit über Interrupts gesteuert. Eine Umstellung auf vollständige Interruptsteuerung hätte allerdings den Vorteil, den Controller zwischendurch in Sleep-Modus zu versetzen, weshalb diese Option für spätere Verbesserungen in Betracht gezogen wird.

Die durch Input Capture gemessenen Pulslängen setzt das Programm zu einem PPM-Frame zusammen und validiert diesen anhand einiger Regeln. Diese Regeln schreiben die minimale / maximale Länge des Sync-Blockes / der Servo-Pulse sowie die Gesamtlänge des Frames vor. Abhängig von der Verfügbarkeit und Validität der eingehenden PPM-Signale, dem Vorliegen von I2C-Kommandos sowie der Schalterstellung an der Fernsteuerung (z.B. Servokanal 7) ergibt sich der interne Status des PPM-Switch. Dieser Status legt dann fest, aus welcher Datenquelle die Pulslängen für das ausgehende PPM-Signal genommen werden. Die Abbildung veranschaulich die internen Status und die Statusübergänge.

Statusmodell

Die Status bedeuten im Einzelnen:

  • NoRC – kein Empfang bzw. kein valides Signal – Autopilot steuert
  • Auto1 – Schalter Stellung 1 – Autopilot steuert
  • Auto2 – Schalter Stellung 2 – Autopilot steuert
  • Remote – manuelle Steuerung mittels Fernsteuerung
  • Failsafe1 – kein Empfang und kein Steuerkommando vom Autopilot – alle Servos auf programmierte Neutralstellung (EEPROM)
  • Failsafe2 – valider PPM-Frame vom Sender, Schalter auf Auto, aber kein Steuerkommando vom Autopilot – manuelle Steuerung

Die I2C-Kommunikation dient hauptsächlich zum Auslesen der Servo-Istpositionen (PPM-Switch -> Autopilot) sowie zum Setzen von Servo-Sollpositionen (Autopilot -> PPM-Switch). Zusätzlich können auch Daten zur Signalgüte gelesen und Defaultpositionen geschrieben und gelesen werden. Hier die Liste aller bisher implementierten Kommandos:

  • 0x80 (Default): Auslesen RC-Werte aller Servos beginnend mit dem Status-Byte
  • 0x84: Auslesen der Soll-Werte (Auto) beginnend mit dem Status-Byte
  • 0x88: Auslesen der Neutralstellung aller Servos (beginnend mit dem Status-Byte)
  • 0x8C: Lesen von Statistikdaten: Status-Byte, durchschnittliche Framelänge (2 Byte), Anzahl valider Frames (2 Byte), Anzahl invalider Frames (2 Byte)
  • 0xAA: Setzen eines Einzelservos, normaler Modus (n=Servokanal 1-7): AA nx xx
  • 0xBA: Setzen Einzelservo, Softdrive: BA nx xx
  • 0xA0: Setzen aller Servos (s: 0=Normal, 1=Softdrive): A0 sx xx sx xx sx xx sx xx …
  • 0xD0: Setzen Neutralstellung aller Servos: A0 0x xx 0x xx 0x xx 0x xx …

Weitere Features

Sofern ein gültiges PPM-Signal der Fernsteuerung anliegt, versucht die Software, das ausgehende Signal damit zu synchronisieren. Der zeitliche Versatz beträgt dabei 2,2ms, d.h. die Hebelstellung der Fernsteuerung wird fast ohne Zeitverlust an die Servos weitergegeben.

Eingangssignal (oben) und Ausgangssignal (unten) im Status Remote

Das Blinken der LEDs zeigt den internen Status an. Grün steht für 1x=Manuell, 2x=Auto1, 3x=Auto2, Rot steht für 1x=Failsafe1, 2x=Failsafe2, 3x=NoRC. Ein Statusübergang findet nicht sofort beim ersten invaliden bzw. validen Frame statt, sondern erst wenn eine konfigurierbare Anzahl entsprechender Frames überschritten wurde. Dies soll verhindern, dass kurzzeitige Störung sofort zum Umschalten des Status führen.

Integration

Wie schon angedeutet, besteht bei der Integration die Schwierigkeit, im Empfänger die Signalstrecke an der richtigen Stelle aufzutrennen. Im Vorfeld ist daher eine eingehende Schaltungs- und Signalanalyse notwendig. Dies wurde für den Empfänger C19 von Graupner durchgeführt. Nach einigen Fehlversuchen ergab sich folgender minimaler Eingriff: Pin 13 (Enable) des Dekadenzählers 4017 muss von der Leiterplatte getrennt werden, z.B. mit der Kupferlackdraht-Methode. Dies trennt den Takteingang vom PPM-Signal. Ebenso muss die Sync-Logik (Reset des 4017) vom PPM-Signal getrennt werden, indem ein 100Ohm-Widerstand (101) ausgelötet, um 90° gedreht und einseitig wieder angelötet wird. Das nun offene Ende des Widerstandes wird mit Pin 13 des 4017 durch einen kurzen Draht verbunden und bildet nun den Eingang für das manipulierte PPM-Signal. Das Signal ist im C19 übrigens invertiert, d.h. ein neuer Servopuls wird durch eine HL-Flanke gestartet. Die Software muss entsprechend auf das Erkennen negativer Flanken konfiguriert werden.

Modifikation des Empfängers Graupner C19 und fertige Kombination mit PPM-Switch

Ausblick

Nachdem die Labortests erfolgreich verliefen, muss die Schaltung nun im echten Einsatz geprüft werden. Vor allem interessiert dabei, ob die galvanische Trennung wirklich eine spürbare Reichweitensteigerung bringt. Sofern die Störstrahlung des Gumstix dann immer noch den Empfang beeinträchtigt, muss wohl ernsthaft über eine Alternative des Hauptrechners nachgedacht werden.

Die vollständige Kontrolle der PPM-Signale bietet potentiell auch die Möglichkeit der Verschlüsselung der Fernsteuersignale. Sofern auf Senderseite eine Codierschaltung vorhanden wäre, könnte das PPM-Signal beliebig manipuliert werden – natürlich im Rahmen der Bandbreitenbeschränkung. Damit könnte zum einen – wie schon oben angeführt – ein UAV vor Hijacking geschützt werden, sofern der Hijacker eine normale, uncodierte Fernsteuerung benutzt. Dies wäre ein nützliches Feature für Flüge mit großer Entfernung vom Startplatz, ausserhalb der Reichweite der eigenen Fernsteuerung (in Deutschland nicht erlaubt). Bei Überlagerung von zwei Fernsteuerungen würde das Flugzeug zwar nicht unbedingt steuerbar, aber zumindest nicht von Fremden manipulierbar – ob nun mit oder ohne Absicht. Zum anderen liessen sich aber bei geschickter Ausnutzung des Sync-Signals zusätzliche Daten übertragen, wenn auch mit einer Rate von wenigen 100 Bit/s.

Schematische Darstellung der Codierung der Funkübertragung

Eine Alternative zur galvanischen Entkopplung über das PPM-Signals besteht weiterhin in der Entkopplung des I2C-Bus. Dies hätte einige Vorteile, u.a. wäre das Relais zur Umschaltung der PPM-Leitung überflüssig – schließlich verbraucht es allein ca. 30-40 mA. Weiterhin könnte der I2C-Bus auf der Seite des R/C-Stromkreises weiter ausgenutzt werden, z.B. zur Messung von Spannung, Stromstärken und Drehzahlen. Vielleicht wird ja eine Optokoppler-I2C-Bridge das nächste hier vorgestellte Projekt…

Download

Eagle Schema:ppmswitch.sch
Eagle Board:ppmswitch.brd
AVR Source Code:switch.c