AX-12 Dynamixel Information

 

All the tricks and tips I have gleaned whilst using these servos - that isn't in the manual! 

Return to the home page of Robots Australia

Robots Australia Menu

Robots Australia Home 

Quadruped4 Robot

Biped Concept Discussion

Earlier Work

Robots Australia Blog on Blogspot

My Workshop 

Servos for Robotics 

Dynamixel AX-12 

Useful Links 

Contact Robots Australia

 

The Robotis Dynamixel AX-12 Servos represent really good value - they are reasonably low cost (compared to other digital servos anyway), have multidrop network communications, sensing and feedback of position and current draw (load), compliance and the ability to turn off the motor drive to allow 'teaching' by externally moving the servo position. These and many other features make the AX-12 a pretty good choice for small robots (generally under 2kg).

When I decided to use these servos for Quadruped4 I bought two servos from Tribotix to both learn about the usage, and also to test the limits, particularly the operating torque limits, as generally servo manufacturers only specify the stall or holding torque which is not that valuable in terms of physical robot design.

I have tested the available torque of a few other servos (see Servos for Robotics) using a simple technique based on bolting or clamping the servo motor to a platform, attaching a 700mm long lightweight length of aluminium channel to the servo horn such that the servo horn is in the centre of the length (equal weight on both sides), and moving a weight attached via a loop of wire over one side of the aluminium length. Sliding the weight further and further outwards from the servo whilst commanding the servo to move gives you a really good way of testing both the holding torque, and the actual torque you can expect the servo to deliver comfortably during use. When the servo starts to really struggle, you just measure the distance from the loop of wire holding the weight to the servo in the centre and calculate the torque from that. Of course this method requires that the aluminium beam holding the mass has to stay relatively horizontal,  so as to apply the full torque loading of the suspended mass, so only small servo movements can be tested.

AX-12 Tester Software

 I needed some way of communicating with the AX-12 Servos for testing purposes. Most people come into contact with the servo through the Robotis Bioloid robot kit, and therefore have the Robotis provided software and their onboard control module to handle the servos. Because of the TTL multidrop interface the AX-12's support, and the 1MBit data rate, I needed a little converter to allow desktop environment software to communicate directly with at least one servo. I re-tasked the PWM Servo Controller board (see Earlier Work) with some new software and a couple of little hardware mods to act as a pass-through converter, one UART acting as a 1Mbit/s TTL level port, and another communicating at 19200 baud through the onboard USB interface to the host computer. I wasn't trying for any performance here, just a working way to set registers within the AX-12. I wrote a little program called AX12Tester which allowed the servo position to be set by a control knob, and various registers to be read or written. This enabled me to test the behaviour of the servos and get a feel for using them in a real design.

Torque Limits and Voltage Limits of the AX-12

The torque is specified as final max holding torque of 16.5 kg.cm at 10V. I wanted to test what the operating torque limits where, operating torque being the maximum usable torque. I used the same test method I have used for a few other servos where I have a long arm made out of aluminium U channel positioned horizontally, hanging maybe 40cm on either side of the servo itself to counterbalance the weight of the arm. I then hang a weight on one side at various distances and see firstly whether the servo can hold the weight without too much droop and whether it can actually lift the weight when commanded to rotate the arm to a different angle. I also wanted to test whether the servo would withstand higher voltages than 10V, as I have seen a few indistinct references to wider specs for this device on the web (and the overvoltage defaults in the AX-12 are set to 19V). Ideally I was looking for the ability to run on 12.6V as this would represent a fully charged LiPo 3-cell pack.

I found that the limits seemed to be about 8.5kg.cm at 9.6V supply, however the unit would error and go into zero torque safety after a few steps back and forth between 134 deg and 127 degrees angle. I should mention the Ax-12 parameters were all defaults, I haven't really mucked around with the compliance etc. settings yet. At torque loading of 6kg.cm, shutdown didn't occur.

At 11.1V (3 cell LiPo nominal), it held but errored to zero torque after move at a load of  10kg.cm.

At 12.6V (3 cell LiPo max charge), held and could repeat move back and forth a few times at 8.8kg.cm, and held but errored into shutdown when commanded to move at 9.9kg.cm.

If the default values of the Ax-12 are right, then the zero torque safety shutdown would have been triggered by over temperature, which the defaults specify as 85 degrees. I haven't really done any work to verify this, the case was warm to the touch, but I suppose it was the h-bridge mosfets which were heating the pcb and temp sensor to this high temperature. Update: I later found that it was not the over-temp alarm which was causing shutdown, but instead the over current or load alarm. As an aside, after the zero torque error condition was entered, the datasheet says the condition should be able to be reset by turning on the torque again with address 0x18, torque enable, however I found this didn't work and I had to power off and on the servo to allow the torque to be re-enabled. Possibly the error condition had to be explicitly reset somehow as well.

Conclusion of this somewhat patchy testing is that the servos are generally usable with a torque loading of about 6 or 7 kg.cm, and use up to 12.6V seems to be ok.

AX-12 Register Quirks

Ok, I have done a little more experimentation on what effects different registers have on the Ax-12 operation, and collected a few notes on the Ax-12 behavour.  Firstly, I found that the default value of the Alarm Shutdown register 0x12 is 0x24 rather than 0x04 as specified in the manual. This means that the AX-12 by default will shutdown to zero torque condition on over temperature and over load (too high torque loading). I found that setting this register to 0x04 and then power cycling the unit (writing to any of the EEPROM register areas requires a power cycle to copy the values into the working RAM registers so they are applied) allows the AX-12 to produce more torque without shutting off. Mind you this allows the unit to be damaged (stripped gears etc) if you do use much more than about 10kg.cm of load. I found that when I loaded the servo with 10kg.cm and commanded the unit to move it flashes the LED indicating an overload condition, but now does not shutdown into zero torque mode like it used to with the factory defaults.

Also I looked at the 0x0F:0x0E register pair which contains the maximum torque setting (default 0x03FF). Setting this register pair to zero (and power cycling to apply the change) simply seems to mean the Ax-12 is always delivering zero torque, whether torque is enabled or not, so pretty useless. Also it seems there is a small bug in the AX-12 firmware if you attempt a READ_DATA command on register 0x0E asking for two bytes;

Reading maximum torque limit registers 0x0F:0x0E;

sent     <0xFF><0xFF><0x01><0x04><0x02><0x0E><0x02><0xE8>
got     <0xFF><0xFF><0x01><0x04><0x00><0xFF><0xF8>

which seems to be a bug, as it returns only 2 chars + the checksum after the length byte which is 0x04. Therefore it is missing a byte... It is only reading one register rather than the two it was asked for. The solution/workaround is to ask for the two registers 0x0E and 0x0F individually, which works fine.

repeating the READ_DATA command but only asking for single 0x0E register;

sent     <0xFF><0xFF><0x01><0x04><0x02><0x0E><0x01><0xE9>
got    <0xFF><0xFF><0x01><0x03><0x00><0xFF><0xFC>

returns the correct response according to the protocol.

Reading the 0x0F register (high byte of max torque limit);

sent    <0xFF><0xFF><0x01><0x04><0x02><0x0F><0x01><0xE8>
got    <0xFF><0xFF><0x01><0x03><0x00><0x03><0xF8>

When performing a WRITE_DATA to write to the 0x0F:0x0E register pair you can't individually write to each register 0x0E or 0x0F with a single byte operation - the Ax-12 returns bad range if you do. Instead you must perform the WRITE_DATA to both registers as a single two byte command, which works fine.