BlueTooth Hexapod

Videos:

BlueTooth Hexapod

Beschreibung:

Diese Dinger, mit denen man eine Plattform in allen 6 Freiheitsgraden bewegen kann finde ich faszinierend. Also musste ich einen bauen. Außerdem wollte ich wissen, ob ein kleiner ATMega32 eine volle Koordinatentransformation für die inverse Kinematik berechnen und gleichzeitig eine PWM für 8 Servos (2 Reserve) ausgeben kann.....ähhm, also - er kann.

Die PWM ist für Standard-Servos (20ms Periode) ausgelegt, kann aber auch im Bereich von 5ms-25ms eingestellt werden, um den Strom (also auch die Geschwindigkeit) für die Servos optimal einzustellen (hier betrieben mit 17ms). Die Auflösung beträgt ca. 0,36°, also ca. 500 Schritte für 180°. Die PWM braucht für die Vorausberechnung 50us und dann max. 8 Timer-Interrupte mit 3ns Länge.

Den Rest der Rechenzeit benötigt der Chip für die inverse Kinematik des Hexapods. Eine Berechnung dauert ca. 10ms (noch mit großem Optimierungspotential). Dafür muss die räumliche Lage der oberen und unteren Gelenkpunkte der Mechanik bekannt sein. Es wird dann die gewünschte Lage der oberen Plattform abweichend von der Nulllage (3 Wege + 3 Winkel) vorgegeben und eine Rotationsmatrix (4x4) berechnet. Mit dieser werden dann die Einzelkoordinaten jedes Gelenkpunktes der oberen Plattform transformiert. Danach kann die notwendige Länge der einzelnen Zylinder mittels Vektorbetrag berechnet und in Pulsweiten auf die Servos ausgegeben werden. Fertig!
Eine lageabhängige Arbeitsraumbegrenzung ist noch nicht implementiert, kann aber recht einfach dadurch realisiert werden, dass die jeweils gewünschte Lage der oberen Plattform über eine lineare Interpolation und nicht, wie im Moment, direkt angefahren wird. Dann kann in jedem Schritt geprüft werden, ob eine der Endlagen einer der 6 Zylinder erreicht ist. Dann wird die Bewegung abgebrochen.

Die Mechanik war etwas aufwendig, auf Grund der Größe des Hexapods. Es war unmöglich die Servos direkt an die Zylinder zu setzen, da sich die Zylinder in der Verlängerung nach unten kreuzen. Also musste ich Bowdenzüge einsetzen. Diese wurden aus Gitarrensaiten gefertigt und werden mit einer Zahnstange betätigt, auf die die Zahnräder (sichtbare weiße Scheiben) wirken, welche auf den Servowellen sitzen.

Als Servos hatte zuerst den Typ ES-05 (Mini) eingesetzt. Diese haben eine ausgezeichnete Linearität, sind aber Reihenweise in den Heldentod gegangen. (Wer braucht Getriebeteile? bwz. Wer hat Elektroniken für die ES-05 übrig?) . Dann bin ich auf den Typ Y-3009 übergegangen. Diese sind kräftiger und schneller, vertragen auch mal einen Überstrom, sind aber von der Linearität her nicht so gut, was zeitweise zum Verziehen der oberen Plattform führt. Den einzigen Ausfall eines der Y-3009 hatte ich nach der Blockade einer Zahnstange, wobei ein Zahn des Abtriebszahnrades abgebrochen ist.

Als Lagesensoren sind zwei MMA7361 von FreeScale verbaut. Das sind 3-achsige Absolutbeschleunigungsaufnehmer mit 1,5g oder 6g Empfindlichkeit und Analogausgang. Die 6 Ausgangsspannungen sampelt der ATMega mit 1kHz, wobei eine einstellbare Glättung implementiert ist. Da die Sensoren auf der Platine diagonal angebracht sind (am weitesten voneinander entfernt), können sie in Kombination auch als Gyroskop genutzt werden. Mit der Einschränkung, dass räumliche Drehungen deren Achsen genau durch beide Sensoren verlaufen, nicht erfasst werden können. Mit den daraus errechneten linearen bzw. Winkel-Beschleunigungen wird die obere Plattform im Modus "Self Gyro Platform" bewegt, womit eine "kreiselstabilisierte Ebene" erzeugt wird. Diese wird im Moment noch durch einen einfachen P-Regler geregelt, der nun mal leider eine konstante Regelabweichung zur Folge hat. (PID-Regler ist in Arbeit)

