Table of Contents
Motivation
Wer sich mit dem Thema Robotik beschäftigt, stolpert früher oder später über die Motoren der Firma Robotis.
Sie tragen den interessanten Namen “Dynamixel”.
Dyna”: Dieser Teil des Namens stammt von “Dynamik” oder “dynamisch”, was auf die Fähigkeit des Servomotors hinweist, präzise und reaktionsschnelle Bewegungen auszuführen.
“Xel”: ist eine Abkürzung für “Excel” (englisch für “hervorragend” oder “übertreffen”).
Es soll die hohe Qualität und Leistungsfähigkeit der Servomotoren betonen.
Aber wir schauen erstmal, was uns erwartet.
Das Dynamixel Shield
Das Dynamixel Shield ist ein Arduino Shield von Robotis, das die Ansteuerung der Dynamixel Motoren ermöglicht. Es passt auf den Arduino Uno und den Arduino Mega.
Um das Shield in Betrieb zu nehmen, muss an die Klemmen eine Spannungsquelle mit 6,5 bis 12 Volt angeschlossen werden.
Dafür muss auch der Jumper entfernt werden.
Der Motor wird über ein drei-poliges Kabel mit einem TTL-Konnektor verbunden.
![](https://creatronix.de/wp-content/uploads/2024/06/dynamixel-shield-5-1024x504.jpg)
Installation der Software
Das Dynamixel Shield kann über die Arduino IDE installiert werden. Wir suchen im Library Manager nach Dynamixel und wählen das DynamixelShield von Robotis aus. Als Abhängigkeit wird auch gleich die Dynamixel2Arduino mitinstalliert.
![](https://creatronix.de/wp-content/uploads/2024/06/dynamixl-lib-1024x603.png)
Code
Um das Shield anzusprechen, müssen wir den Header inkludieren:
#include <DynamixelShield.h>
Werksseitig haben die Motoren alle die ID 1
const uint8_t DXL_ID = 1;
Die Baudrate beträgt standardmäßig 57600 Baud
const uint32_t BAUDRATE = 57600;
Wir benutzen die Protokollversion 2.0
const float DXL_PROTOCOL_VERSION = 2.0;
Wir erzeugen uns ein globales Shield-Objekt, über das wir mit dem Dynamixel-Motor kommunizieren.
DynamixelShield dxl;
Setup
In der setup-Funktion setzen wir die Baudrate und die Protokollversion:
dxl.begin(BAUDRATE);
dxl.setPortProtocolVersion(DXL_PROTOCOL_VERSION);
Mit der ping-Methode können wir feststellen, ob der Motor reagiert. Wenn ping true zurückliefert, können wir den Betriebsmodus setzen. Wichtig ist, dass wir vorher den torqueOff-Befehl aufrufen, damit der Motor während der Konfiguration nicht bewegt werden kann. Dies ist eine Vorsichtsmaßnahme und soll Schäden am Motor verhindern aber auch Fehlverhalten, dass bei größeren Geräten Personen gefährden könnte.
Für unser Beispiel nutzen wir den Velocity-Modus, da wir die Motoren als Antrieb für unseren Ballchaser-Roboter verwenden werden.
if(dxl.ping(DXL_ID) == true){
dxl.torqueOff(DXL_ID);
dxl.setOperatingMode(DXL_ID, OP_VELOCITY);
dxl.torqueOn(DXL_ID);
}
Loop
In der loop-Funktion können wir nun die Geschwindigkeit auf drei verschiedene Arten setzen:
- RAW
- RPM
- Percentage
Der RAW-Modus spricht den kompletten Wertebereich des 10-Bit-Wandlers an. Das heißt wir können Werte von 0 bis 1023 verwenden. Negative Werte ändern die Drehrichtung. Insgesamt können wir damit von -1023 bis 1023 gehen.
dxl.setGoalVelocity(DXL_ID, 200.0, UNIT_RAW);
RPM-Modus: Hier werden echte Umdrehungen pro Minute angegeben.
dxl.setGoalVelocity(DXL_ID, 25.8, UNIT_RPM);
Das kann sinnvoll sein, wenn man unabhängig von der Betriebsspannung Drehgeschwindigkeiten erreichen will.
Prozent-Modus: Prozentwerte bieten eine einheitliche Skala von 0% bis 100%, was die Steuerung intuitiver macht.
dxl.setGoalVelocity(DXL_ID, -10.2, UNIT_PERCENT);
Upload
Zum Upload des Codes muss der kleine Schalter des Shields auf “Upload” gestellt werden und der große sollte auf “Off” stehen.
![](https://creatronix.de/wp-content/uploads/2024/06/dynamixel-shield-3-1024x682.jpg)
![](https://creatronix.de/wp-content/uploads/2024/06/dynamixel-shield-4-1024x768.jpg)
Betrieb
Für den Betrieb werden die Schalter wieder auf die Position “On” und “Dynamixel” gestellt.
Vollständiger Code
#include <DynamixelShield.h>
const uint8_t DXL_ID = 1;
const uint32_t BAUDRATE = 57600;
const float DXL_PROTOCOL_VERSION = 2.0;
DynamixelShield dxl; void
setup() {
dxl.begin(BAUDRATE);
dxl.setPortProtocolVersion(DXL_PROTOCOL_VERSION);
if(dxl.ping(DXL_ID) == true){
dxl.torqueOff(DXL_ID);
dxl.setOperatingMode(DXL_ID, OP_VELOCITY);
dxl.torqueOn(DXL_ID); }
}
void loop() {
dxl.setGoalVelocity(DXL_ID, 200.0, UNIT_RAW);
delay(1000);
dxl.setGoalVelocity(DXL_ID, 25.8, UNIT_RPM);
delay(1000);
dxl.setGoalVelocity(DXL_ID, -10.2, UNIT_PERCENT);
}
Quellen
https://emanual.robotis.com/docs/en/parts/interface/dynamixel_shield/