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
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.
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.