Das BlueTooth-Modul ist ein BISMS02BI-01 von ENZURIO und wird als Pur-Cable-Replace für eine UART (RS232) genutzt. Ein sehr beschäftigter Kollege (Dank an Sebastian) hat dann eine Steilvorlage für eine BlueTooth-Android-App geliefert, die ich dann bis zum jetzigen Stand aufgebohrt habe (ist noch sehr dünnwandig). Die Kommunikation wird im Moment mit Software-Handshake betrieben, was die Bewegungen noch etwas "hakelig" macht. Da wird noch ein Hardware-Handshake eingebaut. Auf dem ATMaga32 läuft ein Klartext-Terminal das sämtliche Einstellungen und Befehle interpretiert.

Hier ist der Befehlssatz:

BlueTooth Modul

Befehl Funktion
RINGBT_Modul: ruft -> ATMega: ATA
CONNECTBT_Modul: Verbunden -> ATMega: schaltet auf Terminal-Befehle
NOBT_Modul: Verbingung getrennt -> ATMega: schaltet auf BlueTooth-Befehle
PAIRBT_Modul: Neue Verbindung -> ATMega: Verbindung speichern
ERRORBT_Modul: Syntaxfehler -> ATMega: n/a

Terminal allgemein

Befehl Kurz Funktion Parameter
SELUARTUAuswahl des Befehlssatzes1-Terminal,2-BlueTooth
WRITEWSpeichern im EEProm-
RECALL RLesen aus dem EEProm-
GETINFOI?Sende Info im Klartext-
GETVALUEV?Sende Interne Werte0-prNone,1-prCMDReady,2-prGOff,3-prGSca,4-prGValsH,5-prTrim,6-prSValsH,7-prSVals,8-prInfo,9-prMatrix,10-prHexMove,11-prHexShow,12-prSLength,13-prHexTrim,14-prServoMode
SETFLASHFLBlitzlicht0-automatisch,1-immer ein

Terminal Servo, PWM

Befehl Kurz Funktion Parameter
SETSERVOMODESM Betriebsmodus0-SelfAxTest,1-RemoteAx,2-SelfDemo,3-SelfHexaGyro.4-RemoteHexa,5-RemoteHexaGyro
SETSERVOAVERRAGESA PWM-Glättung(0-5)
SETSERVOMINVALSMIN globale min PWM (0-500)
SETSERVOMAXVALSMAX globale max PWM (0-800)
SETSERVOPWMOFFSETSO globaler PWM-Offset(0-500)
SETSERVOVALPERIODSV Berechnungsperiode [ms](0-1000)
SETPWMPERIODSP PWM-Periode [ms](5-25)
SETSERVODIRSD Drehrichtung der Servosp0:Kanal(0-7) p1:Richtung(1,-1)
SETSERVOPINSC Pinmaske für Servokanalp0:Kanal(0-7) p1:Maske(0-255)
SETHEXATRIMHT Trimmung Hexapodp0:Freiheitsgrad(0-5) p1:Wert(float)
TRIMSERVOST Tipmode Trimmungdanach: +,-,p,l,ESC(Abbruch)
SETSERVOSENSESS Empfindlichkeit Sensoren->PWM(float)
SETSERVOCHNMINSCMIN Kanal min Wertp0:Kanal(0-7) p1:Wert(0-500)
SETSERVOCHNMAXSCMAX Kanal max Wertp0:Kanal(0-7) p1:Wert(0-500)
SETSERVOCHNVALSCV Kanal Stellwert(0-500)
SETSERVOCHNVALSSCVS Alle Kanälep0..p7:Stellwert(0-500)
SETSERVOVALSMINSCVSMIN Alle Kanäle auf min-
SETSERVOVALSMIDSCVSMID Alle Kanäle auf Mitte-
SETSERVOVALSMAXSCVSMAX Alle Kanäle auf max-
NULLPPN Nullen der Plattform-

Terminal ADC, Sensoren

Befehl Kurz Funktion Parameter
SETADCAVERRAGEAA Glättung Sensorwerte(0-5)
SETADCPERIODAP Samplerate [ms](1-1000)
SETGSELECTGA Empfindlichkeit Sensoren(0-1.5g, 1-6g)
NULLGVALGN Nullung Sensorachsenp0:Achse(0-5)
SCALEGVALGS Scalieren Sensorachsenp0:Achse(0-5) p1:Wert(float)
PRINTGVALCONTGP Dauernde Ausgabe SensorwerteAbbruch mit ESC

Fazit:

Alles in allem: Mal wieder eine kleine lustige Aufgabe!

Downloads:

Hex-File: Atmega32 BlueToothHexapod05.hex
Rom-File: Atmega32 BlueToothHexapod05.rom
Eagle-Board: BlueToothHexapod05.brd
Eagle-Schaltung: BlueToothHexapod05.sch
Android-APP(API-Min-Level:8): BluetoothHexapod.apk