16 zusätzliche Analog-Eingänge via PPM und SPI

Angeregt durch Helles Erweiterung in Verbindung mit dem APM-Mode-Umschalter (hier vorgestellt) habe ich mir für ein Projekt eine Weiterentwicklung gebaut, die durch Vernetzung von zwei Arduino Nano insgesamt 16 zusätzliche Analogeingänge für weitere Eingabegeräte bereitstellt. Auf den APM Mode Umschalter habe ich verzichtet, da ich diesen nicht benötige.

 

Die beiden Arduinos kommunizieren miteinander via SPI. Einer der Arduinos ist dabei der Master, der die SPI-Kommunikation steuert. Er initiiert den Datenaustausch, sendet über die SPI-Leitungen einen PPM-Stream, der den Status aller 8 analogen Ports als Servosignale beeinhaltet, und beendet abschließend die SPI-Kommunikation wieder.

 

Der Slave wiederum nimmt den PPM-Stream entgegen, kombiniert ihn mit den Werten der eigenen 8 Analogeingänge (ebenfalls als Servosignale) und stellt einen gemeinsamen PPM Stream mit 16 Servosignalen zusammen. Dieser Stream wird dann über Pin 9 ausgegeben und kann in der Taranis oder anderen geeigneten Sendern weiterverarbeitet werden.

Details zur SPI-Kommunikation

Bei der Wahl des Protokolls für die Kommunikation zwischen den beiden Arduinos fiel meine Wahl aus zwei Gründen auf SPI:

  • es ist das schnellste serielle Protokoll am Arduino
  • es benötigt keine analogen Ports (im Gegensatz zu I2C)

Da ist es zu verschmerzen, dass man mehr physikalische Leitungen zwischen den beiden Arduinos benötigt: SPI erfordert drei Leitungen für die eigentliche Kommunikation sowie eine weitere für jeden Slave, der angesprochen werden soll. Da es hier bei einem Slave bleibt, brauche ich folglich insgesamt vier Leitungen für SPI.

 

Die Verkabelung ist simpel: die vier verwendeten Ports werden zwischen den beiden Nanos einfach eins-zu-eins miteinander verbunden. Folgende Pins werden dabei genutzt:

  • (Pin D10)    SS - Slave Select: den gewünschten Slave kontaktieren
  • (Pin D11)    MOSI - Master Out Slave In: Daten werden vom Master an den Slave gesendet
  • (Pin D12)    MISO - Master In Slave Out: Daten werden vom Slave an den Master gesendet
  • (Pin D13)    SCK - Serial Clock: das Taktsignal zur Synchronisation der Kommunikation

Der Master beginnt die Kommunikation, indem er den SS-Pin auf low zieht. Damit wird der am anderen Ende angeschlossene Slave in den Empfangsmodus versetzt. Nun sendet der Master die gewünschten Daten seriell über die anderen Leitungen und beendet schließlich die Kommunikation, indem der SS-Pin wieder auf high gesetzt wird.

Umsetzung der SPI-Kommunikation

Bei der Erstellung der beiden Sketche habe ich hinsichtlich der SPI-Kommunikation auf den Beispielen von Nick Gammon (siehe hier) aufgebaut.

 

Der Master ist relativ simpel, da er einfach alle 100 Millisekunden einmal seine Daten sendet.

 

Der Slave ist da schon deutlich anspruchsvoller, da er für den unverzüglichen und sicheren Empfang der Daten Interrupt-gesteuert reagiert. Sobald der Master den SS-Pin auf low zieht, wird im Slave ein Interrupt ausgelöst, der die entsprechende Empfangsroutine startet.

 

Außerdem verwende ich eine ebenfalls von Nick Gammon stammende, lokale Library mit dem Namen "SPI_anything.h", die das serielle Senden und Empfangen unterschiedlicher Datentypen über das SPI Protokoll erheblich vereinfacht.

 

Zu beachten ist noch, dass eine Nutzung des seriellen Terminals der Arduino Entwicklungsumgebung nur sehr eingeschränkt möglich ist, da dieses in Konflikt mit der SPI Kommunikation steht. Dies führt dazu, dass sich der Slave-Arduino beim Ausgeben von Informationen nach wenigen Augenblicken aufhängt, wenn zeitgleich aufs Terminal geschrieben und ein Interrupt durch SPI ausgelöst wird. Die im Slave-Sketch enthaltenen Befehle zur seriellen Ausgabe sollten daher nur bei Bedarf und zu Debugging-Zwecken temporär aktiviert werden.

