Controlling Dynamixel servomotors
Wiring
The code was tested with the following circuit:
Connection test
mbed sends a Ping packet and waits for the response from the Dynamixel.
Dynamixel to mbed connection test
#include "mbed.h"
// From Dynamixel instruction set
const unsigned char PING = 0x01;
void pingDynamixel(uint8_t);
// Half duplex Asynchronouse serial communication
// 8 bit, 1 stop, No parity (mbed default config)
Serial dx116(p13, p14);
// Control pin for the half duplex communication
DigitalOut TxEnable(p15);
Serial pc(USBTX, USBRX);
int main()
{
TxEnable = 0; // Disable Tx/Enable Rx
const uint8_t motorID = 0x01; // Dynamixel ID
const int dynamixelBR = 57600;
dx116.baud(dynamixelBR);
pc.baud(9600);
pc.printf("Request status packet from ID #%x\n with %d bps", motorID, dynamixelBR);
pingDynamixel(motorID);
while(1) {
if (dx116.readable()) {
pc.printf("0x%x\n", dx116.getc()); // Read status packet if available
wait_ms(100);
}
wait_ms(5);
}
}
void pingDynamixel(uint8_t myID)
{
uint8_t elements = 6;
uint8_t packetBuffer[elements];
if (dx116.writeable() ) {
packetBuffer[0] = 0xff;
packetBuffer[1] = 0xff;
packetBuffer[2] = myID; // ID
packetBuffer[3] = 0x02; // Length
packetBuffer[4] = PING; // Instruction
packetBuffer[5] = ~(packetBuffer[2] + packetBuffer[3] + packetBuffer[4]) & 0xFF; // Check sum
// Send instruction packet
TxEnable = 1; // Enable Tx / Disable Rx
for (int i = 0; i<= elements; i++) {
dx116.putc(packetBuffer[i]);
}
wait_ms(1); // fix this!!!
TxEnable = 0; // Disable Tx / Enable Rx
} else {
pc.printf("Dynamixel not writeable\n");
}
}
Import programdynamixel_pingTest
mbed to Dynamixel ping test.
The coding conventions of the library might not be appropriate and many methods are missing but it is usable.
Example using the library
#include "mbed.h"
#include "Dynamixel.h"
int main()
{
Dynamixel DX116(p13, p14, p15, 9, 57600);
DX116.toggleLED(1);
wait(0.5);
DX116.toggleLED(0);
DX116.move(0);
wait(1);
DX116.move(1023);
}
Import programdynamixel_test
Tested on RX-24F and DX116.
Import programdynamixel_pingTest
mbed to Dynamixel ping test.
The coding conventions of the library might not be appropriate and many methods are missing but it is usable.
Example using the wheel mode
/*****************************************************
- Description: mbed to Dynamixel connection test using
the library
- Requirements:
Dynamixel (i.e. DX116, RX28)
MAX3088/MAX485 (RS485 transceiver)
- Connections:
MAX3088 -- mbed
======================
Pin 1 -- Pin 14
Pin 2 -- Pin 15
Pin 4 -- Pin 13
- Comments:
See schematic for wiring details and class
documentation for available methods.
*****************************************************/
#include "mbed.h"
#include "Dynamixel.h"
DigitalOut debug1(LED1);
DigitalOut debug2(LED2);
DigitalOut debug3(LED3);
DigitalOut debug4(LED4);
int main()
{
debug1 = 0;
debug2 = 0;
debug3 = 0;
debug4 = 0;
Dynamixel motor2(p13, p14, p15, 1, 57600); // TX, RX, TX_ENABLE, MOTOR_ID, BD
/**************************
*** Check communication ***
**************************/
motor2.toggleLED(1);
wait(1);
motor2.toggleLED(0);
/**************************
***** Set max angles *****
**************************/
motor2.setAngleLimit(0, ADDRESS_CW_ANGLE_LIMIT);
wait(0.5);
motor2.setAngleLimit(0, ADDRESS_CCW_ANGLE_LIMIT);
wait(0.5);
/**************************
******** Set speed ********
**************************/
motor2.setSpeed(50); // 0-1023 CW
debug1 = 1;
wait(2);
motor2.setSpeed(2000); // 1024-2047 CCW
wait(2);
debug2 = 1;
motor2.setSpeed(0);
}
Import programdynamixel_wheel_test
Tested on MX-28
Troubleshooting
If the servos do not respond, make sure you're using the right ID and baudrate values.
Please log in to post comments.
