Themen:

AVR, avr-gcc, CAN, CPLD, Elektronik, Mikrocontroller, MSP430, PIC, Roboter, Schaltungen, Sensoren, Software, Testboards

S8IO8-Servocontroller

Tags: Elektronik, AVR, Schaltungen, Software
Stand: 18. November 2007, 10:22
6 Kommentar(e)

Der S8IO8 ist der Nachfolger des S8IO, mit einem ATMega48/88/168 anstelle des ATTiny2313 und einer wesentlich flexibleren Firmware.

Der Wechsel auf einen “größeren” Mikrocontroller war für den S8IO überfällig, da es unmöglich geworden war weitere Funktionalität zu integrieren. Der Speicher war mit 97% Belegung einfach … voll ;-)

Durch den Wechsel auf einen ATMega48/88/168 steht jetzt mehr Programmspeicher zur Verfügung, so dass die bisherige Firmware komplett überarbeitet werden konnte. Dadurch ist es nun wesentlich einfacher Erweiterungen einzubauen.
Die State-Machine-artige Grundstruktur wurde durch einen Scanner mit Befehls-Pattern und Callback-Funktionen ersetzt. Dadurch mussten allerdings teilweise die Befehlssequenzen etwas angepasst werden (hauptsächlich für die Konfiguration).

Basisboard (SMD)

S8IO8-Platine Die Idee hinter dieser Platine war es eine möglichst kleine Platine für den Anschluss von Servos an den PC zu entwickeln. Daher sind mehr oder weniger alle Bauteile als SMD aufgeführt:

Will man kein USB verwenden, so ist zusätzlich ein vierpoliger Stecker vorgesehen über den sich die seriellen Signale abgreifen lassen (der FT232RL darf dann nicht bestückt werden). Um die Platine dann an einen PC anschließen braucht man aber noch einen externen Pegelwandler.

[Ich habe ein paar Platinen fertigen lassen. Der Preis für eine doppelseitige Platine mit Lötstopplack und Bestückungsdruck liegt bei 6 Euro. Schreibt mir einfach eine E-Mail falls Interesse besteht]

Protokoll

Die Baudrate beträgt in der Grundeinstellung 9600 Baud, kann aber im Betrieb bzw. beim neu kompilieren geändert werden.

