zurück

FrSky XM+ Empfänger mit Arduino

23.11.2019

In diesem Versuch wird ein FrSky XM+ Empfänger mit einem Arduino Mega verbunden. Außerdem wird gezeigt, wie der XM+ an eine FrSky Taranis QX7 gebunden wird und zusammen dann Steuersignale an den Arduino schicken, um dort Befehle auszuführen.

Verwendete Bauteile und Geräte

FrSky XM+

FrSky XM+ Empfänger

Der XM+ ist ein Empfänger-Modul, welches mit dem SBUS-Protokoll kompatibel ist und Daten seriell empfangen und verschicken kann. Um das Modul mit dem Arduino benutzen zu können, muss das Signal SBUS-Pin des XM+ invertiert werden. Einen solchen TTL-Inverter kann man fertig kaufen oder wie folgt auch einfach selber bauen:

Schaltplan für einen SBUS-Inverter
Abb.: Schaltplan für einen SBUS-Inverter zur Benutzung mit einem Arduino

Man verwendet hier die Spannungsversorgung von 5V des Arduino und kann mit einem einfachen NPN-Kleinsignal-Transistor (hier: BC547B) den TTL-Inverter bauen. Dabei wird der Stromfluss zwischen Collector und Emitter durch R1 (1kΩ) begrenzt. An der Basis liegt das TX-Signal des SBUS-Pins vom XM+, welches mit R2 (10kΩ) begrenzt wird. Nun kann eine Verbindung zum seriellen Eingang RX (hier: RX3 des Arduino Mega) hergestellt werden.

Binding von XM+ and die Taranis QX7

Ein neues oder noch nicht verbundener XM+ Empfänger kann in der folgenden Prozedur einfach und schnell an die Taranis-Fernsteuerung gebunden werden.

  1. Zunächst wird die Stromversorung des XM+ vorbereitet, d.h. Kabel oder Stecker in der Modul eingelötet, dann die Masse mit dem GND-Pin des Arduino verbunden und die 5V- so vorbereitet, dass sie leicht (d.h. mit einer Hand) mit dem XM+-Modul verbunden werden kann.
  2. Nun wird in der Taranis ein neues Modell angelegt und benannt; hier z.B. "xmplus".
    Neues Modell in der Taranis QX7
  3. Nun wechselt man auf die zweite Seite des Setups des Modells und wählt D16 als MODE aus, denn der XM+ ist ein SBUS-Empfänger. Der Umfang der Kanäle ("Ch. Range") sollte auf CH1-16 eingestellt werden.
    Auswählen von D16 als Mode des Modells
  4. Die Empfänger-Nummer muss evtl. noch geändert werden, damit es keine Überschneidungen gibt, allerdings weist die Taranis eh darauf hin, wenn der "RxNum" schon belegt ist.
  5. Nun wählt man "[Bnd]" aus und drückt ENTER, worauf ein Piepsen in regelmäßigen Intervallen zu hören ist. Dies bedeutet, dass die Taranis im Binding-Modus ist und nun den Empfänger sucht.
  6. Jetzt hält man die Bind-Taste auf dem XM+ gedrückt und schließt dann die Spannungsversorgung an das Modul an. Dann sollte man eine kleine rote LED auf dem XM+ blinken sehen, wobei eine grüne LED durchgängig leuchtet. Dann kann die Bind-Taste losgelassen werden und der XM+ von der Spannungsversorgung getrennt werden.
  7. Auf der Taranis wird nun ENTER nochmals gedrückt, um den Binding-Modus zu beenden (das Piepsen sollte nun aufhören).
  8. Wenn nun der XM+ erneut an den Strom angeschlossen wird, sollte nach kurzer Zeit eine grüne LED durchgehend leuchten. Damit ist Empfänger und Sender miteinander verbunden.

Aufbau

Aufbau und Anschluss von XM+ auf dem Breadboard
Abb.: Aufbau und Anschluss von XM+ auf dem Breadboard

