diff --git a/Makefile b/Makefile index 418bd7f51c320402c65399732d9439f87577caa0..67bc17e7240d4097e90dd11ae2f2ecc1b4878537 100755 --- a/Makefile +++ b/Makefile @@ -26,6 +26,7 @@ TARGET_FILES+=src/darwin_math.c TARGET_FILES+=src/darwin_kinematics.c TARGET_FILES+=src/joint_motion.c TARGET_FILES+=src/head_tracking.c +TARGET_FILES+=src/grippers.c TARGET_PROCESSOR=STM32F103RE diff --git a/include/darwin_registers.h b/include/darwin_registers.h index 3eee1019fb1f4007b0938269717d35d9c17ee4c4..3899d162c9ec3376c3cd66d2f73679239fc1b11a 100644 --- a/include/darwin_registers.h +++ b/include/darwin_registers.h @@ -73,6 +73,14 @@ extern "C" { #define HEAD_TILT_I ((unsigned short int)0x004E) #define HEAD_TILT_D ((unsigned short int)0x0050) #define HEAD_TILT_I_CLAMP ((unsigned short int)0x0052) +#define GRIPPER_LEFT_ID ((unsigned short int)0x0054) +#define GRIPPER_LEFT_MAX_ANGLE ((unsigned short int)0x0055) +#define GRIPPER_LEFT_MIN_ANGLE ((unsigned short int)0x0057) +#define GRIPPER_LEFT_MAX_FORCE ((unsigned short int)0x0058) +#define GRIPPER_RIGHT_ID ((unsigned short int)0x0059) +#define GRIPPER_RIGHT_MAX_ANGLE ((unsigned short int)0x005A) +#define GRIPPER_RIGHT_MIN_ANGLE ((unsigned short int)0x005C) +#define GRIPPER_RIGHT_MAX_FORCE ((unsigned short int)0x005E) #define LAST_EEPROM_OFFSET ((unsigned short int)0x00FF) @@ -161,6 +169,20 @@ typedef enum { DARWIN_HEAD_TILT_D_H = HEAD_TILT_D+1, DARWIN_HEAD_TILT_I_CLAMP_L = HEAD_TILT_I_CLAMP,// max error in fixed point format 9|7 DARWIN_HEAD_TILT_I_CLAMP_H = HEAD_TILT_I_CLAMP+1, + DARWIN_GRIPPER_LEFT_ID = GRIPPER_LEFT_ID, + DARWIN_GRIPPER_LEFT_MAX_ANGLE_L = GRIPPER_LEFT_MAX_ANGLE, + DARWIN_GRIPPER_LEFT_MAX_ANGLE_H = GRIPPER_LEFT_MAX_ANGLE+1, + DARWIN_GRIPPER_LEFT_MIN_ANGLE_L = GRIPPER_LEFT_MIN_ANGLE, + DARWIN_GRIPPER_LEFT_MIN_ANGLE_H = GRIPPER_LEFT_MIN_ANGLE+1, + DARWIN_GRIPPER_LEFT_MAX_FORCE_L = GRIPPER_LEFT_MAX_FORCE, + DARWIN_GRIPPER_LEFT_MAX_FORCE_H = GRIPPER_LEFT_MAX_FORCE+1, + DARWIN_GRIPPER_RIGHT_ID = GRIPPER_RIGHT_ID, + DARWIN_GRIPPER_RIGHT_MAX_ANGLE_L = GRIPPER_RIGHT_MAX_ANGLE, + DARWIN_GRIPPER_RIGHT_MAX_ANGLE_H = GRIPPER_RIGHT_MAX_ANGLE+1, + DARWIN_GRIPPER_RIGHT_MIN_ANGLE_L = GRIPPER_RIGHT_MIN_ANGLE, + DARWIN_GRIPPER_RIGHT_MIN_ANGLE_H = GRIPPER_RIGHT_MIN_ANGLE+1, + DARWIN_GRIPPER_RIGHT_MAX_FORCE_L = GRIPPER_RIGHT_MAX_FORCE, + DARWIN_GRIPPER_RIGHT_MAX_FORCE_H = GRIPPER_RIGHT_MAX_FORCE+1, DARWIN_TX_LED_CNTRL = 0x0100, // bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2 | bit 1 | bit 0 // | | | | blink | toggle | value | internally used DARWIN_TX_LED_PERIOD_L = 0x0101, @@ -582,7 +604,9 @@ typedef enum { DARWIN_BATT_CELL3_VOLTAGE_L = 0x026E, DARWIN_BATT_CELL3_VOLTAGE_H = 0x026F, DARWIN_BATT_CELL4_VOLTAGE_L = 0x0270, - DARWIN_BATT_CELL4_VOLTAGE_H = 0x0271 + DARWIN_BATT_CELL4_VOLTAGE_H = 0x0271, + DARWIN_GRIPPER_CNTRL = 0x0272, // bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2 | bit 1 | bit 0 + // left opened | right opened | | | close left | open left | close right | open right } darwin_registers; #define GPIO_BASE_ADDRESS 0x0100 @@ -664,6 +688,15 @@ typedef enum { #define HEAD_STOP 0x02 #define HEAD_STATUS 0x10 +#define GRIPPER_BASE_ADDRESS 0x0272 +#define GRIPPER_MEM_LENGTH 1 +#define GRIPPER_EEPROM_ADDRESS 0x0054 +#define GRIPPER_EEPROM_LENGTH 14 +#define GRIPPER_OPEN_RIGHT 0x01 +#define GRIPPER_CLOSE_RIGHT 0x02 +#define GRIPPER_OPEN_LEFT 0x04 +#define GRIPPER_CLOSE_LEFT 0x08 + #ifdef __cplusplus } #endif diff --git a/include/eeprom_init.h b/include/eeprom_init.h index 331f2879a484098f25ae963405f06ce66a32efea..b636703311e13ee36d73b97ef44bbfa484f75d23 100644 --- a/include/eeprom_init.h +++ b/include/eeprom_init.h @@ -73,7 +73,14 @@ extern "C" { #define DEFAULT_HEAD_TILT_I 0x0000 // 0.0 in fixed point format 0|16 #define DEFAULT_HEAD_TILT_D 0x0000 // 0.0 in fixed point format 0|16 #define DEFAULT_HEAD_TILT_I_CLAMP 0x0000 // 0.0 in fixed point format 9|7 - +#define DEFAULT_GRIPPER_LEFT_ID 0x0017 // ID 23 for the left gripper +#define DEFAULT_GRIPPER_LEFT_MAX_ANGLE 0x0F00 // 30 in fixed point format 9|7 +#define DEFAULT_GRIPPER_LEFT_MIN_ANGLE 0xF100 // -30 in fixed point format 9|7 +#define DEFAULT_GRIPPER_LEFT_MAX_FORCE 0x03FF // 1023 max force in binary format +#define DEFAULT_GRIPPER_RIGHT_ID 0x0018 // ID 24 for the left gripper +#define DEFAULT_GRIPPER_RIGHT_MAX_ANGLE 0x0F00 // 30 in fixed point format 9|7 +#define DEFAULT_GRIPPER_RIGHT_MIN_ANGLE 0xF100 // -30 in fixed point format 9|7 +#define DEFAULT_GRIPPER_RIGHT_MAX_FORCE 0x03FF // 1023 max force in binary format #ifdef __cplusplus } diff --git a/include/grippers.h b/include/grippers.h new file mode 100644 index 0000000000000000000000000000000000000000..9df31bcba3b0a176d7c83c76f7a89e40b98b23b2 --- /dev/null +++ b/include/grippers.h @@ -0,0 +1,32 @@ +#ifndef _GRIPPERS_H +#define _GRIPPERS_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "stm32f1xx.h" +#include "motion_manager.h" + +typedef enum {GRIPPER_LEFT,GRIPPER_RIGHT} grippers_t; + +// public functions +void grippers_init(uint16_t period_us); +inline void grippers_set_period(uint16_t period_us); +inline uint16_t grippers_get_period(void); +void grippers_open(grippers_t gripper); +void grippers_close(grippers_t gripper); +uint8_t gripper_is_open(grippers_t gripper); + +// operation functions +uint8_t grippers_in_range(unsigned short int address, unsigned short int length); +void grippers_process_read_cmd(unsigned short int address,unsigned short int length,unsigned char *data); +void grippers_process_write_cmd(unsigned short int address,unsigned short int length,unsigned char *data); +// motion manager interface functions +void grippers_process(void); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/motion_manager.h b/include/motion_manager.h index 7c63ee26e14a3499fd12e157ed033e0befb798bb..a764496424536f49ea63ff0ddaa96d13295c591b 100755 --- a/include/motion_manager.h +++ b/include/motion_manager.h @@ -6,6 +6,7 @@ extern "C" { #endif #include "stm32f1xx.h" +#include "dynamixel_common.h" typedef enum { R_SHOULDER_PITCH = 1, @@ -62,7 +63,7 @@ typedef struct{ uint8_t enabled; int16_t cw_angle_limit; int16_t ccw_angle_limit; - uint8_t dyn_version; + TDynVersion dyn_version; }TServoInfo; #define MANAGER_MAX_NUM_SERVOS 31 diff --git a/src/darwin_dyn_slave.c b/src/darwin_dyn_slave.c index 1f3924e11143221ab91b07aa5bdba5f40ae362a6..0750b0937bde2814e02ea3ab473d4a110e481fca 100755 --- a/src/darwin_dyn_slave.c +++ b/src/darwin_dyn_slave.c @@ -11,6 +11,7 @@ #include "walking.h" #include "joint_motion.h" #include "head_tracking.h" +#include "grippers.h" /* timer for the execution of the dynamixel slave loop */ #define DYN_SLAVE_TIMER TIM7 @@ -88,6 +89,9 @@ unsigned char darwin_on_write(unsigned short int address,unsigned short int leng // head_tracking commands if(head_tracking_in_range(address,length)) head_tracking_process_write_cmd(address,length,data); + // gripper commands + if(grippers_in_range(address,length)) + grippers_process_write_cmd(address,length,data); // write eeprom for(i=address,j=0;i<LAST_EEPROM_OFFSET && i<(address+length);i++,j++) EE_WriteVariable(i,data[j]); diff --git a/src/eeprom.c b/src/eeprom.c index 701a3ad081d42f9a51233fbb249ead6ff147ced6..c5caef423ff350cc15ad1eeb015987de27471d87 100755 --- a/src/eeprom.c +++ b/src/eeprom.c @@ -53,92 +53,106 @@ uint16_t DataVar = 0; /* Virtual address defined by the user: 0xFFFF value is prohibited */ -uint16_t eeprom_data[] __attribute__ ((section (".eeprom")))={VALID_PAGE, 0xFFFF, - DEFAULT_DEVICE_MODEL&0xFF, DEVICE_MODEL_OFFSET,// model number LSB - DEFAULT_DEVICE_MODEL>>8, DEVICE_MODEL_OFFSET+1,// model number MSB - DEFAULT_FIRMWARE_VERSION, FIRMWARE_VERSION_OFFSET,// firmware version - DEFAULT_DEVICE_ID, DEVICE_ID_OFFSET,// default device id - DEFAULT_BAUDRATE, BAUDRATE_OFFSET,// default baudrate - DEFAULT_RETURN_DELAY, RETURN_DELAY_OFFSET,// return delay time - DEFAULT_MM_PERIOD&0xFF, MM_PERIOD_OFFSET, - DEFAULT_MM_PERIOD>>8, MM_PERIOD_OFFSET+1, - DEFAULT_BAL_KNEE_GAIN&0xFF, MM_BAL_KNEE_GAIN_OFFSET, - DEFAULT_BAL_KNEE_GAIN>>8, MM_BAL_KNEE_GAIN_OFFSET+1, - DEFAULT_BAL_ANKLE_ROLL_GAIN&0xFF, MM_BAL_ANKLE_ROLL_GAIN_OFFSET, - DEFAULT_BAL_ANKLE_ROLL_GAIN>>8, MM_BAL_ANKLE_ROLL_GAIN_OFFSET+1, - DEFAULT_BAL_ANKLE_PITCH_GAIN&0xFF, MM_BAL_ANKLE_PITCH_GAIN_OFFSET, - DEFAULT_BAL_ANKLE_PITCH_GAIN>>8, MM_BAL_ANKLE_PITCH_GAIN_OFFSET+1, - DEFAULT_BAL_HIP_ROLL_GAIN&0xFF, MM_BAL_HIP_ROLL_GAIN_OFFSET, - DEFAULT_BAL_HIP_ROLL_GAIN>>8, MM_BAL_HIP_ROLL_GAIN_OFFSET+1, - DEFAULT_RETURN_LEVEL, RETURN_LEVEL_OFFSET,// return level - DEFAULT_SERVO0_OFFSET, MM_SERVO0_OFFSET, - DEFAULT_SERVO1_OFFSET, MM_SERVO1_OFFSET, - DEFAULT_SERVO2_OFFSET, MM_SERVO2_OFFSET, - DEFAULT_SERVO3_OFFSET, MM_SERVO3_OFFSET, - DEFAULT_SERVO4_OFFSET, MM_SERVO4_OFFSET, - DEFAULT_SERVO5_OFFSET, MM_SERVO5_OFFSET, - DEFAULT_SERVO6_OFFSET, MM_SERVO6_OFFSET, - DEFAULT_SERVO7_OFFSET, MM_SERVO7_OFFSET, - DEFAULT_SERVO8_OFFSET, MM_SERVO8_OFFSET, - DEFAULT_SERVO9_OFFSET, MM_SERVO9_OFFSET, - DEFAULT_SERVO10_OFFSET, MM_SERVO10_OFFSET, - DEFAULT_SERVO11_OFFSET, MM_SERVO11_OFFSET, - DEFAULT_SERVO12_OFFSET, MM_SERVO12_OFFSET, - DEFAULT_SERVO13_OFFSET, MM_SERVO13_OFFSET, - DEFAULT_SERVO14_OFFSET, MM_SERVO14_OFFSET, - DEFAULT_SERVO15_OFFSET, MM_SERVO15_OFFSET, - DEFAULT_SERVO16_OFFSET, MM_SERVO16_OFFSET, - DEFAULT_SERVO17_OFFSET, MM_SERVO17_OFFSET, - DEFAULT_SERVO18_OFFSET, MM_SERVO18_OFFSET, - DEFAULT_SERVO19_OFFSET, MM_SERVO19_OFFSET, - DEFAULT_SERVO20_OFFSET, MM_SERVO20_OFFSET, - DEFAULT_SERVO21_OFFSET, MM_SERVO21_OFFSET, - DEFAULT_SERVO22_OFFSET, MM_SERVO22_OFFSET, - DEFAULT_SERVO23_OFFSET, MM_SERVO23_OFFSET, - DEFAULT_SERVO24_OFFSET, MM_SERVO24_OFFSET, - DEFAULT_SERVO25_OFFSET, MM_SERVO25_OFFSET, - DEFAULT_SERVO26_OFFSET, MM_SERVO26_OFFSET, - DEFAULT_SERVO27_OFFSET, MM_SERVO27_OFFSET, - DEFAULT_SERVO28_OFFSET, MM_SERVO28_OFFSET, - DEFAULT_SERVO29_OFFSET, MM_SERVO29_OFFSET, - DEFAULT_SERVO30_OFFSET, MM_SERVO30_OFFSET, - DEFAULT_SERVO31_OFFSET, MM_SERVO31_OFFSET, - DEFAULT_WALK_X_OFFSET, WALK_X_OFFSET, - DEFAULT_WALK_Y_OFFSET, WALK_Y_OFFSET, - DEFAULT_WALK_Z_OFFSET, WALK_Z_OFFSET, - DEFAULT_WALK_ROLL_OFFSET, WALK_ROLL_OFFSET, - DEFAULT_WALK_PITCH_OFFSET, WALK_PITCH_OFFSET, - DEFAULT_WALK_YAW_OFFSET, WALK_YAW_OFFSET, - DEFAULT_WALK_HIP_PITCH_OFF&0xFF, WALK_HIP_PITCH_OFF, - DEFAULT_WALK_HIP_PITCH_OFF>>8, WALK_HIP_PITCH_OFF+1, - DEFAULT_WALK_PERIOD_TIME&0xFF, WALK_PERIOD_TIME, - DEFAULT_WALK_PERIOD_TIME>>8, WALK_PERIOD_TIME+1, - DEFAULT_WALK_DSP_RATIO, WALK_DSP_RATIO, - DEFAULT_WALK_STEP_FW_BW_RATIO, WALK_STEP_FW_BW_RATIO, - DEFAULT_WALK_FOOT_HEIGHT, WALK_FOOT_HEIGHT, - DEFAULT_WALK_SWING_RIGHT_LEFT, WALK_SWING_RIGHT_LEFT, - DEFAULT_WALK_SWING_TOP_DOWN, WALK_SWING_TOP_DOWN, - DEFAULT_WALK_PELVIS_OFFSET, WALK_PELVIS_OFFSET, - DEFAULT_WALK_ARM_SWING_GAIN, WALK_ARM_SWING_GAIN, - DEFAULT_WALK_MAX_VEL, WALK_MAX_VEL, - DEFAULT_WALK_MAX_ROT_VEL, WALK_MAX_ROT_VEL, - DEFAULT_HEAD_PAN_P&0xFF, HEAD_PAN_P, - DEFAULT_HEAD_PAN_P>>8, HEAD_PAN_P+1, - DEFAULT_HEAD_PAN_I&0xFF, HEAD_PAN_I, - DEFAULT_HEAD_PAN_I>>8, HEAD_PAN_I+1, - DEFAULT_HEAD_PAN_D&0xFF, HEAD_PAN_D, - DEFAULT_HEAD_PAN_D>>8, HEAD_PAN_D+1, - DEFAULT_HEAD_PAN_I_CLAMP&0xFF, HEAD_PAN_I_CLAMP, - DEFAULT_HEAD_PAN_I_CLAMP>>8, HEAD_PAN_I_CLAMP+1, - DEFAULT_HEAD_PAN_D>>8, HEAD_PAN_D+1, - DEFAULT_HEAD_TILT_P&0xFF, HEAD_TILT_P, - DEFAULT_HEAD_TILT_P>>8, HEAD_TILT_P+1, - DEFAULT_HEAD_TILT_I&0xFF, HEAD_TILT_I, - DEFAULT_HEAD_TILT_I>>8, HEAD_TILT_I+1, - DEFAULT_HEAD_TILT_D&0xFF, HEAD_TILT_D, - DEFAULT_HEAD_TILT_D>>8, HEAD_TILT_D+1, - DEFAULT_HEAD_TILT_I_CLAMP&0xFF, HEAD_TILT_I_CLAMP, - DEFAULT_HEAD_TILT_I_CLAMP>>8, HEAD_TILT_I_CLAMP+1}; +uint16_t eeprom_data[] __attribute__ ((section (".eeprom")))={VALID_PAGE, 0xFFFF, + DEFAULT_DEVICE_MODEL&0xFF, DEVICE_MODEL_OFFSET,// model number LSB + DEFAULT_DEVICE_MODEL>>8, DEVICE_MODEL_OFFSET+1,// model number MSB + DEFAULT_FIRMWARE_VERSION, FIRMWARE_VERSION_OFFSET,// firmware version + DEFAULT_DEVICE_ID, DEVICE_ID_OFFSET,// default device id + DEFAULT_BAUDRATE, BAUDRATE_OFFSET,// default baudrate + DEFAULT_RETURN_DELAY, RETURN_DELAY_OFFSET,// return delay time + DEFAULT_MM_PERIOD&0xFF, MM_PERIOD_OFFSET, + DEFAULT_MM_PERIOD>>8, MM_PERIOD_OFFSET+1, + DEFAULT_BAL_KNEE_GAIN&0xFF, MM_BAL_KNEE_GAIN_OFFSET, + DEFAULT_BAL_KNEE_GAIN>>8, MM_BAL_KNEE_GAIN_OFFSET+1, + DEFAULT_BAL_ANKLE_ROLL_GAIN&0xFF, MM_BAL_ANKLE_ROLL_GAIN_OFFSET, + DEFAULT_BAL_ANKLE_ROLL_GAIN>>8, MM_BAL_ANKLE_ROLL_GAIN_OFFSET+1, + DEFAULT_BAL_ANKLE_PITCH_GAIN&0xFF, MM_BAL_ANKLE_PITCH_GAIN_OFFSET, + DEFAULT_BAL_ANKLE_PITCH_GAIN>>8, MM_BAL_ANKLE_PITCH_GAIN_OFFSET+1, + DEFAULT_BAL_HIP_ROLL_GAIN&0xFF, MM_BAL_HIP_ROLL_GAIN_OFFSET, + DEFAULT_BAL_HIP_ROLL_GAIN>>8, MM_BAL_HIP_ROLL_GAIN_OFFSET+1, + DEFAULT_RETURN_LEVEL, RETURN_LEVEL_OFFSET,// return level + DEFAULT_SERVO0_OFFSET, MM_SERVO0_OFFSET, + DEFAULT_SERVO1_OFFSET, MM_SERVO1_OFFSET, + DEFAULT_SERVO2_OFFSET, MM_SERVO2_OFFSET, + DEFAULT_SERVO3_OFFSET, MM_SERVO3_OFFSET, + DEFAULT_SERVO4_OFFSET, MM_SERVO4_OFFSET, + DEFAULT_SERVO5_OFFSET, MM_SERVO5_OFFSET, + DEFAULT_SERVO6_OFFSET, MM_SERVO6_OFFSET, + DEFAULT_SERVO7_OFFSET, MM_SERVO7_OFFSET, + DEFAULT_SERVO8_OFFSET, MM_SERVO8_OFFSET, + DEFAULT_SERVO9_OFFSET, MM_SERVO9_OFFSET, + DEFAULT_SERVO10_OFFSET, MM_SERVO10_OFFSET, + DEFAULT_SERVO11_OFFSET, MM_SERVO11_OFFSET, + DEFAULT_SERVO12_OFFSET, MM_SERVO12_OFFSET, + DEFAULT_SERVO13_OFFSET, MM_SERVO13_OFFSET, + DEFAULT_SERVO14_OFFSET, MM_SERVO14_OFFSET, + DEFAULT_SERVO15_OFFSET, MM_SERVO15_OFFSET, + DEFAULT_SERVO16_OFFSET, MM_SERVO16_OFFSET, + DEFAULT_SERVO17_OFFSET, MM_SERVO17_OFFSET, + DEFAULT_SERVO18_OFFSET, MM_SERVO18_OFFSET, + DEFAULT_SERVO19_OFFSET, MM_SERVO19_OFFSET, + DEFAULT_SERVO20_OFFSET, MM_SERVO20_OFFSET, + DEFAULT_SERVO21_OFFSET, MM_SERVO21_OFFSET, + DEFAULT_SERVO22_OFFSET, MM_SERVO22_OFFSET, + DEFAULT_SERVO23_OFFSET, MM_SERVO23_OFFSET, + DEFAULT_SERVO24_OFFSET, MM_SERVO24_OFFSET, + DEFAULT_SERVO25_OFFSET, MM_SERVO25_OFFSET, + DEFAULT_SERVO26_OFFSET, MM_SERVO26_OFFSET, + DEFAULT_SERVO27_OFFSET, MM_SERVO27_OFFSET, + DEFAULT_SERVO28_OFFSET, MM_SERVO28_OFFSET, + DEFAULT_SERVO29_OFFSET, MM_SERVO29_OFFSET, + DEFAULT_SERVO30_OFFSET, MM_SERVO30_OFFSET, + DEFAULT_SERVO31_OFFSET, MM_SERVO31_OFFSET, + DEFAULT_WALK_X_OFFSET, WALK_X_OFFSET, + DEFAULT_WALK_Y_OFFSET, WALK_Y_OFFSET, + DEFAULT_WALK_Z_OFFSET, WALK_Z_OFFSET, + DEFAULT_WALK_ROLL_OFFSET, WALK_ROLL_OFFSET, + DEFAULT_WALK_PITCH_OFFSET, WALK_PITCH_OFFSET, + DEFAULT_WALK_YAW_OFFSET, WALK_YAW_OFFSET, + DEFAULT_WALK_HIP_PITCH_OFF&0xFF, WALK_HIP_PITCH_OFF, + DEFAULT_WALK_HIP_PITCH_OFF>>8, WALK_HIP_PITCH_OFF+1, + DEFAULT_WALK_PERIOD_TIME&0xFF, WALK_PERIOD_TIME, + DEFAULT_WALK_PERIOD_TIME>>8, WALK_PERIOD_TIME+1, + DEFAULT_WALK_DSP_RATIO, WALK_DSP_RATIO, + DEFAULT_WALK_STEP_FW_BW_RATIO, WALK_STEP_FW_BW_RATIO, + DEFAULT_WALK_FOOT_HEIGHT, WALK_FOOT_HEIGHT, + DEFAULT_WALK_SWING_RIGHT_LEFT, WALK_SWING_RIGHT_LEFT, + DEFAULT_WALK_SWING_TOP_DOWN, WALK_SWING_TOP_DOWN, + DEFAULT_WALK_PELVIS_OFFSET, WALK_PELVIS_OFFSET, + DEFAULT_WALK_ARM_SWING_GAIN, WALK_ARM_SWING_GAIN, + DEFAULT_WALK_MAX_VEL, WALK_MAX_VEL, + DEFAULT_WALK_MAX_ROT_VEL, WALK_MAX_ROT_VEL, + DEFAULT_HEAD_PAN_P&0xFF, HEAD_PAN_P, + DEFAULT_HEAD_PAN_P>>8, HEAD_PAN_P+1, + DEFAULT_HEAD_PAN_I&0xFF, HEAD_PAN_I, + DEFAULT_HEAD_PAN_I>>8, HEAD_PAN_I+1, + DEFAULT_HEAD_PAN_D&0xFF, HEAD_PAN_D, + DEFAULT_HEAD_PAN_D>>8, HEAD_PAN_D+1, + DEFAULT_HEAD_PAN_I_CLAMP&0xFF, HEAD_PAN_I_CLAMP, + DEFAULT_HEAD_PAN_I_CLAMP>>8, HEAD_PAN_I_CLAMP+1, + DEFAULT_HEAD_PAN_D>>8, HEAD_PAN_D+1, + DEFAULT_HEAD_TILT_P&0xFF, HEAD_TILT_P, + DEFAULT_HEAD_TILT_P>>8, HEAD_TILT_P+1, + DEFAULT_HEAD_TILT_I&0xFF, HEAD_TILT_I, + DEFAULT_HEAD_TILT_I>>8, HEAD_TILT_I+1, + DEFAULT_HEAD_TILT_D&0xFF, HEAD_TILT_D, + DEFAULT_HEAD_TILT_D>>8, HEAD_TILT_D+1, + DEFAULT_HEAD_TILT_I_CLAMP&0xFF, HEAD_TILT_I_CLAMP, + DEFAULT_HEAD_TILT_I_CLAMP>>8, HEAD_TILT_I_CLAMP+1, + DEFAULT_GRIPPER_LEFT_ID, GRIPPER_LEFT_ID, + DEFAULT_GRIPPER_LEFT_MAX_ANGLE&0xFF, GRIPPER_LEFT_MAX_ANGLE, + DEFAULT_GRIPPER_LEFT_MAX_ANGLE>>8, GRIPPER_LEFT_MAX_ANGLE+1, + DEFAULT_GRIPPER_LEFT_MIN_ANGLE&0xFF, GRIPPER_LEFT_MIN_ANGLE, + DEFAULT_GRIPPER_LEFT_MIN_ANGLE>>8, GRIPPER_LEFT_MIN_ANGLE+1, + DEFAULT_GRIPPER_LEFT_MAX_FORCE&0xFF, GRIPPER_LEFT_MAX_FORCE, + DEFAULT_GRIPPER_LEFT_MAX_FORCE>>8, GRIPPER_LEFT_MAX_FORCE+1, + DEFAULT_GRIPPER_RIGHT_ID, GRIPPER_RIGHT_ID, + DEFAULT_GRIPPER_RIGHT_MAX_ANGLE&0xFF, GRIPPER_RIGHT_MAX_ANGLE, + DEFAULT_GRIPPER_RIGHT_MAX_ANGLE>>8, GRIPPER_RIGHT_MAX_ANGLE+1, + DEFAULT_GRIPPER_RIGHT_MIN_ANGLE&0xFF, GRIPPER_RIGHT_MIN_ANGLE, + DEFAULT_GRIPPER_RIGHT_MIN_ANGLE>>8, GRIPPER_RIGHT_MIN_ANGLE+1, + DEFAULT_GRIPPER_RIGHT_MAX_FORCE&0xFF, GRIPPER_RIGHT_MAX_FORCE, + DEFAULT_GRIPPER_RIGHT_MAX_FORCE>>8, GRIPPER_RIGHT_MAX_FORCE+1}; /* Private function prototypes -----------------------------------------------*/ /* Private functions ---------------------------------------------------------*/ diff --git a/src/grippers.c b/src/grippers.c new file mode 100644 index 0000000000000000000000000000000000000000..c5fae087946fe969081ef44b37459cbbd41ee25c --- /dev/null +++ b/src/grippers.c @@ -0,0 +1,151 @@ +#include "darwin_dyn_master_v2.h" +#include "dyn_servos.h" +#include "grippers.h" +#include "ram.h" + +// private variables +int64_t grippers_period; +int16_t grippers_period_us; +uint8_t grippers_left_opened; +uint8_t grippers_left_open; +uint8_t grippers_left_close; +uint8_t grippers_right_opened; +uint8_t grippers_right_open; +uint8_t grippers_right_close; + +// public functions +void grippers_init(uint16_t period_us) +{ + uint16_t force; + + /* initialize private variables */ + grippers_left_opened=0x00; + grippers_left_open=0x00; + grippers_left_close=0x00; + grippers_right_opened=0x00; + grippers_right_open=0x00; + grippers_right_close=0x00; + grippers_period=(period_us<<16)/1000000; + grippers_period_us=period_us; + /* configure the maximum force of the servos */ + if(ram_data[DARWIN_GRIPPER_LEFT_ID]!=0xFF) + { + force=ram_data[DARWIN_GRIPPER_LEFT_MAX_FORCE_L]+(ram_data[DARWIN_GRIPPER_LEFT_MAX_FORCE_H]<<8); + dyn_master_write_word(&darwin_dyn_master_v2,ram_data[DARWIN_GRIPPER_LEFT_ID],XL_TORQUE_LIMIT_L,force); + } + if(ram_data[DARWIN_GRIPPER_RIGHT_ID]!=0xFF) + { + force=ram_data[DARWIN_GRIPPER_RIGHT_MAX_FORCE_L]+(ram_data[DARWIN_GRIPPER_RIGHT_MAX_FORCE_H]<<8); + dyn_master_write_word(&darwin_dyn_master_v2,ram_data[DARWIN_GRIPPER_RIGHT_ID],XL_TORQUE_LIMIT_L,force); + } +} + +inline void grippers_set_period(uint16_t period_us) +{ + grippers_period=(period_us<<16)/1000000; + grippers_period_us=period_us; +} + +inline uint16_t grippers_get_period(void) +{ + return grippers_period_us; +} + +void grippers_open(grippers_t gripper) +{ + if(gripper==GRIPPER_LEFT) + grippers_left_open=0x01; + else if(gripper==GRIPPER_RIGHT) + grippers_right_open=0x01; +} + +void grippers_close(grippers_t gripper) +{ + if(gripper==GRIPPER_LEFT) + grippers_left_close=0x01; + else if(gripper==GRIPPER_RIGHT) + grippers_right_close=0x01; +} + +uint8_t gripper_is_open(grippers_t gripper) +{ + if(gripper==GRIPPER_LEFT) + return grippers_left_opened; + else if(gripper==GRIPPER_RIGHT) + return grippers_right_opened; + else + return 0x00; +} + +// operation functions +uint8_t grippers_in_range(unsigned short int address, unsigned short int length) +{ + if(ram_in_window(GRIPPER_BASE_ADDRESS,GRIPPER_MEM_LENGTH,address,length) || + ram_in_window(GRIPPER_EEPROM_ADDRESS,GRIPPER_EEPROM_LENGTH,address,length)) + return 0x01; + else + return 0x00; +} + +void grippers_process_read_cmd(unsigned short int address,unsigned short int length,unsigned char *data) +{ + +} + +void grippers_process_write_cmd(unsigned short int address,unsigned short int length,unsigned char *data) +{ + if(ram_in_range(DARWIN_GRIPPER_CNTRL,address,length)) + { + if(data[DARWIN_GRIPPER_CNTRL-address]&GRIPPER_OPEN_RIGHT) + grippers_open(GRIPPER_RIGHT); + else if(data[DARWIN_GRIPPER_CNTRL-address]&GRIPPER_CLOSE_RIGHT) + grippers_close(GRIPPER_RIGHT); + if(data[DARWIN_GRIPPER_CNTRL-address]&GRIPPER_OPEN_LEFT) + grippers_open(GRIPPER_LEFT); + else if(data[DARWIN_GRIPPER_CNTRL-address]&GRIPPER_CLOSE_LEFT) + grippers_close(GRIPPER_LEFT); + } +} + +// motion manager interface functions +void grippers_process(void) +{ + uint16_t angle; + + if(ram_data[DARWIN_GRIPPER_LEFT_ID]!=0xFF) + { + if(grippers_left_opened==0x01) + { + if(grippers_left_close==0x01) + { + grippers_left_close=0x00; + angle=ram_data[DARWIN_GRIPPER_LEFT_MIN_ANGLE_L]+(ram_data[DARWIN_GRIPPER_LEFT_MIN_ANGLE_H]<<8); + manager_current_angles[ram_data[DARWIN_GRIPPER_LEFT_ID]]=angle<<9; + } + else if(grippers_left_open==0x01) + { + grippers_left_open=0x00; + angle=ram_data[DARWIN_GRIPPER_LEFT_MAX_ANGLE_L]+(ram_data[DARWIN_GRIPPER_LEFT_MAX_ANGLE_H]<<8); + manager_current_angles[ram_data[DARWIN_GRIPPER_LEFT_ID]]=angle<<9; + } + } + } + if(ram_data[DARWIN_GRIPPER_RIGHT_ID]!=0xFF) + { + if(grippers_right_opened==0x01) + { + if(grippers_right_close==0x01) + { + grippers_right_close=0x00; + angle=ram_data[DARWIN_GRIPPER_RIGHT_MIN_ANGLE_L]+(ram_data[DARWIN_GRIPPER_RIGHT_MIN_ANGLE_H]<<8); + manager_current_angles[ram_data[DARWIN_GRIPPER_RIGHT_ID]]=angle<<9; + } + else if(grippers_right_open==0x01) + { + grippers_right_open=0x00; + angle=ram_data[DARWIN_GRIPPER_RIGHT_MAX_ANGLE_L]+(ram_data[DARWIN_GRIPPER_RIGHT_MAX_ANGLE_H]<<8); + manager_current_angles[ram_data[DARWIN_GRIPPER_RIGHT_ID]]=angle<<9; + } + } + } +} diff --git a/src/motion_manager.c b/src/motion_manager.c index 2e2fa0f9152bd016ec8134712c8fb7ba31e4b2ee..8077fcd6ccc3ee42c02abbbf7ba9e1b4780af608 100755 --- a/src/motion_manager.c +++ b/src/motion_manager.c @@ -7,6 +7,7 @@ #include "walking.h" #include "joint_motion.h" #include "head_tracking.h" +#include "grippers.h" #include "imu.h" #define MANAGER_TIMER TIM5 @@ -39,20 +40,30 @@ void manager_send_motion_command(void) for(i=0;i<MANAGER_MAX_NUM_SERVOS;i++) { - if(manager_servos[i].enabled) - { - if(manager_servos[i].model!=0x0000) - { - servo_ids[num]=manager_servos[i].id; - manager_servos[i].cw_comp=(1<<(manager_current_slopes[i]&0x0F)); - manager_servos[i].ccw_comp=(1<<((manager_current_slopes[i]&0xF0)>>4)); - write_data[num].data_addr=(uint8_t *)&(manager_servos[i].cw_comp); - num++; - } + if(manager_servos[i].enabled && manager_servos[i].model!=0x0000 && manager_servos[i].dyn_version==DYN_VER1) + { + servo_ids[num]=manager_servos[i].id; + manager_servos[i].cw_comp=(1<<(manager_current_slopes[i]&0x0F)); + manager_servos[i].ccw_comp=(1<<((manager_current_slopes[i]&0xF0)>>4)); + write_data[num].data_addr=(uint8_t *)&(manager_servos[i].cw_comp); + num++; } } if(num>0) dyn_master_sync_write(&darwin_dyn_master,num,servo_ids,P_CW_COMPLIANCE_SLOPE,4,write_data); + num=0; + for(i=0;i<MANAGER_MAX_NUM_SERVOS;i++) + { + if(manager_servos[i].enabled && manager_servos[i].model!=0x0000 && manager_servos[i].dyn_version==DYN_VER2) + { + servo_ids[num]=manager_servos[i].id; + manager_servos[i].ccw_comp=(1<<(manager_current_slopes[i]&0x0F)); + write_data[num].data_addr=(uint8_t *)&(manager_servos[i].cw_comp); + num++; + } + } + if(num>0) + dyn_master_sync_write(&darwin_dyn_master_v2,num,servo_ids,P_CW_COMPLIANCE_SLOPE,3,write_data); } inline uint16_t manager_angle_to_value(uint8_t servo_id,int16_t angle) @@ -85,7 +96,10 @@ void manager_get_current_position(void) { if(!manager_servos[i].enabled && manager_servos[i].model!=0x0000)// servo is not enabled but it is present { - dyn_master_read_word(&darwin_dyn_master,manager_servos[i].id,P_PRESENT_POSITION_L,&manager_servos[i].current_value); + if(manager_servos[i].dyn_version==DYN_VER1) + dyn_master_read_word(&darwin_dyn_master,manager_servos[i].id,P_PRESENT_POSITION_L,&manager_servos[i].current_value); + else + dyn_master_read_word(&darwin_dyn_master_v2,manager_servos[i].id,XL_PRESENT_POSITION_L,&manager_servos[i].current_value); manager_servos[i].current_angle=manager_value_to_angle(i,manager_servos[i].current_value); ram_data[DARWIN_MM_SERVO0_CUR_POS_L+i*2]=(manager_servos[i].current_angle&0xFF); ram_data[DARWIN_MM_SERVO0_CUR_POS_H+i*2]=(manager_servos[i].current_angle>>8); @@ -156,6 +170,8 @@ void MANAGER_TIMER_IRQHandler(void) head_tracking_process(); // call the walking process walking_process(); + // call the grippers process + grippers_process(); // balance the robot manager_balance(); // get the target angles from all modules @@ -175,7 +191,7 @@ void manager_init(uint16_t period_us) TIM_MasterConfigTypeDef sMasterConfig; uint8_t servo_ids[MANAGER_MAX_NUM_SERVOS]; uint16_t model,value; - uint8_t i,num=0; + uint8_t i,num=0,current=0; uint32_t present_servos=0x00000000; /* initialize the dynamixel master module for the servos */ @@ -190,13 +206,13 @@ void manager_init(uint16_t period_us) dyn_master_scan(&darwin_dyn_master,&num,servo_ids); ram_data[DARWIN_MM_NUM_SERVOS]=num; manager_num_servos=0; - for(i=0;i<MANAGER_MAX_NUM_SERVOS;i++) + for(i=0;i<MANAGER_MAX_NUM_SERVOS && current<num;i++) { - if(i==servo_ids[manager_num_servos]) + if(i==servo_ids[current]) { present_servos|=(0x00000001<<i); // read the model of the i-th device - dyn_master_read_word(&darwin_dyn_master,servo_ids[manager_num_servos],P_MODEL_NUMBER_L,&model); + dyn_master_read_word(&darwin_dyn_master,servo_ids[current],P_MODEL_NUMBER_L,&model); switch(model) { case SERVO_AX12A: manager_servos[i].encoder_resolution=1023; @@ -261,10 +277,11 @@ void manager_init(uint16_t period_us) break; default: break; } - manager_servos[i].id=servo_ids[manager_num_servos]; + manager_servos[i].id=servo_ids[current]; manager_servos[i].model=model; manager_servos[i].module=MM_NONE; manager_servos[i].enabled=0x00; + manager_servos[i].dyn_version=DYN_VER1; // get the servo's current position dyn_master_read_word(&darwin_dyn_master,manager_servos[i].id,P_PRESENT_POSITION_L,&manager_servos[i].current_value); manager_servos[i].current_angle=manager_value_to_angle(i,manager_servos[i].current_value); @@ -278,6 +295,7 @@ void manager_init(uint16_t period_us) // set the action current angles manager_current_angles[i]=manager_servos[i].current_angle<<9; manager_num_servos++; + current=0; } else { @@ -296,15 +314,55 @@ void manager_init(uint16_t period_us) manager_servos[i].ccw_angle_limit=0; } } - ram_data[DARWIN_MM_PRESENT_SERVOS1]=(present_servos&0x000000FF); - ram_data[DARWIN_MM_PRESENT_SERVOS2]=((present_servos&0x0000FF00)>>8); - ram_data[DARWIN_MM_PRESENT_SERVOS3]=((present_servos&0x00FF0000)>>16); - ram_data[DARWIN_MM_PRESENT_SERVOS4]=((present_servos&0xFF000000)>>24); darwin_dyn_master_disable_power(); // detect the servos connected on the v2 bus -// dyn_master_scan(&darwin_dyn_master_v2,&num,servo_ids); + dyn_master_scan(&darwin_dyn_master_v2,&num,servo_ids); + ram_data[DARWIN_MM_NUM_SERVOS]+=num; + current=0; + for(i=0;i<MANAGER_MAX_NUM_SERVOS && current<num;i++) + { + if(i==servo_ids[current]) + { + present_servos|=(0x00000001<<i); + // read the model of the i-th device + dyn_master_read_word(&darwin_dyn_master_v2,servo_ids[current],XL_MODEL_NUMBER_L,&model); + switch(model) + { + case SERVO_XL320: manager_servos[i].encoder_resolution=1023; + manager_servos[i].gear_ratio=238; + manager_servos[i].max_angle=300<<7; + manager_servos[i].center_angle=150<<7; + manager_servos[i].max_speed=354; + break; + default: break; + } + manager_servos[i].id=servo_ids[current]; + manager_servos[i].model=model; + manager_servos[i].module=MM_NONE; + manager_servos[i].enabled=0x00; + manager_servos[i].dyn_version=DYN_VER2; + // get the servo's current position + dyn_master_read_word(&darwin_dyn_master_v2,manager_servos[i].id,XL_PRESENT_POSITION_L,&manager_servos[i].current_value); + manager_servos[i].current_angle=manager_value_to_angle(i,manager_servos[i].current_value); + ram_data[DARWIN_MM_SERVO0_CUR_POS_L+i*2]=(manager_servos[i].current_angle&0xFF); + ram_data[DARWIN_MM_SERVO0_CUR_POS_H+i*2]=(manager_servos[i].current_angle>>8); + // read the servo limits + dyn_master_read_word(&darwin_dyn_master_v2,manager_servos[i].id,XL_CW_ANGLE_LIMIT_L,&value); + manager_servos[i].cw_angle_limit=manager_value_to_angle(i,value); + dyn_master_read_word(&darwin_dyn_master_v2,manager_servos[i].id,XL_CCW_ANGLE_LIMIT_L,&value); + manager_servos[i].ccw_angle_limit=manager_value_to_angle(i,value); + // set the action current angles + manager_current_angles[i]=manager_servos[i].current_angle<<9; + manager_num_servos++; + current++; + } + } + ram_data[DARWIN_MM_PRESENT_SERVOS1]=(present_servos&0x000000FF); + ram_data[DARWIN_MM_PRESENT_SERVOS2]=((present_servos&0x0000FF00)>>8); + ram_data[DARWIN_MM_PRESENT_SERVOS3]=((present_servos&0x00FF0000)>>16); + ram_data[DARWIN_MM_PRESENT_SERVOS4]=((present_servos&0xFF000000)>>24); ram_data[DARWIN_MM_CNTRL]&=(~MANAGER_SCANNING); /* configure timer */ @@ -343,6 +401,7 @@ void manager_init(uint16_t period_us) walking_init(period_us); joint_motion_init(period_us); head_tracking_init(period_us); + grippers_init(period_us); } uint16_t manager_get_period(void) diff --git a/src/ram.c b/src/ram.c index cf821c30d488f1062058d3420b40dadda31b8efc..3d77ee0e898d5c198d2a21c0bcf014127af8f21c 100755 --- a/src/ram.c +++ b/src/ram.c @@ -119,6 +119,34 @@ void ram_init(void) ram_data[HEAD_TILT_I_CLAMP]=(uint8_t)(eeprom_data&0x00FF); if(EE_ReadVariable(HEAD_TILT_I_CLAMP+1,&eeprom_data)==0) ram_data[HEAD_TILT_I_CLAMP+1]=(uint8_t)(eeprom_data&0x00FF); + if(EE_ReadVariable(GRIPPER_LEFT_ID,&eeprom_data)==0) + ram_data[GRIPPER_LEFT_ID]=(uint8_t)(eeprom_data&0x00FF); + if(EE_ReadVariable(GRIPPER_LEFT_MAX_ANGLE,&eeprom_data)==0) + ram_data[GRIPPER_LEFT_MAX_ANGLE]=(uint8_t)(eeprom_data&0x00FF); + if(EE_ReadVariable(GRIPPER_LEFT_MAX_ANGLE+1,&eeprom_data)==0) + ram_data[GRIPPER_LEFT_MAX_ANGLE+1]=(uint8_t)(eeprom_data&0x00FF); + if(EE_ReadVariable(GRIPPER_LEFT_MIN_ANGLE,&eeprom_data)==0) + ram_data[GRIPPER_LEFT_MIN_ANGLE]=(uint8_t)(eeprom_data&0x00FF); + if(EE_ReadVariable(GRIPPER_LEFT_MIN_ANGLE+1,&eeprom_data)==0) + ram_data[GRIPPER_LEFT_MIN_ANGLE+1]=(uint8_t)(eeprom_data&0x00FF); + if(EE_ReadVariable(GRIPPER_LEFT_MAX_FORCE,&eeprom_data)==0) + ram_data[GRIPPER_LEFT_MAX_FORCE]=(uint8_t)(eeprom_data&0x00FF); + if(EE_ReadVariable(GRIPPER_LEFT_MAX_FORCE+1,&eeprom_data)==0) + ram_data[GRIPPER_LEFT_MAX_FORCE+1]=(uint8_t)(eeprom_data&0x00FF); + if(EE_ReadVariable(GRIPPER_RIGHT_ID,&eeprom_data)==0) + ram_data[GRIPPER_RIGHT_ID]=(uint8_t)(eeprom_data&0x00FF); + if(EE_ReadVariable(GRIPPER_RIGHT_MAX_ANGLE,&eeprom_data)==0) + ram_data[GRIPPER_RIGHT_MAX_ANGLE]=(uint8_t)(eeprom_data&0x00FF); + if(EE_ReadVariable(GRIPPER_RIGHT_MAX_ANGLE+1,&eeprom_data)==0) + ram_data[GRIPPER_RIGHT_MAX_ANGLE+1]=(uint8_t)(eeprom_data&0x00FF); + if(EE_ReadVariable(GRIPPER_RIGHT_MIN_ANGLE,&eeprom_data)==0) + ram_data[GRIPPER_RIGHT_MIN_ANGLE]=(uint8_t)(eeprom_data&0x00FF); + if(EE_ReadVariable(GRIPPER_RIGHT_MIN_ANGLE+1,&eeprom_data)==0) + ram_data[GRIPPER_RIGHT_MIN_ANGLE+1]=(uint8_t)(eeprom_data&0x00FF); + if(EE_ReadVariable(GRIPPER_RIGHT_MAX_FORCE,&eeprom_data)==0) + ram_data[GRIPPER_RIGHT_MAX_FORCE]=(uint8_t)(eeprom_data&0x00FF); + if(EE_ReadVariable(GRIPPER_RIGHT_MAX_FORCE+1,&eeprom_data)==0) + ram_data[GRIPPER_RIGHT_MAX_FORCE+1]=(uint8_t)(eeprom_data&0x00FF); } inline void ram_read_byte(uint16_t address,uint8_t *data)