Die Übertragung beginnt immer mit einem Synchronisationsbyte,hier das Raute Zeichen (#, 0x23 als ASCII-Zeichen), gefolgt von einem Byte das die Funktion auswählt. Folgende Zeichen können genutzt werden:

ASCII-
Zeichen
Hex-Wert Parameter
(Bytes)
Beschreibung
S 0x53 2 Servoposition setzten
s 0x73 1 Servoposition auslesen
D 0x44 2 Servo Offset einstellen
L 0x4C 5 erweiterten Drehbereich einstellen
O 0x4F 2 IO-Pins als Ausgang setzten
I 0x49 1 Zustände der Eingangspins lesen
V 0x56 0 Version der Software abfragen
B 0x42 1 neue Baudrate einstellen
E 0x45 0 aktuelle Einstellungen im EEprom abspeichern
d 0x64 0 Standard-Werte laden
R 0x52 0 Controller neu starten

Servoposition setzen

‘#S’ + Nummer + Position des Servos

Es wird als zuerst die Adresse des Servos (0 bis 7), danach die Soll-Position des Servos gesendet.

Beispiel

Um das Servo 2 auf Position 10 (= 0x0a) zu bringen müsste man folgendes senden:

0x23 0x53 0x02 0x0a

Servoposition auslesen

‘#s’ + Nummer des Servos

Auch hier muss noch die Servo-Adresse gesendet werden. Man bekommt daraufhin ein Byte mit der aktuellen Position zurück.

IO-Pins als Ausgang setzen

‘#O’ + Maske + Zustand

Um auch nur einzelne Pins als Ausgangs setzen zu können wird hier mit Masken gearbeitet. Es wird also zuerst eine Maske gesendet in der alle Pins die als Ausgang gesetzt werden sollen markiert sind, und erst dann die jeweiligen Zuständen der Pins.
Es werden somit auch nur die Pins die in der Maske gesetzt waren wirklich als Ausgänge geschaltet, alle andere behalten ihre aktuelle Funktion.

In der folgenden Tabelle ist der Zusammenhang zwischen den Bytes und dem Ergebnis dargestellt:

Maske.n Zustand.n Pin.n
0 x vorherige Funktion
1 0 Ausgang mit Low-Pegel
1 1 Ausgang mit High-Pegel
Beispiel

Bit.3 (= 0x08 als Maske) auf High-Pegel setzen:

0x23 0x4F 0x08 0x08

Zusätzlich Bit.6 auf High-Pegel und Bit.2 auf Low-Pegel:

0x23 0x4F 0x4C 0x48

weitere Beispiele:

IO_2 Ein   : 0x23 0x4F 0x04 0x04
IO_2 Aus   : 0x23 0x4F 0x04 0x00
IO_3 Ein   : 0x23 0x4F 0x08 0x08
...                  ...

Zustände der Eingangspins lesen

‘#I’ + Maske

Auch hier muss zuerst eine Maske gesendet werden die angibt welche Pins als Eingang geschaltet werden sollen. Daraufhin bekommt man ein Byte mit dem aktuellen Zustand der Eingangspins zurück. Alle Bits die in der Maske nicht gesetzt werden waren sind auch in diesem Byte nicht gesetzt.

Beispiel

Zustand von Bit.2 und Bit.4 lesen:

0x23 0x49 0x14
=> sendet (Eingangswert & 0x14) zurück

Version anzeigen

‘#V’

Liefert zwei Bytes mit der aktuellen Version der Software zurück. Das erste Byte gibt dabei die Stelle vor dem Komma an, das zweite dementsprechend die Stelle hinter dem Komma.

Aktuell ist “0.2”.

erweiterten Drehbereich einstellen

‘#L’ + Nummer des Servos + Min. Wert (2 Byte) + Max. Wert (2 Byte)

Über dieses Kommando kann man direkt die mimalen und maximalen Timerwerte, die zur Erzeugung der Servoimpulse benutzt werden, setzen.

ACHTUNG: Wird ein zu großer Bereich gewählt kann dies dazu führen das das Servo in den Endanschlag fährt und somit beschädigt wird. Wenn man also den größtmöglichen Drehbereich braucht sollte man sich langsam an diesen heran tasten!

Die neu gesetzten Werte sind bis zu einem Reset des Mikrocontrollers aktiv. Will man die Werte dauerhaft speichern muss die Werte ins EEprom schreiben lassen.

Beispiel

Um den Drehbereich des Servos auf Kanal 0 auf 0,5 bis 2,5 ms auszudehnen muss folgendes gesendet werden (bei 4 MHz):

0x23 0x4C 0x00 0xd8 0xf0 0xf8 0x30

Servo-Offset einstellen

‘#D’ + Nummer + Offset

Ermöglicht einen Offset im Bereich von -128 bis 127 zu definieren, der jeweils auf die Servoposition addiert wird. Somit lässt sich zum Beispiel die Nullposition noch genau justieren.

ACHTUNG: Größere Werte sollten eher durch das Umsetzen des Servohebels erreicht werden, da sich ansonsten der mögliche Drehbereich einschränkt.

Baudrate einstellen

‘#B’ + Baudrate

Hier muss noch ein Byte gesendet werden das die einzustellende Baudrate definiert. Folgende Tabelle zeigt die Möglichkeiten:

Byte Baudrate Verfügbar bei
4 MHz 7,3728 MHz 8 MHz 14,7456 MHz
0 2400 ja ja ja ja
1 4800 ja ja ja ja
2 9600 ja ja ja ja
3 14,4k   ja ja ja
4 19,2k ja ja ja ja
5 28,8k   ja   ja
6 38,4k   ja ja ja
7 57,6k   ja   ja
8 115,2k   ja   ja

Die geänderte Baudrate bleibt erstmal nur bis zu einem “Neustart” des Controllers aktiv. Um sie dauerhaft zu speichern muss das EEprom verwendet werden (siehe Werte im EEprom speichern).

Beispiel

Folgender Befehl ändert die Baudrate auf 19,2k Baud:

0x23  0x43 0x42 0x04

Werte im EEprom speichern

‘#E’

Speichert den aktuellen Zustand des Controllers im Eeprom. Neben den aktuellen Servopositionen werden also auch Servo-Offset, eventl. geänderte Grenzen, die Baudrate, der Zustand der IO-Pins usw. gespeichert und beim nächsten Start wieder hergestellt.

Default-Werte laden

‘#d’

Lädt die beim Compilieren einstellten Werte und überschreibt so die aktuelle Konfiguration. Auch hier muss man ein “write eeprom” nachschicken um die Werte dauerhaft zurückzusetzen.

Controller neu starten

‘#R’

Startet den Controller neu. Hilfreich zum Beispiel wenn man mit der Konfiguration herum gespielt hat und die aktuellen Werte wieder verwerfen will.

ACHTUNG: Alle Änderungen seit dem letzten beschreiben des EEproms werden verworfen!

Software compilieren

Als erstes muss man im mitgelieferten Makefile den verwendeten Controller und die Taktfrequenz einstellen. Dazu einfach um Zeile 45 die korrekten Einträge einkommentieren und alle anderen auskommentieren. Sind die entsprechenden Werte dort nicht vorhanden, dann werden diese aktuell noch nicht unterstützt.

Danach sollte man noch den verwendeten Programmieradapter in Zeile 248ff einstellen. Bei mir zum Beispiel:

# Programming hardware: alf avr910 avrisp bascom bsd
# dt006 pavr picoweb pony-stk200 sp12 stk200 stk500
AVRDUDE_PROGRAMMER = stk500

# com1 = serial port. Use lpt1 to connect to parallel port
AVRDUDE_PORT = /dev/ttyUSB0

Ist dies erledigt kann man mit folgenden Kommandos die Software auf den Controller spielen:

make all
make fuse
make program

Mit ‘make fuse’ werden dabei auch die Fusebits richtig einstellt (externer Quarz, Brown-Out-Detection auf 2,7V).

Lizenz

Wie auch beim S8IO steht der Quelltext zum S8IO8 steht unter der GNU General Public License (GPL). Eine Kopie der GPL liegt dem Projekt bei.

Fotos

S8IO8-Platine S8IO8 Basisboard mit Anschlüssen

Nachbauten der Leute von RoboTrack:

Test der IO-Funktionen Test der IO-Funktionen

Downloads:

s8io8.zip [236.99 kB]

Zum Anfang

Kommentare

# Herbert meinte am 19. November 2007, 18:35 dazu:

glückwunsch,
dieses servoboard ist schlicht und einfach das gelbe vom ei, an dieser stelle auch noch mal der hinweis aufs forum..! unter http://forum.kreatives-chaos.com

lg herbert

# Rigo meinte am 24. Januar 2008, 22:45 dazu:

Hallo das ist das was ich schon lange suche, kann ich es auch bei dir Kaufen?

# Fabian Greif meinte am 24. Januar 2008, 23:11 dazu:

Du hast eine E-Mail

# Thomas Roth meinte am 8. März 2008, 10:54 dazu:

Hi,
komme nicht drumrum 2 Platinen (wenn möglich) zu bestellen. Besitze noch Laser wobei der Beam durch 2 Servos umgelenkt wird.
Habe passende Touch-Board´s welche 8 Laser werwalten. Eprom on Board beinhaltet Daten zur ausführung ein-facher Figuren.
Mache mal Fotos der Geräte und sende sie dann nach.

Grüße aus Köln

# Wolfgang meinte am 25. März 2008, 16:21 dazu:

Hallo,

wo kann ich so eine fertige Platine bekommen?

# Martin meinte am 30. April 2010, 02:14 dazu:

Tolle Projekte mit super Anleitungen… habs nachgebaut und alles hat sofort funktioniert! Danke Martin