diff --git a/dynamixel_manager/include/modules/dyn_servos.h b/dynamixel_manager/include/modules/dyn_servos.h index 07d4e55521b0279fda66c9fe001c91c7623ce551..f3dc02d85a8e1f20bfe293e8d8e9bfc336db1db7 100755 --- a/dynamixel_manager/include/modules/dyn_servos.h +++ b/dynamixel_manager/include/modules/dyn_servos.h @@ -1,125 +1,107 @@ #ifndef _DYN_SERVOS_H #define _DYN_SERVOS_H -// Servo register map -typedef enum{ - P_MODEL_NUMBER_L = 0, - P_MODEL_NUMBER_H = 1, - P_VERSION = 2, - P_ID = 3, - P_BAUD_RATE = 4, - P_RETURN_DELAY_TIME = 5, - P_CW_ANGLE_LIMIT_L = 6, - P_CW_ANGLE_LIMIT_H = 7, - P_CCW_ANGLE_LIMIT_L = 8, - P_CCW_ANGLE_LIMIT_H = 9, - P_SYSTEM_DATA2 = 10, - P_HIGH_LIMIT_TEMPERATURE = 11, - P_LOW_LIMIT_VOLTAGE = 12, - P_HIGH_LIMIT_VOLTAGE = 13, - P_MAX_TORQUE_L = 14, - P_MAX_TORQUE_H = 15, - P_RETURN_LEVEL = 16, - P_ALARM_LED = 17, - P_ALARM_SHUTDOWN = 18, - P_OPERATING_MODE = 19, - P_LOW_CALIBRATION_L = 20, - P_LOW_CALIBRATION_H = 21, - P_HIGH_CALIBRATION_L = 22, - P_HIGH_CALIBRATION_H = 23, - P_TORQUE_ENABLE = 24, - P_LED = 25, - P_CW_COMPLIANCE_MARGIN = 26, - P_CCW_COMPLIANCE_MARGIN = 27, - P_CW_COMPLIANCE_SLOPE = 28, - P_CCW_COMPLIANCE_SLOPE = 29, - P_D_GAIN = 26, - P_I_GAIN = 27, - P_P_GAIN = 28, - P_RESERVED = 29, - P_GOAL_POSITION_L = 30, - P_GOAL_POSITION_H = 31, - P_MOVING_SPEED_L = 32, - P_MOVING_SPEED_H = 33, - P_TORQUE_LIMIT_L = 34, - P_TORQUE_LIMIT_H = 35, - P_PRESENT_POSITION_L = 36, - P_PRESENT_POSITION_H = 37, - P_PRESENT_SPEED_L = 38, - P_PRESENT_SPEED_H = 39, - P_PRESENT_LOAD_L = 40, - P_PRESENT_LOAD_H = 41, - P_PRESENT_VOLTAGE = 42, - P_PRESENT_TEMPERATURE = 43, - P_REGISTERED_INSTRUCTION = 44, - P_PAUSE_TIME = 45, - P_MOVING = 46, - P_LOCK = 47, - P_PUNCH_L = 48, - P_PUNCH_H = 49, - P_RESERVED4 = 50, - P_RESERVED5 = 51, - P_POT_L = 52, - P_POT_H = 53, - P_PWM_OUT_L = 54, - P_PWM_OUT_H = 55, - P_P_ERROR_L = 56, - P_P_ERROR_H = 57, - P_I_ERROR_L = 58, - P_I_ERROR_H = 59, - P_D_ERROR_L = 60, - P_D_ERROR_H = 61, - P_P_ERROR_OUT_L = 62, - P_P_ERROR_OUT_H = 63, - P_I_ERROR_OUT_L = 64, - P_I_ERROR_OUT_H = 65, - P_D_ERROR_OUT_L = 66, - P_D_ERROR_OUT_H = 67}TDynServo; +#define NUM_REG 62 -typedef enum{ - XL_MODEL_NUMBER_L = 0, - XL_MODEL_NUMBER_H = 1, - XL_VERSION = 2, - XL_ID = 3, - XL_BAUD_RATE = 4, - XL_RETURN_DELAY_TIME = 5, - XL_CW_ANGLE_LIMIT_L = 6, - XL_CW_ANGLE_LIMIT_H = 7, - XL_CCW_ANGLE_LIMIT_L = 8, - XL_CCW_ANGLE_LIMIT_H = 9, - XL_SYSTEM_DATA2 = 10, - XL_CONTROL_MODE = 11, - XL_HIGH_LIMIT_TEMPERATURE = 12, - XL_LOW_LIMIT_VOLTAGE = 13, - XL_HIGH_LIMIT_VOLTAGE = 14, - XL_MAX_TORQUE_L = 15, - XL_MAX_TORQUE_H = 16, - XL_RETURN_LEVEL = 17, - XL_ALARM_SHUTDOWN = 18, - XL_TORQUE_ENABLE = 24, - XL_LED = 25, - XL_D_GAIN = 27, - XL_I_GAIN = 28, - XL_P_GAIN = 29, - XL_GOAL_POSITION_L = 30, - XL_GOAL_POSITION_H = 31, - XL_MOVING_SPEED_L = 32, - XL_MOVING_SPEED_H = 33, - XL_TORQUE_LIMIT_L = 35, - XL_TORQUE_LIMIT_H = 36, - XL_PRESENT_POSITION_L = 37, - XL_PRESENT_POSITION_H = 38, - XL_PRESENT_SPEED_L = 39, - XL_PRESENT_SPEED_H = 40, - XL_PRESENT_LOAD_L = 41, - XL_PRESENT_LOAD_H = 42, - XL_PRESENT_VOLTAGE = 45, - XL_PRESENT_TEMPERATURE = 46, - XL_REGISTERED_INSTRUCTION = 47, - XL_MOVING = 49, - XL_HARDWARE_ERROR_STATUS = 50, - XL_PUNCH_L = 51, - XL_PUNCH_H = 51}TXLServo; +typedef struct{ + unsigned short int address; + unsigned char size; + unsigned char eeprom; +}TDynReg; +extern TDynReg ax_reg[NUM_REG]; +extern TDynReg mx_1_0_reg[NUM_REG]; +extern TDynReg mx_2_0_reg[NUM_REG]; +extern TDynReg xl_reg[NUM_REG]; + +typedef enum { + // [Access] [Description] + // Info + model_number=0, // (R) Model Number + model_info, // (R) + firmware_version, // (R) Version of the Firmware + id, // (RW) ID of Dynamixel + baudrate, // (RW) Baud Rate of Dynamixel + return_delay_time, // (RW) Return Delay Time + second_id, // (RW) + protocol, // (RW) + return_level, // (RW) Status Return Level + // Configuration + drive_mode, // (RW) Drive mode + op_mode, // (RW) Joint or wheel mode + homming_offset, // (RW) + moving_threshold, // (RW) + min_angle_limit, // (RW) Clockwise Angle Limit + max_angle_limit, // (RW) Counterclockwise Angle Limit + temp_limit, // (RW) Internal Temperature Limit + min_voltage_limit, // (RW) Lowest Voltage Limit + max_voltage_limit, // (RW) Highest Voltage Limit + pwm_limit, // (RW) Maximum Torque + max_pwm, // (RW) Maximum Torque + current_limit, // (RW) + max_current, // (RW) + velocity_limit, // (RW) + multi_turn_off, // (RW) Multi turn offset position + resolution_div, // (RW) Resolution divider + // Status + alarm_led, // (RW) LED for Alarm + alarm_shtdwn, // (RW) Shutdown for Alarm + led, // (RW) LED On/Off + bus_watchdog, // (RW) + moving, // (R) Means if there is any movement + moving_status, // (R) + lock, // (RW) Locking EEPROM + reg_inst, // (RW) Means if Instruction is registered + hardware_error, // (R) Means if there is any movement + // control + torque_en, // (RW) Torque On/Off + vel_pid_i, // (RW) + vel_pid_p, // (RW) + pos_pid_p, // (RW) + pos_pid_i, // (RW) + pos_pid_d, // (RW) + feedfwd_gain_2, // (RW) + feedfwd_gain_1, // (RW) + cw_comp_margin, // (RW) CW Compliance Margin + ccw_comp_margin, // (RW) CCW Compliance Margin + cw_comp_slope, // (RW) CW Compliance Slope + ccw_comp_slope, // (RW) CCW Compliance Slope + punch, // (RW) Punch + // Set point + goal_pos, // (RW) Goal Position + goal_speed, // (RW) Moving Speed + goal_pwm, // (RW) + goal_current, // (RW) + profile_accel, // (RW) + profile_vel, // (RW) + // Feedback + current_pos, // (R) Current Position + current_speed, // (R) Current Speed + current_load, // (R) Current Load + current_voltage, // (R) Current Voltage + current_temp, // (R) Current Temperature + current_pwm, // (R) + realtime_tick, // (R) Realtime tick + velocity_traj, // (R) + pos_traj // (R) +} reg_id; + +#define NUM_SERVO_MODELS 11 + +typedef struct{ + unsigned short int model; + unsigned short int encoder_resolution; + unsigned char gear_ratio; + unsigned short int max_angle; + unsigned short int center_angle; + unsigned short int max_speed; + long long int cw_angle_limit; + long long int ccw_angle_limit; + TDynReg *registers; + unsigned char pid; + unsigned char protocol_ver; +}TServoConfig; + +extern TServoConfig servo_data[NUM_SERVO_MODELS]; #endif diff --git a/dynamixel_manager/src/modules/dyn_servos.c b/dynamixel_manager/src/modules/dyn_servos.c new file mode 100644 index 0000000000000000000000000000000000000000..4a7ba4a90f29903fa52bbd3bf4fb2dce2b9396ff --- /dev/null +++ b/dynamixel_manager/src/modules/dyn_servos.c @@ -0,0 +1,291 @@ +#include "dyn_servos.h" + +TDynReg ax_reg[NUM_REG]={// Info + {0x0000,2,1}, + {0xFFFF,0,0}, + {0x0002,1,1}, + {0x0003,1,1}, + {0x0004,1,1}, + {0x0005,1,1}, + {0xFFFF,0,0}, + {0xFFFF,0,0}, + {0x0010,1,1}, + // Configuration + {0xFFFF,0,0}, + {0xFFFF,0,0}, + {0xFFFF,0,0}, + {0xFFFF,0,0}, + {0x0006,2,1}, + {0x0008,2,1}, + {0x000B,1,1}, + {0x000C,1,1}, + {0x000D,1,1}, + {0x000E,2,1}, + {0x0022,2,0}, + {0xFFFF,0,0}, + {0xFFFF,0,0}, + {0xFFFF,0,0}, + {0xFFFF,0,0}, + {0xFFFF,0,0}, + // Status + {0x0011,1,1}, + {0x0012,1,1}, + {0x0019,1,0}, + {0xFFFF,0,0}, + {0x002E,1,0}, + {0xFFFF,0,0}, + {0x002F,1,0}, + {0x002C,1,0}, + {0xFFFF,0,0}, + // Control + {0x0018,1,0}, + {0xFFFF,0,0}, + {0xFFFF,0,0}, + {0xFFFF,0,0}, + {0xFFFF,0,0}, + {0xFFFF,0,0}, + {0xFFFF,0,0}, + {0xFFFF,0,0}, + {0x001A,1,0}, + {0x001B,1,0}, + {0x001C,1,0}, + {0x001D,1,0}, + {0x0030,2,0}, + // Set point + {0x001E,2,0}, + {0x0020,2,0}, + {0xFFFF,0,0}, + {0xFFFF,0,0}, + {0xFFFF,0,0}, + {0xFFFF,0,0}, + // Feedback + {0x0024,2,0}, + {0x0026,2,0}, + {0x0028,2,0}, + {0x002A,1,0}, + {0x002B,1,0}, + {0xFFFF,0,0}, + {0xFFFF,0,0}, + {0xFFFF,0,0}, + {0xFFFF,0,0}}; + +TDynReg mx_1_0_reg[NUM_REG]={// Info + {0x0000,2,1}, + {0xFFFF,0,0}, + {0x0002,1,1}, + {0x0003,1,1}, + {0x0004,1,1}, + {0x0005,1,1}, + {0xFFFF,0,0}, + {0xFFFF,0,0}, + {0x0010,1,1}, + // Configuration + {0xFFFF,0,0}, + {0xFFFF,0,0}, + {0xFFFF,0,0}, + {0xFFFF,0,0}, + {0x0006,2,1}, + {0x0008,2,1}, + {0x000B,1,1}, + {0x000C,1,1}, + {0x000D,1,1}, + {0x000E,2,1}, + {0x0022,2,0}, + {0xFFFF,0,0}, + {0xFFFF,0,0}, + {0x0020,2,0}, + {0x0014,2,1}, + {0x0016,1,1}, + // Status + {0x0011,1,1}, + {0x0012,1,1}, + {0x0019,1,0}, + {0xFFFF,0,0}, + {0x002E,1,0}, + {0xFFFF,0,0}, + {0x002F,1,0}, + {0x002C,1,0}, + {0xFFFF,0,0}, + // Control + {0x0018,1,0}, + {0xFFFF,0,0}, + {0xFFFF,0,0}, + {0x001C,1,0}, + {0x001B,1,0}, + {0x001A,1,0}, + {0xFFFF,0,0}, + {0xFFFF,0,0}, + {0xFFFF,0,0}, + {0xFFFF,0,0}, + {0xFFFF,0,0}, + {0xFFFF,0,0}, + {0x0030,2,0}, + // Set point + {0x001E,2,0}, + {0x0020,2,0}, + {0xFFFF,0,0}, + {0xFFFF,0,0}, + {0x0049,1,0}, + {0xFFFF,0,0}, + // Feedback + {0x0024,2,0}, + {0x0026,2,0}, + {0x0028,2,0}, + {0x002A,1,0}, + {0x002B,1,0}, + {0xFFFF,0,0}, + {0x0032,2,0}, + {0xFFFF,0,0}, + {0xFFFF,0,0}}; + +TDynReg xl_reg[NUM_REG]={// Info + {0x0000,2,1}, + {0xFFFF,0,0}, + {0x0002,1,1}, + {0x0003,1,1}, + {0x0004,1,1}, + {0x0005,1,1}, + {0xFFFF,0,0}, + {0xFFFF,0,0}, + {0x0011,1,1}, + // Configuration + {0xFFFF,0,0}, + {0x000B,1,1}, + {0xFFFF,0,0}, + {0xFFFF,0,0}, + {0x0006,2,1}, + {0x0008,2,1}, + {0x000C,1,1}, + {0x000D,1,1}, + {0x000E,1,1}, + {0x000F,2,1}, + {0x0023,2,0}, + {0xFFFF,0,0}, + {0xFFFF,0,0}, + {0xFFFF,0,0}, + {0xFFFF,0,0}, + {0xFFFF,0,0}, + // Status + {0x0012,1,1}, + {0x0012,1,1}, + {0x0019,1,0}, + {0xFFFF,0,0}, + {0x0031,1,0}, + {0xFFFF,0,0}, + {0xFFFF,0,0}, + {0x002F,1,0}, + {0x0032,1,0}, + // Control + {0x0018,1,0}, + {0xFFFF,0,0}, + {0xFFFF,0,0}, + {0x001D,1,0}, + {0x001C,1,0}, + {0x001B,1,0}, + {0xFFFF,0,0}, + {0xFFFF,0,0}, + {0xFFFF,0,0}, + {0xFFFF,0,0}, + {0xFFFF,0,0}, + {0xFFFF,0,0}, + {0x0033,2,0}, + // Set point + {0x001E,2,0}, + {0x0020,2,0}, + {0xFFFF,0,0}, + {0xFFFF,0,0}, + {0x0049,1,0}, + {0xFFFF,0,0}, + // Feedback + {0x0025,2,0}, + {0x0027,2,0}, + {0x0029,2,0}, + {0x002D,1,0}, + {0x002E,1,0}, + {0xFFFF,0,0}, + {0xFFFF,0,0}, + {0xFFFF,0,0}, + {0xFFFF,0,0}}; + +TDynReg mx_2_0_reg[NUM_REG]={// Info + {0x0000,2,1}, + {0x0002,4,1}, + {0x0006,1,1}, + {0x0007,1,1}, + {0x0008,1,1}, + {0x0009,1,1}, + {0x000C,1,1}, + {0x000D,1,1}, + {0x0044,1,0}, + // Configuration + {0x000A,1,1}, + {0x000B,1,1}, + {0x0014,4,1}, + {0x0018,4,1}, + {0x0034,4,1}, + {0x0030,4,1}, + {0x001F,1,1}, + {0x0022,2,1}, + {0x0020,2,1}, + {0x0024,2,1}, + {0xFFFF,0,0}, + {0x0026,2,1}, + {0xFFFF,0,0}, + {0x002C,4,1}, + {0xFFFF,0,0}, + {0xFFFF,0,0}, + // Status + {0x003F,1,1}, + {0x003F,1,1}, + {0x0041,1,0}, + {0x0062,1,0}, + {0x007A,1,0}, + {0x007B,1,0}, + {0xFFFF,0,0}, + {0x0045,1,0}, + {0x0046,1,0}, + // Control + {0x0040,1,0}, + {0x004C,2,0}, + {0x004E,2,0}, + {0x0054,2,0}, + {0x0052,2,0}, + {0x0050,2,0}, + {0x0058,2,0}, + {0x005A,2,0}, + {0xFFFF,0,0}, + {0xFFFF,0,0}, + {0xFFFF,0,0}, + {0xFFFF,0,0}, + {0xFFFF,0,0}, + // Set point + {0x0074,4,0}, + {0x0068,4,0}, + {0x0064,2,0}, + {0x0066,2,0}, + {0x006C,4,0}, + {0x0070,4,0}, + // Feedback + {0x0084,4,0}, + {0x0080,4,0}, + {0x007E,2,0}, + {0x0090,2,0}, + {0x0092,1,0}, + {0x007C,2,0}, + {0x0078,2,0}, + {0x0088,5,0}, + {0x008C,4,0}}; + +TServoConfig servo_data[NUM_SERVO_MODELS]={ +//model | enc_res | gear | max_angle | center_angle | max_speed | cw_limit | ccw_limit | registers | pid | protocol +{300 , 1023 , 32 , 300<<7 , 150<<7 , 324 , 0 , 300<<7 , ax_reg , 0 , 1}, +{12 , 1023 , 254 , 300<<7 , 150<<7 , 354 , 0 , 300<<7 , ax_reg , 0 , 1}, +{18 , 1023 , 254 , 300<<7 , 150<<7 , 582 , 0 , 300<<7 , ax_reg , 0 , 1}, +{360 , 4095 , 32 , 360<<7 , 180<<7 , 2820 , 0 , 360<<7 , mx_1_0_reg, 1 , 1}, +{29 , 4095 , 193 , 360<<7 , 180<<7 , 330 , 0 , 360<<7 , mx_1_0_reg, 1 , 1}, +{310 , 4095 , 200 , 360<<7 , 180<<7 , 378 , 0 , 360<<7 , mx_1_0_reg, 1 , 1}, +{320 , 4095 , 225 , 360<<7 , 180<<7 , 270 , 0 , 360<<7 , mx_1_0_reg, 1 , 1}, +{30 , 4095 , 193 , 360<<7 , 180<<7 , 378 , 0 , 360<<7 , mx_2_0_reg, 1 , 2}, +{311 , 4095 , 200 , 360<<7 , 180<<7 , 378 , 0 , 360<<7 , mx_2_0_reg, 1 , 2}, +{321 , 4095 , 225 , 360<<7 , 180<<7 , 270 , 0 , 360<<7 , mx_2_0_reg, 1 , 2}, +{350 , 1023 , 238 , 300<<7 , 150<<7 , 684 , 0 , 300<<7 , xl_reg , 1 , 2}};