by Robotis

Connect and control Robotis Dynamixel Servos to ARC. This open-source plugin converts the Virtual Servo ports on ARC (v0-v99) to control Robotis Dynamixel Servos.

How to add the Dynamixel robot skill

  1. Load the most recent release of ARC (Get ARC).
  2. Press the Project tab from the top menu bar in ARC.
  3. Press Add Robot Skill from the button ribbon bar in ARC.
  4. Choose the Servo category tab.
  5. Press the Dynamixel icon to add the robot skill to your project.

Don't have a robot yet?

Follow the Getting Started Guide to build a robot and use the Dynamixel robot skill.

How to use the Dynamixel robot skill

Connect and control Robotis Dynamixel Servos with ARC, including Arduino and Robotis controllers. This open-source plugin converts the Virtual servo ports with any EZ-B (v0-v99) to control Robotis Dynamixel Servos. The servos supported are XL-320, AX-12, and XL430 compatible protocols. Dynamixel Servos are very different than regular hobby PWM servos. Firstly, they are considered much more professional due to their design specifically for use in robotics. Each Dynamixel servo contains a microprocessor. The microprocessor is told what position to move the servo into over TTL at the configured baud rate. 

ARC Capabilities

ARC has many parameters that can be assigned to servo movements. When selecting a servo, these parameters are specified by script commands or in the Advanced menu of robot skills. This skill supports the following ARC parameters...
- servo position
- Speed
- Release
- Velocity
- Acceleration

User-inserted image

User-inserted image

Cable Accessory

This plugin requires a cable accessory to connect your servo to the EZ-B easily. If you desire to READ servo positions, the cable will include both RX and TX. There are instructions below for connecting the servo to READ positioning.
User-inserted image

EZB Controller Types

There are a few different EZB controllers that each have their hardware configuration. We cover the controllers and what UART should be used below.

EZ-Robot IoTiny
The IoTiny does not have a hardware UART, so it cannot read servo positions. This means you can use any digital ports to transmit servo positions to the servo. Connect any digital port of the IoTiny to the signal wire of the dynamixel connector.

Arduino/EZ-Robot EZB v4 Wiring For Reading Positioning
Using this diagram, you will have to wire the servo to these controllers manually. You must connect TX and RX ports to read servo data with bi-directional communication. On the EZ-Robot EZ-B v4, it’s port D5 (TX) and D6 (RX) for UART #1 together. 

User-inserted image

Robotis Open CM9.04 Controller
The Robotis Open CM9.04 controller can support servos connected directly to itself or through the expansion board. If using only the controller, the UART #0 is used in ARC. If using the expansion board, UART #2 is used in ARC.

Robotis OpenCR Controller
The Robotis OpenCR controller can support servos connected directly to the onboard connectors. This uses UART #2 in ARC, selecting UART #2 in the dynamixel robot skill config.

UART/Serial Port Overview

There are a few options for connecting the Dynamixel servos covered above. Here is a summary...

1) EZB controllers without hardware UART (such as IoTiny) will use software serial pins for transmitting servo positions only. They cannot read servo positions. With this setup, you can use any digital port.

2) EZ-Robot EZ-B v4 or Arduino Mega is UART #1 (port D5 & D6). But depending on how many UARTs EZB has, you can connect to any UART.

3) Robotis Open CM 9.04 without expansion board uses UART #0.

4) Robotis Open CM 9.04 with expansion board uses UART #2.

5) Robotis OpenCR uses UART #2.


Most Dynamixel servo documentation states the operating voltage in the manual. Check the documentation for your dynamixel servo model to ensure your power source is sufficient. If you experience unusual behavior of Dynamixel servos, the first common issue is insufficient to power. 

Servo ID

The Dynamixel Servos each have a unique ID. Because they are chained together through one cable, each servo must be given a unique ID. Servos with the same ID will respond to the same commands and mirror their behavior. New Dynamixel Servos come pre-configured with the ID of 01. servo V0 relates to dynamixel ID:0, V1 is dynamixel ID:1, v2 is dynamixel ID:2, and so on...

Using this configuration utility, you can assign new ID's to servos. You may also test the servo to ensure the ID was successful.

Servo LEDs

The LEDs on the dynamixel servo can be controlled using the EZ-Script ControlCommand(). View the Cheat Sheet to see the available ControlCommand syntax for the Dynamixel plugin when editing a script.

Control Commands

This robot skill supports several control commands. The most useful are the WriteRam commands. These allow the user to send a command directly to the servo RAM. These control commands are not required to use this robot skill, as these are added for advanced users. To use the robot skill and move servos, follow the instructions on this manual page to assign Dynamixel servos id's to ARC Vx servos.


controlCommand("Dynamixel", "SetLED", Port, true|false);
controlCommand("Dynamixel", "TorqueEnable", Port, true|false);
controlCommand("Dynamixel", "WriteRamByte", Port, Address, Value);
controlCommand("Dynamixel", "WriteRamInt32", Port, Address, Value);
controlCommand("Dynamixel", "WriteRamUInt16", Port, Address, Value);

