Elektronik und Roboterbau
AVR, avr-gcc, CAN, CPLD, Elektronik, Mikrocontroller, MSP430, PIC, Roboter, Schaltungen, Sensoren, Software, Testboards
Tags: Elektronik,
AVR,
Schaltungen,
Software
Stand: 18. November 2007, 11: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).
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]
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 |
‘#S’ + Nummer + Position des Servos
Es wird als zuerst die Adresse des Servos (0 bis 7), danach die Soll-Position des Servos gesendet.
Um das Servo 2 auf Position 10 (= 0x0a) zu bringen müsste man folgendes senden:
0x23 0x53 0x02 0x0a
‘#s’ + Nummer des Servos
Auch hier muss noch die Servo-Adresse gesendet werden. Man bekommt daraufhin ein Byte mit der aktuellen Position zurück.
‘#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 |
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
... ...
‘#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.
Zustand von Bit.2 und Bit.4 lesen:
0x23 0x49 0x14
=> sendet (Eingangswert & 0x14) zurück
‘#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”.
‘#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.
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
‘#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.
‘#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).
Folgender Befehl ändert die Baudrate auf 19,2k Baud:
0x23 0x43 0x42 0x04
‘#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.
‘#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.
‘#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!
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).
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.
Nachbauten der Leute von RoboTrack:
Kommentare
# Herbert meinte am 19. November 2007, 19: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, 23:45 dazu:
Hallo das ist das was ich schon lange suche, kann ich es auch bei dir Kaufen?
# Fabian Greif meinte am 25. Januar 2008, 00:11 dazu:
Du hast eine E-Mail
# Thomas Roth meinte am 8. März 2008, 11: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, 17:21 dazu:
Hallo,
wo kann ich so eine fertige Platine bekommen?
# Martin meinte am 30. April 2010, 03:14 dazu:
Tolle Projekte mit super Anleitungen… habs nachgebaut und alles hat sofort funktioniert! Danke Martin