Erstellen des PPM Signals

Beide Arduinos erzeugen jeweils ein PPM Signal aus ihren 8 Analogports. Die eingelesenen Werte werden über einen map-Befehl auf das Standardformat für Servosignale umgerechnet, also von 1 bis 2 ms je nach Status.

 

Da es viel einfacher ist, Daten vom Master an den Slave zu senden, übernimmt der Slave nach Empfang der Daten vom Master die weitere Verarbeitung der Gesamtdaten. Er verbindet die beiden PPM-Signale zu einem gemeinsamen Stream und gibt diesen auf Pin 9 aus. 

 

Das PPM Signal erreicht so eine Framelänge von 38,5 ms und der verwendete Fernsteuersender muss in der Lage sein, mit dieser Framelänge umzugehen. Bei den Taranis ist das kein Problem. Damit das PPM Signal in jeder Situation die exakt richtige Dauer hat, wird auch hier ein Interrupt verwendet (Timer 1). 

Schaltplan für Master und Slave

Die Schaltpläne für Master und Slave sind nahezu identisch und unterscheiden sich nur in einem einzigen Detail: lediglich der Slave wird an Pin 9 mit der DSC-Buchse des Fernsteuersenders verbunden. Alle anderen Beschaltungen sind gleich und bestehen nur aus ein paar Widerständen und Kondensatoren.

 

Achtung: Es empfiehlt sich, die Arduinos durch Einsatz einer Diode vor Verpolung zu schützen. Außerdem sollte man unbedingt eine Feinsicherung von 0,5 A zwischen der Spannungsversorgung der Arduinos und der Senderelektronik einsetzen. Dies dient dem Schutz der Senderelektronik vor versehentlichen Kurzschlüssen in der selbstgebauten Schaltung (ich habe das auf schmerzhafte Weise erfahren und in der Folge gelernt, wie eine neue Hauptplatine in meinen Sender einbaut wird...).

 

Ein paar Hinweise zu den drei Darstellungen oben:

Die Breadboard-Ansicht dokumentiert meinen Versuchsaufbau. Nur die Enden jeder Leitung sind tatsächlich gesteckt, die Knicke dienen nur der besseren Übersichtlichkeit und haben keine elektrische Verbindung mit den darunter liegenden Steckplätzen.

 

Der Schaltplan und das Boardlayout sind individuell auf meine Anforderungen abgestimmt. Der Stecker SV1 dient dem Anschluß aller Eingabegeräte wie Potis, Schalter mit Widerständen usw und liefert hierfür ebenfalls Masse und +5V. Auf der Breadboard-Darstellung ist jeweils ein Poti als Beispiel eingezeichnet.

 

Der andere Stecker SV3 nimmt alle anderen Leitungen für Stromversorgung, SPI und PPM-Ausgang beim Slave auf. Die Jumper J1 bis J8 sind nur ein Hilfsmittel, um die auf der Oberseite laufenden, im Board-Layout rot dargestellten Leitungen leicht einlöten zu können.

Konfiguration im Sender (OpenTX)

Die Konfiguration der Erweiterung an der Lehrer/Schüler-Buchse erfolgt Modell-spezifisch.

 

In den "Modell-Einstellungen" wird ganz unten zunächst unter dem Menüpunkt "DSC Buchse PPM In/Out" der Modus "Lehrer/Buchse" eingestellt.

 

Im Menü "Inputs" kann nun jeder der 16 zusätzlichen Eingänge einem beliebigen Eingang I01 bis I32 zugewiesen werden. Die zusätzlichen Eingänge werden unter der Bezeichnung TR1 bis TR16 (für Trainer) referenziert. Hier kann man auch gleich deren Funktion testen. Einfach die gewünschte Zeile editieren, "Quelle" markieren und den gewünschten Eingang TRxx auswählen. Wird das entsprechende Eingabegerät bewegt, sollten im nebenstehenden Koordinatensystem die Änderungen entsprechend angezeigt werden.

 

Die Weiterverarbeitung erfolgt ab hier wie mit jeder Quelle gewohnt über Mischer.

Software-Download

Download
16-channel-ppm-spi-Software.zip
Komprimiertes Archiv im ZIP Format 5.0 KB