|
|
Line 11: |
Line 11: |
| | | |
| ==CAN Frames== | | ==CAN Frames== |
− | ===Standard CAN Packet=== | + | ===Arbitration Identifier=== |
− | The standard CAN packet used for communication is 14 bytes including 8 bytes of data. | + | The Allegro Hand uses 11 bit standard arbitration identifier. It is composed with two part. |
− | <syntaxhighlight lang="cpp">
| + | |
− | typedef struct{
| + | |
− | unsigned char STD_EXT; //type of message (Standard or Extended)
| + | |
− | unsigned long msg_id; //message identifier
| + | |
− | unsigned char data_length; //
| + | |
− | char data[8]; // data array
| + | |
− | } can_msg;
| + | |
− | </syntaxhighlight>
| + | |
− | | + | |
− | ===ID (Message Identifier)===
| + | |
− | The 4 byte integer CAN message identifier (msg_id) is split into the command ID (26 bits), destination ID (3 bits) and source ID (3 bits).
| + | |
| <br> | | <br> |
− | {|style=" border-collapse: separate; border-spacing: 15; border-width: 2px; border-style: solid; border-color: #CCCCCC; padding: 0px; text-align: left; width: 800px" | + | {| class="wikitable" style="text-align: center; width: 85%;" |
− | | style="padding: 0px 0px 0px 3px; width: 21.88%; font-size: 80%" | 1
| + | !colspan="1"|MSB |
− | | style="width: 21.88%; font-size: 80%" | 8
| + | !colspan="1"|9 |
− | | style="width: 21.88%; font-size: 80%" | 16
| + | !colspan="1"|8 |
− | | style="width: 6.26%; font-size: 80%" | 24
| + | !colspan="1"|7 |
− | | style="width: 3.13%; font-size: 80%" | 26
| + | !colspan="1"|6 |
− | | style="width: 6.26%; font-size: 80%" | 27
| + | !colspan="1"|5 |
− | | style="width: 3.13%; font-size: 80%" | 29
| + | !colspan="1"|4 |
− | | style="width: 6.26%; font-size: 80%" | 30
| + | !colspan="1"|3 |
− | | style="width: 3.13%; font-size: 80%" | 32
| + | !colspan="1"|2 |
− | |-
| + | !colspan="1"|1 |
− | | style="padding: 2px 5px 2px 5px; background: #F0F0F0" ! scope="row" colspan="5" | Command ID
| + | !colspan="1"|LSB |
− | | style="padding: 2px 5px 2px 5px; background: #F0F0F0" ! scope="row" colspan="2" | Dest. ID
| + | |
− | | style="padding: 2px 5px 2px 5px; background: #F0F0F0" ! scope="row" colspan="2" | Source ID
| + | |
| |- | | |- |
| + | !colspan="9" style="background-color:#ffffff;"| Message ID |
| + | !colspan="2" style="background-color:#ffffff;"| Device ID |
| + | |
| |} | | |} |
| <br> | | <br> |
− | | + | <br> |
− | ====Command Identifiers==== | + | ===Message ID=== |
− | | + | <br> |
− | {|style=" border-collapse: separate; border-spacing: 15; border-width: 2px; border-style: solid; border-color: #CCCCCC; padding: 0px; text-align: left; width: 800px" | + | {| class="wikitable" style="text-align: center; width: 85%;" |
− | | style="padding: 3px 5px 2px 5px; background: #F0F0F0" | Variable Name
| + | !colspan="1"|Message |
− | | style="padding: 3px 5px 2px 5px; background: #F0F0F0" | Value
| + | !colspan="1"|Message ID |
− | | style="padding: 3px 5px 2px 5px; background: #F0F0F0" | Description
| + | !colspan="1"|RTR |
− | | style="padding: 3px 5px 2px 5px; background: #F0F0F0" | Destination
| + | !colspan="1"|Description |
− | | style="padding: 3px 5px 2px 5px; background: #F0F0F0" | Source
| + | |
| |- | | |- |
− | | style="padding: 2px 5px 2px 5px" | ID_CMD_SET_SYSTEM_ON
| + | !style="background-color:#ffffff;"| Servo ON |
− | | style="padding: 2px 5px 2px 5px" | 0x01
| + | !style="background-color:#ffffff;"| 0x040 |
− | | style="padding: 2px 5px 2px 5px" | Start periodic communication
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 2px 5px" | ID_COMMON
| + | !style="background-color:#ffffff;"| Engage joint motor driver |
− | | style="padding: 2px 5px 2px 5px" | ID_DEVICE_MAIN
| + | |
| |- | | |- |
− | | style="padding: 2px 5px 2px 5px" | ID_CMD_SET_SYSTEM_OFF
| + | !style="background-color:#ffffff;"| Servo OFF |
− | | style="padding: 2px 5px 2px 5px" | 0x02
| + | !style="background-color:#ffffff;"| 0x041 |
− | | style="padding: 2px 5px 2px 5px" | Stop periodic communication
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 2px 5px" | ID_COMMON
| + | !style="background-color:#ffffff;"| Disable joint motor driver |
− | | style="padding: 2px 5px 2px 5px" | ID_DEVICE_MAIN
| + | |
| |- | | |- |
− | | style="padding: 2px 5px 2px 5px" | ID_CMD_SET_PERIOD
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 2px 5px" | 0x03
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 2px 5px" | Set communication frequency
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 2px 5px" | ID_COMMON
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 2px 5px" | ID_DEVICE_MAIN
| + | |
| |- | | |- |
− | | style="padding: 2px 5px 2px 5px" | ID_CMD_SET_MODE_JOINT
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 2px 5px" | 0x04
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 2px 5px" | Command Transmission Mode
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 2px 5px" | ID_COMMON
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 2px 5px" | ID_DEVICE_MAIN
| + | |
| |- | | |- |
− | | style="padding: 2px 5px 2px 5px" | ID_CMD_SET_MODE_TASK
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 2px 5px" | 0x05
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 2px 5px" | Command Transmission Mode
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 2px 5px" | ID_COMMON
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 2px 5px" | ID_DEVICE_MAIN
| + | |
| |- | | |- |
− | | style="padding: 2px 5px 2px 5px" | ID_CMD_SET_TORQUE_1
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 2px 5px" | 0x06
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 2px 5px" | Index finger (1) torque command
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 2px 5px" | ID_COMMON
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 2px 5px" | ID_DEVICE_MAIN
| + | |
| |- | | |- |
− | | style="padding: 2px 5px 2px 5px" | ID_CMD_SET_TORQUE_2
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 2px 5px" | 0x07
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 2px 5px" | Middle finger (2) torque command
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 2px 5px" | ID_COMMON
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 2px 5px" | ID_DEVICE_MAIN
| + | |
| |- | | |- |
− | | style="padding: 2px 5px 2px 5px" | ID_CMD_SET_TORQUE_3
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 2px 5px" | 0x08
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 2px 5px" | Pinky finger (3) torque command
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 2px 5px" | ID_COMMON
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 2px 5px" | ID_DEVICE_MAIN
| + | |
| |- | | |- |
− | | style="padding: 2px 5px 2px 5px" | ID_CMD_SET_TORQUE_4
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 2px 5px" | 0x09
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 2px 5px" | Thumb torque command
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 2px 5px" | ID_COMMON
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 2px 5px" | ID_DEVICE_MAIN
| + | |
| |- | | |- |
− | | style="padding: 2px 5px 2px 5px" | ID_CMD_SET_POSITION_1
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 2px 5px" | 0x0a
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 2px 5px" | (unused)
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 2px 5px" | ID_COMMON
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 2px 5px" | ID_DEVICE_MAIN
| + | |
| |- | | |- |
− | | style="padding: 2px 5px 2px 5px" | ID_CMD_SET_POSITION_2
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 2px 5px" | 0x0b
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 2px 5px" | (unused)
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 2px 5px" | ID_COMMON
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 2px 5px" | ID_DEVICE_MAIN
| + | |
| |- | | |- |
− | | style="padding: 2px 5px 2px 5px" | ID_CMD_SET_POSITION_3
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 2px 5px" | 0x0c
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 2px 5px" | (unused)
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 2px 5px" | ID_COMMON
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 2px 5px" | ID_DEVICE_MAIN
| + | |
| |- | | |- |
− | | style="padding: 2px 5px 2px 5px" | ID_CMD_SET_POSITION_4
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 2px 5px" | 0x0d
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 2px 5px" | (unused)
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 2px 5px" | ID_COMMON
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 2px 5px" | ID_DEVICE_MAIN
| + | |
| |- | | |- |
− | | style="padding: 2px 5px 2px 5px" | ID_CMD_QUERY_STATE_DATA
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 2px 5px" | 0x0e
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 2px 5px" | Request joint state
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 2px 5px" | ID_COMMON
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 2px 5px" | ID_DEVICE_MAIN
| + | |
| |- | | |- |
− | | style="padding: 2px 5px 2px 5px" | ID_CMD_QUERY_STATE_DATA
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 2px 5px" | 0x0e
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 2px 5px" | Joint state response
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 2px 5px" | ID_DEVICE_MAIN
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 2px 5px" | ID_DEVICE_SUB_01<br>ID_DEVICE_SUB_02<br>ID_DEVICE_SUB_03<br>ID_DEVICE_SUB_04
| + | |
| |- | | |- |
− | | style="padding: 5px 5px 2px 5px" | ID_CMD_QUERY_CONTROL_DATA
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 2px 5px" | 0x0f
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 2px 5px" | Joint state response
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 2px 5px" | ID_DEVICE_MAIN
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 5px 5px" | ID_DEVICE_SUB_01<br>ID_DEVICE_SUB_02<br>ID_DEVICE_SUB_03<br>ID_DEVICE_SUB_04
| + | |
| |- | | |- |
− | |}
| + | !style="background-color:#ffffff;"| |
− | <br>
| + | !style="background-color:#ffffff;"| |
− | | + | !style="background-color:#ffffff;"| |
− | ====Source and Destination Identifiers====
| + | !style="background-color:#ffffff;"| |
− | | + | |
− | {|style=" border-collapse: separate; border-spacing: 15; border-width: 2px; border-style: solid; border-color: #CCCCCC; padding: 0px; text-align: left; width: 520px"
| + | |
− | | style="padding: 3px 5px 2px 5px; background: #F0F0F0" | Variable Name
| + | |
− | | style="padding: 3px 5px 2px 5px; background: #F0F0F0" | Value
| + | |
− | | style="padding: 3px 5px 2px 5px; background: #F0F0F0" | Description
| + | |
| |- | | |- |
− | | style="padding: 2px 5px 2px 5px" | ID_COMMON
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 2px 5px" | 0x01
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 2px 5px" | Allegro Hand | + | !style="background-color:#ffffff;"| |
| + | !style="background-color:#ffffff;"| |
| |- | | |- |
− | | style="padding: 2px 5px 2px 5px" | ID_DEVICE_MAIN
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 2px 5px" | 0x02
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 2px 5px" | Control PC | + | !style="background-color:#ffffff;"| |
| + | !style="background-color:#ffffff;"| |
| |- | | |- |
− | | style="padding: 2px 5px 2px 5px" | ID_DEVICE_SUB_01
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 2px 5px" | 0x03
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 2px 5px" | Index Finger | + | !style="background-color:#ffffff;"| |
| + | !style="background-color:#ffffff;"| |
| |- | | |- |
− | | style="padding: 2px 5px 2px 5px" | ID_DEVICE_SUB_02
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 2px 5px" | 0x04
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 2px 5px" | Middle Finger | + | !style="background-color:#ffffff;"| |
| + | !style="background-color:#ffffff;"| |
| |- | | |- |
− | | style="padding: 2px 5px 2px 5px" | ID_DEVICE_SUB_03
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 2px 5px" | 0x05
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 2px 5px" | Little Finger | + | !style="background-color:#ffffff;"| |
| + | !style="background-color:#ffffff;"| |
| |- | | |- |
− | | style="padding: 2px 5px 2px 5px" | ID_DEVICE_SUB_04
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 2px 5px" | 0x06
| + | !style="background-color:#ffffff;"| |
− | | style="padding: 2px 5px 2px 5px" | Thumb | + | !style="background-color:#ffffff;"| |
| + | !style="background-color:#ffffff;"| |
| |- | | |- |
| + | !style="background-color:#ffffff;"| |
| + | !style="background-color:#ffffff;"| |
| + | !style="background-color:#ffffff;"| |
| + | !style="background-color:#ffffff;"| |
| |} | | |} |
| <br> | | <br> |
The CAN communication baud-rate is 1Mbps.
Messages can be sent to initialize or stop CAN communication.
Remote frame can be used to request data. If host sends remote frame, the Allegro Hand responds with it regardless periodic communication status.
The Allegro Hand control software attempts to communicate with the real or simulated hand at a regular control interval. Every 3 milliseconds, the joint torques are calculated and the joint angles are updated.
The Allegro Hand uses 11 bit standard arbitration identifier. It is composed with two part.