Forum: Mikrocontroller und Digitale Elektronik AX-12 Servos - Problem mit dem Statuspacket


von Marius S. (one-man-army)


Lesenswert?

Hi!
Ich beschäftige mich seit nun mehr einer Woche mit Dynamixel AX-12 
Servos. Zur zeit versuche ich das Statuspaket auszulesen, also das was 
der Servo antwortet.
An den µC sind 6 Servos über einen Bus angeschlossen und ich sende ihnen 
die Befehle per UART. Sie antworten dann logischer Weise auch über den 
selben Weg.
Und jetzt zum Problem:
Laut der Dokumentation sieht das Statuspaket wie folgt aus:

0xFF|0xFF|ID|Länge|Fehlercode|Parameter 1 ... Parameter N|Checksum

Allerdings habe ich nun das gesamte Paket auf einem Display anzeigen 
lassen und es stimmen ein paar Werte nicht. Das erste wäre, dass die ID 
nicht mit der ID des angesprochenen Motors übereinstimmt. D.h. ich sage 
dem Motor mit der ID 1, er soll sich auf eine bestimmte Position 
bewegen, im Statuspacket kommt allerdings die ID 2 (aber manchmal auch 
utopische Zahlen) zurück.
Das nächste Problem kommt bereits bei der Länge des Paketes. Dort wird 
im Falle des Einstellens einer Position am ersten Motor die Paketlänge 
von 69(dez) zurückgegeben. Als ich es mit dem 2. Motor versuchte kam die 
Paketlänge von 68(dez) zurück. Bei dem 3. Motor kam die Packetlänge von 
67(dez) zurück usw. Beim Auslesen einer bestimmten Position kam sogar 
die Paketlänge von -3(dez) zurück.
Bei den nachfolgenden Zahlen, gibt es zwar auch Probleme, allerdings 
würde ich dies auf die falsche Länge zurückführen, da dann das korrekte 
Lesen des Paketes nicht funktionieren dürfte.

Kennt sich hier jemand mit diesen Servos aus? Ich habe in anderen 
Threads, dass sich scheinbar ein paar Leute mit ihnen beschäftigen. 
Vielleicht könnt ihr mir ja sagen, was mit den Servos incht stimmt, oder 
vielleicht auch, was ich in meinem Programm beachten muss.
Danke schonmal für jeden Versuch zu helfen.

MfG

von avion23 (Gast)


Lesenswert?

Chars sind default signed. Also unsigned uint8_t zum speichern 
verwenden.
Welche baudrate? Welcher Takt? Welcher µC? Welcher Pegelwandler? 
Beispiel hexdumps posten, daneben das was du erwartest.

von Marius S. (one-man-army)


Lesenswert?

Ok. Dann versuch ich das mal alles zu beantworten^^
Ich sende alles in uint8_t also da liegt eig kein Fehler. Schließlich 
bewegen sich die Servos ja auch. Das ist halt auch ein wenig komisch, 
trotz angeblich vorhandenem Fehler machen sie das was sie sollen.
Als Baudrate benutze ich 1000000, daher auch der Display und kein 
Terminalprogramm (HTerm geht nicht so schnell). Der µC ist ein ATMega32. 
Was für einen Pegelwandler ich habe weiß ich ehrlich gesagt grad gar 
nicht. Also ich hab mein Board mit dem ATMega32 drauf und die Servos 
sind vor dem USB Ein-/Ausgang angelötet. Dort fangen sie einfach die 
Befehle die über USB raus sollen ab und führen sie aus.

Als Beispiel kann ich folgendes geben:
Ich sage dem Servo 1, er soll mir seine derzeitige Temperatur melden. 
Der Befehl sieht so aus:

0xFF|0xFF|0x01|0x04|0x02|0x2B|0x01|0xCC

Man nehme an, der Servo hat gerade eine Temperatur von 32 C°, also 
müsste die Antwort so lauten:

0xFF|0xFF|0x01|0x03|0x00|0x20|0xDB

Die Tatsächliche Antwort ist allerdings wie folgt:

0xFF|0xFF|0x01|0xFB [-5(dez)]|0x04|0x00|0x04|0x5F

Wie man sieht ist der Anfang in Ordnung. In diesem Fall stimmt auch die 
ID, allerdings gibt es Probleme mit der Länge und Programmbedingt, kann 
danach nichts mehr funktionieren. Das heißt ab dem 4. Byte ist die 
Ausgabe sehr wahrscheinlich nicht mehr, dem Statuspaket entsprechend.

edit:
Hab den Takt noch vergessen: 16MHz

von avion23 (Gast)


Lesenswert?