1) The Address and Value can be referenced using the servo Control Table. Please find the list of Dynamixel Servos HERE to access their control table specifications.

2) Each WriteRam ControlCommand() specifies the size of the value. This is because control table addresses will require a value size (byte, int32, uint16). Check the control table command manual for the variable size it accepts.

For example, this command will set the goal position of an AX-12 servo on port V1 (id 1) to 512.


controlCommand("Dynamixel", "WriteRamUInt16", v1, 30, 512);

The parameters you will need for the control commands are identified in the image below when viewing the control table. Notice the SIZE parameter, which determines the WriteRamXXXX to use. If the size is 1, the WriteRamByte will be used. If the size is 2, the WriteRamUInt16 will be used. If the size is 4, the WriteRamIn32 will be used. 

The address and value range are also displayed in the control tables.
User-inserted image

Video Demo With Robotis Arm

This video uses a Robotis Dynamixel arm and XM430 servos with an OpenCM9.04 controller. 

Troubleshooting Dynamixel Servos

If the servos are not responding, verify the physical connection is correct. Next, confirm adequate power is provided to the servo. Verify that this robot skill config selected the servo ID and right type.

If the XL430 or similar type servo is not responding, the torque may be disabled. This can be force-enabled by using the ControlCommand() or releasing the servo. When the servo is released, it will automatically allow torque once the servo is instructed to move.

The configuration window of this robot skill has some tools for diagnosing the connection. You can use these diagnostic tools to verify a bi-directional communication with the servo. For example, you can use the PING or READ servo POSITION to confirm that the servo communicates bi-directional with the EZB.

User-inserted image

Step by Step Instructions

Once you have the servo wired and sufficient power is provided, you can use any control in ARC that uses servos. This means it will work with Auto Position, Camera, WiiMote, Joystick, and more. This example will show you how to move a dynamixel servo with generic servo control. Before following these steps, ensure you have this plugin installed.

Step 1
Load ARC

User-inserted image

Step 2

Connect to your I/O controller

User-inserted image

Step 3

Add the control by selecting the Project tab and Add Control.

User-inserted image

Step 4

Navigate to the servo tab and select Dynamixel. If the plugin has been successfully installed, you will see the Dynamixel plugin in the list.

User-inserted image

Step 5

The Dyamixel control will be added to your project. Press the Config gear icon to load the configuration screen.

User-inserted image

Step 6

Enter the baud rate that matches your servo configuration. The servos have a baud rate specified or a default baud rate shipped from the factory. If you need to change the baud rate of the servo, use the Dyanmixel utility. You cannot change the baud rate of the servo in ARC. This value is the baud rate that the EZ-B will use to communicate with the dynamixel servo. This must match the baud rate of the servo.

User-inserted image

Step 6a

Specify what port the servo is connected to on the controller. It is essential to follow this recommendation. The plugin has blue question boxes (and throughout the ARC software) to assist your robot development. It is recommended to use the blue question marks and read the content to understand what options do.

User-inserted image

Step 7

Each dynamixel servo will have a unique ID. Enable each ID for the servos by checking the respective box. When an ID is checked, the ARC software will use the Vx (virtual servos) corresponding with that ID. For example, if you enable Dynamixel servo ID #2, the ARC V2 servo will control it. Also, specify the protocol version of the servo. Different dynamixel models will use one of the two protocols. Consult the datasheet of the dynamixel servo to know what protocol it uses -or- contact Robotis for more information on using their product. To get the servo's full resolution, ensure you have entered the MAX resolution for that servo model. Each model has different resolutions, or it can be configured using the Dyanmixel utilities.

User-inserted image

Step 8

After you have enabled your servos, press Save

User-inserted image

Step 9

We will show you an example of how the servo can be moved. We will do this by using a generic horizontal servo control. Press Project -> Add Control to return to the add control menu. Navigate to servo and select Horizontal Servo. Remember, any control in ARC that uses servos can now control dynamixel servos by the respective Vx (virtual) servo ID.

User-inserted image

Step 10

Press the GEAR icon to configure the horizontal servo control.

User-inserted image

Step 11

To configure this control to use a virtual servo, select the servo to bring up the port dialog. This applies to all controls in ARC that use servos.

User-inserted image

Step 12

Select the Virtual servo ID for your dynamixel servo from the list and press Close.

User-inserted image

Step 13

Now use the sliders to specify the Min and Max position you wish this servo to move and press Close.

User-inserted image


You can now control the dynamixel servo with the horizontal servo control. To find out more about servos, consult the learn section of this website to use your Synthiam product.

Related Tutorials

Related Hack Events

Related Questions


Upgrade to ARC Pro

Synthiam ARC Pro is a cool new tool that will help unleash your creativity with programming robots in just seconds!

The ezb baudrate and servo baudrate can be different. It’s okay because they’re different ports on different connections. 

dtr and rts only need to be enabled if the ezb won’t connect at all. If the ezb is connecting, then it’s golden. 

