Im folgenden möchte ich die Entwicklung eines Servocontrollers beschreiben. Er ist ein Teil des Flobo-Projekts, soll aber modular und somit auch für andere Zwecke einsetzbar sein. Zunächst möchte ich aber beschreiben, wie die Ansteuerung von Servos prinzipiell funktioniert.
Zum Zweck der späteren Weiterverarbeitung wurde die Funktionsweise der PPM-Decodierung in RC-Empfängern analysiert. Dabei kam als Sender eine MC-15 (35 MHz) von Graupner und als Empfänger der „C16 FM40S“, ebenfalls von Graupner zum Einsatz. Der Empfänger wurde geöffnet und das Gehäuse entfernt.
Deutlich zu erkennen ist der CMOS-IC 4017, welcher offensichtlich zur Umsetzung des PPM-Signals auf das PWM-Signal für die Servos benutzt wird.
Der 4017 ist ein Dekadenzähler, welcher eine Eingangsfrequenz zählt und die Pulse einzeln an seine 10 Ausgänge weiterreicht. Über einen Reset-Eingang kann die Zählung zurückgesetzt werden. Nach einem Reset oder dem Überlauf des Zählers wird erneut Ausgang 0 angesteuert. Ein zusätzlicher Ausgang teilt die Eingangsfrequenz durch 10, wird aber für die Decodierung nicht benötigt. Im RC-Empfänger wird der 4017 zur Aufsplittung des gebündelten PPM-Signals an die einzelnen Servo-Ausgänge benutzt. Das PPM-Signal wird dabei an Pin 14 (Clock Input) angelegt.
An Pin 15 wird ein Reset-Signal angelegt, welches im Empfänger aus dem PPM generiert wird. Vermutlich wird ein Reset – geregelt durch eine einfache Schaltung – dann ausgelöst, wenn min. 4 Millisekunden keine HL-Flanke im PPM-Signal aufgetreten ist. Die nächste HL-Flanke setzt dann Reset auf Low und veranlasst gleichzeitig den Beginn der Frequenzzählung.
Aus Abbildung 4 ist abzulesen, dass ein vollständiger Signalzyklus 22 ms benötigt. Insgesamt werden vom Sender 8 Pulse moduliert, was bedeutet, dass maximal 7 Servos angesteuert werden, da der letzte Puls für die Reset-Steuerung benötigt wird. Die Servostellung ist im zeitlichen Abstand zweier LH-Flanken codiert. Dieser Abstand bewegt sich zwischen 1ms (minimale Servostellung) und 2 ms (maximale Servostellung). In Abbildung 5 wurden die Kanäle 6 und 7 zunächst auf Minimalstellung gebracht und dann auf Maximalstellung. Der grössere Abstand der Flanken lässt dies deutlich erkennen.
Im konkreten Fall von 7 zu übertragenden Kanäle werden also mindestens 7 ms und höchstens 14 ms zur Codierung der Servostellungen benötigt. Bei einem Zyklus von 22 ms bleibt damit eine zeitliche Reserve von 8 ms. Zieht man davon 4 ms für den Reset ab, wäre es also möglich noch zwei weitere Kanäle zu übertragen. Tatsächlich scheint es aber nur Fernsteuerungen mit maximal acht Kanälen zu geben. Siehe hierzu auch die Informationen zur PPM-Codierung auf den Seiten von MFTech.
Abbildung 6 zeigt den zeitlichen Zusammenhang zwischen PPM-Signal und decodiertem Servosignal. Das Servosignal wird auch PWM-Signal (Pulsweiten-Modulation) bezeichnet, da sich die Servostellung über die Länge des Pulses (High-Anteil) ergibt. Eine LH-Flanke des PPM-Signals startet den Impuls, die nächste beendet ihn wieder. Wie in Abbildung 7 zu sehen ist, folgt dem Ende des Pulses für Servo 1 unmittelbar der Beginn des Pulses für Servo 2.
Die meisten Empfänger liefern das unverstärkte PPM-Signal am dritten Pin des Batterie-Anschlusses nach aussen. Bei den mir zur Verfügung stehenden Empfängern von Graupner hat das Signal nur eine Spannung von 0.9 V und muss folglich auf 5 V verstärkt werden. Dazu wird der Operationsverstärker LM324 bzw. LM358 eingesetzt. Mit einer Testschaltung konnten somit die Pulsweiten in Abhängikeit der Hebelstellung des Senders gemessen werden. Dabei war hilfreich, dass der Sender MC-15 die Hebelstellung in Prozent anzeigt (bei der Kalibrierung). Die Position eines Servos bewegt sich zwischen -150% und +150%; die Mittelstellung ist 0%. Hier die Messergebnisse:
Servostellung | Pulsweite in ms |
---|---|
0% | 1.5 |
-100% | 1.1 |
-150% | 0.9 |
+100% | 1.9 |
+150% | 2.1 |
Ein Prozent Servoweg entspricht somit 4 Mikrosekunden Pulsweite.
Die gesammelten Erkenntnisse und Messungen helfen bei der Auswertung des PPM-Signales bzw. der Generierung der Servo-Signale durch einen Mikrocontroller. Es wurde ein Baustein entwickelt, welcher einerseits das PPM-Signal in numerische Werte pro Kanal umsetzt und diese über die I2C-Schnittstelle weitergibt und andererseits einen oder mehrere Servos konfigurationsabhängig ausblendet und mit synthetischen Signalen ansteuern kann.
Im folgenden sind Schaltplan und Board-Layout für die entsprechende Schaltung zu sehen. Beim Layout wurde vor allem auf Platzeinsparung geachtet. Das Board misst 32 x 20 mm und wird direkt auf einen RC-Empfänger montiert. Der Stecker für die I2C-Schnittstelle oben rechts enthält neben den beiden Signalleitungen und Masse auch noch VCC. Dies ist notwendig, um einen I2C-Levelshifter zu betreiben, welcher auf die Referenzspannung der Zielschaltung angewiesen ist.
Download: | i2cservo_r.sch | i2cservo_r.brd |
Nach dem Prototyp, der noch verschiedene Fehler aufwies, wurde die aktuelle Version 5 aufgebaut. Sobald alle Komponenten montiert sind, funktioniert der Controller ohne Probleme. Gegenüber der letzten Version wurde u.a. auch der u741 durch den LM358 ersetzt mit dem nun erfolgreich Signale der Fernsteuerung decodiert werden können.
Auch die Entwicklung der Software für den Controller ist wieder etwas vorwärts gegangen. Inzwischen wurde zunächst die Servofunktionalität, I2C-Empfangs- und Sendebetrieb und sowie die PPM-Signalverarbeitung programmiert. Die aktuelle Firmware-Version 0.12 hat folgende Eigenschaften:
- I2C Slave-Adresse: 0x60
- Setzen der Servoposition mit den Bytefolgen „AA nx xx“ und „BA nx xx“, wobei n die Servonummer (4 Bit) und xxx die Pulsweite des Servosignals ist (12 Bit)
- Die Anweisung „AA“ setzt die Servoposition sofort, „BA“ nutzt den „Soft Drive“, also ein langsames Anfahren der Zielposition
- Auslesen der Fernsteuersignale über I2C
- Speichern der aktuellen Servostellung im EEPROM bei Betätigung des Tasters
- Über Kanal 7 der Fernsteuerung lässt sich zwischen RC-Modus und I2C-Steuerung umschalten
- LED zeigt Modus durch Blinksequenz an
Download: | Firmware und Sourcecode | Source für I2C-Master |
Mittlerweile konnte die Schaltung an das parallel entwickelte Gumstix-Board angeschlossen werden. Über ein Shell-Programm werden hierbei Steuerbefehle an zwei Servos gegeben, wie dieses kurze Video (1,2MB) zeigt.
Auf Basis der Erfahrungen mit dem Servoswitch wurde Ende 2009 der PPM-Switch entwickelt. Dieser ist stärker in den RC-Empfänger integriert und soll dank galvanischer Entkopplung für bessere Reichweiten sorgen. Die Weiterentwicklung des Servoswitch wurde daher eingestellt.