Gut, ich habe keine Ahnung wo der Fehler liegen könnte. Aber ich kann 
dich bestätigen:
- 16MHz sind gut
- Checksummen sind auch schon in Ordnung. Trick: Checksum berechnen geht 
gut über aufsummieren inkl. der invertierten checksum, dann muss 0xff 
rauskommen.
- letztes Packet stimmt überhaupt nicht

Dein
>Das ist halt auch ein wenig komisch,
>trotz angeblich vorhandenem Fehler machen sie das was sie sollen.
macht mich etwas skeptisch: Vielleicht sind die Daten korrekt, nur das 
Display zeigt Müll an?

>Als Baudrate benutze ich 1000000, daher auch der Display und kein
>Terminalprogramm (HTerm geht nicht so schnell).
Schonmal ausprobiert direkt die 1000000 ein zu tippen und dann enter? 
Linux oder Windows? Welcher usb-seriell wandler? Wenn ftdi dann ist 
1Mbit möglich.

Das
>Also ich hab mein Board mit dem ATMega32 drauf und die Servos
>sind vor dem USB Ein-/Ausgang angelötet.
ist mir noch überhaupt nicht klar. D.h. du hast einen Rechner, von dem 
aus du die Kommandos schickst und sozusagen mit dem atmega32 und dem 
display sniffst? Wenn ja, wie schnell? Ich hatte oft erst die richtigen 
Probleme wenn der Bus voll belegt war. Wie bekommst du denn den Pegel 
auf der Datenleitung hin? Wie schaltest du um zwischen senden und 
empfangen?

Ich würde versuchen das ganz systematisch durch zu gehen.
1. werden Daten korrekt gesendet und vom servo übernommen 
(wahrscheinlich ja?)
2. werden Daten korrekt vom Servo gesendet? (->nein)
  2.1 womit ausgelesen? Display korrekt?
  2.2 Pegel korrekt? Verbindungen korrekt? Selbe Masse!
  2.3 Programm korrekt?
...
Ich kann dir wie du merkst nicht so richtig helfen, nur laut mit denken. 
Gib mal neuen Input

von Marius S. (one-man-army)


Lesenswert?

Hi!
Sorry dass ich mich erst jetzt wieder melde, aber war ein bisschen 
schwieriger wieder an inet zu kommen.^^

Zuerst mal danke, für die antwort. Allerdings bin ich auch nur nochmal 
da um zu sagen, dass sich das ganze geklärt hat.

Ich klär am Besten trotzdem mal die unklarheiten auf^^
Was die richtige Funktionsweise trotz Fehler angeht, hab ich keine 
Ahnung weswegen es so war, aber die anderen beiden Sachen kann ich 
erklären.

Das mit der Baudrate ist mir genau nachdem ich den beitrag abgeschickt 
aufgefallen, bzw erklärt worden. Man muss halt zumidnest bei Windows 
immer eine Zahl in das Fenster für die Baudrate eingeben, dann springt 
HTerm allerdings wieder zu Connect. Dann wieder in das Fenster klicken 
und wieder eine Zahl. Hterm springt wieder zu Connect. So Spitzfindig 
muss man halt auch erstmal sein -.-

Und nun der Aufbau. Ich hatte den ATMega ganz normal über USB an den PC 
angeschlossen um ihn zu programmieren. Das Programm selbst läuft 
allerdings komplett unabhängig vom PC. Damit die Servos angesteuert 
werden können, sind die zwischen USB und Microcontroller angeschlossen. 
So können sie ohne Probleme den UART auslesen (bzw sie machen es auch 
immer, daher auch nur bedingt eine Kommunikation mit dem PC möglich). Um 
nun den Servo anzusteuern werden im Programm ganz normal die Befehle in 
Form von Char an den UART geschickt. Dieser glaubt zu dieser Zeit mit 
dem PC zu sprechen, allerdings spielt der Servo sozusagen 
Man-In-The-Middle. Wenn der PC angeschlossen ist kann es sogar mit dem 
Probleme geben.

Was jetzt in meinem Programm das eigentliche Problem war:
Es werden um die Servos anzuschließen 4 Pins benötigt. (Masse, Plus, 
Daten-In, Daten-Out) In meinem Fall waren die Pins für Daten-In bzw 
Daten-Out  aneinandergeschlossen, warum weiß ich nicht genau, aber das 
versuche ich noch in Erfahrung zu bringen. Dadurch kam logischer Weise 
der Befehl einerseits durch den Daten-Out von µC an Servo, allerdings 
auch genauso an den µC selbst. Er hat also mitgehört, was er selbst 
gesagt hat. Da nun der Servo auch geantwortet hat, sind diese beiden 
Packete durcheinander geraten und konnten nicht mehr auseinander 
gehalten werden.

Ich hoffe dieser Text hilft wenigsten jemand anders nicht den gleiche 
Fehler zu machen ;)

MfG Marius Schmidt

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.