= CANbus Communication Specifications = == Data Link Specifications == * 1Mbaud CANbus * 8 time quanta per bit * 75% sampling point * Sync jump width = 1 time quanta (TQ) * 11-bit MsgID (standard CAN) * Proprietary protocol, not !DeviceNet or CANopen * Recommended reading: Controller Area Network by Konrad Etschberger == CANbus Timing == * 75μS to ask for position * 75μS per puck to respond with the positions * 125μS to send a packed torque to the lower 4DOF * 125μS to send a packed torque to the wrist * Control-side processing time on PC For the 4DOF, it is: 75+(4*75)+125+PC = 500μS + PC For the 7DOF, it is: 75+(7*75)+(2*125)+PC = 850μS + PC These numbers are limited by the 1 Mbps CANbus. Each message has a 47-bit frame (47μS), plus payload data (3 bytes, 24μS typ). CANbus transceivers are not rated above 1 Mbps due to slew-rate limitations. == ID Specifications == === Message IDs === * [GFFFFFTTTTT] (11 bits, binary) * G: Group, 0 = Directed message, 1 = Group broadcast * F: From ID, Host = 00000, Motor N = N * T: To ID or group Examples: * 00000000011 => Directed message from host to motor 3 (3 = 00011, binary) * 10001100100 => Group broadcast from motor 3 to group 4 === Motor IDs and Groups === Each motor in the robot has a unique communication ID, can be a part of any three groups (GRPA, GRPB, GRPC), and will listen for and process messages bound for its ID or any of its groups. There are a total of 32 possible groups (from 00000 to 11111). Motors 1 to 4 belong to groups 0, 1, and 4, motors 5 to 7 belong to groups 0, 2, and 5, and the host belongs to groups 3 and 6 by default. The default groups are: * 0 = All actuators * 1 = Lower arm torques (motors 1-4) * 2 = Upper arm torques (motors 5-7) * 3 = Position feedback * 4 = Lower arm property * 5 = Upper arm property * 6 = Property feedback == CANbus Frame Data Payload == === Standard CANbus Message Format === CAN specifies a maximum of 8 bytes/frame payload – our typical payload consists of 4-6 bytes: [APPPPPPP] [00000000] [LLLLLLLL] [mmmmmmmm] [MMMMMMMM] [HHHHHHHH] * A: Action, 0 = Get property, 1 = Set property * P: Property (128 possible values, 0..127, 0000000..1111111), see Motor Controller Properties and Safety Module Properties below. * 0: Second byte (almost) always set to zero (see exceptions below) * L: Low byte of data value * m: mid-low byte of data value * If sending a 16-bit integer value, the following are not used: * M: Mid-high byte of data value * H: High byte of data value The CAN frame data length code (DLC) is set to the number of bytes being transmitted. === Exceptions === 1. The Position property (P) is a 22-bit, 2's complement number. It is packed into a 3-byte frame payload [00MMMMMM] [mmmmmmmm] [LLLLLLLL]. It is always sent to Group 3. 1. Command torque can be sent as a set of four 14-bit, 2's complement numbers. It is sent to the motor controllers in 8 bytes (max): ||0||1||2||3||4||5||6||7 ||APPPPPPP||BBBBBBbb||bbbbbbCC||CCCCcccc||ccccDDDD||DDdddddd||ddEEEEEE||eeeeeeee * A = Action * P = Property * B = Upper 6 bits of first value * b = Lower 8 bits of first value * C = Upper 6 bits of second value * c = Lower 8 bits of second value * D = Upper 6 bits of third value * d = Lower 8 bits of third value * E = Upper 6 bits of fourth value * e = Lower 8 bits of fourth value Each motor has a property (PIDX: 1-4), which tells it which torque to use from the set of 4 == Full Communication Example == This example contains: * 3 motors with IDs of 5, 6, and 7 * A host with an ID of 0 '''Host sends:''' * MsgID [10000000000] → Group 0 * Data [10000101] [00000000] [00000010] [0000000] → Set property 5 (STAT) to 2 (STATUS_READY) * The motors start up with STAT = 0 (STATUS_RESET) * Setting STAT to READY gets the motors ready to receive additional data * Motors will only respond to STAT and VERS commands while in RESET (for safety) '''Host sends:''' * MsgID [10000000000] → Group 0 * Data [10001000] [00000000] [00000010] [00000000] → Set property 8 (MODE) to 2 (MODE_TORQUE) * The motors default to MODE = 0 (MODE_IDLE) * Setting MODE to MODE_TORQUE tells the motors to apply any torque sent to them * When MODE = MODE_IDLE, motors will ignore any torque commands sent and apply braking * When using a WAM, the safety system will set the MODE when you press the IDLE/ACTIVATE buttons * Do not try to bypass the WAM’s safety system by setting the MODE directly, this will cause undesired operation. '''Host sends:''' * MsgID [10000000000] → Group 0 * Data [00110000] → Get property 48 (P) '''Motors send:''' * MsgID [10010100011] → From ID 5 to Group 3 * Data [00000000] [00000000] [0000010] → My position is 2 encoder counts * MsgID [10011000011] → From ID 6 to Group 3 * Data [00000000] [00000000] [0000111] → My position is 7 encoder counts * MsgID [10011100011] → From ID 7 to Group 3 * Data [00111111] [11111111] [11111110] → My position is -2 encoder counts Host uses these positions to calculate a torque. '''Host sends:''' * MsgID [10000000010] → Group 2 * Data [10101010] [AAAAAAaa] [aaaaaaBB] [BBBBbbbb] [bbbbCCCC] [CCcccccc] [cc000000] [00000000] * Set torques to new values AAAAAAaaaaaaaa, etc.