17 Servos per Summensignal steuern
Kombination zweier existierender Projekte
Aus den Einzelprojekten Servos per Arduino steuern und RC Summensignal per Microcontroller einlesen lässt sich ein Servo-Mixer kombinieren.
Berechnet wird das PWM-Signal für 24 Servos. Da auf dem Arduino Nano Board nicht alle Ausgänge herausgeführt sind, und nun auch noch Pin D8 (PB0) als Eingang für das Summensignal dient, sind nur noch 17 Servos übrig.
Anpassung der Timer-Verwendung
Beide Projekte verwenden den 16bit-Timer Timer1. Da dieser in unterschiedlichen Modi verwendet wird, muss entweder der PWM-Thread oder der Summensignal-Thread auf einen anderen Timer ausweichen.
Für das Einlesen des Summensignals sind die 16bit Auflösung von Timer1 wichtig. Beim Generieren der Zeitbasis für das PWM-Signal ist hingegen ein 8bit-Timer kein Nachteil. Deswegen wird der Software-PWM-Thread für die Servos auf Timer2 ausgelagert.
Software-Design
![]() |
Verwendung der Timer / Data Flow
|
Wichtig: Die Interrupts des Servo-Threads (PWM) und der Interrupt für das Einlesen des Summensignals sind nicht verschränkt. Auch wenn das Summensignal ausbleibt läuft die Software weiter, gibt ein gültiges PWM-Signal (auf Basis des letzten korrekt empfangenen Summensignals) aus.
Das Entspricht sozusagen der Failsafe-Einstellung "Hold Position".
Download Sourcecode: 17 Servos per Summensignal am Arduino Nano steuern
Speicherbedarf laut Compiler:
FLASH: | 2880 Byte von 30720 Byte | 9% |
---|---|---|
RAM: | 554 Byte von 2048 Byte | 27% |
Optionale Debug-Ausgabe auf der Konsole
Wenn man die Zeilen "Serial.begin(115200);" und "printDebugMessages(*dataset);" einkommentiert, werden auf der Konsole (USB) die eingelesenen Werte ausgegeben.
Dieser Zusätzliche Rechenaufwand verzögert nur die Verarbeitungszeit in der Main Loop.
Bemerkenswert: weder die Präzision beim Einlesen des Summensignals noch das ausgegebene PWM-Signal wird von langwierigen Routinen innerhalb der Main Loop beeinflusst. Das ermöglicht komplexe Berechnungen mit den Servosignalen.
Bekannte Einschränkungen
- Der Thread zum Erzeugen des PWM-Signals arbeitet aktuell noch nicht mit gepufferten Daten.
Wenn ein Servowert reduziert wird währenddessen der Counter den Wert bereits überschritten hat, kommt exakt 1 fehlerhafter Puls zum Servo, was durch ein kurzes Zucken sichtbar wird. - Wenn das Summensignal ausbleibt oder ungültig ist, wird die letzte gültige Servoposition gehalten. Besser wäre, eine Failsafe-Position nach einem definierten Timeout nach Ausfall des Summensignals anzufahren.