Daten-Ausgabe der Kanäle (Channels)

Wenn der XM+ nun wie oben aufgebaut und mit dem Arduino Mega verdrahtet wurde, können wir nun mit der Library SBUS die vom Sender übertragenen Daten auf der seriellen Konsole ausgeben. Leider kann hier der Arduino Uno nicht verwendet werden, weil wir die Daten über einen seriellen Port (hier Serial3) empfangen und gleichzeitig über den eine anderen seriellen Port an den Computer schicken. Und da der Arduino Uno nur eine serielle Schnittstelle bietet, muss man hier auf den Mega ausweichen.

#include "SBUS.h"
SBUS sbus(Serial3);

void setup()
{
  sbus.begin();
  Serial.begin(9600);
}

// this is timer2, which triggers ever 1ms and processes the incoming SBUS datastream
ISR(TIMER2_COMPA_vect)
{
  sbus.process();
}

void loop()
{
  delay(500);
  printStatus();
}

void printStatus()
{
  Serial.print("Ch1  ");
  Serial.println(sbus.getNormalizedChannel(1));
  Serial.print("Ch2  ");
  Serial.println(sbus.getNormalizedChannel(2));
  Serial.print("Ch3  ");
  Serial.println(sbus.getNormalizedChannel(3));
  Serial.print("Ch4  ");
  Serial.println(sbus.getNormalizedChannel(4));
  Serial.print("Ch5  ");
  Serial.println(sbus.getNormalizedChannel(5));
  Serial.print("Ch6  ");
  Serial.println(sbus.getNormalizedChannel(6));
  Serial.print("Ch7  ");
  Serial.println(sbus.getNormalizedChannel(7));
  Serial.print("Ch8  ");
  Serial.println(sbus.getNormalizedChannel(8));
  Serial.print("Ch9  ");
  Serial.println(sbus.getNormalizedChannel(9));
  Serial.print("Ch10 ");
  Serial.println(sbus.getNormalizedChannel(10));
  Serial.print("Ch11 ");
  Serial.println(sbus.getNormalizedChannel(11));
  Serial.print("Ch12 ");
  Serial.println(sbus.getNormalizedChannel(12));
  Serial.print("Ch13 ");
  Serial.println(sbus.getNormalizedChannel(13));
  Serial.print("Ch14 ");
  Serial.println(sbus.getNormalizedChannel(14));
  Serial.print("Ch15 ");
  Serial.println(sbus.getNormalizedChannel(15));
  Serial.print("Ch16 ");
  Serial.println(sbus.getNormalizedChannel(16));
  Serial.println();
}

Nach dem Ausführen und Hochladen des Sketches sehen wird die normalisierten Wert der einzelnen Kanäle der Taranis, die über den XM+ empfangen wurden.

Fernsteuerung zweier LEDs

Statt die Daten der Kanäle einfach nur auf der Konsole auszugeben, habe ich hier einen Versuch aufgebaut, das die Steuerknüppel der Taranis die Helligkeit zweier verschiedenfarbiger LEDs steuern sollen.

#include "SBUS.h"
SBUS sbus(Serial3);

#define PIN_RED  2
#define PIN_BLUE 3

void setup()
{
  sbus.begin();
  pinMode(PIN_RED, OUTPUT);
  pinMode(PIN_BLUE, OUTPUT);
}

ISR(TIMER2_COMPA_vect)
{
  sbus.process();
}

void loop()
{
  ledStatus();
}

void ledStatus()
{
  analogWrite(PIN_RED, map(sbus.getNormalizedChannel(3), -83, 83, 0, 255));
  analogWrite(PIN_BLUE, map(sbus.getNormalizedChannel(2), -83, 83, 0, 255));
}
Video: Fernsteuerung eines Arduino mit einer Taranis QX7

So kann man den Arduino Mega als "Flight Controller" für eigene ferngesteuerte Projekte (Autos, Boote, etc.) verwenden.