Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: MX12.h
- Revision:
- 31:61f9fca504dd
- Parent:
- 30:4e7cf52ac2dd
--- a/MX12.h Fri Feb 04 09:22:50 2022 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,410 +0,0 @@ -/** - * @file MX12.h - * @brief this header file contains all required definitions and - * basic utilities functions to manage au bus of servomotor - * Dynaminel MX12 - */ -#ifndef MBED_MX12_H_ -#define MBED_MX12_H_ - -#include "mbed.h" - -#define MX12_PACKET_MAX_SIZE 32 -#define MX12_MAX_MOTOR_COUNT 16 - -#define MX12_SPEED_QUANTA_RPM 0.916 /* Data from MX12 e-manual */ -#define MX12_ABSOLUTE_MAX_SPEED_RAD_S 98.13 - - - -/* Dynamixel protocol v1.0 : Instructions - ******************************************/ -#define PROTOCOL_INSTRUCTION_PING 0x01 -#define PROTOCOL_INSTRUCTION_READ 0x02 -#define PROTOCOL_INSTRUCTION_WRITE 0x03 -#define PROTOCOL_INSTRUCTION_REG_WRITE 0x04 -#define PROTOCOL_INSTRUCTION_ACTION 0x05 -#define PROTOCOL_INSTRUCTION_FACTORY_RESET 0x06 -#define PROTOCOL_INSTRUCTION_REBOOT 0x08 -#define PROTOCOL_INSTRUCTION_SYNC_WRITE 0x83 -#define PROTOCOL_INSTRUCTION_BULK_READ 0x92 - -/* Dynamixel protocol v1.0 : Contro table content - ************************************************/ -#define CONTROL_TABLE_MODEL_NUMBER 0 -#define CONTROL_TABLE_FIRMWARE_VERSION 2 -#define CONTROL_TABLE_ID 3 -#define CONTROL_TABLE_BAUD_RATE 4 -#define CONTROL_TABLE_RETURN_DELAY_TIME 5 -#define CONTROL_TABLE_CW_ANGLE_LIMIT 6 -#define CONTROL_TABLE_CCW_ANGLE_LIMIT 8 -#define CONTROL_TABLE_TEMPERATURE_LIMIT 11 -#define CONTROL_TABLE_MIN_VOLTAGE_LIMIT 12 -#define CONTROL_TABLE_MAX_VOLTAGE_LIMIT 13 -#define CONTROL_TABLE_MAX_TORQUE 14 -#define CONTROL_TABLE_STATUS_RETURN_LEVEL 16 -#define CONTROL_TABLE_ALARM_LED 17 -#define CONTROL_TABLE_SHUTDOWN 18 -#define CONTROL_TABLE_MULTITURN_OFFSET 20 -#define CONTROL_TABLE_RESOLUTION_DIVIDER 22 -#define CONTROL_TABLE_TORQUE_ENABLE 24 -#define CONTROL_TABLE_LED 25 -#define CONTROL_TABLE_P_GAIN 26 -#define CONTROL_TABLE_I_GAIN 27 -#define CONTROL_TABLE_D_GAIN 28 -#define CONTROL_TABLE_GOAL_POSITION 30 -#define CONTROL_TABLE_MOVING_SPEED 32 -#define CONTROL_TABLE_TORQUE_LIMIT 34 -#define CONTROL_TABLE_PRESENT_POSITION 36 -#define CONTROL_TABLE_PRESENT_SPEED 38 -#define CONTROL_TABLE_PRESENT_LOAD 40 -#define CONTROL_TABLE_PRESENT_VOLTAGE 42 -#define CONTROL_TABLE_PRESENT_TEMPERATURE 43 -#define CONTROL_TABLE_REGISTRED_INSTRUCTION 44 -#define CONTROL_TABLE_MOVING 46 -#define CONTROL_TABLE_LOCK 47 -#define CONTROL_TABLE_PUNCH 48 -#define CONTROL_TABLE_GOAL_ACCELERATION 73 - -/** - * @brief Class to communicate with Dynamixel MX12 servomotors - * - * @details - * - * The servomotors are daisy chained to a serial link of the target - * microcontroller. The class ensures the initialization of serial link - * and the management of communications mainly to control rotational - * speed of servomotors. - * - * Transmission of messages to the servomotors is blocking while - * reception is non-blocking thanks to the use of an interrupt routine. - * - * @author Titouan Soulard (creator and maintainer until April 2021) - * @author Bruno Denis (Doxygen documentation and code rearrangement) - * - * @see Control table of Dynamixel MX12 servomotor - * @see https://emanual.robotis.com/docs/en/dxl/mx/mx-12w/ - * @see Dynamixel protocol v1.0 manual - * @see https://emanual.robotis.com/docs/en/dxl/protocol1/ - * - * Example of class usage to send two instruction packets to servomotor #1 - * with one second gap. First ask to move at 10% of maximum speed and the - * stop the movement. - * - * @code - * #include "mbed.h" - * #include "MX12.h" - * - * #define SERVO_TX_PIN PC_4 - * #define SERVO_RX_PIN PC_5 - * #define SERVO_BAUD 115200 - * #define SERVO_ID 1 - * - * #define DELAY_1000ms 1000 - * #define DELAY_1ms 1 - * - * MX12 servo_bus(SERVO_TX_PIN, SERVO_RX_PIN, SERVO_BAUD); - * float relative_speed; - * - * int main() - * { - * // Set speed of SERVO_ID servomotor to 10% - * // Send on servo_bus to SERVO_ID motor the instruction "moving speed" - * // with parameter 0.1 (10% of maximum speed) - * relative_speed = 0.1; - * servo_bus.SetSpeed(SERVO_ID, relative_speed); - * - * // wait for one second - * thread_sleep_for(DELAY_1000ms); - * - * // set speed of SERVO_ID servomotor to 0% - * relative_speed = 0.0; - * servo_bus.SetSpeed(SERVO_ID, relative_speed); - * - * // infinite loop - * while (true) thread_sleep_for(DELAY_1000ms); - * } - * @endcode - * - * @warning - * Warning: receipt of packets from servomotors has not been tested - * (hardwre problem). However, sending move speed instruction is operational. - * - * @warning - * Warning: Error field of status packet if decoded by GetStatus() returns - * an enumation type "Status". As several errors can be reported - * simultaneously the type enum is not suitable (B. Denis 11/2021). - * - * @bug - * Bug: GetStatus() method has a hazardous behavior because it provides - * a result by reading the content of the variable _current_frame - * which can be modified at any time by the private ISR _Rx_interrupt(). - * - */ -class MX12 -{ - public: - - /** Error status occurred during the operation of servomotor. - * - * @warning - * Enumaration type is not suitable for all error status because - * it can denote only one error at a time (B. Denis 11/2021) - */ - enum Status { - InstructionError, /**< In case of sending an undefined instruction - or delivering the action instruction - without the Reg Write instruction */ - OverloadError, /**< When the current load cannot be controlled - by the set Torque */ - ChecksumError, /**< When the Checksum of the transmitted - Instruction Packet is incorrect */ - RangeError, /**< When an instruction is out of the range - for use */ - OverheatingError, /**< When internal temperature of servomotor - is out of the range of operating - temperature set in the Control table */ - AngleLimitError, /**< When Goal Position is written out of the - range from CW Angle Limit to CCW Angle - Limit */ - InputVoltageError, /**< When the applied voltage is out of the - range of operating voltage set in the - Control table */ - Unknown, /**< Combination of several errors (Caution: - limit of enum approach to code errors) */ - Ok ///< no error - }; - - /** Enumeration of states of the medium acces control (MAC) - * of the master-slave protocol of the communication between - * the robot controller (master) and the servomotors (slaves). - */ - enum SerialState { - Writing, /**< Robot controller send an "instruction packet" - (request) to a servomotor */ - Reading, /**< Robot controller receive a "status packet" from a - requested servomotor */ - Idle ///< Robot controller ready for a new cycle request-answer - }; - - /** Structure of store status packet (also known as return packet) - * according tne Dynamixel protocol v1.0, which are messages sent - * by servomotors to contriller in response of an instruction packet - */ - struct Status_packet { - unsigned char raw[MX12_PACKET_MAX_SIZE]; /**< bytes received */ - unsigned char n_byte; /**< Number of received byte */ - unsigned char servo_id; /**< Identifier field denoted servomotor - * involved in the message */ - unsigned char length; /**< Length field of status packet */ - unsigned char error; /**< Error field of status packet */ - unsigned char n_param; /**< Number of received parameter*/ - unsigned char param[MX12_PACKET_MAX_SIZE]; /**< array of received - * parameters */ - unsigned char received_checksum; /**< Received checksum field */ - unsigned char calculated_checksum; /**< Calculated checksum */ - bool parsed; /**< status packet is correctly parsed */ - bool valid; /**< received_checksum == calculated_checksum */ - }; - - /** - * @brief Discrete states of the packet parser. - * - * @detail - * Each value corresponding to a field that the parser - * can identify according the Dynamixel protocol v1.0. - * Enumeration include field of instruction packets - * (packets sent to servomotors) and field of status packets - * (packets received from servomotors). - */ - enum PacketField { - Header1, ///< Heading1 field of instruction or status packet - Header2, ///< Heading2 field of instruction or status packet - Id, ///< ID field of instruction or status packet - Length, ///< Length field of status packet - Error, ///< Error status field of status packet - Instruction, ///< Instruction field of instruction packet - Data, ///< expect to read parameter fields of status packet - Checksum ///< expect to read Checksum field of status packet - }; - - /** Structure to store the current state of packet parserComplement to the ParsingState enumeration to store the reading - * progress of each section of the status packet. - */ - struct ParserState { - MX12::PacketField expected_field; ///< next expected field - unsigned char byte_index; ///< index of byte already parsed - unsigned char param_index; ///< index of parameter already parsed - }; - - /** Create an instance of MX12 and attach it to a serial link - * - * @param tx board pin used for transmission in UART daisy chain link - * to servomotors - * @param rx board pin used for reception in UART daisy chain link - * to servomotors - * @param baud modulation rate of UART signal, unit: Baud - * to servomotors - */ - MX12(PinName tx, PinName rx, int baud=115200); - - /** Send desired normalized speed to a specific servomotor - * - * @param mot_id a unique value in the daisy chain network to identify - * each servomotor - * @param speed a float between -1 and 1 that represents the percentage - * of maximum requested speed - */ - void SetSpeed(unsigned char mot_id, float speed); - - /** Send desired ablosute speed to a specific servomotor - * - * @param mot_id a unique value in the daisy chain network to identify - * each servomotor - * @param speed desired speed in radians per second - */ - void SetSpeed_rad_s(unsigned char mot_id, float speed); - - /** Informs about the availability of the bus for a new transmission - * of instruction packet (Method Access Control) - * - * @returns true if bus ready for a new transmission, otherwise false - */ - char IsAvailable(void); - - /** - * @brief Build and send an instruction packet to a servomotor - * according Dynamixel Protocol 1.0 - * - * @detail This method is limited to only two kind of instruction : - * read data from a servomoteur et write data on servomotor. - * Ping, Reg Write, Action, Factory Reset, Rebbot, Sync Write - * and Bulk Read are not supported. - * - * For the method to issue a read instruction, set the data - * parameter to NULL, otherwise the method issue a - * write instruction - * - * @param[in] mot_id indicates the ID of the device (servomotor) that - * should receive the Instruction Packet and process it - * @param[in] address data address in the "Control Table of RAM Area" - * of a servomotor MX12 - * (https://emanual.robotis.com/docs/en/dxl/mx/mx-12w/#control-table-of-ram-area). - * @param[in] len if it is a write instruction, size in bytes - * of the data to write in the "Control Table of RAM Area" - * @param[in] data array of char containing parameter of Danamixel - * protocol that are the instruction’s auxiliary data field. - * Set to NULL for read instruction, otherwise the method issue - * a write instruction - * - * @see https://emanual.robotis.com/docs/en/dxl/protocol1/ - * - * Structure of instruction Packet - * - * <PRE> - * |Header1|Header2|Packet ID|Length|Instruction|Param1...ParamN|Checksum| - * |-------|-------|---------|------|-----------|---------------|--------| - * | 0xFF | 0xFF |Packet ID|Length|Instruction|Param1...ParamN| CHKSUM | - * | cmd[0]| cmd[1]| cmd[2] |cmd[3]| cmd[4] |cmd[5]... | | - * \\__ ___/ \\_ _/ \\__ __/ - * \/ \/ \/ - * mot_id address data - * (len = N-1) - * </PRE> - */ - void rw(unsigned char mot_id, char address, char len, char *data); - - /** - * Display status packet in hexadecimal format - * - * @warning - * Use console without any previous declaration. Assume console is - * setup by calling program - */ - void PrintSerial(); - - /** - * Get information from de Error byte of the last status packet - * received from a servomotor - * - * @return - * One of enum MX12::Status value to describe errors. 'Ok' is - * returns if no error occurred during the last operation of - * servomotor. - * - * @warning - * Warning: if a combination of several errors is reported the function - * returns "Unknown". - * - * @bug - * Bug: this method has a hazardous behavior because it provides - * a result by reading the content of the variable _current_frame - * which can be modified at any time by the private ISR _Rx_interrupt() - */ - - MX12::Status GetStatus(void); - - - // Allow to read the status packet - char ReadSerial(); - - /* function aivailaible in a previous version of the class - */ - // MX12::Status GetStatus(void); - // void ReadPosition(unsigned char mot_id); - // float GetPosition(unsigned char mot_id); - - void cmd_moteur(float Vavance, float Vlat, float Wz); - // envoie la commande moteur de manière à avancer d'une vitesse Vavance en - // mètres par seconde, d'une vitesse Vlat en mètre par seconde et d'une - // vitesse de rotation Wz en rad/s - - void eteindre_moteurs(); - // permet d'enlever le couple dans les moteurs - - void cmd_moteur_multiturn(float pos1, float pos2, float pos3); - // permet de positionner le moteur pas à pas - - void cmd_moteur_rampe_unitaire(int id_moteur, float w_moteur, int step, float time); - - protected: - - /** Serial port where servomotor bus is connected - */ - UnbufferedSerial _mx12; - - - /** Servomotor bus state to managed medium acces control (MAC) - */ - MX12::SerialState _bus_state; - - /** Structure filled by ISR (Interrupt Service Routine) ReadCallback() - * parser to store message received from servomotor byte after byte - */ - MX12::Status_packet _status_pck; - - /** Structure update by ISR (Interrupt Service Routine) ReadCallback() - * parser to model its current state - */ - MX12::ParserState _parser_state; - - - unsigned char _answer; - - /** - * @brief - * Interupt service routine (ISR) to read and parse received message - * - * @detail - * This interupt routine is attached to reception event on servomoteur - * bus and is called for each character received on bus. - * - * As the characters are received, the progress of the parser - * is stored in _parser_state and the result of the analysis - * is stored in _status_pck. - */ - void _Rx_interrupt(); - -}; - -#endif /* MBED_MX12_H_ */ \ No newline at end of file