PSL_2021 / servomotor_MX12_Lorenzo

Dependents:   PSL_ROBOT_lorenzo robot_lorenzo recepteur_mbed_os_6

Committer:
denis2nis
Date:
Sun Nov 07 10:54:45 2021 +0000
Revision:
14:5a0c7b30f8c0
Parent:
13:ccda9a56fef1
Child:
16:8fcf79e02dd4
Fix uncomplete case switch

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 2:02f3323a107d 69 * The servomotors are daisy chained to a serial link of the target
denis2nis 2:02f3323a107d 70 * microcontroller. The class ensures the initialization of serial link
denis2nis 8:e74ef93ae660 71 * and the management of communications mainly to control rotational
denis2nis 8:e74ef93ae660 72 * speed of servomotors.
denis2nis 8:e74ef93ae660 73 *
denis2nis 2:02f3323a107d 74 * Transmission of messages to the servomotors is blocking while
denis2nis 2:02f3323a107d 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 8:e74ef93ae660 125 *
denis2nis 11:9bc7f5e2ccee 126 * Error field of status packet if decoded by GetStatus()
denis2nis 10:ca9afe156ee1 127 * Doxygen Release 1.7.2 returns an enumation type "Status". As several
denis2nis 10:ca9afe156ee1 128 * errors can be reported simultaneously the type enum is not suitable
denis2nis 10:ca9afe156ee1 129 * (B. Denis 11/2021).
denis2nis 10:ca9afe156ee1 130 *
denis2nis 11:9bc7f5e2ccee 131 * @bug
denis2nis 8:e74ef93ae660 132 *
denis2nis 10:ca9afe156ee1 133 * Bug: GetStatus() method has a hazardous behavior because it provides
denis2nis 10:ca9afe156ee1 134 * a result by reading the content of the variable _current_frame
denis2nis 13:ccda9a56fef1 135 * which can be modified at any time by the private ISR _Rx_interrupt().
denis2nis 8:e74ef93ae660 136 *
denis2nis 1:a9ba9cf928fe 137 */
denis2nis 0:7556356a8bcd 138 class MX12
denis2nis 0:7556356a8bcd 139 {
denis2nis 0:7556356a8bcd 140 public:
denis2nis 0:7556356a8bcd 141
denis2nis 8:e74ef93ae660 142 /** Error status occurred during the operation of servomotor.
denis2nis 8:e74ef93ae660 143 *
denis2nis 8:e74ef93ae660 144 * @warning
denis2nis 8:e74ef93ae660 145 * Enumaration type is not suitable for all error status because
denis2nis 8:e74ef93ae660 146 * it can denote only one error at a time (B. Denis 11/2021)
denis2nis 8:e74ef93ae660 147 */
denis2nis 8:e74ef93ae660 148 enum Status {
denis2nis 8:e74ef93ae660 149 InstructionError, /**< In case of sending an undefined instruction
denis2nis 8:e74ef93ae660 150 or delivering the action instruction
denis2nis 8:e74ef93ae660 151 without the Reg Write instruction */
denis2nis 8:e74ef93ae660 152 OverloadError, /**< When the current load cannot be controlled
denis2nis 8:e74ef93ae660 153 by the set Torque */
denis2nis 8:e74ef93ae660 154 ChecksumError, /**< When the Checksum of the transmitted
denis2nis 8:e74ef93ae660 155 Instruction Packet is incorrect */
denis2nis 8:e74ef93ae660 156 RangeError, /**< When an instruction is out of the range
denis2nis 8:e74ef93ae660 157 for use */
denis2nis 8:e74ef93ae660 158 OverheatingError, /**< When internal temperature of servomotor
denis2nis 8:e74ef93ae660 159 is out of the range of operating
denis2nis 8:e74ef93ae660 160 temperature set in the Control table */
denis2nis 8:e74ef93ae660 161 AngleLimitError, /**< When Goal Position is written out of the
denis2nis 8:e74ef93ae660 162 range from CW Angle Limit to CCW Angle
denis2nis 8:e74ef93ae660 163 Limit */
denis2nis 8:e74ef93ae660 164 InputVoltageError, /**< When the applied voltage is out of the
denis2nis 8:e74ef93ae660 165 range of operating voltage set in the
denis2nis 8:e74ef93ae660 166 Control table */
denis2nis 8:e74ef93ae660 167 Unknown, /**< Combination of several errors (Caution:
denis2nis 8:e74ef93ae660 168 limit of enum approach to code errors) */
denis2nis 8:e74ef93ae660 169 Ok ///< no error
denis2nis 8:e74ef93ae660 170 };
denis2nis 8:e74ef93ae660 171
denis2nis 13:ccda9a56fef1 172 /** Enumeration of states of the medium acces control (MAC)
denis2nis 13:ccda9a56fef1 173 * of the master-slave protocol of the communication between
denis2nis 13:ccda9a56fef1 174 * the robot controller (master) and the servomotors (slaves).
denis2nis 8:e74ef93ae660 175 */
denis2nis 8:e74ef93ae660 176 enum SerialState {
denis2nis 8:e74ef93ae660 177 Writing, /**< Robot controller send an "instruction packet"
denis2nis 8:e74ef93ae660 178 (request) to a servomotor */
denis2nis 8:e74ef93ae660 179 Reading, /**< Robot controller receive a "status packet" from a
denis2nis 8:e74ef93ae660 180 requested servomotor */
denis2nis 8:e74ef93ae660 181 Idle ///< Robot controller ready for a new cycle request-answer
denis2nis 8:e74ef93ae660 182 };
denis2nis 8:e74ef93ae660 183
denis2nis 8:e74ef93ae660 184 /** Structure of store status packet (also known as return packet)
denis2nis 8:e74ef93ae660 185 * according tne Dynamixel protocol v1.0, which are messages sent
denis2nis 8:e74ef93ae660 186 * by servomotors to contriller in response of an instruction packet
denis2nis 8:e74ef93ae660 187 */
denis2nis 13:ccda9a56fef1 188 struct Status_packet {
denis2nis 13:ccda9a56fef1 189 unsigned char raw[MX12_PACKET_MAX_SIZE]; /**< bytes received */
denis2nis 13:ccda9a56fef1 190 unsigned char n_byte; /**< Number of received byte */
denis2nis 13:ccda9a56fef1 191 unsigned char servo_id; /**< Identifier field denoted servomotor
denis2nis 13:ccda9a56fef1 192 * involved in the message */
denis2nis 13:ccda9a56fef1 193 unsigned char length; /**< Length field of status packet */
denis2nis 13:ccda9a56fef1 194 unsigned char error; /**< Error field of status packet */
denis2nis 13:ccda9a56fef1 195 unsigned char n_param; /**< Number of received parameter*/
denis2nis 13:ccda9a56fef1 196 unsigned char param[MX12_PACKET_MAX_SIZE]; /**< array of received
denis2nis 13:ccda9a56fef1 197 * parameters */
denis2nis 13:ccda9a56fef1 198 unsigned char received_checksum; /**< Received checksum field */
denis2nis 13:ccda9a56fef1 199 unsigned char calculated_checksum; /**< Calculated checksum */
denis2nis 13:ccda9a56fef1 200 bool parsed; /**< status packet is correctly parsed */
denis2nis 13:ccda9a56fef1 201 bool valid; /**< received_checksum == calculated_checksum */
denis2nis 8:e74ef93ae660 202 };
denis2nis 8:e74ef93ae660 203
denis2nis 13:ccda9a56fef1 204 /**
denis2nis 13:ccda9a56fef1 205 * @brief Discrete states of the packet parser.
denis2nis 13:ccda9a56fef1 206 *
denis2nis 13:ccda9a56fef1 207 * @detail
denis2nis 13:ccda9a56fef1 208 * Each value corresponding to a field that the parser
denis2nis 13:ccda9a56fef1 209 * can identify according the Dynamixel protocol v1.0.
denis2nis 13:ccda9a56fef1 210 * Enumeration include field of instruction packets
denis2nis 13:ccda9a56fef1 211 * (packets sent to servomotors) and field of status packets
denis2nis 13:ccda9a56fef1 212 * (packets received from servomotors).
denis2nis 9:b4a5187fdec6 213 */
denis2nis 13:ccda9a56fef1 214 enum PacketField {
denis2nis 13:ccda9a56fef1 215 Header1, ///< Heading1 field of instruction or status packet
denis2nis 13:ccda9a56fef1 216 Header2, ///< Heading2 field of instruction or status packet
denis2nis 13:ccda9a56fef1 217 Id, ///< ID field of instruction or status packet
denis2nis 13:ccda9a56fef1 218 Length, ///< Length field of status packet
denis2nis 13:ccda9a56fef1 219 Error, ///< Error status field of status packet
denis2nis 13:ccda9a56fef1 220 Instruction, ///< Instruction field of instruction packet
denis2nis 13:ccda9a56fef1 221 Data, ///< expect to read parameter fields of status packet
denis2nis 13:ccda9a56fef1 222 Checksum ///< expect to read Checksum field of status packet
denis2nis 9:b4a5187fdec6 223 };
denis2nis 9:b4a5187fdec6 224
denis2nis 13:ccda9a56fef1 225 /** Structure to store the current state of packet parserComplement to the ParsingState enumeration to store the reading
denis2nis 9:b4a5187fdec6 226 * progress of each section of the status packet.
denis2nis 8:e74ef93ae660 227 */
denis2nis 13:ccda9a56fef1 228 struct ParserState {
denis2nis 13:ccda9a56fef1 229 MX12::PacketField expected_field; ///< next expected field
denis2nis 13:ccda9a56fef1 230 unsigned char byte_index; ///< index of byte already parsed
denis2nis 13:ccda9a56fef1 231 unsigned char param_index; ///< index of parameter already parsed
denis2nis 8:e74ef93ae660 232 };
denis2nis 5:0cf54586a4be 233
denis2nis 8:e74ef93ae660 234 /** Create MX12 instance
denis2nis 8:e74ef93ae660 235 *
denis2nis 8:e74ef93ae660 236 * @param tx board pin used for transmission in UART daisy chain link
denis2nis 8:e74ef93ae660 237 * to servomotors
denis2nis 8:e74ef93ae660 238 * @param rx board pin used for reception in UART daisy chain link
denis2nis 8:e74ef93ae660 239 * to servomotors
denis2nis 8:e74ef93ae660 240 * @param baud modulation rate of UART signal, unit: Baud
denis2nis 8:e74ef93ae660 241 * to servomotors
denis2nis 8:e74ef93ae660 242 */
denis2nis 8:e74ef93ae660 243 MX12(PinName tx, PinName rx, int baud=115200);
denis2nis 8:e74ef93ae660 244
denis2nis 8:e74ef93ae660 245 /** Send desired speed to a specific servomotor
denis2nis 8:e74ef93ae660 246 *
denis2nis 8:e74ef93ae660 247 * @param mot_id a unique value in the daisy chain network to identify
denis2nis 8:e74ef93ae660 248 * each servomotor
denis2nis 8:e74ef93ae660 249 * @param speed a float between -1 and 1 that represents the percentage
denis2nis 8:e74ef93ae660 250 * of maximum requested speed
denis2nis 8:e74ef93ae660 251 */
denis2nis 8:e74ef93ae660 252 void SetSpeed(unsigned char mot_id, float speed);
denis2nis 8:e74ef93ae660 253
denis2nis 10:ca9afe156ee1 254 /** Informs about the availability of the bus for a new transmission
denis2nis 10:ca9afe156ee1 255 * of instruction packet (Method Access Control)
denis2nis 10:ca9afe156ee1 256 *
denis2nis 10:ca9afe156ee1 257 * @returns true if bus ready for a new transmission, otherwise false
denis2nis 9:b4a5187fdec6 258 */
denis2nis 8:e74ef93ae660 259 char IsAvailable(void);
denis2nis 8:e74ef93ae660 260
denis2nis 8:e74ef93ae660 261 /**
denis2nis 13:ccda9a56fef1 262 * @brief Build and send an instruction packet to a servomotor
denis2nis 13:ccda9a56fef1 263 * according Dynamixel Protocol 1.0
denis2nis 13:ccda9a56fef1 264 *
denis2nis 13:ccda9a56fef1 265 * @detail This method is limited to only two kind of instruction :
denis2nis 13:ccda9a56fef1 266 * read data from a servomoteur et write data on servomotor.
denis2nis 13:ccda9a56fef1 267 * Ping, Reg Write, Action, Factory Reset, Rebbot, Sync Write
denis2nis 13:ccda9a56fef1 268 * and Bulk Read are not supported.
denis2nis 13:ccda9a56fef1 269 *
denis2nis 13:ccda9a56fef1 270 * For the method to issue a read instruction, set the data
denis2nis 13:ccda9a56fef1 271 * parameter to NULL, otherwise the method issue a
denis2nis 13:ccda9a56fef1 272 * write instruction
denis2nis 8:e74ef93ae660 273 *
denis2nis 8:e74ef93ae660 274 * @param[in] mot_id indicates the ID of the device (servomotor) that
denis2nis 8:e74ef93ae660 275 * should receive the Instruction Packet and process it
denis2nis 8:e74ef93ae660 276 * @param[in] address data address in the "Control Table of RAM Area"
denis2nis 8:e74ef93ae660 277 * of a servomotor MX12
denis2nis 8:e74ef93ae660 278 * (https://emanual.robotis.com/docs/en/dxl/mx/mx-12w/#control-table-of-ram-area).
denis2nis 8:e74ef93ae660 279 * @param[in] len if it is a write instruction, size in bytes
denis2nis 8:e74ef93ae660 280 * of the data to write in the "Control Table of RAM Area"
denis2nis 8:e74ef93ae660 281 * @param[in] data array of char containing parameter of Danamixel
denis2nis 13:ccda9a56fef1 282 * protocol that are the instruction’s auxiliary data field.
denis2nis 13:ccda9a56fef1 283 * Set to NULL for read instruction, otherwise the method issue
denis2nis 13:ccda9a56fef1 284 * a write instruction
denis2nis 8:e74ef93ae660 285 *
denis2nis 8:e74ef93ae660 286 * @see https://emanual.robotis.com/docs/en/dxl/protocol1/
denis2nis 8:e74ef93ae660 287 *
denis2nis 13:ccda9a56fef1 288 * Structure of instruction Packet
denis2nis 13:ccda9a56fef1 289 *
denis2nis 8:e74ef93ae660 290 * <PRE>
denis2nis 8:e74ef93ae660 291 * |Header1|Header2|Packet ID|Length|Instruction|Param1...ParamN|Checksum|
denis2nis 8:e74ef93ae660 292 * |-------|-------|---------|------|-----------|---------------|--------|
denis2nis 8:e74ef93ae660 293 * | 0xFF | 0xFF |Packet ID|Length|Instruction|Param1...ParamN| CHKSUM |
denis2nis 8:e74ef93ae660 294 * | cmd[0]| cmd[1]| cmd[2] |cmd[3]| cmd[4] |cmd[5]... | |
denis2nis 8:e74ef93ae660 295 * \\__ ___/ \\_ _/ \\__ __/
denis2nis 8:e74ef93ae660 296 * \/ \/ \/
denis2nis 8:e74ef93ae660 297 * mot_id address data
denis2nis 8:e74ef93ae660 298 * (len = N-1)
denis2nis 8:e74ef93ae660 299 * </PRE>
denis2nis 8:e74ef93ae660 300 */
denis2nis 8:e74ef93ae660 301 void rw(unsigned char mot_id, char address, char len, char *data);
denis2nis 8:e74ef93ae660 302
denis2nis 13:ccda9a56fef1 303 /**
denis2nis 13:ccda9a56fef1 304 * Display status packet in hexadecimal format
denis2nis 8:e74ef93ae660 305 *
denis2nis 8:e74ef93ae660 306 * @warning
denis2nis 13:ccda9a56fef1 307 * Use console without any previous declaration. Assume console is
denis2nis 13:ccda9a56fef1 308 * setup by calling program
denis2nis 8:e74ef93ae660 309 */
denis2nis 8:e74ef93ae660 310 void PrintSerial();
denis2nis 8:e74ef93ae660 311
denis2nis 8:e74ef93ae660 312 /**
denis2nis 8:e74ef93ae660 313 * Get information from de Error byte of the last status packet
denis2nis 8:e74ef93ae660 314 * received from a servomotor
denis2nis 8:e74ef93ae660 315 *
denis2nis 8:e74ef93ae660 316 * @return
denis2nis 8:e74ef93ae660 317 * One of enum MX12::Status value to describe errors. 'Ok' is
denis2nis 8:e74ef93ae660 318 * returns if no error occurred during the last operation of
denis2nis 8:e74ef93ae660 319 * servomotor.
denis2nis 8:e74ef93ae660 320 *
denis2nis 8:e74ef93ae660 321 * @warning
denis2nis 10:ca9afe156ee1 322 *
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 14:5a0c7b30f8c0 326 * @warning
denis2nis 10:ca9afe156ee1 327 *
denis2nis 10:ca9afe156ee1 328 * Bug: this method has a hazardous behavior because it provides
denis2nis 10:ca9afe156ee1 329 * a result by reading the content of the variable _current_frame
denis2nis 13:ccda9a56fef1 330 * which can be modified at any time by the private ISR _Rx_interrupt()
denis2nis 8:e74ef93ae660 331 */
denis2nis 8:e74ef93ae660 332 MX12::Status GetStatus(void);
denis2nis 5:0cf54586a4be 333
denis2nis 8:e74ef93ae660 334 /* function aivailaible in a previous version of the class
denis2nis 8:e74ef93ae660 335 */
denis2nis 8:e74ef93ae660 336 // MX12::Status GetStatus(void);
denis2nis 8:e74ef93ae660 337 // void ReadPosition(unsigned char mot_id);
denis2nis 8:e74ef93ae660 338 // float GetPosition(unsigned char mot_id);
denis2nis 8:e74ef93ae660 339
denis2nis 10:ca9afe156ee1 340 protected:
denis2nis 5:0cf54586a4be 341
denis2nis 13:ccda9a56fef1 342 /** Serial port where servomotor bus is connected
denis2nis 9:b4a5187fdec6 343 */
denis2nis 8:e74ef93ae660 344 UnbufferedSerial _mx12;
denis2nis 13:ccda9a56fef1 345
denis2nis 13:ccda9a56fef1 346
denis2nis 13:ccda9a56fef1 347 /** Servomotor bus state to managed medium acces control (MAC)
denis2nis 13:ccda9a56fef1 348 */
denis2nis 13:ccda9a56fef1 349 MX12::SerialState _bus_state;
denis2nis 8:e74ef93ae660 350
denis2nis 13:ccda9a56fef1 351 /** Structure filled by ISR (Interrupt Service Routine) ReadCallback()
denis2nis 13:ccda9a56fef1 352 * parser to store message received from servomotor byte after byte
denis2nis 8:e74ef93ae660 353 */
denis2nis 13:ccda9a56fef1 354 MX12::Status_packet _status_pck;
denis2nis 13:ccda9a56fef1 355
denis2nis 13:ccda9a56fef1 356 /** Structure update by ISR (Interrupt Service Routine) ReadCallback()
denis2nis 13:ccda9a56fef1 357 * parser to model its current state
denis2nis 13:ccda9a56fef1 358 */
denis2nis 13:ccda9a56fef1 359 MX12::ParserState _parser_state;
denis2nis 13:ccda9a56fef1 360
denis2nis 8:e74ef93ae660 361
denis2nis 8:e74ef93ae660 362 unsigned char _answer;
denis2nis 13:ccda9a56fef1 363
denis2nis 13:ccda9a56fef1 364 /**
denis2nis 13:ccda9a56fef1 365 * @brief
denis2nis 13:ccda9a56fef1 366 * Interupt service routine (ISR) to read and parse received message
denis2nis 13:ccda9a56fef1 367 *
denis2nis 13:ccda9a56fef1 368 * @detail
denis2nis 8:e74ef93ae660 369 *
denis2nis 13:ccda9a56fef1 370 * This interupt routine is attached to reception event on servomoteur
denis2nis 13:ccda9a56fef1 371 * bus and is called for each character received on bus.
denis2nis 13:ccda9a56fef1 372 *
denis2nis 13:ccda9a56fef1 373 * As the characters are received, the progress of the parser
denis2nis 13:ccda9a56fef1 374 * is stored in _parser_state and the result of the analysis
denis2nis 13:ccda9a56fef1 375 * is stored in _status_pck.
denis2nis 8:e74ef93ae660 376 */
denis2nis 13:ccda9a56fef1 377 void _Rx_interrupt();
denis2nis 8:e74ef93ae660 378
denis2nis 0:7556356a8bcd 379 };
denis2nis 0:7556356a8bcd 380
denis2nis 8:e74ef93ae660 381 #endif /* MBED_MX12_H_ */