I’ll take a peek to see if the previous changes would affect anything. Stay tuned
This might help you guys...
I did some line sniffing and found that the Torque Enable command in the Cheat Sheet doesn't actually send anything down to the Dynamixel that is readable by the Dynamixel wizard.
My workaround was to use this line of code instead.


controlCommand("Dynamixel", "WriteRamByte", V1, 64, 1);
register 64 torques on the servo when it gets a 1 value and torques it off when it gets a 0.
This got my servo torqued ON and working, but I am pretty sure that before the servos torqued on from the start and didn't require this step.

Either way I'm back in business while you have time to look up the bug.
Ya they used to torque from startup. Strange they’re not. Thanks for debugging that because it’ll help.
A bug was introduced from an optimization in the ezb servo library which caused the torque to not enable when the servo was released. This has been resolved and will be included in tonight's release

I am trying to connect my Dynamixel servo directly to my EZ-B4 and the skill is not able to connect to the servo. I have the servo signal connected to EZ-B4 pins D5 and D6, I have the servo power connected to EZ-B4 D5's power pin, and the ground connected to EZ-B4 D5's ground pin. I am supplying 11 volts. I connected to the EZB4 and verified it was connected. I checked the power and the ground at the connector. I added the Dynamixel skill and set the UART Port to #1 option. The baud rate is 1000000 on the settings page and 57600 on the Utilities page. I enabled V1. I tried scanning for sensors and nothing. I tried pinging the sensor and nothing. I tried increasing the board to 1000000 on the Utilities, but it seems that was not allowed by the skill. I have been working at this for over 4 hours and still nothing. I went through the tutorial line by line. I read the community support until my eyes got blurry. I updated my Synthiam software to version 2022.01.17.00. Any suggestions? :( (frustration)

User-inserted image
Sorry. I found my problem 30 seconds after I posted.:D I'm good for now. :):):)
Haha what was the issue?
I had the ground and the signal wires switched. That’s the problem with doing robotics at 3 AM!
Ooooh i hear you on that one! I was doing the same last night - fighting with code until i realized i should just sleep
LOL!xD Are roboticists allowed to sleep? 

Ps. Who would I talk to about the possibility of licensing ARC software so that I can sell my code commercially?
I have gotten the movement of my 5 robot arm servos working well. Now I am attempting to read the position of each servo using


before I move them so that I don't strip a gear when they are too far in the wrong place. The problem I see is that when I first connect to the EZ-B4 and the servos, the positions read as "0" until I move each servo. That doesn't help me. I want to read the servo position BEFORE I initialize each servo. Is this possible?  --Thanks!
#76   — Edited
And you have the TX and RX wires connected to the EZB? Here's the image from the manual above

User-inserted image

You can also see if you have it connected by using the diagnostics in the robot skill's config screen...
User-inserted image
Yes, I have the two wires connected properly and when I click the "read position" button  in Utilities it reads the "raw position" in in real time. When I try to get it from (Python) code, I just get "0". If I move the servo even a little, only then can I read the position. 

You can see that in the console V1 and V2 have a number. That is because I FIRST incremented them. V3, V4, and V5 show 0. I haven not yet moved them and they are NOT at 0. If only I could get the "raw position"! 

User-inserted image

User-inserted image
#78   — Edited
Try updating to the latest robot skill version. I made a change that should fix it. There's also a performance improvement as well

User-inserted image
Hello DJ. Thanks!

I found that it works for "GetPositionRealtime" but not for "GetPosition". Is that the way it is supposed to work? 

Also, do I get a $100 credit added to my Synthiam credit balance for finding this issue?:)
I get $100 credit for doing the work to fix it:D 

You can read the difference between the two commands. But real-time is for bi-direction communication. 

Since you're using python, here's the manual in the support section for python commands:

You'll find the documentation for those commands on that link
#82   — Edited
..sigh..I'm back here again. I'm having issues with alan and alena dynamixels. I've not turned them on for prolly 1 year or more. I can say that i am connected to the heads and they move for 1/10 of a second then stop (eyes work fine which are standard servos). So at least I know that the connection is working . Since the last time i fired them up, I can tell there have been several revisions to the plug in and something has changed that is causing this problem.

I am still on uart #1 for EZB on D5. The baud rates haven't changed. Its set for Ax-12 protocol for the DYNAMIXEL MX-64T. I cant see what else might have changed. Could it be the addition of the acceleration or some other addition?

I am on current version of ARC and updated all the plug ins.

Thanks in advance for any help trouble shooting.

Edit****see below****
#83   — Edited
After messing around with it after dinner I had success. I went into the servo settings for the dynamixels (in my case the servo pad settings) and click on all three velocity/acceleration and speed settings (-1). I just clicked on them and they changed from red to black then saved. This for some reason got the servos moving again. Not sure why that would happen?! But was not the dynamixel servo plug in but rather how ARC sets up the virtual servo controls with the dynamixels. I'll have to check and see if after I save the project and reload will the dynamixels work or will i need to do this pattern to fix it each time.

User-inserted image

****Edit: Saving the the project after doing above fixes the issue..i might have to do this for all my project files?!