This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision Last revision Both sides next revision | ||
product:usb2ax:advanced_instructions [2013/04/02 05:41] xevel |
product:usb2ax:advanced_instructions [2015/02/04 00:22] xevel |
||
---|---|---|---|
Line 1: | Line 1: | ||
===== USB2AX: Advanced instructions ===== | ===== USB2AX: Advanced instructions ===== | ||
- | The USB2AX can react to some specific commands as if it were a Dynamixel device. | + | The USB2AX can react to some specific commands as if it were a Dynamixel device, and much more. |
---- | ---- | ||
Line 54: | Line 54: | ||
SYNC_READ is used for reading data from multiple Dynamixel actuators with one command. | SYNC_READ is used for reading data from multiple Dynamixel actuators with one command. | ||
This allows for a significant performance boost when reading the same values in a lot of devices. | This allows for a significant performance boost when reading the same values in a lot of devices. | ||
+ | |||
+ | An implementation in the DynamxelSDK library is availalbe in the [[https://github.com/Xevel/usb2ax/tree/master/pc_software/usb2ax_DynamixelSDK|GitHub repository]] | ||
**Warning: Various implementations of custom Dynamixel multiple-read commands named SYNC_READ can be found over the Internet, this one is based on the one found in the arbotix_python ROS package by Michael Ferguson. | **Warning: Various implementations of custom Dynamixel multiple-read commands named SYNC_READ can be found over the Internet, this one is based on the one found in the arbotix_python ROS package by Michael Ferguson. | ||
Line 59: | Line 61: | ||
**How does it actually work?**\\ | **How does it actually work?**\\ | ||
- | SYNC_READ is a command only the controller can understand (using this command without such a controller will either not have any effect or, if a servo with ID 0xFD is present on the bus, might return an error 0x20).\\ | + | SYNC_READ is a command only the controller can understand: using this command without such a controller will either not have any effect or, if a servo with ID 0xFD is present on the bus, might return an error 0x20.\\ |
The controller converts SYNC_READ into multiple separate READ commands to get data from each servo, then sends back to the computer a single big packet containing all the data.\\ | The controller converts SYNC_READ into multiple separate READ commands to get data from each servo, then sends back to the computer a single big packet containing all the data.\\ | ||
This significantly decreases the effect of USB latency. | This significantly decreases the effect of USB latency. | ||
- | Limitations | + | **Limitations**\\ |
- | + | A SYNC_READ command reads the same registers in each servo.\\ | |
- | You can use this instruction only when you want to read the same bytes in each servo.\\ | + | |
The USB2AX limits the maximum number of servos to read from (N) to 32, and the maximum data length (L) to 6 bytes. | The USB2AX limits the maximum number of servos to read from (N) to 32, and the maximum data length (L) to 6 bytes. | ||
- | **Instruction Packet** | + | **Instruction Packet**\\ |
<0xFF><0xFF><ID><Length><Instruction><Param 1><Param 2><Param 3> ... <Param N+2><Checksum> | <0xFF><0xFF><ID><Length><Instruction><Param 1><Param 2><Param 3> ... <Param N+2><Checksum> | ||
- | ID : 0XFD or 0xFE | + | ID : 0xFD or 0xFE |
Length : N + 4 (N: number of Dynamixel actuators to read from, value between 1 and 32 inclusive) | Length : N + 4 (N: number of Dynamixel actuators to read from, value between 1 and 32 inclusive) | ||
- | Instruction: 0X84 | + | Instruction: 0x84 |
Param 1 : Starting address of the location where the data is to be read from | Param 1 : Starting address of the location where the data is to be read from | ||
Param 2 : L (L: length of the data to be read, value between 1 and 6 inclusive) | Param 2 : L (L: length of the data to be read, value between 1 and 6 inclusive) | ||
Line 84: | Line 84: | ||
- | **Status Packet (Return Packet)** | + | **WARNING** Some choices of implementation of the Dynamixel SDK make it impossible to simply send this packet and expect a valid response. A modified version of the SDK will be availalbe to fix this problem. |
+ | |||
+ | |||
+ | **Status Packet (Return Packet)**\\ | ||
<0xFF><0xFF><ID><Length><Error><Param 1> ... <Param L><Param L+1> ... <Param L*N><Checksum> | <0xFF><0xFF><ID><Length><Error><Param 1> ... <Param L><Param L+1> ... <Param L*N><Checksum> | ||
Line 100: | Line 103: | ||
- | == Example == | + | ** Example **\\ |
Reading the Present Position and Present Speed for 4 Dynamixel actuators with IDs of **0**, //1//, __2__, ''7''. | Reading the Present Position and Present Speed for 4 Dynamixel actuators with IDs of **0**, //1//, __2__, ''7''. | ||
- | **Instruction Packet**\\ | + | Instruction Packet\\ |
0XFF 0XFF 0XFD 0X08 0X84 0X24 0X04 **0X00** //0X01// __0X02__ ''0X07'' 0X44\\ | 0XFF 0XFF 0XFD 0X08 0X84 0X24 0X04 **0X00** //0X01// __0X02__ ''0X07'' 0X44\\ | ||
- | **Response Packet**\\ | + | Status Packet\\ |
0XFF 0XFF 0XFD 0X12 0X00 **0X50 0X01 0XFF 0X01** //0X20 0X00 0X00 0X02// __0X10 0X00 0X10 0X02__ ''0X00 0X00 0XFE 0X01'' 0X5C | 0XFF 0XFF 0XFD 0X12 0X00 **0X50 0X01 0XFF 0X01** //0X20 0X00 0X00 0X02// __0X10 0X00 0X10 0X02__ ''0X00 0X00 0XFE 0X01'' 0X5C | ||
+ | ** Performances ** | ||
+ | |||
+ | On tests performed with the reference implementation (see above), reading the present positions (2 bytes) of 8 servos took around 2.7ms, on a Win7 64 bits desktop plateform. Each additional servos will add betwee 0.21 and 0.34ms. | ||
---- | ---- | ||
//Based on documentation by Richard "iBot" Ibbotson// | //Based on documentation by Richard "iBot" Ibbotson// |