Hallo zusammen,
was haltet ihr von diesem Projekt:
===============
HexaBoard Mini Board
Technische Ausstattung:
7 Mikro-Kontroller in 1-6 Master/Slave Konfiguration
Hauptprozessor „Master“
Wahlweise kann einer der folgenden Prozessoren Verwendung finden:
Atmel ATmega48, ATmega88, ATmega168 oder ATmega328.
aktueller (Juli 2009) Preis bei Reichelt: 1.25€ für ATmega48
Hilfsprozessoren „SLAVE1“ - „SLAVE6“
Wahlweise kann einer der folgenden Prozessoren Verwendung finden:
Atmel ATtiny24, ATtiny44 oder ATtiny88.
aktueller (Juli 2009) Preis bei Reichelt: 1.20€ für ATtiny24
Für umfangreiche Schrittfolgen (Details weiter unten) empfiehlt sich die Verwendung
eines ATtiny84 mit 8k Flash.
Zusammenspiel und Verwendung der Prozessoren:
Der Hauptprozessor stellt über 2x 10polige Pfostenleisten je 8 I/O Ports, also insgesamt 16 Ports, die frei im Modell für weitere Funktionen genutzt werden können.
Am Hauptprozessor befinden sich weiter jeweils 3 Taster, 3 LEDs in verschiedenen Farben, um jeweilige Stati anzeigen zu können, ein kleiner Lautsprecher für akustische Signale, ein interner 2-Draht und ein externer I²C-Bus.
Der interne 2-Draht Bus entspricht elektrisch dem I²C Bus und dient der Kommunikation des Hauptprozessor mit den Hilfsprozessoren.
Da der interne Bus getrennt vom externen I²C Bus ist besteht keine Notwendigkeit, auf dem internen Bus das I²C Protokoll zu verwenden.
Die 6 Hilfsprozessoren stellen jeweils 3 PWM-Ports bereit, die auf (RN-Standard kompatible) 3-polige Stervo-Stecker herausgeführt sind.
In der GND-Leitung eines jeden PWM-Port ist ein 0.1 Ohm Widerstand eingeschliffen.
Die mechanische Belastung (die Kraft, die Sollposition zu halten bzw. zu erreichen) jedes einzelnen Servo lässt sich aus der Stromaufnahme des der Last gegensteuernden Motor ermitteln.
Am eingeschliffenen Widerstand steigt der Spanungsabfall mit der Zunahme der Last an.
Diese Spannung kann je seperatem PWM-Port über den ADC des Hilfsprozessor gemessen werden.
Im praktischen Betrieb bedeutet das, dass „Hindernisse“ wie Bodenunebenheiten etc. komfortabel kompensiert werden können, da jedes einzelne Bein selbst erkennen kann, wenn der Fuss auf ein Hindernis trifft bzw. den Boden berührt.
Selbst der Gefahr, dass das Modell durch Verlagerung des Gewichtes bei der Überwindung von Hindernissen kippt, kann begegnet werden, ohne weitere Sensoren zu benötigen.
Der Prozessor „fühlt“ die mechanische Last an der Stromaufnahme des Servo.
Anschlüsse:
18x 8/16-Bit-Timer-PWM
1x I²C
2x 8-Bit I/O
1x RS232
1x 5VDC Stromversorgung
1x ISP Hauptprozessor
6x ISP Hilfsprozessoren
Zusätzliche Funktionen:
3x Taster zur Eingabe
3x Status LED
Betrieb:
Zum Gehen gibt der Hauptprozessor gibt den Hilfprozessoren die vollständigen Bewegungen der Schrittfolge vor und steuert danach nur noch Tempo und Richtung.
Die jeweiligen Hilfsprozessoren arbeiten die Schrittfolge entsprechend dem vorgegebenen Tempo synchron ab und kompensieren kleinere Probleme wie Türschwellen etc. selbstständig.
Das Ziel der Hilfsprozessoren ist ausserdem eine ausbalancierte waagerechte Plattform, was sich einfach erreichen lässt, indem man einen stärker belasteten Servo entlastet, indem man auf der anderen Seite des Modells den korrespondierenden Servo belastet – unabhängig davon, wie schräg oder uneben der Untergrund ist.
Dazu ist es angeraten, dass die Hilfsprozessoren (analog, wie es mit den ABS-Steuergeräten etc. im KFZ gelöst ist) in regelmässigem Abstand ihre aktuellen Betriebsparameter (aktuelle Servostellung, Motor-Last) als Datenticket auf den internen Bus senden, um so sowohl den Master up-to-date zu halten und auch zum Zweck der Synchronisation.
interner Bus:
ein typisches Datenpaket für die Übertragung einer Schrittfolge ist wie folgt aufgebaut:
Quell-ID (4 Bit) 0000 Master
Ziel-ID (4Bit) 1111 alle
Paket-Typ (1 Byte) Upload Schrittfolge (0x04h)
Sequence (2 Byte) 0000.0000.0000.0000 für die erste Pos. der ersten Sequenz
PWM1A (1 Byte) Soll-Position 1. Servo
PWM1B (1 Byte) Soll-Position 2. Servo
PWM1C (1 Byte) Soll-Position 3. Servo
PWM2A (1 Byte) Soll-Position 4. Servo
PWM2B (1 Byte) Soll-Position 5. Servo
PWM2C (1 Byte) Soll-Position 6. Servo
PWM3A (1 Byte) Soll-Position 7. Servo
PWM3B (1 Byte) Soll-Position 8. Servo
PWM3C (1 Byte) Soll-Position 9. Servo
PWM4A (1 Byte) Soll-Position 10. Servo
PWM4B (1 Byte) Soll-Position 11. Servo
PWM4C (1 Byte) Soll-Position 12. Servo
PWM5A (1 Byte) Soll-Position 13. Servo
PWM5B (1 Byte) Soll-Position 14. Servo
PWM5C (1 Byte) Soll-Position 15. Servo
PWM6A (1 Byte) Soll-Position 16. Servo
PWM6B (1 Byte) Soll-Position 17. Servo
PWM6C (1 Byte) Soll-Position 18. Servo
Die Übertragung eines vollständigen Telegramms dauert bei einem Takt von 100khz weniger als 5ms.
Eine Schrittfolge, die aus 200 Einzelschritten je Zyklus besteht, wäre nach 1s übertragen.
Danach kann der Hauptprozessor die jeweiligen Schrittpositionen über einfachere Pakete abfordern:
Quell-ID (4 Bit) 0000 Master
Ziel-ID (4Bit) 1111 alle
Paket-Typ (1 Byte) Ausführen Schrittfolge (0x10h)
Sequence (2 Byte) 0000.0000.0000.0000 für die erste Pos. der ersten Sequenz
Ein kompletter Zyklus inclusive der Statis bzgl. erreichter Position und der Belastung würde dann so aussehen:
Quell Ziel Typ
0000 1111 0x10h 0x0000h
Hauptprozessor an alle: GOTO Pos. 0
0001 1111 0x00h 0x80h 0x77h 0x25h 0x22h 0x28h 0x20h
Hilfsprozessor „SLAVE1“ Status an alle: PWM1A auf Position 80h, PWM1B auf Position 77h, PWM1C auf Position 25h, Belastung Servo 1A 22h, Belastung Servo 1B 28h und Belastung Servo 1C 20h.
0002 1111 0x00h 0x80h 0x77h 0x25h 0x21h 0x28h 0x21h
Hilfsprozessor „SLAVE2“ Status an alle: PWM2A auf Position 80h, PWM1B auf Position 77h, PWM1C auf Position 25h, Belastung Servo 1A 21h, Belastung Servo 1B 28h und Belastung Servo 1C 21h.
0003 1111 0x00h 0x80h 0x77h 0x25h 0x21h 0x26h 0x21h
0004 1111 0x00h 0x80h 0x77h 0x25h 0x25h 0x26h 0x31h
0005 1111 0x00h 0x80h 0x77h 0x25h 0x27h 0x28h 0x21h
0006 1111 0x00h 0x80h 0x77h 0x25h 0x23h 0x28h 0x23h
45ms Pause
0000 1111 0x10h 0x0001h
Hauptprozessor an alle: GOTO Pos. 1
<...>
jede Status-Message ist 8 Bytes lang, d.h. alle 6 Stati zusammen sind 48 Bytes.
Jedes Schrittfolge-Kommando ist 4 Bytes lang, die vollständige Ausführung eines Schrittes ist vom Protokoll her gesehen nach 52 Bytes oder auch nach weniger als 5 ms abgeschlossen.
Mit Rücksicht auf die Trägheit der Mechanik sollte es ausreichen, wenn der Hauptprozessor alle 50ms eine Positionsänderung anfordert, um eine fliessende Bewegung hinzubekommen.
==> alle 50ms hat der Hauptprozessor für 5ms mit dem Gehen zu tun, die restlichen 90% der CPU-Zeit verbleiben dem Hauptprozessor für andere Aufgaben (Orientierung, Navigation, ...) und den Hilfsprozessoren, die PWMs anzupassen und die aktuellen Werte für die Belastung zu ermitteln.
Was haltet ihr von diesem Ansatz?
Ralph
Lesezeichen