Servo-Modul Version 1.0 24.06.2010 Mit dem Servo-Modul ist es möglich bis zu 8 Modellbau-Servos (analoges Signal) an zu steuern. Die Ansteuerung kann wahlweise über den I2C-Bus, einen COM-Port (RS232) oder über den RS485-Bus erfolgen. Über Adress-Jumper wird dem Servo-Modul eine eindeutige Adresse zugewiesen. Damit können an einem Bus bis zu 32 Servo-Module angeschlossen werden. Die Ansteuerung der Servos kann einzeln (jeder Servo für sich), oder zusammen (alle Servos bekommen den gleichen Wert zugewiesen), vorgenommen werden. Dabei sind Schrittweiten von 0 bis 255 möglich (der Wert 128 ist die Mittelstellung des Servos). Je nach Einstellung lassen sich damit Signalzeiten von 1ms bis 2ms einstellen, bzw. Signalzeiten von 0,5ms bis 2,5ms einstellen. Die Konfiguration der einzelnen Servos erfolgt hier über Servo-Befehle. Mit den Servo-Befehlen lässt sich jeder Servo einzeln einstellen, sprich jeder der insgesamt 8 Servos kann einzeln konfiguriert werden. Folgende Einstellungen sind möglich: * Servo-Modus ---> Der Servo kann Daten von 0 bis 255 verarbeiten * Servo Zwei-Punkt-Modus ---> Der Servo fährt von Punk-A nach Punkt-B * Digital-Port-Modus ---> Der Servo-Port läst sich als normaler Schaltausgang benutzen * Servo-Start-Wert ---> Beim einschalten des Moduls nimmt der Servo diese Position an * Servo-trimmen ---> Die Mittelstellung des Servos läst sich verschieben * Servo-Punkt-A ---> wird für Zwei-Punkt-Modus benötigt * Servo-Punkt-B ---> wird für Zwei-Punkt-Modus benötigt * Servo-Verzögerung ---> Die Stellzeit des Servos wird verlangsamt * Servo-invertieren ---> Die Stellrichtung des Servos wird umgedreht * Servo-Bereich ---> Stellwinkel einstellen normal 1ms bis 2ms erweitert 0,5ms bis 2,5ms * Baudrate ---> Geschwindigkeit der Datenübertragung von 300 Baud bis 38400 Baud
Aufbau der Servo-Befehle Die Servo-Befehlen sind wie folgt aufgeteilt: Das Servo-Modul hat eine Grundeinstellung, die hier mit Default gekennzeichnet ist. Bei der ersten Inbetriebnahme werden automatisch die Default-Werte eingestellt. Es ist aber auch möglich über den Servo-Befehl 10 und Servo-Daten 13 die Dafault-Werte wieder her zu stellen (Reset Servo-Modul). Aufbau/Protokoll der Datenübertragung Als erstes Byte wird immer die Adresse zum Servo-Modul übertragen. Als zweites Byte folgt immer die Servo-Nummer, die den jeweiligen Servo anspricht (8 Bits = 8 Servos). Danach folgen als drittes Byte die Servo-Daten und als viertes Byte der Servo-Befehl. Beispiel für den I2C-Bus: ---> Adresse I2C_Write(3) ---> Servo-Nummer ---> Servo-Daten ---> Servo-Befehl Beispiel für RS232 und RS485: ---> Adresse Put(3) ---> Servo-Nummer ---> Servo-Daten ---> Servo-Befehl
Bei den Beispielen wird das Servo-Modul mit der Adresse 16 (über Jumper einstellbar) angesprochen. Als Servo-Nummer wurde hier eine 3 gesendet, was bedeutet das Bit0 und Bit1 dieses Bytes auf 1 gesetzt wurde. Die nachfolgenden Daten bzw. Befehle gelten also für Servo1 und Servo2, alle anderen Servos werden nicht angesprochen. Danach folgen die Servo-Daten mit einem Wert von 255 und der Servo-Befehl mit einem Wert von 0. Die beiden Servos - Servo1 und Servo2 werden also nach links fahren (oder nach rechts, je nachdem ob das Servo-Signal vorher invertiert wurde). Einstellung der Servo-Modul Adresse Das Servo-Modul hat 5 Adress-Jumper, die für die Adressierung des Moduls zuständig sind. Mit den Jumpern lassen sich insgesamt 32 verschiedene Adressen einstellen. Die erste Adresse ist dezimal 16 (alle Jumper offen) und die letzte Adresse ist 78 (alle Jumper zu). So lassen sich insgesamt 32 Servo-Module an einem Bus betreiben. Wenn jedes Modul mit 8 Servos bestückt ist, dann lassen sich so insgesamt 256 Servos ansteuern... Besonderheiten I2C-Bus Der I2C-Bus wurde für kurze Strecken entwickelt (kleiner 1m), von daher ist es nicht ratsam den I2C-Bus über mehrere Meter aus zu bauen. Da der I2C-Bus aber über ein Start und Stopp Kommando verfügt, ist es sehr einfach die Daten geordnet (richtige Reihenfolge) zu übertragen. Daher ist es beim I2C-Bus auch möglich auf das senden des Servo-Befehls zu verzichten. Soll ein oder mehrere Servos auf eine bestimmte Position eingestellt werden, dann reicht auch folgende Datenübertragung aus: I2C_Write(3)
Im Servo Zwei-Punkt-Modus und im Digital-Port-Modus reicht es sogar aus nur die Servo-Nummer zu senden: I2C_Write(3) Damit wird für die Datenübertragung weniger Zeit benötigt und der I2C-Bus wird früher wieder für andere Aufgaben frei gegeben. Besonderheiten RS232 Wenn die RS232 Schnittstelle vom Servo-Modul genutzt wird, dann muss der MAX485 Chip entfernt werden. Wird die RS232 mit einem PC verbunden, dann muss noch ein MAX232 Chip mit verbaut werden (oder ein FT232 Chip für eine USB Anbindung). Außerdem muss darauf geachtet werden dass die TXD und RXD Leitung zwischen PC und Modul gekreuzt werden, damit die Daten auch übertragen werden können. Besonderheiten RS485 Wenn der RS485-Bus vom Servo-Modul verwendet wird, dann kann die RS232 Schnittstelle vom Servo-Modul nicht genutzt werden. Der RS485-Bus wurde für eine Datenübertragung mit bis zu 500m Kabellänge vorgesehen. Ich habe das Servo-Modul mit ca. 40m Kabellänge getestet und die Datenübertragung hat hierbei problemlos funktioniert. An einem RS485-Bus lassen sich maximal 32 Geräte anschließen (dazu zählt auch der Sender). Es könnten daher also nur 31 Servo-Module an einem RS485-Bus betrieben werden. Des Weiteren ist die Terminierung des RS485-Busses wichtig. Der Sender (Anfang vom Bus) und das letzte Servo-Modul (Ende vom Bus) müssen terminiert werden. Auf dem Servo-Modul ist hierfür einen Jumper vorgesehen. Ist der Jumper geschlossen, dann ist das Modul terminiert.
Bei der Datenübertragung ist darauf zu achten dass immer exakt 4 Bytes zum Servo-Modul gesendet werden (das gilt auch für die RS232 Schnittstelle). Es ist hier also nicht möglich ein Byte weg zu lassen (nicht mit zu senden), so wie es bei der I2C-Bus Übertragung möglich ist. Sollte man sich einmal nicht sicher sein wie viel Bytes bereits übertragen wurden, dann kann ein Reset gesendet werden: Nach dem senden von 4 Bytes mit dem Wert 0 ist der Datenbus dann wieder ausgerichtet. Ich habe die Datenübertragung mit einem USB zu RS485 Adapter getestet. Selbst mit einer Übertragungsrate von 38400 Baud kam es nie zu Problemen bei der Übertragung (mit ca. 40m Klingeldraht, ungeschirmt). Es ist aber auch möglich immer ein Reset vor dem senden das Datenpaketes zu übertragen. Um das Servo-Modul leichter ein zu stellen und zu testen, habe ich auch ein Servo-Test Programm erstellt, welches mit der RS232 oder RS485 Schnittstelle genutzt werden kann:
Neben der Ansteuerung über den RS485-Bus gibt es auch noch weitere Möglichkeiten das Servo-Modul zu kontrollieren. Das Servo-Modul hat eine LED, die aufleuchtet so bald eine Datenübertragung abgeschlossen ist und die Daten verarbeitet wurden. Dieser LED-Ausgang ist über einen NPN-Transistor heraus geführt. Wurde ein Datenpaket erkannt und verarbeitet, dann schaltet der NPN-Transistor nach Masse durch. Hier wird also ein ACK zurück geliefert, welches von einem Sender ausgewertet werden kann. Des Weiteren gibt es noch einen Reset-Eingang, der nach Masse geschaltet ein Daten-Reset auslöst (nur für RS232 und RS485). Die Versorgungsspannung Bei dem Servo-Modul wurde ein Gleichrichter mit verbaut, so dass das Modul mit Gleichspannung und auch Wechselspannung betrieben werden kann (9V bis 20V). Außerdem wurde ein Festspannungsregler für die Steuereinheit verbaut und ein Festspannungsregler für die Servo Spannung. Damit kann die Servo Spannung auf 5V oder 6V eingestellt werden (über den Feintrimmer), ja nach dem ob der Servo schneller oder langsamer laufen soll. Sollten mehrere Servos an dem Modul betrieben werden, dann ist auf die Erwärmung des Festspannungsreglers (LM317) zu achten. Gegebenenfalls ist an dem LM317 ein Kühlkörper zu montieren. Sollte das Servo-Modul im Digital-Port-Modus betrieben werden, dann ist zu beachten dass der Port nur maximal 10mA liefern kann. Es ist dann unbedingt noch ein Transistor für Schaltaufgaben mit vor zu sehen. Beispiele zur Ansteuerung - Daten Anschließend noch ein paar Beispiele zur Ansteuerung des Servo-Moduls. Alle Beispiele beziehen sich auf ein Modul mit der Adresse 16 (alle Werte in dezimal). Servo1 bis Servo8 auf Mittelstellung einstellen (im Servo-Modus): Put(128) I2C_Write(128)
Nur Servo3 auf Linksanschlag einstellen (im Servo-Modus): Put(4) I2C_Write(4) Nur Servo1 auf Rechtsanschlag einstellen (im Servo-Modus): Nur Servo2 auf den Wert 70 einstellen (im Servo-Modus): Put(2) I2C_Write(2) Put(70) I2C_Write(70) Servo1 bis Servo8 auf den Wert 70 einstellen (im Servo-Modus): Put(70) I2C_Write(70) Servo1 und Servo2 auf Mittelstellung einstellen (im Servo-Modus): Put(3) I2C_Write(3) Put(128) I2C_Write(128) Im Digital-Port-Modus Servo-Port8 EINschalten: Put(128) I2C_Write(128) Im Digital-Port-Modus Servo-Port8 AUSschalten:
Im Servo Zwei-Punkt-Modus Servo1 auf Punkt-A ausrichten: Im Servo Zwei-Punkt-Modus Servo1 auf Punkt-B ausrichten: Beispiele zur Ansteuerung - Befehle Bei der Übertragung eines Befehls wird keine Servo Positionsänderung vorgenommen, es sei denn das der Befehl eine direkte Änderung veranlasst. Servo-Modus für Servo1 bis Servo8 einstellen: Servo Zwei-Punkt-Modus für Servo1 einstellen Punkt-A Wert 70 Punkt-B Wert 150: Put(70) I2C_Write(70) Put(4) I2C_Write(4) Put(150) I2C_Write(150) Put(5) I2C_Write(5)
Digital-Port-Modus für Servo8 einstellen: Put(128) I2C_Write(128) Put(2) I2C_Write(2) Start-Wert für Servo1 auf Wert 255 einstellen (im Servo-Modus): Put(2) I2C_Write(2) Servo1 Mittelwert auf Wert 120 trimmen: Put(120) I2C_Write(120) Put(3) I2C_Write(3) Zeitverzögerung für Servo1 einstellen Verzögerungswert 5: Put(5) I2C_Write(5) Put(6) I2C_Write(6) Zeitverzögerung für Servo1 ausschalten: Put(6) I2C_Write(6) Servo-Signal invertieren, für Servo3: Put(4) I2C_Write(4) Put(7)
I2C_Write(7) Servo-Signal invertieren aufheben, für Servo3: Put(4) I2C_Write(4) Put(7) I2C_Write(7) Erweiterten Servo-Bereich für Servo1 aktivieren: Put(8) I2C_Write(8) Erweiterten Servo-Bereich für Servo1 deaktivieren: Put(8) I2C_Write(8) Baudrate auf 9600 Baud einstellen: I2C_Write(5) I2C_Write(9) Default-Werte laden: I2C_Write(13) I2C_Write(10) Put(5) Put(9) Put(13) Put(10)
Daten-Reset senden (nur RS232 und RS485): Hinweise Wenn das Servo-Modul im erweiterten Stellbereich betrieben wird (0,5ms bis 2,5ms), dann ist auf den Endanschlag des Servos zu achten. Nicht jeder Servo ist auch in der Lage diesen Stellbereich an zu fahren. Daher sollten Servo-Daten kleiner Wert 10 und größer Wert 245 im erweiterten Servo Bereich vermieden werden. Im Notfall hilft hier aber auch austesten weiter... Haftungsausschluss Ich habe das Servo-Modul nach besten Wissen und Gewissen getestet. Leider kann ich aber auch nicht ausschließen dass das Servo-Modul 100%-tig fehlerfrei funktioniert. Ich übernehme daher keinerlei Haftung für Personen oder Sachschäden, die durch die direkte oder indirekte Nutzung der Hardware oder Software entstehen sollten. Autor Jens Gürtler 2010 Fehler und Verbesserungsvorschläge bitte an nachfolgende E-Mail Adresse senden. jensguertler@web.de