PSL_2021 / servomotor_MX12_Lorenzo

Dependents:   PSL_ROBOT_lorenzo robot_lorenzo recepteur_mbed_os_6

Committer:
denis2nis
Date:
Sun Nov 07 11:23:09 2021 +0000
Revision:
16:8fcf79e02dd4
Parent:
14:5a0c7b30f8c0
Child:
24:2ab26ed08c83
Small improvement in documentation

Who changed what in which revision?

UserRevisionLine numberNew contents of line
denis2nis 1:a9ba9cf928fe 1 /**
denis2nis 9:b4a5187fdec6 2 * @file MX12.h
denis2nis 13:ccda9a56fef1 3 * @brief this header file contains all required definitions and
denis2nis 8:e74ef93ae660 4 * basic utilities functions to manage au bus of servomotor
denis2nis 8:e74ef93ae660 5 * Dynaminel MX12
denis2nis 8:e74ef93ae660 6 */
denis2nis 8:e74ef93ae660 7 #ifndef MBED_MX12_H_
denis2nis 8:e74ef93ae660 8 #define MBED_MX12_H_
denis2nis 0:7556356a8bcd 9
denis2nis 0:7556356a8bcd 10 #include "mbed.h"
denis2nis 0:7556356a8bcd 11
denis2nis 13:ccda9a56fef1 12 #define MX12_PACKET_MAX_SIZE 32
denis2nis 5:0cf54586a4be 13 #define MX12_MAX_MOTOR_COUNT 16
denis2nis 5:0cf54586a4be 14
denis2nis 2:02f3323a107d 15 /* Dynamixel protocol v1.0 : Instructions
denis2nis 2:02f3323a107d 16 ******************************************/
denis2nis 2:02f3323a107d 17 #define PROTOCOL_INSTRUCTION_PING 0x01
denis2nis 2:02f3323a107d 18 #define PROTOCOL_INSTRUCTION_READ 0x02
denis2nis 2:02f3323a107d 19 #define PROTOCOL_INSTRUCTION_WRITE 0x03
denis2nis 2:02f3323a107d 20 #define PROTOCOL_INSTRUCTION_REG_WRITE 0x04
denis2nis 2:02f3323a107d 21 #define PROTOCOL_INSTRUCTION_ACTION 0x05
denis2nis 2:02f3323a107d 22 #define PROTOCOL_INSTRUCTION_FACTORY_RESET 0x06
denis2nis 2:02f3323a107d 23 #define PROTOCOL_INSTRUCTION_REBOOT 0x08
denis2nis 2:02f3323a107d 24 #define PROTOCOL_INSTRUCTION_SYNC_WRITE 0x83
denis2nis 2:02f3323a107d 25 #define PROTOCOL_INSTRUCTION_BULK_READ 0x92
denis2nis 2:02f3323a107d 26
denis2nis 5:0cf54586a4be 27 /* Dynamixel protocol v1.0 : Contro table content
denis2nis 5:0cf54586a4be 28 ************************************************/
denis2nis 5:0cf54586a4be 29 #define CONTROL_TABLE_MODEL_NUMBER 0
denis2nis 5:0cf54586a4be 30 #define CONTROL_TABLE_FIRMWARE_VERSION 2
denis2nis 5:0cf54586a4be 31 #define CONTROL_TABLE_ID 3
denis2nis 5:0cf54586a4be 32 #define CONTROL_TABLE_BAUD_RATE 4
denis2nis 5:0cf54586a4be 33 #define CONTROL_TABLE_RETURN_DELAY_TIME 5
denis2nis 5:0cf54586a4be 34 #define CONTROL_TABLE_CW_ANGLE_LIMIT 6
denis2nis 5:0cf54586a4be 35 #define CONTROL_TABLE_CCW_ANGLE_LIMIT 8
denis2nis 5:0cf54586a4be 36 #define CONTROL_TABLE_TEMPERATURE_LIMIT 11
denis2nis 5:0cf54586a4be 37 #define CONTROL_TABLE_MIN_VOLTAGE_LIMIT 12
denis2nis 5:0cf54586a4be 38 #define CONTROL_TABLE_MAX_VOLTAGE_LIMIT 13
denis2nis 5:0cf54586a4be 39 #define CONTROL_TABLE_MAX_TORQUE 14
denis2nis 5:0cf54586a4be 40 #define CONTROL_TABLE_STATUS_RETURN_LEVEL 16
denis2nis 5:0cf54586a4be 41 #define CONTROL_TABLE_ALARM_LED 17
denis2nis 5:0cf54586a4be 42 #define CONTROL_TABLE_SHUTDOWN 18
denis2nis 5:0cf54586a4be 43 #define CONTROL_TABLE_MULTITURN_OFFSET 20
denis2nis 5:0cf54586a4be 44 #define CONTROL_TABLE_RESOLUTION_DIVIDER 22
denis2nis 5:0cf54586a4be 45 #define CONTROL_TABLE_TORQUE_ENABLE 24
denis2nis 5:0cf54586a4be 46 #define CONTROL_TABLE_LED 25
denis2nis 5:0cf54586a4be 47 #define CONTROL_TABLE_P_GAIN 26
denis2nis 5:0cf54586a4be 48 #define CONTROL_TABLE_I_GAIN 27
denis2nis 5:0cf54586a4be 49 #define CONTROL_TABLE_D_GAIN 28
denis2nis 5:0cf54586a4be 50 #define CONTROL_TABLE_GOAL_POSITION 30
denis2nis 5:0cf54586a4be 51 #define CONTROL_TABLE_MOVING_SPEED 32
denis2nis 5:0cf54586a4be 52 #define CONTROL_TABLE_TORQUE_LIMIT 34
denis2nis 5:0cf54586a4be 53 #define CONTROL_TABLE_PRESENT_POSITION 36
denis2nis 5:0cf54586a4be 54 #define CONTROL_TABLE_PRESENT_SPEED 38
denis2nis 5:0cf54586a4be 55 #define CONTROL_TABLE_PRESENT_LOAD 40
denis2nis 5:0cf54586a4be 56 #define CONTROL_TABLE_PRESENT_VOLTAGE 42
denis2nis 5:0cf54586a4be 57 #define CONTROL_TABLE_PRESENT_TEMPERATURE 43
denis2nis 5:0cf54586a4be 58 #define CONTROL_TABLE_REGISTRED_INSTRUCTION 44
denis2nis 5:0cf54586a4be 59 #define CONTROL_TABLE_MOVING 46
denis2nis 5:0cf54586a4be 60 #define CONTROL_TABLE_LOCK 47
denis2nis 5:0cf54586a4be 61 #define CONTROL_TABLE_PUNCH 48
denis2nis 5:0cf54586a4be 62 #define CONTROL_TABLE_GOAL_ACCELERATION 73
denis2nis 2:02f3323a107d 63
denis2nis 2:02f3323a107d 64 /**
denis2nis 8:e74ef93ae660 65 * @brief Class to communicate with Dynamixel MX12 servomotors
denis2nis 1:a9ba9cf928fe 66 *
denis2nis 2:02f3323a107d 67 * @details
denis2nis 8:e74ef93ae660 68 *
denis2nis 16:8fcf79e02dd4 69 * The servomotors are daisy chained to a serial link of the target
denis2nis 16:8fcf79e02dd4 70 * microcontroller. The class ensures the initialization of serial link
denis2nis 16:8fcf79e02dd4 71 * and the management of communications mainly to control rotational
denis2nis 16:8fcf79e02dd4 72 * speed of servomotors.
denis2nis 8:e74ef93ae660 73 *
denis2nis 16:8fcf79e02dd4 74 * Transmission of messages to the servomotors is blocking while
denis2nis 16:8fcf79e02dd4 75 * reception is non-blocking thanks to the use of an interrupt routine.
denis2nis 5:0cf54586a4be 76 *
denis2nis 5:0cf54586a4be 77 * @author Titouan Soulard (creator and maintainer until April 2021)
denis2nis 5:0cf54586a4be 78 * @author Bruno Denis (Doxygen documentation and code rearrangement)
denis2nis 1:a9ba9cf928fe 79 *
denis2nis 5:0cf54586a4be 80 * @see Control table of Dynamixel MX12 servomotor
denis2nis 5:0cf54586a4be 81 * @see https://emanual.robotis.com/docs/en/dxl/mx/mx-12w/
denis2nis 5:0cf54586a4be 82 * @see Dynamixel protocol v1.0 manual
denis2nis 5:0cf54586a4be 83 * @see https://emanual.robotis.com/docs/en/dxl/protocol1/
denis2nis 12:acfd6c46954b 84 *
denis2nis 12:acfd6c46954b 85 * Example of class usage to send two instruction packets to servomotor #1
denis2nis 12:acfd6c46954b 86 * with one second gap. First ask to move at 10% of maximum speed and the
denis2nis 12:acfd6c46954b 87 * stop the movement.
denis2nis 12:acfd6c46954b 88 *
denis2nis 12:acfd6c46954b 89 * @code
denis2nis 12:acfd6c46954b 90 * #include "mbed.h"
denis2nis 12:acfd6c46954b 91 * #include "MX12.h"
denis2nis 12:acfd6c46954b 92 *
denis2nis 12:acfd6c46954b 93 * #define SERVO_TX_PIN PC_4
denis2nis 12:acfd6c46954b 94 * #define SERVO_RX_PIN PC_5
denis2nis 12:acfd6c46954b 95 * #define SERVO_BAUD 115200
denis2nis 12:acfd6c46954b 96 * #define SERVO_ID 1
denis2nis 12:acfd6c46954b 97 *
denis2nis 12:acfd6c46954b 98 * #define DELAY_1000ms 1000
denis2nis 12:acfd6c46954b 99 * #define DELAY_1ms 1
denis2nis 12:acfd6c46954b 100 *
denis2nis 12:acfd6c46954b 101 * MX12 servo_bus(SERVO_TX_PIN, SERVO_RX_PIN, SERVO_BAUD);
denis2nis 12:acfd6c46954b 102 * float relative_speed;
denis2nis 12:acfd6c46954b 103 *
denis2nis 12:acfd6c46954b 104 * int main()
denis2nis 12:acfd6c46954b 105 * {
denis2nis 12:acfd6c46954b 106 * // Set speed of SERVO_ID servomotor to 10%
denis2nis 12:acfd6c46954b 107 * // Send on servo_bus to SERVO_ID motor the instruction "moving speed"
denis2nis 12:acfd6c46954b 108 * // with parameter 0.1 (10% of maximum speed)
denis2nis 12:acfd6c46954b 109 * relative_speed = 0.1;
denis2nis 12:acfd6c46954b 110 * servo_bus.SetSpeed(SERVO_ID, relative_speed);
denis2nis 12:acfd6c46954b 111 *
denis2nis 12:acfd6c46954b 112 * // wait for one second
denis2nis 12:acfd6c46954b 113 * thread_sleep_for(DELAY_1000ms);
denis2nis 12:acfd6c46954b 114 *
denis2nis 12:acfd6c46954b 115 * // set speed of SERVO_ID servomotor to 0%
denis2nis 12:acfd6c46954b 116 * relative_speed = 0.0;
denis2nis 12:acfd6c46954b 117 * servo_bus.SetSpeed(SERVO_ID, relative_speed);
denis2nis 12:acfd6c46954b 118 *
denis2nis 12:acfd6c46954b 119 * // infinite loop
denis2nis 12:acfd6c46954b 120 * while (true) thread_sleep_for(DELAY_1000ms);
denis2nis 12:acfd6c46954b 121 * }
denis2nis 12:acfd6c46954b 122 * @endcode
denis2nis 5:0cf54586a4be 123 *
denis2nis 8:e74ef93ae660 124 * @warning
denis2nis 16:8fcf79e02dd4 125 * Warning: receipt of packets from servomotors has not been tested
denis2nis 16:8fcf79e02dd4 126 * (hardwre problem). However, sending move speed instruction is operational.
denis2nis 8:e74ef93ae660 127 *
denis2nis 16:8fcf79e02dd4 128 * @warning
denis2nis 16:8fcf79e02dd4 129 * Warning: Error field of status packet if decoded by GetStatus() returns
denis2nis 16:8fcf79e02dd4 130 * an enumation type "Status". As several errors can be reported
denis2nis 16:8fcf79e02dd4 131 * simultaneously the type enum is not suitable (B. Denis 11/2021).
denis2nis 10:ca9afe156ee1 132 *
denis2nis 11:9bc7f5e2ccee 133 * @bug
denis2nis 10:ca9afe156ee1 134 * Bug: GetStatus() method has a hazardous behavior because it provides
denis2nis 10:ca9afe156ee1 135 * a result by reading the content of the variable _current_frame
denis2nis 13:ccda9a56fef1 136 * which can be modified at any time by the private ISR _Rx_interrupt().
denis2nis 8:e74ef93ae660 137 *
denis2nis 1:a9ba9cf928fe 138 */
denis2nis 0:7556356a8bcd 139 class MX12
denis2nis 0:7556356a8bcd 140 {
denis2nis 0:7556356a8bcd 141 public:
denis2nis 0:7556356a8bcd 142
denis2nis 8:e74ef93ae660 143 /** Error status occurred during the operation of servomotor.
denis2nis 8:e74ef93ae660 144 *
denis2nis 8:e74ef93ae660 145 * @warning
denis2nis 8:e74ef93ae660 146 * Enumaration type is not suitable for all error status because
denis2nis 8:e74ef93ae660 147 * it can denote only one error at a time (B. Denis 11/2021)
denis2nis 8:e74ef93ae660 148 */
denis2nis 8:e74ef93ae660 149 enum Status {
denis2nis 8:e74ef93ae660 150 InstructionError, /**< In case of sending an undefined instruction
denis2nis 8:e74ef93ae660 151 or delivering the action instruction
denis2nis 8:e74ef93ae660 152 without the Reg Write instruction */
denis2nis 8:e74ef93ae660 153 OverloadError, /**< When the current load cannot be controlled
denis2nis 8:e74ef93ae660 154 by the set Torque */
denis2nis 8:e74ef93ae660 155 ChecksumError, /**< When the Checksum of the transmitted
denis2nis 8:e74ef93ae660 156 Instruction Packet is incorrect */
denis2nis 8:e74ef93ae660 157 RangeError, /**< When an instruction is out of the range
denis2nis 8:e74ef93ae660 158 for use */
denis2nis 8:e74ef93ae660 159 OverheatingError, /**< When internal temperature of servomotor
denis2nis 8:e74ef93ae660 160 is out of the range of operating
denis2nis 8:e74ef93ae660 161 temperature set in the Control table */
denis2nis 8:e74ef93ae660 162 AngleLimitError, /**< When Goal Position is written out of the
denis2nis 8:e74ef93ae660 163 range from CW Angle Limit to CCW Angle
denis2nis 8:e74ef93ae660 164 Limit */
denis2nis 8:e74ef93ae660 165 InputVoltageError, /**< When the applied voltage is out of the
denis2nis 8:e74ef93ae660 166 range of operating voltage set in the
denis2nis 8:e74ef93ae660 167 Control table */
denis2nis 8:e74ef93ae660 168 Unknown, /**< Combination of several errors (Caution:
denis2nis 8:e74ef93ae660 169 limit of enum approach to code errors) */
denis2nis 8:e74ef93ae660 170 Ok ///< no error
denis2nis 8:e74ef93ae660 171 };
denis2nis 8:e74ef93ae660 172
denis2nis 13:ccda9a56fef1 173 /** Enumeration of states of the medium acces control (MAC)
denis2nis 13:ccda9a56fef1 174 * of the master-slave protocol of the communication between
denis2nis 13:ccda9a56fef1 175 * the robot controller (master) and the servomotors (slaves).
denis2nis 8:e74ef93ae660 176 */
denis2nis 8:e74ef93ae660 177 enum SerialState {
denis2nis 8:e74ef93ae660 178 Writing, /**< Robot controller send an "instruction packet"
denis2nis 8:e74ef93ae660 179 (request) to a servomotor */
denis2nis 8:e74ef93ae660 180 Reading, /**< Robot controller receive a "status packet" from a
denis2nis 8:e74ef93ae660 181 requested servomotor */
denis2nis 8:e74ef93ae660 182 Idle ///< Robot controller ready for a new cycle request-answer
denis2nis 8:e74ef93ae660 183 };
denis2nis 8:e74ef93ae660 184
denis2nis 8:e74ef93ae660 185 /** Structure of store status packet (also known as return packet)
denis2nis 8:e74ef93ae660 186 * according tne Dynamixel protocol v1.0, which are messages sent
denis2nis 8:e74ef93ae660 187 * by servomotors to contriller in response of an instruction packet
denis2nis 8:e74ef93ae660 188 */
denis2nis 13:ccda9a56fef1 189 struct Status_packet {
denis2nis 13:ccda9a56fef1 190 unsigned char raw[MX12_PACKET_MAX_SIZE]; /**< bytes received */
denis2nis 13:ccda9a56fef1 191 unsigned char n_byte; /**< Number of received byte */
denis2nis 13:ccda9a56fef1 192 unsigned char servo_id; /**< Identifier field denoted servomotor
denis2nis 13:ccda9a56fef1 193 * involved in the message */
denis2nis 13:ccda9a56fef1 194 unsigned char length; /**< Length field of status packet */
denis2nis 13:ccda9a56fef1 195 unsigned char error; /**< Error field of status packet */
denis2nis 13:ccda9a56fef1 196 unsigned char n_param; /**< Number of received parameter*/
denis2nis 13:ccda9a56fef1 197 unsigned char param[MX12_PACKET_MAX_SIZE]; /**< array of received
denis2nis 13:ccda9a56fef1 198 * parameters */
denis2nis 13:ccda9a56fef1 199 unsigned char received_checksum; /**< Received checksum field */
denis2nis 13:ccda9a56fef1 200 unsigned char calculated_checksum; /**< Calculated checksum */
denis2nis 13:ccda9a56fef1 201 bool parsed; /**< status packet is correctly parsed */
denis2nis 13:ccda9a56fef1 202 bool valid; /**< received_checksum == calculated_checksum */
denis2nis 8:e74ef93ae660 203 };
denis2nis 8:e74ef93ae660 204
denis2nis 13:ccda9a56fef1 205 /**
denis2nis 13:ccda9a56fef1 206 * @brief Discrete states of the packet parser.
denis2nis 13:ccda9a56fef1 207 *
denis2nis 13:ccda9a56fef1 208 * @detail
denis2nis 13:ccda9a56fef1 209 * Each value corresponding to a field that the parser
denis2nis 13:ccda9a56fef1 210 * can identify according the Dynamixel protocol v1.0.
denis2nis 13:ccda9a56fef1 211 * Enumeration include field of instruction packets
denis2nis 13:ccda9a56fef1 212 * (packets sent to servomotors) and field of status packets
denis2nis 13:ccda9a56fef1 213 * (packets received from servomotors).
denis2nis 9:b4a5187fdec6 214 */
denis2nis 13:ccda9a56fef1 215 enum PacketField {
denis2nis 13:ccda9a56fef1 216 Header1, ///< Heading1 field of instruction or status packet
denis2nis 13:ccda9a56fef1 217 Header2, ///< Heading2 field of instruction or status packet
denis2nis 13:ccda9a56fef1 218 Id, ///< ID field of instruction or status packet
denis2nis 13:ccda9a56fef1 219 Length, ///< Length field of status packet
denis2nis 13:ccda9a56fef1 220 Error, ///< Error status field of status packet
denis2nis 13:ccda9a56fef1 221 Instruction, ///< Instruction field of instruction packet
denis2nis 13:ccda9a56fef1 222 Data, ///< expect to read parameter fields of status packet
denis2nis 13:ccda9a56fef1 223 Checksum ///< expect to read Checksum field of status packet
denis2nis 9:b4a5187fdec6 224 };
denis2nis 9:b4a5187fdec6 225
denis2nis 13:ccda9a56fef1 226 /** Structure to store the current state of packet parserComplement to the ParsingState enumeration to store the reading
denis2nis 9:b4a5187fdec6 227 * progress of each section of the status packet.
denis2nis 8:e74ef93ae660 228 */
denis2nis 13:ccda9a56fef1 229 struct ParserState {
denis2nis 13:ccda9a56fef1 230 MX12::PacketField expected_field; ///< next expected field
denis2nis 13:ccda9a56fef1 231 unsigned char byte_index; ///< index of byte already parsed
denis2nis 13:ccda9a56fef1 232 unsigned char param_index; ///< index of parameter already parsed
denis2nis 8:e74ef93ae660 233 };
denis2nis 5:0cf54586a4be 234
denis2nis 16:8fcf79e02dd4 235 /** Create an instance of MX12 and attach it to a serial link
denis2nis 8:e74ef93ae660 236 *
denis2nis 8:e74ef93ae660 237 * @param tx board pin used for transmission in UART daisy chain link
denis2nis 8:e74ef93ae660 238 * to servomotors
denis2nis 8:e74ef93ae660 239 * @param rx board pin used for reception in UART daisy chain link
denis2nis 8:e74ef93ae660 240 * to servomotors
denis2nis 8:e74ef93ae660 241 * @param baud modulation rate of UART signal, unit: Baud
denis2nis 8:e74ef93ae660 242 * to servomotors
denis2nis 8:e74ef93ae660 243 */
denis2nis 8:e74ef93ae660 244 MX12(PinName tx, PinName rx, int baud=115200);
denis2nis 8:e74ef93ae660 245
denis2nis 8:e74ef93ae660 246 /** Send desired speed to a specific servomotor
denis2nis 8:e74ef93ae660 247 *
denis2nis 8:e74ef93ae660 248 * @param mot_id a unique value in the daisy chain network to identify
denis2nis 8:e74ef93ae660 249 * each servomotor
denis2nis 8:e74ef93ae660 250 * @param speed a float between -1 and 1 that represents the percentage
denis2nis 8:e74ef93ae660 251 * of maximum requested speed
denis2nis 8:e74ef93ae660 252 */
denis2nis 8:e74ef93ae660 253 void SetSpeed(unsigned char mot_id, float speed);
denis2nis 8:e74ef93ae660 254
denis2nis 10:ca9afe156ee1 255 /** Informs about the availability of the bus for a new transmission
denis2nis 10:ca9afe156ee1 256 * of instruction packet (Method Access Control)
denis2nis 10:ca9afe156ee1 257 *
denis2nis 10:ca9afe156ee1 258 * @returns true if bus ready for a new transmission, otherwise false
denis2nis 9:b4a5187fdec6 259 */
denis2nis 8:e74ef93ae660 260 char IsAvailable(void);
denis2nis 8:e74ef93ae660 261
denis2nis 8:e74ef93ae660 262 /**
denis2nis 13:ccda9a56fef1 263 * @brief Build and send an instruction packet to a servomotor
denis2nis 13:ccda9a56fef1 264 * according Dynamixel Protocol 1.0
denis2nis 13:ccda9a56fef1 265 *
denis2nis 13:ccda9a56fef1 266 * @detail This method is limited to only two kind of instruction :
denis2nis 13:ccda9a56fef1 267 * read data from a servomoteur et write data on servomotor.
denis2nis 13:ccda9a56fef1 268 * Ping, Reg Write, Action, Factory Reset, Rebbot, Sync Write
denis2nis 13:ccda9a56fef1 269 * and Bulk Read are not supported.
denis2nis 13:ccda9a56fef1 270 *
denis2nis 13:ccda9a56fef1 271 * For the method to issue a read instruction, set the data
denis2nis 13:ccda9a56fef1 272 * parameter to NULL, otherwise the method issue a
denis2nis 13:ccda9a56fef1 273 * write instruction
denis2nis 8:e74ef93ae660 274 *
denis2nis 8:e74ef93ae660 275 * @param[in] mot_id indicates the ID of the device (servomotor) that
denis2nis 8:e74ef93ae660 276 * should receive the Instruction Packet and process it
denis2nis 8:e74ef93ae660 277 * @param[in] address data address in the "Control Table of RAM Area"
denis2nis 8:e74ef93ae660 278 * of a servomotor MX12
denis2nis 8:e74ef93ae660 279 * (https://emanual.robotis.com/docs/en/dxl/mx/mx-12w/#control-table-of-ram-area).
denis2nis 8:e74ef93ae660 280 * @param[in] len if it is a write instruction, size in bytes
denis2nis 8:e74ef93ae660 281 * of the data to write in the "Control Table of RAM Area"
denis2nis 8:e74ef93ae660 282 * @param[in] data array of char containing parameter of Danamixel
denis2nis 13:ccda9a56fef1 283 * protocol that are the instruction’s auxiliary data field.
denis2nis 13:ccda9a56fef1 284 * Set to NULL for read instruction, otherwise the method issue
denis2nis 13:ccda9a56fef1 285 * a write instruction
denis2nis 8:e74ef93ae660 286 *
denis2nis 8:e74ef93ae660 287 * @see https://emanual.robotis.com/docs/en/dxl/protocol1/
denis2nis 8:e74ef93ae660 288 *
denis2nis 13:ccda9a56fef1 289 * Structure of instruction Packet
denis2nis 13:ccda9a56fef1 290 *
denis2nis 8:e74ef93ae660 291 * <PRE>
denis2nis 8:e74ef93ae660 292 * |Header1|Header2|Packet ID|Length|Instruction|Param1...ParamN|Checksum|
denis2nis 8:e74ef93ae660 293 * |-------|-------|---------|------|-----------|---------------|--------|
denis2nis 8:e74ef93ae660 294 * | 0xFF | 0xFF |Packet ID|Length|Instruction|Param1...ParamN| CHKSUM |
denis2nis 8:e74ef93ae660 295 * | cmd[0]| cmd[1]| cmd[2] |cmd[3]| cmd[4] |cmd[5]... | |
denis2nis 8:e74ef93ae660 296 * \\__ ___/ \\_ _/ \\__ __/
denis2nis 8:e74ef93ae660 297 * \/ \/ \/
denis2nis 8:e74ef93ae660 298 * mot_id address data
denis2nis 8:e74ef93ae660 299 * (len = N-1)
denis2nis 8:e74ef93ae660 300 * </PRE>
denis2nis 8:e74ef93ae660 301 */
denis2nis 8:e74ef93ae660 302 void rw(unsigned char mot_id, char address, char len, char *data);
denis2nis 8:e74ef93ae660 303
denis2nis 13:ccda9a56fef1 304 /**
denis2nis 13:ccda9a56fef1 305 * Display status packet in hexadecimal format
denis2nis 8:e74ef93ae660 306 *
denis2nis 8:e74ef93ae660 307 * @warning
denis2nis 13:ccda9a56fef1 308 * Use console without any previous declaration. Assume console is
denis2nis 13:ccda9a56fef1 309 * setup by calling program
denis2nis 8:e74ef93ae660 310 */
denis2nis 8:e74ef93ae660 311 void PrintSerial();
denis2nis 8:e74ef93ae660 312
denis2nis 8:e74ef93ae660 313 /**
denis2nis 8:e74ef93ae660 314 * Get information from de Error byte of the last status packet
denis2nis 8:e74ef93ae660 315 * received from a servomotor
denis2nis 8:e74ef93ae660 316 *
denis2nis 8:e74ef93ae660 317 * @return
denis2nis 8:e74ef93ae660 318 * One of enum MX12::Status value to describe errors. 'Ok' is
denis2nis 8:e74ef93ae660 319 * returns if no error occurred during the last operation of
denis2nis 8:e74ef93ae660 320 * servomotor.
denis2nis 8:e74ef93ae660 321 *
denis2nis 8:e74ef93ae660 322 * @warning
denis2nis 10:ca9afe156ee1 323 * Warning: if a combination of several errors is reported the function
denis2nis 14:5a0c7b30f8c0 324 * returns "Unknown".
denis2nis 9:b4a5187fdec6 325 *
denis2nis 16:8fcf79e02dd4 326 * @bug
denis2nis 10:ca9afe156ee1 327 * Bug: this method has a hazardous behavior because it provides
denis2nis 10:ca9afe156ee1 328 * a result by reading the content of the variable _current_frame
denis2nis 13:ccda9a56fef1 329 * which can be modified at any time by the private ISR _Rx_interrupt()
denis2nis 8:e74ef93ae660 330 */
denis2nis 8:e74ef93ae660 331 MX12::Status GetStatus(void);
denis2nis 5:0cf54586a4be 332
denis2nis 8:e74ef93ae660 333 /* function aivailaible in a previous version of the class
denis2nis 8:e74ef93ae660 334 */
denis2nis 8:e74ef93ae660 335 // MX12::Status GetStatus(void);
denis2nis 8:e74ef93ae660 336 // void ReadPosition(unsigned char mot_id);
denis2nis 8:e74ef93ae660 337 // float GetPosition(unsigned char mot_id);
denis2nis 8:e74ef93ae660 338
denis2nis 10:ca9afe156ee1 339 protected:
denis2nis 5:0cf54586a4be 340
denis2nis 13:ccda9a56fef1 341 /** Serial port where servomotor bus is connected
denis2nis 9:b4a5187fdec6 342 */
denis2nis 8:e74ef93ae660 343 UnbufferedSerial _mx12;
denis2nis 13:ccda9a56fef1 344
denis2nis 13:ccda9a56fef1 345
denis2nis 13:ccda9a56fef1 346 /** Servomotor bus state to managed medium acces control (MAC)
denis2nis 13:ccda9a56fef1 347 */
denis2nis 13:ccda9a56fef1 348 MX12::SerialState _bus_state;
denis2nis 8:e74ef93ae660 349
denis2nis 13:ccda9a56fef1 350 /** Structure filled by ISR (Interrupt Service Routine) ReadCallback()
denis2nis 13:ccda9a56fef1 351 * parser to store message received from servomotor byte after byte
denis2nis 8:e74ef93ae660 352 */
denis2nis 13:ccda9a56fef1 353 MX12::Status_packet _status_pck;
denis2nis 13:ccda9a56fef1 354
denis2nis 13:ccda9a56fef1 355 /** Structure update by ISR (Interrupt Service Routine) ReadCallback()
denis2nis 13:ccda9a56fef1 356 * parser to model its current state
denis2nis 13:ccda9a56fef1 357 */
denis2nis 13:ccda9a56fef1 358 MX12::ParserState _parser_state;
denis2nis 13:ccda9a56fef1 359
denis2nis 8:e74ef93ae660 360
denis2nis 8:e74ef93ae660 361 unsigned char _answer;
denis2nis 13:ccda9a56fef1 362
denis2nis 13:ccda9a56fef1 363 /**
denis2nis 13:ccda9a56fef1 364 * @brief
denis2nis 13:ccda9a56fef1 365 * Interupt service routine (ISR) to read and parse received message
denis2nis 13:ccda9a56fef1 366 *
denis2nis 13:ccda9a56fef1 367 * @detail
denis2nis 13:ccda9a56fef1 368 * This interupt routine is attached to reception event on servomoteur
denis2nis 13:ccda9a56fef1 369 * bus and is called for each character received on bus.
denis2nis 13:ccda9a56fef1 370 *
denis2nis 13:ccda9a56fef1 371 * As the characters are received, the progress of the parser
denis2nis 13:ccda9a56fef1 372 * is stored in _parser_state and the result of the analysis
denis2nis 13:ccda9a56fef1 373 * is stored in _status_pck.
denis2nis 8:e74ef93ae660 374 */
denis2nis 13:ccda9a56fef1 375 void _Rx_interrupt();
denis2nis 8:e74ef93ae660 376
denis2nis 0:7556356a8bcd 377 };
denis2nis 0:7556356a8bcd 378
denis2nis 8:e74ef93ae660 379 #endif /* MBED_MX12_H_ */