diff --git a/Makefile b/Makefile index c31048f2ab1f85686d2f3b5e12a5990b0b5a87cc..ff8179a385e59ef6f8a485934f7d50bdfb7d59a5 100755 --- a/Makefile +++ b/Makefile @@ -29,6 +29,7 @@ TARGET_FILES+=src/joint_motion.c TARGET_FILES+=src/head_tracking.c TARGET_FILES+=src/grippers.c TARGET_FILES+=src/smart_charger.c +TARGET_FILES+=src/stairs.c TARGET_PROCESSOR=STM32F103RE @@ -94,7 +95,7 @@ TARGET_FILES+=$(HAL_PATH)/src/stm32f1xx_hal.c TARGET_FILES+=$(USART_PATH)/src/usart3.c TARGET_FILES+=$(USART_PATH)/src/usart2.c -TARGET_FILES+=$(USART_PATH)/src/usart1.c +TARGET_FILES+=$(USART_PATH)/src/usart1_remap.c DARWIN_OBJS_TMP = $(notdir $(TARGET_FILES:.c=.o)) DARWIN_OBJS = $(patsubst %,$(BUILD_PATH)/%,$(DARWIN_OBJS_TMP)) diff --git a/include/adc_dma.h b/include/adc_dma.h index 0fd1dc41c7b437f8177404d968c381193d708393..db29c8d33f3945d9ff928d1d50cc85c48f5db6fc 100755 --- a/include/adc_dma.h +++ b/include/adc_dma.h @@ -10,7 +10,7 @@ extern "C" { #define ADC_NUM_CHANNELS 12 typedef enum {ADC_CH1=0,ADC_CH2=1,ADC_CH3=2,ADC_CH4=3,ADC_CH5=4,ADC_CH6=5,ADC_CH7=6,ADC_CH8=7, - ADC_CH9=8,ADC_CH10=9,ADC_CH12=10,ADC_CH14=11} adc_ch_t; + ADC_CH9=8,ADC_CH10=9,ADC_CH12=10} adc_ch_t; void adc_init(void); void adc_start(void); diff --git a/include/darwin_dyn_master_v2.h b/include/darwin_dyn_master_v2.h index b4a1b34d01c20f6e411ad3902e9d86682697c99c..a7e5d190f4dc6a65dd022c5c8d2a59656915501f 100644 --- a/include/darwin_dyn_master_v2.h +++ b/include/darwin_dyn_master_v2.h @@ -12,6 +12,8 @@ extern "C" { extern TDynamixelMaster darwin_dyn_master_v2; void darwin_dyn_master_v2_init(void); +inline void darwin_dyn_master_v2_enable_power(void); +inline void darwin_dyn_master_v2_disable_power(void); #ifdef __cplusplus } diff --git a/include/darwin_registers.h b/include/darwin_registers.h index 86ee43f0353cf4e4b92c807470bc6b3cee4becbc..b84afcc7e78db9bde69d3b2fa67e03b84805ef40 100644 --- a/include/darwin_registers.h +++ b/include/darwin_registers.h @@ -75,119 +75,184 @@ 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)0x0059) -#define GRIPPER_RIGHT_ID ((unsigned short int)0x005B) -#define GRIPPER_RIGHT_MAX_ANGLE ((unsigned short int)0x005C) -#define GRIPPER_RIGHT_MIN_ANGLE ((unsigned short int)0x005E) -#define GRIPPER_RIGHT_MAX_FORCE ((unsigned short int)0x0060) -#define SMART_CHARGER_PERIOD ((unsigned short int)0x0062) +#define GRIPPER_LEFT_TOP_ID ((unsigned short int)0x0054) +#define GRIPPER_LEFT_BOT_ID ((unsigned short int)0x0055) +#define GRIPPER_LEFT_MAX_ANGLE ((unsigned short int)0x0056) +#define GRIPPER_LEFT_MIN_ANGLE ((unsigned short int)0x0058) +#define GRIPPER_LEFT_MAX_FORCE ((unsigned short int)0x005A) +#define GRIPPER_RIGHT_TOP_ID ((unsigned short int)0x005C) +#define GRIPPER_RIGHT_BOT_ID ((unsigned short int)0x005D) +#define GRIPPER_RIGHT_MAX_ANGLE ((unsigned short int)0x005E) +#define GRIPPER_RIGHT_MIN_ANGLE ((unsigned short int)0x0060) +#define GRIPPER_RIGHT_MAX_FORCE ((unsigned short int)0x0062) +#define SMART_CHARGER_PERIOD ((unsigned short int)0x0064) +#define STAIRS_PHASE1_TIME ((unsigned short int)0x0066) +#define STAIRS_PHASE2_TIME ((unsigned short int)0x0068) +#define STAIRS_PHASE3_TIME ((unsigned short int)0x006A) +#define STAIRS_PHASE4_TIME ((unsigned short int)0x006C) +#define STAIRS_PHASE5_TIME ((unsigned short int)0x006E) +#define STAIRS_PHASE6_TIME ((unsigned short int)0x0070) +#define STAIRS_PHASE7_TIME ((unsigned short int)0x0072) +#define STAIRS_PHASE8_TIME ((unsigned short int)0x0074) +#define STAIRS_PHASE9_TIME ((unsigned short int)0x0076) +#define STAIRS_X_OFFSET ((unsigned short int)0x0078) +#define STAIRS_Y_OFFSET ((unsigned short int)0x0079) +#define STAIRS_Z_OFFSET ((unsigned short int)0x007A) +#define STAIRS_R_OFFSET ((unsigned short int)0x007B) +#define STAIRS_P_OFFSET ((unsigned short int)0x007C) +#define STAIRS_A_OFFSET ((unsigned short int)0x007D) +#define STAIRS_Y_SHIFT ((unsigned short int)0x007E) +#define STAIRS_X_SHIFT ((unsigned short int)0x007F) +#define STAIRS_Z_OVERSHOOT ((unsigned short int)0x0080) +#define STAIRS_Z_HEIGHT ((unsigned short int)0x0081) +#define STAIRS_HIP_PITCH_OFF ((unsigned short int)0x0082) +#define STAIRS_R_SHIFT ((unsigned short int)0x0084) +#define STAIRS_P_SHIFT ((unsigned short int)0x0085) +#define STAIRS_A_SHIFT ((unsigned short int)0x0086) +#define STAIRS_Y_SPREAD ((unsigned short int)0x0087) +#define STAIRS_X_SHIFT_BODY ((unsigned short int)0x0088) #define LAST_EEPROM_OFFSET ((unsigned short int)0x00FF) typedef enum { - DARWIN_MODEL_NUMBER_L = DEVICE_MODEL_OFFSET, - DARWIN_MODEL_NUMBER_H = DEVICE_MODEL_OFFSET+1, - DARWIN_VERSION = FIRMWARE_VERSION_OFFSET, - DARWIN_ID = DEVICE_ID_OFFSET, - DARWIN_BAUD_RATE = BAUDRATE_OFFSET, - DARWIN_RETURN_DELAY_TIME = RETURN_DELAY_OFFSET, - DARWIN_MM_PERIOD_L = MM_PERIOD_OFFSET, - DARWIN_MM_PERIOD_H = MM_PERIOD_OFFSET+1, - DARWIN_MM_BAL_KNEE_GAIN_L = MM_BAL_KNEE_GAIN_OFFSET,// fixed point format 0|16 - DARWIN_MM_BAL_KNEE_GAIN_H = MM_BAL_KNEE_GAIN_OFFSET+1, - DARWIN_MM_BAL_ANKLE_ROLL_GAIN_L = MM_BAL_ANKLE_ROLL_GAIN_OFFSET,// fixed point format 0|16 - DARWIN_MM_BAL_ANKLE_ROLL_GAIN_H = MM_BAL_ANKLE_ROLL_GAIN_OFFSET+1, - DARWIN_MM_BAL_ANKLE_PITCH_GAIN_L = MM_BAL_ANKLE_PITCH_GAIN_OFFSET,// fixed point format 0|16 - DARWIN_MM_BAL_ANKLE_PITCH_GAIN_H = MM_BAL_ANKLE_PITCH_GAIN_OFFSET+1, - DARWIN_MM_BAL_HIP_ROLL_GAIN_L = MM_BAL_HIP_ROLL_GAIN_OFFSET,// fixed point format 0|16 - DARWIN_MM_BAL_HIP_ROLL_GAIN_H = MM_BAL_HIP_ROLL_GAIN_OFFSET+1, - DARWIN_RETURN_LEVEL = RETURN_LEVEL_OFFSET, - DARWIN_MM_SERVO0_OFFSET = MM_SERVO0_OFFSET, // angle offset in fixed point format 1-3|4 - DARWIN_MM_SERVO1_OFFSET = MM_SERVO1_OFFSET, // angle offset in fixed point format 1-3|4 - DARWIN_MM_SERVO2_OFFSET = MM_SERVO2_OFFSET, // angle offset in fixed point format 1-3|4 - DARWIN_MM_SERVO3_OFFSET = MM_SERVO3_OFFSET, // angle offset in fixed point format 1-3|4 - DARWIN_MM_SERVO4_OFFSET = MM_SERVO4_OFFSET, // angle offset in fixed point format 1-3|4 - DARWIN_MM_SERVO5_OFFSET = MM_SERVO5_OFFSET, // angle offset in fixed point format 1-3|4 - DARWIN_MM_SERVO6_OFFSET = MM_SERVO6_OFFSET, // angle offset in fixed point format 1-3|4 - DARWIN_MM_SERVO7_OFFSET = MM_SERVO7_OFFSET, // angle offset in fixed point format 1-3|4 - DARWIN_MM_SERVO8_OFFSET = MM_SERVO8_OFFSET, // angle offset in fixed point format 1-3|4 - DARWIN_MM_SERVO9_OFFSET = MM_SERVO9_OFFSET, // angle offset in fixed point format 1-3|4 - DARWIN_MM_SERVO10_OFFSET = MM_SERVO10_OFFSET, // angle offset in fixed point format 1-3|4 - DARWIN_MM_SERVO11_OFFSET = MM_SERVO11_OFFSET, // angle offset in fixed point format 1-3|4 - DARWIN_MM_SERVO12_OFFSET = MM_SERVO12_OFFSET, // angle offset in fixed point format 1-3|4 - DARWIN_MM_SERVO13_OFFSET = MM_SERVO13_OFFSET, // angle offset in fixed point format 1-3|4 - DARWIN_MM_SERVO14_OFFSET = MM_SERVO14_OFFSET, // angle offset in fixed point format 1-3|4 - DARWIN_MM_SERVO15_OFFSET = MM_SERVO15_OFFSET, // angle offset in fixed point format 1-3|4 - DARWIN_MM_SERVO16_OFFSET = MM_SERVO16_OFFSET, // angle offset in fixed point format 1-3|4 - DARWIN_MM_SERVO17_OFFSET = MM_SERVO17_OFFSET, // angle offset in fixed point format 1-3|4 - DARWIN_MM_SERVO18_OFFSET = MM_SERVO18_OFFSET, // angle offset in fixed point format 1-3|4 - DARWIN_MM_SERVO19_OFFSET = MM_SERVO19_OFFSET, // angle offset in fixed point format 1-3|4 - DARWIN_MM_SERVO20_OFFSET = MM_SERVO20_OFFSET, // angle offset in fixed point format 1-3|4 - DARWIN_MM_SERVO21_OFFSET = MM_SERVO21_OFFSET, // angle offset in fixed point format 1-3|4 - DARWIN_MM_SERVO22_OFFSET = MM_SERVO22_OFFSET, // angle offset in fixed point format 1-3|4 - DARWIN_MM_SERVO23_OFFSET = MM_SERVO23_OFFSET, // angle offset in fixed point format 1-3|4 - DARWIN_MM_SERVO24_OFFSET = MM_SERVO24_OFFSET, // angle offset in fixed point format 1-3|4 - DARWIN_MM_SERVO25_OFFSET = MM_SERVO25_OFFSET, // angle offset in fixed point format 1-3|4 - DARWIN_MM_SERVO26_OFFSET = MM_SERVO26_OFFSET, // angle offset in fixed point format 1-3|4 - DARWIN_MM_SERVO27_OFFSET = MM_SERVO27_OFFSET, // angle offset in fixed point format 1-3|4 - DARWIN_MM_SERVO28_OFFSET = MM_SERVO28_OFFSET, // angle offset in fixed point format 1-3|4 - DARWIN_MM_SERVO29_OFFSET = MM_SERVO29_OFFSET, // angle offset in fixed point format 1-3|4 - DARWIN_MM_SERVO30_OFFSET = MM_SERVO30_OFFSET, // angle offset in fixed point format 1-3|4 - DARWIN_MM_SERVO31_OFFSET = MM_SERVO31_OFFSET, // angle offset in fixed point format 1-3|4 - DARWIN_WALK_X_OFFSET = WALK_X_OFFSET, - DARWIN_WALK_Y_OFFSET = WALK_Y_OFFSET, - DARWIN_WALK_Z_OFFSET = WALK_Z_OFFSET, - DARWIN_WALK_ROLL_OFFSET = WALK_ROLL_OFFSET, - DARWIN_WALK_PITCH_OFFSET = WALK_PITCH_OFFSET, - DARWIN_WALK_YAW_OFFSET = WALK_YAW_OFFSET, - DARWIN_WALK_HIP_PITCH_OFF_L = WALK_HIP_PITCH_OFF, - DARWIN_WALK_HIP_PITCH_OFF_H = WALK_HIP_PITCH_OFF+1, - DARWIN_WALK_PERIOD_TIME_L = WALK_PERIOD_TIME, - DARWIN_WALK_PERIOD_TIME_H = WALK_PERIOD_TIME+1, - DARWIN_WALK_DSP_RATIO = WALK_DSP_RATIO, - DARWIN_WALK_STEP_FW_BW_RATIO = WALK_STEP_FW_BW_RATIO, - DARWIN_WALK_FOOT_HEIGHT = WALK_FOOT_HEIGHT, - DARWIN_WALK_SWING_RIGHT_LEFT = WALK_SWING_RIGHT_LEFT, - DARWIN_WALK_SWING_TOP_DOWN = WALK_SWING_TOP_DOWN, - DARWIN_WALK_PELVIS_OFFSET = WALK_PELVIS_OFFSET, - DARWIN_WALK_ARM_SWING_GAIN = WALK_ARM_SWING_GAIN, - DARWIN_WALK_MAX_VEL = WALK_MAX_VEL, - DARWIN_WALK_MAX_ROT_VEL = WALK_MAX_ROT_VEL, - DARWIN_HEAD_PAN_P_L = HEAD_PAN_P,// constant in fixed point format 0|16 - DARWIN_HEAD_PAN_P_H = HEAD_PAN_P+1, - DARWIN_HEAD_PAN_I_L = HEAD_PAN_I,// constant in fixed point format 0|16 - DARWIN_HEAD_PAN_I_H = HEAD_PAN_I+1, - DARWIN_HEAD_PAN_D_L = HEAD_PAN_D,// constant in fixed point format 0|16 - DARWIN_HEAD_PAN_D_H = HEAD_PAN_D+1, - DARWIN_HEAD_PAN_I_CLAMP_L = HEAD_PAN_I_CLAMP,// max error in fixed point format 9|7 - DARWIN_HEAD_PAN_I_CLAMP_H = HEAD_PAN_I_CLAMP+1, - DARWIN_HEAD_TILT_P_L = HEAD_TILT_P,// constant in fixed point format 0|16 - DARWIN_HEAD_TILT_P_H = HEAD_TILT_P+1, - DARWIN_HEAD_TILT_I_L = HEAD_TILT_I,// constant in fixed point format 0|16 - DARWIN_HEAD_TILT_I_H = HEAD_TILT_I+1, - DARWIN_HEAD_TILT_D_L = HEAD_TILT_D,// constant in fixed point format 0|16 - 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_SMART_CHARGER_PERIOD_L = SMART_CHARGER_PERIOD, //en ms - DARWIN_SMART_CHARGER_PERIOD_H = SMART_CHARGER_PERIOD+1, + DARWIN_MODEL_NUMBER_L = DEVICE_MODEL_OFFSET, + DARWIN_MODEL_NUMBER_H = DEVICE_MODEL_OFFSET+1, + DARWIN_VERSION = FIRMWARE_VERSION_OFFSET, + DARWIN_ID = DEVICE_ID_OFFSET, + DARWIN_BAUD_RATE = BAUDRATE_OFFSET, + DARWIN_RETURN_DELAY_TIME = RETURN_DELAY_OFFSET, + DARWIN_MM_PERIOD_L = MM_PERIOD_OFFSET, + DARWIN_MM_PERIOD_H = MM_PERIOD_OFFSET+1, + DARWIN_MM_BAL_KNEE_GAIN_L = MM_BAL_KNEE_GAIN_OFFSET,// fixed point format 0|16 + DARWIN_MM_BAL_KNEE_GAIN_H = MM_BAL_KNEE_GAIN_OFFSET+1, + DARWIN_MM_BAL_ANKLE_ROLL_GAIN_L = MM_BAL_ANKLE_ROLL_GAIN_OFFSET,// fixed point format 0|16 + DARWIN_MM_BAL_ANKLE_ROLL_GAIN_H = MM_BAL_ANKLE_ROLL_GAIN_OFFSET+1, + DARWIN_MM_BAL_ANKLE_PITCH_GAIN_L = MM_BAL_ANKLE_PITCH_GAIN_OFFSET,// fixed point format 0|16 + DARWIN_MM_BAL_ANKLE_PITCH_GAIN_H = MM_BAL_ANKLE_PITCH_GAIN_OFFSET+1, + DARWIN_MM_BAL_HIP_ROLL_GAIN_L = MM_BAL_HIP_ROLL_GAIN_OFFSET,// fixed point format 0|16 + DARWIN_MM_BAL_HIP_ROLL_GAIN_H = MM_BAL_HIP_ROLL_GAIN_OFFSET+1, + DARWIN_RETURN_LEVEL = RETURN_LEVEL_OFFSET, + DARWIN_MM_SERVO0_OFFSET = MM_SERVO0_OFFSET, // angle offset in fixed point format 1-3|4 + DARWIN_MM_SERVO1_OFFSET = MM_SERVO1_OFFSET, // angle offset in fixed point format 1-3|4 + DARWIN_MM_SERVO2_OFFSET = MM_SERVO2_OFFSET, // angle offset in fixed point format 1-3|4 + DARWIN_MM_SERVO3_OFFSET = MM_SERVO3_OFFSET, // angle offset in fixed point format 1-3|4 + DARWIN_MM_SERVO4_OFFSET = MM_SERVO4_OFFSET, // angle offset in fixed point format 1-3|4 + DARWIN_MM_SERVO5_OFFSET = MM_SERVO5_OFFSET, // angle offset in fixed point format 1-3|4 + DARWIN_MM_SERVO6_OFFSET = MM_SERVO6_OFFSET, // angle offset in fixed point format 1-3|4 + DARWIN_MM_SERVO7_OFFSET = MM_SERVO7_OFFSET, // angle offset in fixed point format 1-3|4 + DARWIN_MM_SERVO8_OFFSET = MM_SERVO8_OFFSET, // angle offset in fixed point format 1-3|4 + DARWIN_MM_SERVO9_OFFSET = MM_SERVO9_OFFSET, // angle offset in fixed point format 1-3|4 + DARWIN_MM_SERVO10_OFFSET = MM_SERVO10_OFFSET, // angle offset in fixed point format 1-3|4 + DARWIN_MM_SERVO11_OFFSET = MM_SERVO11_OFFSET, // angle offset in fixed point format 1-3|4 + DARWIN_MM_SERVO12_OFFSET = MM_SERVO12_OFFSET, // angle offset in fixed point format 1-3|4 + DARWIN_MM_SERVO13_OFFSET = MM_SERVO13_OFFSET, // angle offset in fixed point format 1-3|4 + DARWIN_MM_SERVO14_OFFSET = MM_SERVO14_OFFSET, // angle offset in fixed point format 1-3|4 + DARWIN_MM_SERVO15_OFFSET = MM_SERVO15_OFFSET, // angle offset in fixed point format 1-3|4 + DARWIN_MM_SERVO16_OFFSET = MM_SERVO16_OFFSET, // angle offset in fixed point format 1-3|4 + DARWIN_MM_SERVO17_OFFSET = MM_SERVO17_OFFSET, // angle offset in fixed point format 1-3|4 + DARWIN_MM_SERVO18_OFFSET = MM_SERVO18_OFFSET, // angle offset in fixed point format 1-3|4 + DARWIN_MM_SERVO19_OFFSET = MM_SERVO19_OFFSET, // angle offset in fixed point format 1-3|4 + DARWIN_MM_SERVO20_OFFSET = MM_SERVO20_OFFSET, // angle offset in fixed point format 1-3|4 + DARWIN_MM_SERVO21_OFFSET = MM_SERVO21_OFFSET, // angle offset in fixed point format 1-3|4 + DARWIN_MM_SERVO22_OFFSET = MM_SERVO22_OFFSET, // angle offset in fixed point format 1-3|4 + DARWIN_MM_SERVO23_OFFSET = MM_SERVO23_OFFSET, // angle offset in fixed point format 1-3|4 + DARWIN_MM_SERVO24_OFFSET = MM_SERVO24_OFFSET, // angle offset in fixed point format 1-3|4 + DARWIN_MM_SERVO25_OFFSET = MM_SERVO25_OFFSET, // angle offset in fixed point format 1-3|4 + DARWIN_MM_SERVO26_OFFSET = MM_SERVO26_OFFSET, // angle offset in fixed point format 1-3|4 + DARWIN_MM_SERVO27_OFFSET = MM_SERVO27_OFFSET, // angle offset in fixed point format 1-3|4 + DARWIN_MM_SERVO28_OFFSET = MM_SERVO28_OFFSET, // angle offset in fixed point format 1-3|4 + DARWIN_MM_SERVO29_OFFSET = MM_SERVO29_OFFSET, // angle offset in fixed point format 1-3|4 + DARWIN_MM_SERVO30_OFFSET = MM_SERVO30_OFFSET, // angle offset in fixed point format 1-3|4 + DARWIN_MM_SERVO31_OFFSET = MM_SERVO31_OFFSET, // angle offset in fixed point format 1-3|4 + DARWIN_WALK_X_OFFSET = WALK_X_OFFSET, + DARWIN_WALK_Y_OFFSET = WALK_Y_OFFSET, + DARWIN_WALK_Z_OFFSET = WALK_Z_OFFSET, + DARWIN_WALK_ROLL_OFFSET = WALK_ROLL_OFFSET, + DARWIN_WALK_PITCH_OFFSET = WALK_PITCH_OFFSET, + DARWIN_WALK_YAW_OFFSET = WALK_YAW_OFFSET, + DARWIN_WALK_HIP_PITCH_OFF_L = WALK_HIP_PITCH_OFF, + DARWIN_WALK_HIP_PITCH_OFF_H = WALK_HIP_PITCH_OFF+1, + DARWIN_WALK_PERIOD_TIME_L = WALK_PERIOD_TIME, + DARWIN_WALK_PERIOD_TIME_H = WALK_PERIOD_TIME+1, + DARWIN_WALK_DSP_RATIO = WALK_DSP_RATIO, + DARWIN_WALK_STEP_FW_BW_RATIO = WALK_STEP_FW_BW_RATIO, + DARWIN_WALK_FOOT_HEIGHT = WALK_FOOT_HEIGHT, + DARWIN_WALK_SWING_RIGHT_LEFT = WALK_SWING_RIGHT_LEFT, + DARWIN_WALK_SWING_TOP_DOWN = WALK_SWING_TOP_DOWN, + DARWIN_WALK_PELVIS_OFFSET = WALK_PELVIS_OFFSET, + DARWIN_WALK_ARM_SWING_GAIN = WALK_ARM_SWING_GAIN, + DARWIN_WALK_MAX_VEL = WALK_MAX_VEL, + DARWIN_WALK_MAX_ROT_VEL = WALK_MAX_ROT_VEL, + DARWIN_HEAD_PAN_P_L = HEAD_PAN_P,// constant in fixed point format 0|16 + DARWIN_HEAD_PAN_P_H = HEAD_PAN_P+1, + DARWIN_HEAD_PAN_I_L = HEAD_PAN_I,// constant in fixed point format 0|16 + DARWIN_HEAD_PAN_I_H = HEAD_PAN_I+1, + DARWIN_HEAD_PAN_D_L = HEAD_PAN_D,// constant in fixed point format 0|16 + DARWIN_HEAD_PAN_D_H = HEAD_PAN_D+1, + DARWIN_HEAD_PAN_I_CLAMP_L = HEAD_PAN_I_CLAMP,// max error in fixed point format 9|7 + DARWIN_HEAD_PAN_I_CLAMP_H = HEAD_PAN_I_CLAMP+1, + DARWIN_HEAD_TILT_P_L = HEAD_TILT_P,// constant in fixed point format 0|16 + DARWIN_HEAD_TILT_P_H = HEAD_TILT_P+1, + DARWIN_HEAD_TILT_I_L = HEAD_TILT_I,// constant in fixed point format 0|16 + DARWIN_HEAD_TILT_I_H = HEAD_TILT_I+1, + DARWIN_HEAD_TILT_D_L = HEAD_TILT_D,// constant in fixed point format 0|16 + 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_TOP_ID = GRIPPER_LEFT_TOP_ID, + DARWIN_GRIPPER_LEFT_BOT_ID = GRIPPER_LEFT_BOT_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_TOP_ID = GRIPPER_RIGHT_TOP_ID, + DARWIN_GRIPPER_RIGHT_BOT_ID = GRIPPER_RIGHT_BOT_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_SMART_CHARGER_PERIOD_L = SMART_CHARGER_PERIOD, //en ms + DARWIN_SMART_CHARGER_PERIOD_H = SMART_CHARGER_PERIOD+1, + DARWIN_STAIRS_PHASE1_TIME_L = STAIRS_PHASE1_TIME, + DARWIN_STAIRS_PHASE1_TIME_H = STAIRS_PHASE1_TIME+1, + DARWIN_STAIRS_PHASE2_TIME_L = STAIRS_PHASE2_TIME, + DARWIN_STAIRS_PHASE2_TIME_H = STAIRS_PHASE2_TIME+1, + DARWIN_STAIRS_PHASE3_TIME_L = STAIRS_PHASE3_TIME, + DARWIN_STAIRS_PHASE3_TIME_H = STAIRS_PHASE3_TIME+1, + DARWIN_STAIRS_PHASE4_TIME_L = STAIRS_PHASE4_TIME, + DARWIN_STAIRS_PHASE4_TIME_H = STAIRS_PHASE4_TIME+1, + DARWIN_STAIRS_PHASE5_TIME_L = STAIRS_PHASE5_TIME, + DARWIN_STAIRS_PHASE5_TIME_H = STAIRS_PHASE5_TIME+1, + DARWIN_STAIRS_PHASE6_TIME_L = STAIRS_PHASE6_TIME, + DARWIN_STAIRS_PHASE6_TIME_H = STAIRS_PHASE6_TIME+1, + DARWIN_STAIRS_PHASE7_TIME_L = STAIRS_PHASE7_TIME, + DARWIN_STAIRS_PHASE7_TIME_H = STAIRS_PHASE7_TIME+1, + DARWIN_STAIRS_PHASE8_TIME_L = STAIRS_PHASE8_TIME, + DARWIN_STAIRS_PHASE8_TIME_H = STAIRS_PHASE8_TIME+1, + DARWIN_STAIRS_PHASE9_TIME_L = STAIRS_PHASE9_TIME, + DARWIN_STAIRS_PHASE9_TIME_H = STAIRS_PHASE9_TIME+1, + DARWIN_STAIRS_X_OFFSET = STAIRS_X_OFFSET, + DARWIN_STAIRS_Y_OFFSET = STAIRS_Y_OFFSET, + DARWIN_STAIRS_Z_OFFSET = STAIRS_Z_OFFSET, + DARWIN_STAIRS_Y_SHIFT = STAIRS_Y_SHIFT, + DARWIN_STAIRS_R_OFFSET = STAIRS_R_OFFSET, + DARWIN_STAIRS_P_OFFSET = STAIRS_P_OFFSET, + DARWIN_STAIRS_A_OFFSET = STAIRS_A_OFFSET, + DARWIN_STAIRS_X_SHIFT = STAIRS_X_SHIFT, + DARWIN_STAIRS_Z_OVERSHOOT = STAIRS_Z_OVERSHOOT, + DARWIN_STAIRS_Z_HEIGHT = STAIRS_Z_HEIGHT, + DARWIN_STAIRS_HIP_PITCH_OFF_L = STAIRS_HIP_PITCH_OFF, + DARWIN_STAIRS_HIP_PITCH_OFF_H = STAIRS_HIP_PITCH_OFF+1, + DARWIN_STAIRS_R_SHIFT = STAIRS_R_SHIFT, + DARWIN_STAIRS_P_SHIFT = STAIRS_P_SHIFT, + DARWIN_STAIRS_A_SHIFT = STAIRS_A_SHIFT, + DARWIN_STAIRS_Y_SPREAD = STAIRS_Y_SPREAD, + DARWIN_STAIRS_X_SHIFT_BODY = STAIRS_X_SHIFT_BODY, + //RAM 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 @@ -250,10 +315,6 @@ typedef enum { DARWIN_ADC_TEMP_H = 0x012C, DARWIN_ADC_CH12_L = 0x012D, DARWIN_ADC_CH12_H = 0x012E, - DARWIN_ADC_VREF_L = 0x012F, - DARWIN_ADC_VREF_H = 0x0130, - DARWIN_ADC_CH14_L = 0x0131, - DARWIN_ADC_CH14_H = 0x0132, DARWIN_IMU_CNTRL = 0x013B, // bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2 | bit 1 | bit 0 // accel_det | gyro_det | calibrating | running | | start_cal | stop | start DARWIN_IMU_CAL_SAMPLES_L = 0x013C, @@ -272,8 +333,8 @@ typedef enum { DARWIN_IMU_ACCEL_Z_H = 0x0149, DARWIN_MM_NUM_SERVOS = 0x014A, - DARWIN_MM_CNTRL = 0x014B, // bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2 | bit 1 | bit 0 - // scanning | | | | | Enable power | Enable balance | Enable manager + DARWIN_MM_CNTRL = 0x014B, // bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2 | bit 1 | bit 0 + // scanning | fwd fall | bwd fall | | Enable power v2 | Enable power | Enable balance | Enable manager DARWIN_MM_MODULE_EN0 = 0x014C, // bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2 | bit 1 | bit 0i // Enable servo 0 | assigned module | Enable servo 1 | assigned module // | 000 -> none | @@ -568,68 +629,22 @@ typedef enum { DARWIN_HEAD_MIN_TILT_H = 0x0244, DARWIN_HEAD_TILT_TARGET_L = 0x0245, // angle in fixed point format 9|7 DARWIN_HEAD_TILT_TARGET_H = 0x0246, - -// to do: include more registers os smart charger's memory map to read -/* DARWIN_BATT_CHARGER_STATUS = 0x0247, - DARWIN_BATT_INPUT_CURRENT_L = 0x0248, - DARWIN_BATT_INPUT_CURRENT_H = 0x0249, - DARWIN_BATT_CHARGE_CURRENT_L = 0x024A, - DARWIN_BATT_CHARGE_CURRENT_H = 0x024B, - DARWIN_BATT_CHARGE_VOLTAGE_L = 0x024C, - DARWIN_BATT_CHARGE_VOLTAGE_H = 0x024D, - DARWIN_BATT_LIMIT_CURRENT_L = 0x024E, - DARWIN_BATT_LIMIT_CURRENT_H = 0x024F, // - DARWIN_BATT_TEMPERATURE_L = 0x0250, - DARWIN_BATT_TEMPERATURE_H = 0x0251, - DARWIN_BATT_VOLTAGE_L = 0x0252, - DARWIN_BATT_VOLTAGE_H = 0x0253, - DARWIN_BATT_CURRENT_L = 0x0254, - DARWIN_BATT_CURRENT_H = 0x0255, - DARWIN_BATT_AVG_CURRENT_L = 0x0256, - DARWIN_BATT_AVG_CURRENT_H = 0x0257, - DARWIN_BATT_RELATIVE_SOC = 0x0258,// - DARWIN_BATT_ABSOLUTE_SOC = 0x0259, - DARWIN_BATT_REMAINING_CAP_L = 0x025A, - DARWIN_BATT_REMAINING_CAP_H = 0x025B, - DARWIN_BATT_FULL_CHARGE_CAP_L = 0x025C, - DARWIN_BATT_FULL_CHARGE_CAP_H = 0x025D, - DARWIN_BATT_RUN_TIME_EMPTY_L = 0x025E, // - DARWIN_BATT_RUN_TIME_EMPTY_H = 0x025F, - DARWIN_BATT_AVG_TIME_EMPTY_L = 0x0260, - DARWIN_BATT_AVG_TIME_EMPTY_H = 0x0261, - DARWIN_BATT_AVG_TIME_FULL_L = 0x0262, - DARWIN_BATT_AVG_TIME_FULL_H = 0x0263, - DARWIN_BATT_STATUS_L = 0x0264, - DARWIN_BATT_STATUS_H = 0x0265, - DARWIN_BATT_DESIGN_CAP_L = 0x0266, - DARWIN_BATT_DESIGN_CAP_H = 0x0267, - DARWIN_BATT_DESIGN_VOLTAGE_L = 0x0268, - DARWIN_BATT_DESIGN_VOLTAGE_H = 0x0269, - DARWIN_BATT_CELL1_VOLTAGE_L = 0x026A, - DARWIN_BATT_CELL1_VOLTAGE_H = 0x026B, - DARWIN_BATT_CELL2_VOLTAGE_L = 0x026C, - DARWIN_BATT_CELL2_VOLTAGE_H = 0x026D, - DARWIN_BATT_CELL3_VOLTAGE_L = 0x026E, - DARWIN_BATT_CELL3_VOLTAGE_H = 0x026F, - DARWIN_BATT_CELL4_VOLTAGE_L = 0x0270, - DARWIN_BATT_CELL4_VOLTAGE_H = 0x0271, -*/ -//añadidos + DARWIN_SMART_CHARGER_ID = 0x0247, - DARWIN_SMART_CHARGER_STATUS = 0x0248, - DARWIN_SMART_CHARGER_LIMIT_CURRENT_L = 0x0249, - DARWIN_SMART_CHARGER_LIMIT_CURRENT_H = 0x024A, - DARWIN_SMART_CHARGER_AVG_TIME_EMPTY_L = 0x024B, - DARWIN_SMART_CHARGER_AVG_TIME_EMPTY_H = 0x024C, - DARWIN_SMART_CHARGER_AVG_TIME_FULL_L = 0x024D, - DARWIN_SMART_CHARGER_AVG_TIME_FULL_H = 0x024E, - DARWIN_SMART_CHARGER_BATT_STATUS_L = 0x024F, - DARWIN_SMART_CHARGER_BATT_STATUS_H = 0x0250, - DARWIN_SMART_CHARGER_CNTRL = 0x0251, // bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2 | bit 1 | bit 0 - // | detected | enable -//Cambio registro - DARWIN_GRIPPER_CNTRL = 0x0252 // 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_SMART_CHARGER_LIMIT_CURRENT_L = 0x0248, // Input max current in mA + DARWIN_SMART_CHARGER_LIMIT_CURRENT_H = 0x0249, + DARWIN_SMART_CHARGER_AVG_TIME_EMPTY_L = 0x024A, // Average time to empty batteries in min + DARWIN_SMART_CHARGER_AVG_TIME_EMPTY_H = 0x024B, + DARWIN_SMART_CHARGER_AVG_TIME_FULL_L = 0x024C, // Average time to full batteries in min + DARWIN_SMART_CHARGER_AVG_TIME_FULL_H = 0x024D, + DARWIN_SMART_CHARGER_BATT_STATUS_L = 0x024E, // Battery status + DARWIN_SMART_CHARGER_BATT_STATUS_H = 0x024F, + DARWIN_SMART_CHARGER_CNTRL = 0x0250, // bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2 | bit 1 | bit 0 + // | detected | enable + DARWIN_GRIPPER_CNTRL = 0x0251, // bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2 | bit 1 | bit 0 + // left opened | right opened | left moving | right moving | close left | open left | close right | open right + DARWIN_STAIRS_CNTRL = 0x0252 // bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2 | bit 1 | bit 0 + // current phase | climbing | stop stairs | start stairs down | start stairs up }darwin_registers; #define GPIO_BASE_ADDRESS 0x0100 @@ -674,7 +689,10 @@ typedef enum { #define MANAGER_ENABLE 0x01 #define MANAGER_EN_BAL 0x02 #define MANAGER_EN_PWR 0x04 +#define MANAGER_EN_PWR_V2 0x08 #define MANAGER_SCANNING 0x80 +#define MANAGER_FWD_FALL 0x40 +#define MANAGER_BWD_FALL 0x20 #define MANAGER_EVEN_SER_EN 0x80 #define MANAGER_EVEN_SER_MOD 0x70 #define MANAGER_ODD_SER_EN 0x08 @@ -711,23 +729,35 @@ typedef enum { #define HEAD_STOP 0x02 #define HEAD_STATUS 0x10 -#define GRIPPER_BASE_ADDRESS 0x0252//0x0274 +#define GRIPPER_BASE_ADDRESS 0x0251 #define GRIPPER_MEM_LENGTH 1 #define GRIPPER_EEPROM_ADDRESS 0x0054 -#define GRIPPER_EEPROM_LENGTH 14 +#define GRIPPER_EEPROM_LENGTH 16 #define GRIPPER_OPEN_RIGHT 0x01 #define GRIPPER_CLOSE_RIGHT 0x02 #define GRIPPER_OPEN_LEFT 0x04 #define GRIPPER_CLOSE_LEFT 0x08 +#define GRIPPER_MOVING_LEFT 0x20 +#define GRIPPER_MOVING_RIGHT 0x10 +#define GRIPPER_OPENED_LEFT 0x80 +#define GRIPPER_OPENED_RIGHT 0x40 #define SMART_CHARGER_BASE_ADDRESS 0x0247 -#define SMART_CHARGER_MEM_LENGTH 10 //45 -#define SMART_CHARGER_EEPROM_BASE 0x0060 +#define SMART_CHARGER_MEM_LENGTH 11 +#define SMART_CHARGER_EEPROM_BASE 0x0062 #define SMART_CHARGER_EEPROM_LENGTH 2 #define SMART_CHARGER_DET 0x01 #define SMART_CHARGER_EN 0x02 - +#define STAIRS_BASE_ADDRESS 0x0252 +#define STAIRS_MEM_LENGTH 1 +#define STAIRS_EEPROM_ADDRESS 0x0066 +#define STAIRS_EEPROM_LENGTH 35 +#define STAIRS_START_UP 0x01 +#define STAIRS_START_DOWN 0x02 +#define STAIRS_STOP 0x04 +#define STAIRS_STATUS 0x08 +#define STAIRS_PHASE 0xF0 #ifdef __cplusplus } diff --git a/include/dyn_battery.h b/include/dyn_battery.h index ac02ce82b99b8996815da0b769d379eaa18ce3e6..70e47b622cbb9e935c4cacd2d708d15971979527 100644 --- a/include/dyn_battery.h +++ b/include/dyn_battery.h @@ -45,7 +45,7 @@ typedef enum { BATTERY_OUTPUT_VOLTAGE_H = 0x1E, /* RAM */ BATTERY_CHARGER_STATUS = 0x1F, - BATTERY_INPUT_CURRENT_L = 0x20,//corriente consumida (mA) + BATTERY_INPUT_CURRENT_L = 0x20, BATTERY_INPUT_CURRENT_H = 0x21, BATTERY_CHARGE_CURRENT_L = 0x22, BATTERY_CHARGE_CURRENT_H = 0x23, @@ -61,25 +61,25 @@ typedef enum { BATTERY_CURRENT_H = 0x2D, BATTERY_AVG_CURRENT_L = 0x2E, BATTERY_AVG_CURRENT_H = 0x2F, - BATTERY_RELATIVE_SOC = 0x30,//State Of Charge (%) + BATTERY_RELATIVE_SOC = 0x30, BATTERY_ABSOLUTE_SOC = 0x31, - BATTERY_REMAINING_CAP_L = 0x32,//mAh (tiempo de vida) + BATTERY_REMAINING_CAP_L = 0x32, BATTERY_REMAINING_CAP_H = 0x33, - BATTERY_FULL_CHARGE_CAP_L = 0x34,// + BATTERY_FULL_CHARGE_CAP_L = 0x34, BATTERY_FULL_CHARGE_CAP_H = 0x35, - BATTERY_RUN_TIME_EMPTY_L = 0x36,//(min) + BATTERY_RUN_TIME_EMPTY_L = 0x36, BATTERY_RUN_TIME_EMPTY_H = 0x37, BATTERY_AVG_TIME_EMPTY_L = 0x38, - BATTERY_AVG_TIME_EMPTY_H = 0x39,//tiempo hasta que este descargada (min) - BATTERY_AVG_TIME_FULL_L = 0x3A,//tiempo hasta que este cargada (min) + BATTERY_AVG_TIME_EMPTY_H = 0x39, + BATTERY_AVG_TIME_FULL_L = 0x3A, BATTERY_AVG_TIME_FULL_H = 0x3B, - BATTERY_STATUS_L = 0x3C,//cargando o descargando, cargada, descargada,... + BATTERY_STATUS_L = 0x3C, BATTERY_STATUS_H = 0x3D, - BATTERY_DESIGN_CAP_L = 0x3E,//Capacidad de la bateria - numero constante + BATTERY_DESIGN_CAP_L = 0x3E, BATTERY_DESIGN_CAP_H = 0x3F, BATTERY_DESIGN_VOLTAGE_L = 0x40, BATTERY_DESIGN_VOLTAGE_H = 0x41, - BATTERY_CELL1_VOLTAGE_L = 0x42,//Voltage de cada celda + BATTERY_CELL1_VOLTAGE_L = 0x42, BATTERY_CELL1_VOLTAGE_H = 0x43, BATTERY_CELL2_VOLTAGE_L = 0x44, BATTERY_CELL2_VOLTAGE_H = 0x45, diff --git a/include/eeprom.h b/include/eeprom.h index c20035882aa091380fd791694b2318e5029ac777..5d227885a7c436bf53c08f10f51c986163b46e31 100755 --- a/include/eeprom.h +++ b/include/eeprom.h @@ -83,7 +83,7 @@ extern "C" { #define PAGE_FULL ((uint8_t)0x80) /* Variables' number */ -#define NB_OF_VAR ((uint8_t)0x60) +#define NB_OF_VAR ((uint8_t)0x89) /* Exported types ------------------------------------------------------------*/ /* Exported macro ------------------------------------------------------------*/ diff --git a/include/eeprom_init.h b/include/eeprom_init.h index 7ba89ed6261ee183c407170d0a0fff7e1a2587ab..09eca5c7ead93c546ad246a4cf536853dbc8d9af 100644 --- a/include/eeprom_init.h +++ b/include/eeprom_init.h @@ -5,86 +5,112 @@ extern "C" { #endif -#define DEFAULT_DEVICE_MODEL 0x7300 -#define DEFAULT_FIRMWARE_VERSION 0x0001 -#define DEFAULT_DEVICE_ID 0x0002 -#define DEFAULT_BAUDRATE 0x0001 -#define DEFAULT_RETURN_DELAY 0x0000 -#define DEFAULT_MM_PERIOD 0x1E78 //7800us -#define DEFAULT_BAL_KNEE_GAIN 0x4CCD // 0.3 in fixed point format 0|16 -#define DEFAULT_BAL_ANKLE_ROLL_GAIN 0xFFFF // 0.99999 -#define DEFAULT_BAL_ANKLE_PITCH_GAIN 0xE666 // 0.9 -#define DEFAULT_BAL_HIP_ROLL_GAIN 0x8000 // 0.5 -#define DEFAULT_RETURN_LEVEL 0x0002 -#define DEFAULT_SERVO0_OFFSET 0x0000 // 0 in fixed point format 4 (1+3) | 4 -#define DEFAULT_SERVO1_OFFSET 0x0000 // 0 in fixed point format 4 (1+3) | 4 -#define DEFAULT_SERVO2_OFFSET 0x0000 // 0 in fixed point format 4 (1+3) | 4 -#define DEFAULT_SERVO3_OFFSET 0x0000 // 0 in fixed point format 4 (1+3) | 4 -#define DEFAULT_SERVO4_OFFSET 0x0000 // 0 in fixed point format 4 (1+3) | 4 -#define DEFAULT_SERVO5_OFFSET 0x0000 // 0 in fixed point format 4 (1+3) | 4 -#define DEFAULT_SERVO6_OFFSET 0x0000 // 0 in fixed point format 4 (1+3) | 4 -#define DEFAULT_SERVO7_OFFSET 0x0000 // 0 in fixed point format 4 (1+3) | 4 -#define DEFAULT_SERVO8_OFFSET 0x0000 // 0 in fixed point format 4 (1+3) | 4 -#define DEFAULT_SERVO9_OFFSET 0x0000 // 0 in fixed point format 4 (1+3) | 4 -#define DEFAULT_SERVO10_OFFSET 0x0000 // 0 in fixed point format 4 (1+3) | 4 -#define DEFAULT_SERVO11_OFFSET 0x0000 // 0 in fixed point format 4 (1+3) | 4 -#define DEFAULT_SERVO12_OFFSET 0x0000 // 0 in fixed point format 4 (1+3) | 4 -#define DEFAULT_SERVO13_OFFSET 0x0000 // 0 in fixed point format 4 (1+3) | 4 -#define DEFAULT_SERVO14_OFFSET 0x0000 // 0 in fixed point format 4 (1+3) | 4 -#define DEFAULT_SERVO15_OFFSET 0x0000 // 0 in fixed point format 4 (1+3) | 4 -#define DEFAULT_SERVO16_OFFSET 0x0000 // 0 in fixed point format 4 (1+3) | 4 -#define DEFAULT_SERVO17_OFFSET 0x0000 // 0 in fixed point format 4 (1+3) | 4 -#define DEFAULT_SERVO18_OFFSET 0x0000 // 0 in fixed point format 4 (1+3) | 4 -#define DEFAULT_SERVO19_OFFSET 0x0000 // 0 in fixed point format 4 (1+3) | 4 -#define DEFAULT_SERVO20_OFFSET 0x0000 // 0 in fixed point format 4 (1+3) | 4 -#define DEFAULT_SERVO21_OFFSET 0x0000 // 0 in fixed point format 4 (1+3) | 4 -#define DEFAULT_SERVO22_OFFSET 0x0000 // 0 in fixed point format 4 (1+3) | 4 -#define DEFAULT_SERVO23_OFFSET 0x0000 // 0 in fixed point format 4 (1+3) | 4 -#define DEFAULT_SERVO24_OFFSET 0x0000 // 0 in fixed point format 4 (1+3) | 4 -#define DEFAULT_SERVO25_OFFSET 0x0000 // 0 in fixed point format 4 (1+3) | 4 -#define DEFAULT_SERVO26_OFFSET 0x0000 // 0 in fixed point format 4 (1+3) | 4 -#define DEFAULT_SERVO27_OFFSET 0x0000 // 0 in fixed point format 4 (1+3) | 4 -#define DEFAULT_SERVO28_OFFSET 0x0000 // 0 in fixed point format 4 (1+3) | 4 -#define DEFAULT_SERVO29_OFFSET 0x0000 // 0 in fixed point format 4 (1+3) | 4 -#define DEFAULT_SERVO30_OFFSET 0x0000 // 0 in fixed point format 4 (1+3) | 4 -#define DEFAULT_SERVO31_OFFSET 0x0000 // 0 in fixed point format 4 (1+3) | 4 -#define DEFAULT_WALK_X_OFFSET 0xFFF6 // -10 mm -#define DEFAULT_WALK_Y_OFFSET 0x0005 // 5 mm -#define DEFAULT_WALK_Z_OFFSET 0x0014 // 20 mm -#define DEFAULT_WALK_ROLL_OFFSET 0x0000 // 0 degrees in fixed point format 5 (1+4) | 3 -#define DEFAULT_WALK_PITCH_OFFSET 0x0000 // 0 degrees in fixed point format 5 (1+4) | 3 -#define DEFAULT_WALK_YAW_OFFSET 0x0000 // 0 degrees in fixed point format 5 (1+4) | 3 -#define DEFAULT_WALK_HIP_PITCH_OFF 0x34B6 // 13.18 degrees in fixed point format 6 (1+5) | 10 -#define DEFAULT_WALK_PERIOD_TIME 0x0258 // 600 ms -#define DEFAULT_WALK_DSP_RATIO 0x0019 // 0.1 in fixed point format 0 | 8 -#define DEFAULT_WALK_STEP_FW_BW_RATIO 0x004C // 0.3 in fixed point format 0 | 8 -#define DEFAULT_WALK_FOOT_HEIGHT 0x0028 // 40 mm -#define DEFAULT_WALK_SWING_RIGHT_LEFT 0x0014 // 20 mm -#define DEFAULT_WALK_SWING_TOP_DOWN 0x0005 // 5 mm -#define DEFAULT_WALK_PELVIS_OFFSET 0x0018 // 3 degrees in fixed point format 5 (1+4) | 3 -#define DEFAULT_WALK_ARM_SWING_GAIN 0x0030 // 1.5 in fixed point format 3 | 5 -#define DEFAULT_WALK_MAX_VEL 0x0016 // 20 mm/s -#define DEFAULT_WALK_MAX_ROT_VEL 0x0040 // 8 degrees/s in fixed point format 5 | 3 -#define DEFAULT_HEAD_PAN_P 0x028F // 0.01 in fixed point format 0|16 -#define DEFAULT_HEAD_PAN_I 0x0000 // 0.0 in fixed point format 0|16 -#define DEFAULT_HEAD_PAN_D 0x0000 // 0.0 in fixed point format 0|16 -#define DEFAULT_HEAD_PAN_I_CLAMP 0x0000 // 0.0 in fixed point format 9|7 -#define DEFAULT_HEAD_TILT_P 0x028F // 0.01 in fixed point format 0|16 -#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 - -#define DEFAULT_SMART_CHARGER_PERIOD 0x05DC //1500 ms (7,8ms*200) +#define DEFAULT_DEVICE_MODEL 0x7300 +#define DEFAULT_FIRMWARE_VERSION 0x0001 +#define DEFAULT_DEVICE_ID 0x0002 +#define DEFAULT_BAUDRATE 0x0001 +#define DEFAULT_RETURN_DELAY 0x0000 +#define DEFAULT_MM_PERIOD 0x1E78 //7800us +#define DEFAULT_BAL_KNEE_GAIN 0x4CCD // 0.3 in fixed point format 0|16 +#define DEFAULT_BAL_ANKLE_ROLL_GAIN 0xFFFF // 0.99999 +#define DEFAULT_BAL_ANKLE_PITCH_GAIN 0xE666 // 0.9 +#define DEFAULT_BAL_HIP_ROLL_GAIN 0x8000 // 0.5 +#define DEFAULT_RETURN_LEVEL 0x0002 +#define DEFAULT_SERVO0_OFFSET 0x0000 // 0 in fixed point format 4 (1+3) | 4 +#define DEFAULT_SERVO1_OFFSET 0x0000 // 0 in fixed point format 4 (1+3) | 4 +#define DEFAULT_SERVO2_OFFSET 0x0000 // 0 in fixed point format 4 (1+3) | 4 +#define DEFAULT_SERVO3_OFFSET 0x0000 // 0 in fixed point format 4 (1+3) | 4 +#define DEFAULT_SERVO4_OFFSET 0x0000 // 0 in fixed point format 4 (1+3) | 4 +#define DEFAULT_SERVO5_OFFSET 0x0000 // 0 in fixed point format 4 (1+3) | 4 +#define DEFAULT_SERVO6_OFFSET 0x0000 // 0 in fixed point format 4 (1+3) | 4 +#define DEFAULT_SERVO7_OFFSET 0x0000 // 0 in fixed point format 4 (1+3) | 4 +#define DEFAULT_SERVO8_OFFSET 0x0000 // 0 in fixed point format 4 (1+3) | 4 +#define DEFAULT_SERVO9_OFFSET 0x0000 // 0 in fixed point format 4 (1+3) | 4 +#define DEFAULT_SERVO10_OFFSET 0x0000 // 0 in fixed point format 4 (1+3) | 4 +#define DEFAULT_SERVO11_OFFSET 0x0000 // 0 in fixed point format 4 (1+3) | 4 +#define DEFAULT_SERVO12_OFFSET 0x0000 // 0 in fixed point format 4 (1+3) | 4 +#define DEFAULT_SERVO13_OFFSET 0x0000 // 0 in fixed point format 4 (1+3) | 4 +#define DEFAULT_SERVO14_OFFSET 0x0000 // 0 in fixed point format 4 (1+3) | 4 +#define DEFAULT_SERVO15_OFFSET 0x0000 // 0 in fixed point format 4 (1+3) | 4 +#define DEFAULT_SERVO16_OFFSET 0x0000 // 0 in fixed point format 4 (1+3) | 4 +#define DEFAULT_SERVO17_OFFSET 0x0000 // 0 in fixed point format 4 (1+3) | 4 +#define DEFAULT_SERVO18_OFFSET 0x0000 // 0 in fixed point format 4 (1+3) | 4 +#define DEFAULT_SERVO19_OFFSET 0x0000 // 0 in fixed point format 4 (1+3) | 4 +#define DEFAULT_SERVO20_OFFSET 0x0000 // 0 in fixed point format 4 (1+3) | 4 +#define DEFAULT_SERVO21_OFFSET 0x0000 // 0 in fixed point format 4 (1+3) | 4 +#define DEFAULT_SERVO22_OFFSET 0x0000 // 0 in fixed point format 4 (1+3) | 4 +#define DEFAULT_SERVO23_OFFSET 0x0000 // 0 in fixed point format 4 (1+3) | 4 +#define DEFAULT_SERVO24_OFFSET 0x0000 // 0 in fixed point format 4 (1+3) | 4 +#define DEFAULT_SERVO25_OFFSET 0x0000 // 0 in fixed point format 4 (1+3) | 4 +#define DEFAULT_SERVO26_OFFSET 0x0000 // 0 in fixed point format 4 (1+3) | 4 +#define DEFAULT_SERVO27_OFFSET 0x0000 // 0 in fixed point format 4 (1+3) | 4 +#define DEFAULT_SERVO28_OFFSET 0x0000 // 0 in fixed point format 4 (1+3) | 4 +#define DEFAULT_SERVO29_OFFSET 0x0000 // 0 in fixed point format 4 (1+3) | 4 +#define DEFAULT_SERVO30_OFFSET 0x0000 // 0 in fixed point format 4 (1+3) | 4 +#define DEFAULT_SERVO31_OFFSET 0x0000 // 0 in fixed point format 4 (1+3) | 4 +#define DEFAULT_WALK_X_OFFSET 0xFFF6 // -10 mm +#define DEFAULT_WALK_Y_OFFSET 0x0005 // 5 mm +#define DEFAULT_WALK_Z_OFFSET 0x0014 // 20 mm +#define DEFAULT_WALK_ROLL_OFFSET 0x0000 // 0 degrees in fixed point format 5 (1+4) | 3 +#define DEFAULT_WALK_PITCH_OFFSET 0x0000 // 0 degrees in fixed point format 5 (1+4) | 3 +#define DEFAULT_WALK_YAW_OFFSET 0x0000 // 0 degrees in fixed point format 5 (1+4) | 3 +#define DEFAULT_WALK_HIP_PITCH_OFF 0x34B6 // 13.18 degrees in fixed point format 6 (1+5) | 10 +#define DEFAULT_WALK_PERIOD_TIME 0x0258 // 600 ms +#define DEFAULT_WALK_DSP_RATIO 0x0019 // 0.1 in fixed point format 0 | 8 +#define DEFAULT_WALK_STEP_FW_BW_RATIO 0x004C // 0.3 in fixed point format 0 | 8 +#define DEFAULT_WALK_FOOT_HEIGHT 0x0028 // 40 mm +#define DEFAULT_WALK_SWING_RIGHT_LEFT 0x0014 // 20 mm +#define DEFAULT_WALK_SWING_TOP_DOWN 0x0005 // 5 mm +#define DEFAULT_WALK_PELVIS_OFFSET 0x0018 // 3 degrees in fixed point format 5 (1+4) | 3 +#define DEFAULT_WALK_ARM_SWING_GAIN 0x0030 // 1.5 in fixed point format 3 | 5 +#define DEFAULT_WALK_MAX_VEL 0x0016 // 20 mm/s +#define DEFAULT_WALK_MAX_ROT_VEL 0x0040 // 8 degrees/s in fixed point format 5 | 3 +#define DEFAULT_HEAD_PAN_P 0x028F // 0.01 in fixed point format 0|16 +#define DEFAULT_HEAD_PAN_I 0x0000 // 0.0 in fixed point format 0|16 +#define DEFAULT_HEAD_PAN_D 0x0000 // 0.0 in fixed point format 0|16 +#define DEFAULT_HEAD_PAN_I_CLAMP 0x0000 // 0.0 in fixed point format 9|7 +#define DEFAULT_HEAD_TILT_P 0x028F // 0.01 in fixed point format 0|16 +#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_TOP_ID 0x0015 // ID 21 for the left gripper +#define DEFAULT_GRIPPER_LEFT_BOT_ID 0x0016 // ID 22 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 0x0080 // 1023 max force in binary format +#define DEFAULT_GRIPPER_RIGHT_TOP_ID 0x0017 // ID 23 for the left gripper +#define DEFAULT_GRIPPER_RIGHT_BOT_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 0x0080 // 1023 max force in binary format +#define DEFAULT_SMART_CHARGER_PERIOD 0x05DC // 1500 ms +#define DEFAULT_STAIRS_PHASE1_TIME 0x0640 // 1600 ms +#define DEFAULT_STAIRS_PHASE2_TIME 0x0C80 // 3200 ms +#define DEFAULT_STAIRS_PHASE3_TIME 0x12C0 // 4800 ms +#define DEFAULT_STAIRS_PHASE4_TIME 0x1900 // 6400 ms +#define DEFAULT_STAIRS_PHASE5_TIME 0x1F40 // 8000 ms +#define DEFAULT_STAIRS_PHASE6_TIME 0x2580 // 9600 ms +#define DEFAULT_STAIRS_PHASE7_TIME 0x2BC0 // 11200 ms +#define DEFAULT_STAIRS_PHASE8_TIME 0x3200 // 12800 ms +#define DEFAULT_STAIRS_PHASE9_TIME 0x3840 // 14400 ms +#define DEFAULT_STAIRS_X_OFFSET 0xFFF6 // -10 mm +#define DEFAULT_STAIRS_Y_OFFSET 0x0005 // 5mm +#define DEFAULT_STAIRS_Z_OFFSET 0x0014 // 20 mm +#define DEFAULT_STAIRS_R_OFFSET 0x0000 // 0 degrees in fixed point format 5 (1+4) | 3 +#define DEFAULT_STAIRS_P_OFFSET 0x0000 // 0 degrees in fixed point format 5 (1+4) | 3 +#define DEFAULT_STAIRS_A_OFFSET 0x0000 // 0 degrees in fixed point format 5 (1+4) | 3 +#define DEFAULT_STAIRS_Y_SHIFT 0x0028 // 40 mm +#define DEFAULT_STAIRS_X_SHIFT 0x0050 // 80 mm +#define DEFAULT_STAIRS_Z_OVERSHOOT 0x000F // 15 mm +#define DEFAULT_STAIRS_Z_HEIGHT 0x001E // 30 mm +#define DEFAULT_STAIRS_HIP_PITCH_OFF 0x34B6 // 13.18 degrees in fixed point format 6 (1+5) | 10 +#define DEFAULT_STAIRS_R_SHIFT 0x000B // 2.875 degrees in fixed point format 5 (1+5) | 2 +#define DEFAULT_STAIRS_P_SHIFT 0x0017 // 5.73 degrees in fixed point format 5 (1+5) | 2 +#define DEFAULT_STAIRS_A_SHIFT 0x0045 // 17.19 degrees in fixed point format 6 (1+5) | 2 +#define DEFAULT_STAIRS_Y_SPREAD 0x0014 // 20 mm +#define DEFAULT_STAIRS_X_SHIFT_BODY 0x0023 // 35 mm - +#define EEPROM_SIZE 137 #ifdef __cplusplus } diff --git a/include/grippers.h b/include/grippers.h index 9df31bcba3b0a176d7c83c76f7a89e40b98b23b2..9a1aa5fd90e5c64d1cc75a9bac5fe51f73109634 100644 --- a/include/grippers.h +++ b/include/grippers.h @@ -16,13 +16,15 @@ 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); +void grippers_stop(grippers_t gripper); uint8_t gripper_is_open(grippers_t gripper); +uint8_t gripper_is_close(grippers_t gripper); +uint8_t gripper_is_moving(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 diff --git a/include/imu.h b/include/imu.h index 079304bf1b235660acb081ab1186a926366633c0..f3e1c3d203ca0ebe27e7a82ba3c569d4d5cddb11 100755 --- a/include/imu.h +++ b/include/imu.h @@ -14,6 +14,7 @@ void imu_stop(void); void imu_set_calibration_samples(uint16_t num_samples); void imu_start_gyro_cal(void); void imu_get_gyro_data(int32_t *x, int32_t *y, int32_t *z); +void imu_get_accel_data(int32_t *x, int32_t *y, int32_t *z); uint8_t imu_is_gyro_calibrated(void); // operation functions uint8_t imu_in_range(unsigned short int address,unsigned short int length); diff --git a/include/motion_manager.h b/include/motion_manager.h index 10f053f73afb1aeef86c1b705e4e2f68b0feb327..d0f234ce1e61bd2eefffab36a056d07729157523 100755 --- a/include/motion_manager.h +++ b/include/motion_manager.h @@ -29,7 +29,11 @@ typedef enum { R_ANKLE_ROLL = 17, L_ANKLE_ROLL = 18, L_PAN = 19, - L_TILT = 20} servo_id_t; + L_TILT = 20, + L_GRIPPER_TOP = 21, + L_GRIPPER_BOT = 22, + R_GRIPPER_TOP = 23, + R_GRIPPER_BOT = 24} servo_id_t; typedef enum {MM_NONE = 0, @@ -38,6 +42,10 @@ typedef enum {MM_NONE = 0, MM_JOINTS = 3, MM_HEAD = 4} TModules; +typedef enum {MM_FWD_FALL = 0, + MM_BWD_FALL = 1, + MM_STANDING = 2} TFall; + typedef struct { void (*process_fnct)(void); @@ -86,6 +94,8 @@ inline void manager_disable(void); inline uint8_t manager_is_enabled(void); void manager_enable_balance(void); void manager_disable_balance(void); +inline uint8_t manager_has_fallen(void); +TFall manager_get_fallen_position(void); inline uint8_t manager_get_num_servos(void); void manager_set_module(uint8_t servo_id,TModules module); inline TModules manager_get_module(uint8_t servo_id); diff --git a/include/smart_charger.h b/include/smart_charger.h index d6f8659ee1635a6f3a4446b1ddb1cc3aedbf0e76..42c3217353f678c2f0f4d82fc63bbc35732c5478 100644 --- a/include/smart_charger.h +++ b/include/smart_charger.h @@ -37,13 +37,13 @@ void smart_charger_init(uint16_t period_us); * * \param master pointer to a TDynamixelMaster structure ((darwin_dyn_master or darwin_dyn_master_v2). */ -inline void smart_charger_set_version(TDynamixelMaster *master); +inline void smart_charger_set_master(TDynamixelMaster *master); /** * \brief Function to get the master version of the Dynamixel protocol set to the module * \return the Dynamixel master structure associated to the smart charger module (darwin_dyn_master or darwin_dyn_master_v2). */ -inline TDynamixelMaster* smart_charger_get_version(void); +inline TDynamixelMaster* smart_charger_get_master(void); /** * \brief Function to set smart charger's period * @@ -118,4 +118,4 @@ void smart_charger_process(void); } #endif -#endif \ No newline at end of file +#endif diff --git a/include/stairs.h b/include/stairs.h new file mode 100755 index 0000000000000000000000000000000000000000..4cb0bacaa035ca6ccbb4e75ed88ecafacc92c4a8 --- /dev/null +++ b/include/stairs.h @@ -0,0 +1,31 @@ +#ifndef _STAIRS_H +#define _STAIRS_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "stm32f1xx.h" +#include "motion_manager.h" + +// public functions +void stairs_init(uint16_t period_us); +inline void stairs_set_period(uint16_t period_us); +inline uint16_t stairs_get_period(void); +void stairs_start(uint8_t up); +void stairs_stop(void); +uint8_t is_climbing_stairs(void); +uint8_t stairs_get_phase(void); + +// operation functions +uint8_t stairs_in_range(unsigned short int address, unsigned short int length); +void stairs_process_read_cmd(unsigned short int address,unsigned short int length,unsigned char *data); +void stairs_process_write_cmd(unsigned short int address,unsigned short int length,unsigned char *data); +// motion manager interface functions +void stairs_process(void); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/adc_dma.c b/src/adc_dma.c index d24f466d8bdf495add858283b077871a3f177eb5..eb0f821a5e19c6faea28b2ff64462cbdfb3b4547 100755 --- a/src/adc_dma.c +++ b/src/adc_dma.c @@ -7,15 +7,13 @@ #define ADC1_CH4 ADC_CHANNEL_7 #define ADC1_CH5 ADC_CHANNEL_8 #define ADC1_CH6 ADC_CHANNEL_TEMPSENSOR -#define ADC1_CH7 ADC_CHANNEL_VREFINT #define ADC2_CH1 ADC_CHANNEL_9 #define ADC2_CH2 ADC_CHANNEL_10 #define ADC2_CH3 ADC_CHANNEL_11 #define ADC2_CH4 ADC_CHANNEL_12 -#define ADC2_CH5 ADC_CHANNEL_13 -#define ADC2_CH6 ADC_CHANNEL_14 -#define ADC2_CH7 ADC_CHANNEL_15 +#define ADC2_CH5 ADC_CHANNEL_14 +#define ADC2_CH6 ADC_CHANNEL_15 #define ADC1_CH1_PIN GPIO_PIN_0 #define ADC1_CH1_PORT GPIOA @@ -47,15 +45,12 @@ #define ADC2_CH4_PIN GPIO_PIN_2 #define ADC2_CH4_PORT GPIOC #define ADC2_CH4_ENABLE_PORT_CLK __HAL_RCC_GPIOC_CLK_ENABLE() -#define ADC2_CH5_PIN GPIO_PIN_3 +#define ADC2_CH5_PIN GPIO_PIN_4 #define ADC2_CH5_PORT GPIOC #define ADC2_CH5_ENABLE_PORT_CLK __HAL_RCC_GPIOC_CLK_ENABLE() -#define ADC2_CH6_PIN GPIO_PIN_4 +#define ADC2_CH6_PIN GPIO_PIN_5 #define ADC2_CH6_PORT GPIOC #define ADC2_CH6_ENABLE_PORT_CLK __HAL_RCC_GPIOC_CLK_ENABLE() -#define ADC2_CH7_PIN GPIO_PIN_5 -#define ADC2_CH7_PORT GPIOC -#define ADC2_CH7_ENABLE_PORT_CLK __HAL_RCC_GPIOC_CLK_ENABLE() #define ADC2_ENABLE_CLK __ADC2_CLK_ENABLE() @@ -82,7 +77,7 @@ ADC_HandleTypeDef hadc2; DMA_HandleTypeDef hdma_adc1; TIM_HandleTypeDef ADC_TIM_Handle; -uint32_t adc_data[9];// temporal buffer to store ADC data before conversion +uint32_t adc_data[6];// temporal buffer to store ADC data before conversion uint16_t adc_period_ms; // private functions @@ -153,7 +148,7 @@ void ADC_DMA_IRQHandler(void) if(__HAL_DMA_GET_IT_SOURCE(&hdma_adc1, DMA_IT_TC) != RESET) { __HAL_DMA_CLEAR_FLAG(&hdma_adc1, __HAL_DMA_GET_TC_FLAG_INDEX(&hdma_adc1)); - for(i=0;i<7;i++) + for(i=0;i<6;i++) { if(i==5) { @@ -202,7 +197,6 @@ void adc_init(void) ADC2_CH4_ENABLE_PORT_CLK; ADC2_CH5_ENABLE_PORT_CLK; ADC2_CH6_ENABLE_PORT_CLK; - ADC2_CH7_ENABLE_PORT_CLK; ADC_ENABLE_DMA_CLK; @@ -214,7 +208,7 @@ void adc_init(void) hadc1.Init.DiscontinuousConvMode = DISABLE; hadc1.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T1_CC1; hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; - hadc1.Init.NbrOfConversion = 7; + hadc1.Init.NbrOfConversion = 6; HAL_ADC_Init(&hadc1); multimode.Mode = ADC_DUALMODE_REGSIMULT; @@ -246,10 +240,6 @@ void adc_init(void) sConfig.Rank = 6; HAL_ADC_ConfigChannel(&hadc1, &sConfig); - sConfig.Channel = ADC1_CH7; - sConfig.Rank = 7; - HAL_ADC_ConfigChannel(&hadc1, &sConfig); - // configure GPIO GPIO_InitStruct.Pin = ADC1_CH1_PIN|ADC1_CH2_PIN|ADC1_CH3_PIN|ADC1_CH4_PIN; GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; @@ -266,7 +256,7 @@ void adc_init(void) hadc2.Init.DiscontinuousConvMode = DISABLE; hadc2.Init.ExternalTrigConv = ADC_SOFTWARE_START;//ADC_EXTERNALTRIGCONV_T1_CC1; hadc2.Init.DataAlign = ADC_DATAALIGN_RIGHT; - hadc2.Init.NbrOfConversion = 7; + hadc2.Init.NbrOfConversion = 6; HAL_ADC_Init(&hadc2); // configure ADC2 channels @@ -295,13 +285,9 @@ void adc_init(void) sConfig.Rank = 6; HAL_ADC_ConfigChannel(&hadc2, &sConfig); - sConfig.Channel = ADC2_CH7; - sConfig.Rank = 7; - HAL_ADC_ConfigChannel(&hadc2, &sConfig); - // configure GPIO GPIO_InitStruct.Pin = ADC2_CH2_PIN|ADC2_CH3_PIN|ADC2_CH4_PIN|ADC2_CH5_PIN| - ADC2_CH6_PIN|ADC2_CH7_PIN; + ADC2_CH6_PIN; GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); @@ -366,7 +352,7 @@ void adc_init(void) HAL_ADCEx_Calibration_Start(&hadc2); HAL_ADC_Start(&hadc2); - HAL_ADCEx_MultiModeStart_DMA(&hadc1,adc_data,7); + HAL_ADCEx_MultiModeStart_DMA(&hadc1,adc_data,6); } void adc_start(void) @@ -426,8 +412,6 @@ uint16_t adc_get_channel(adc_ch_t channel) break; case ADC_CH12: value=ram_data[DARWIN_ADC_CH12_L]+ram_data[DARWIN_ADC_CH12_H]*256; break; - case ADC_CH14: value=ram_data[DARWIN_ADC_CH14_L]+ram_data[DARWIN_ADC_CH14_H]*256; - break; default: value=0x0000; } @@ -462,8 +446,6 @@ uint16_t adc_get_channel_raw(adc_ch_t channel) break; case ADC_CH12: value=(adc_data[5]&0xFFFF0000)>>16; break; - case ADC_CH14: value=(adc_data[6]&0xFFFF0000)>>16; - break; default: value=0x0000; } diff --git a/src/cm730_fw.c b/src/cm730_fw.c index d074c765ddd1f91e06636c2809f33fa476b6acb2..7693bace89751e5e77b06d534dc8b9787c1fb4bb 100755 --- a/src/cm730_fw.c +++ b/src/cm730_fw.c @@ -7,6 +7,7 @@ #include "darwin_time.h" #include "darwin_dyn_slave.h" #include "darwin_dyn_master.h" +#include "darwin_dyn_master_v2.h" #include "motion_manager.h" #include "action.h" #include "action_id.h" @@ -14,7 +15,6 @@ int main(void) { uint16_t eeprom_data,period; - uint8_t i; /* initialize the HAL module */ HAL_Init(); diff --git a/src/darwin_dyn_master_v2.c b/src/darwin_dyn_master_v2.c index 5dc5e5daf5ded2ca691a234b8c2dc9e1d6f9aae4..6152125c7700e3e8a4139a8086b974cfaf2df635 100755 --- a/src/darwin_dyn_master_v2.c +++ b/src/darwin_dyn_master_v2.c @@ -11,6 +11,10 @@ #define TX_EN_PIN GPIO_PIN_1 #define TX_EN_GPIO_PORT GPIOA +#define POWER_GPIO_CLK __GPIOC_CLK_ENABLE() +#define POWER_PIN GPIO_PIN_3 +#define POWER_GPIO_PORT GPIOC + /* private variables */ TDynamixelMaster darwin_dyn_master_v2; TTime darwin_dyn_master_v2_timer; @@ -79,5 +83,18 @@ void darwin_dyn_master_v2_init(void) /* configure dynamixel master module */ dyn_master_set_rx_timeout(&darwin_dyn_master_v2,50); dyn_master_set_return_level(&darwin_dyn_master_v2,return_all); + darwin_dyn_master_v2_disable_power(); +} + +inline void darwin_dyn_master_v2_enable_power(void) +{ + HAL_GPIO_WritePin(POWER_GPIO_PORT,POWER_PIN,GPIO_PIN_SET); + ram_data[DARWIN_MM_CNTRL]|=MANAGER_EN_PWR_V2; +} + +inline void darwin_dyn_master_v2_disable_power(void) +{ + HAL_GPIO_WritePin(POWER_GPIO_PORT,POWER_PIN,GPIO_PIN_RESET); + ram_data[DARWIN_MM_CNTRL]&=(~MANAGER_EN_PWR_V2); } diff --git a/src/darwin_dyn_slave.c b/src/darwin_dyn_slave.c index dd7f12fac2b7730652638b6bf9e393ab0b2f1155..b287d062003f5a8011ae145d60137559255b6382 100755 --- a/src/darwin_dyn_slave.c +++ b/src/darwin_dyn_slave.c @@ -13,6 +13,7 @@ #include "head_tracking.h" #include "grippers.h" #include "smart_charger.h" +#include "stairs.h" /* timer for the execution of the dynamixel slave loop */ #define DYN_SLAVE_TIMER TIM7 @@ -96,6 +97,8 @@ unsigned char darwin_on_write(unsigned short int address,unsigned short int leng // smart charger commands if(smart_charger_in_range(address,length)) smart_charger_process_write_cmd(address,length,data); + if(stairs_in_range(address,length)) + stairs_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 d511af23b9cf8ebb04bf8cd314b10cfea15fc435..fd7d1f016d4c07e2bef8678d444a430c3e54311f 100755 --- a/src/eeprom.c +++ b/src/eeprom.c @@ -53,108 +53,145 @@ 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, - 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, - DEFAULT_SMART_CHARGER_PERIOD&0xFF, SMART_CHARGER_PERIOD, - DEFAULT_SMART_CHARGER_PERIOD>>8, SMART_CHARGER_PERIOD+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_TOP_ID, GRIPPER_LEFT_TOP_ID, + DEFAULT_GRIPPER_LEFT_BOT_ID, GRIPPER_LEFT_BOT_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_TOP_ID, GRIPPER_RIGHT_TOP_ID, + DEFAULT_GRIPPER_RIGHT_BOT_ID, GRIPPER_RIGHT_BOT_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, + DEFAULT_SMART_CHARGER_PERIOD&0xFF, SMART_CHARGER_PERIOD, + DEFAULT_SMART_CHARGER_PERIOD>>8, SMART_CHARGER_PERIOD+1, + DEFAULT_STAIRS_PHASE1_TIME&0xFF, STAIRS_PHASE1_TIME, + DEFAULT_STAIRS_PHASE1_TIME>>8, STAIRS_PHASE1_TIME+1, + DEFAULT_STAIRS_PHASE2_TIME&0xFF, STAIRS_PHASE2_TIME, + DEFAULT_STAIRS_PHASE2_TIME>>8, STAIRS_PHASE2_TIME+1, + DEFAULT_STAIRS_PHASE3_TIME&0xFF, STAIRS_PHASE3_TIME, + DEFAULT_STAIRS_PHASE3_TIME>>8, STAIRS_PHASE3_TIME+1, + DEFAULT_STAIRS_PHASE4_TIME&0xFF, STAIRS_PHASE4_TIME, + DEFAULT_STAIRS_PHASE4_TIME>>8, STAIRS_PHASE4_TIME+1, + DEFAULT_STAIRS_PHASE5_TIME&0xFF, STAIRS_PHASE5_TIME, + DEFAULT_STAIRS_PHASE5_TIME>>8, STAIRS_PHASE5_TIME+1, + DEFAULT_STAIRS_PHASE6_TIME&0xFF, STAIRS_PHASE6_TIME, + DEFAULT_STAIRS_PHASE6_TIME>>8, STAIRS_PHASE6_TIME+1, + DEFAULT_STAIRS_PHASE7_TIME&0xFF, STAIRS_PHASE7_TIME, + DEFAULT_STAIRS_PHASE7_TIME>>8, STAIRS_PHASE7_TIME+1, + DEFAULT_STAIRS_PHASE8_TIME&0xFF, STAIRS_PHASE8_TIME, + DEFAULT_STAIRS_PHASE8_TIME>>8, STAIRS_PHASE8_TIME+1, + DEFAULT_STAIRS_PHASE9_TIME&0xFF, STAIRS_PHASE9_TIME, + DEFAULT_STAIRS_PHASE9_TIME>>8, STAIRS_PHASE9_TIME+1, + DEFAULT_STAIRS_X_OFFSET, STAIRS_X_OFFSET, + DEFAULT_STAIRS_Y_OFFSET, STAIRS_Y_OFFSET, + DEFAULT_STAIRS_Z_OFFSET, STAIRS_Z_OFFSET, + DEFAULT_STAIRS_R_OFFSET, STAIRS_R_OFFSET, + DEFAULT_STAIRS_P_OFFSET, STAIRS_P_OFFSET, + DEFAULT_STAIRS_A_OFFSET, STAIRS_A_OFFSET, + DEFAULT_STAIRS_Y_SHIFT, STAIRS_Y_SHIFT, + DEFAULT_STAIRS_X_SHIFT, STAIRS_X_SHIFT, + DEFAULT_STAIRS_Z_OVERSHOOT, STAIRS_Z_OVERSHOOT, + DEFAULT_STAIRS_Z_HEIGHT, STAIRS_Z_HEIGHT, + DEFAULT_STAIRS_HIP_PITCH_OFF&0xFF, STAIRS_HIP_PITCH_OFF, + DEFAULT_STAIRS_HIP_PITCH_OFF>>8, STAIRS_HIP_PITCH_OFF+1, + DEFAULT_STAIRS_R_SHIFT, STAIRS_R_SHIFT, + DEFAULT_STAIRS_P_SHIFT, STAIRS_P_SHIFT, + DEFAULT_STAIRS_A_SHIFT, STAIRS_A_SHIFT, + DEFAULT_STAIRS_Y_SPREAD, STAIRS_Y_SPREAD, + DEFAULT_STAIRS_X_SHIFT_BODY, STAIRS_X_SHIFT_BODY}; /* Private function prototypes -----------------------------------------------*/ /* Private functions ---------------------------------------------------------*/ @@ -736,7 +773,7 @@ static uint16_t EE_PageTransfer(uint16_t VirtAddress, uint16_t Data) HAL_StatusTypeDef flashstatus = HAL_OK; uint32_t newpageaddress = EEPROM_START_ADDRESS; uint32_t oldpageid = 0; - uint16_t validpage = PAGE0, varidx = 0; + uint16_t validpage = PAGE0, varidx = 0, address=0; uint16_t eepromstatus = 0, readstatus = 0; uint32_t page_error = 0; FLASH_EraseInitTypeDef s_eraseinit; @@ -784,15 +821,16 @@ static uint16_t EE_PageTransfer(uint16_t VirtAddress, uint16_t Data) /* Transfer process: transfer variables from old to the new active page */ for (varidx = 0; varidx < NB_OF_VAR; varidx++) { - if (eeprom_data[varidx] != VirtAddress) /* Check each variable except the one passed as parameter */ + address=((__IO uint16_t*)oldpageid)[1+varidx*2]; + if (address != VirtAddress) /* Check each variable except the one passed as parameter */ { /* Read the other last variable updates */ - readstatus = EE_ReadVariable(eeprom_data[varidx], &DataVar); + readstatus = EE_ReadVariable(address, &DataVar); /* In case variable corresponding to the virtual address was found */ if (readstatus != 0x1) { /* Transfer the variable to the new active page */ - eepromstatus = EE_VerifyPageFullWriteVariable(eeprom_data[varidx], DataVar); + eepromstatus = EE_VerifyPageFullWriteVariable(address, DataVar); /* If program operation was failed, a Flash error code is returned */ if (eepromstatus != HAL_OK) { diff --git a/src/grippers.c b/src/grippers.c index c5fae087946fe969081ef44b37459cbbd41ee25c..5544346b9a44459ee306563a05523dfe20bb66d9 100644 --- a/src/grippers.c +++ b/src/grippers.c @@ -2,42 +2,48 @@ #include "dyn_servos.h" #include "grippers.h" #include "ram.h" +#include "joint_motion.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; +uint8_t gripper_left_target; +uint8_t gripper_right_target; // public functions void grippers_init(uint16_t period_us) { uint16_t force; + uint32_t servo_mask=0x00000000; /* 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; + gripper_left_target=0x00;//close; + gripper_right_target=0x00;//close; 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) + servo_mask=0x00000000; + if(ram_data[DARWIN_GRIPPER_LEFT_TOP_ID]!=0xFF && ram_data[DARWIN_GRIPPER_LEFT_BOT_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); + dyn_master_write_word(&darwin_dyn_master_v2,ram_data[DARWIN_GRIPPER_LEFT_TOP_ID],XL_TORQUE_LIMIT_L,force); + dyn_master_write_word(&darwin_dyn_master_v2,ram_data[DARWIN_GRIPPER_LEFT_BOT_ID],XL_TORQUE_LIMIT_L,force); + servo_mask|=1<<ram_data[DARWIN_GRIPPER_LEFT_TOP_ID]; + servo_mask|=1<<ram_data[DARWIN_GRIPPER_LEFT_BOT_ID]; + joint_motion_set_group_servos(1,servo_mask); } - if(ram_data[DARWIN_GRIPPER_RIGHT_ID]!=0xFF) + servo_mask=0x00000000; + if(ram_data[DARWIN_GRIPPER_RIGHT_TOP_ID]!=0xFF && ram_data[DARWIN_GRIPPER_RIGHT_BOT_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); + dyn_master_write_word(&darwin_dyn_master_v2,ram_data[DARWIN_GRIPPER_RIGHT_TOP_ID],XL_TORQUE_LIMIT_L,force); + dyn_master_write_word(&darwin_dyn_master_v2,ram_data[DARWIN_GRIPPER_RIGHT_BOT_ID],XL_TORQUE_LIMIT_L,force); + servo_mask|=1<<ram_data[DARWIN_GRIPPER_RIGHT_TOP_ID]; + servo_mask|=1<<ram_data[DARWIN_GRIPPER_RIGHT_BOT_ID]; + joint_motion_set_group_servos(2,servo_mask); } + grippers_close(GRIPPER_LEFT); + grippers_close(GRIPPER_RIGHT); } inline void grippers_set_period(uint16_t period_us) @@ -54,27 +60,101 @@ inline uint16_t grippers_get_period(void) void grippers_open(grippers_t gripper) { if(gripper==GRIPPER_LEFT) - grippers_left_open=0x01; + { + ram_data[DARWIN_JOINT_SERVO0_ANGLE_L+ram_data[DARWIN_GRIPPER_LEFT_TOP_ID]*2]=ram_data[DARWIN_GRIPPER_RIGHT_MAX_ANGLE_L]; + ram_data[DARWIN_JOINT_SERVO0_ANGLE_L+ram_data[DARWIN_GRIPPER_LEFT_TOP_ID]*2+1]=ram_data[DARWIN_GRIPPER_RIGHT_MAX_ANGLE_H]; + ram_data[DARWIN_JOINT_SERVO0_SPEED+ram_data[DARWIN_GRIPPER_LEFT_TOP_ID]]=60; + ram_data[DARWIN_JOINT_SERVO0_ANGLE_L+ram_data[DARWIN_GRIPPER_LEFT_BOT_ID]*2]=ram_data[DARWIN_GRIPPER_RIGHT_MAX_ANGLE_L]; + ram_data[DARWIN_JOINT_SERVO0_ANGLE_L+ram_data[DARWIN_GRIPPER_LEFT_BOT_ID]*2+1]=ram_data[DARWIN_GRIPPER_RIGHT_MAX_ANGLE_H]; + ram_data[DARWIN_JOINT_SERVO0_SPEED+ram_data[DARWIN_GRIPPER_LEFT_BOT_ID]]=60; + joint_motion_start(1); + } else if(gripper==GRIPPER_RIGHT) - grippers_right_open=0x01; + { + ram_data[DARWIN_JOINT_SERVO0_ANGLE_L+ram_data[DARWIN_GRIPPER_RIGHT_TOP_ID]*2]=ram_data[DARWIN_GRIPPER_RIGHT_MAX_ANGLE_L]; + ram_data[DARWIN_JOINT_SERVO0_ANGLE_L+ram_data[DARWIN_GRIPPER_RIGHT_TOP_ID]*2+1]=ram_data[DARWIN_GRIPPER_RIGHT_MAX_ANGLE_H]; + ram_data[DARWIN_JOINT_SERVO0_SPEED+ram_data[DARWIN_GRIPPER_RIGHT_TOP_ID]]=60; + ram_data[DARWIN_JOINT_SERVO0_ANGLE_L+ram_data[DARWIN_GRIPPER_RIGHT_BOT_ID]*2]=ram_data[DARWIN_GRIPPER_RIGHT_MAX_ANGLE_L]; + ram_data[DARWIN_JOINT_SERVO0_ANGLE_L+ram_data[DARWIN_GRIPPER_RIGHT_BOT_ID]*2+1]=ram_data[DARWIN_GRIPPER_RIGHT_MAX_ANGLE_H]; + ram_data[DARWIN_JOINT_SERVO0_SPEED+ram_data[DARWIN_GRIPPER_RIGHT_BOT_ID]]=60; + joint_motion_start(2); + } } void grippers_close(grippers_t gripper) { if(gripper==GRIPPER_LEFT) - grippers_left_close=0x01; + { + ram_data[DARWIN_JOINT_SERVO0_ANGLE_L+ram_data[DARWIN_GRIPPER_LEFT_TOP_ID]*2]=ram_data[DARWIN_GRIPPER_RIGHT_MIN_ANGLE_L]; + ram_data[DARWIN_JOINT_SERVO0_ANGLE_L+ram_data[DARWIN_GRIPPER_LEFT_TOP_ID]*2+1]=ram_data[DARWIN_GRIPPER_RIGHT_MIN_ANGLE_H]; + ram_data[DARWIN_JOINT_SERVO0_SPEED+ram_data[DARWIN_GRIPPER_LEFT_TOP_ID]]=60; + ram_data[DARWIN_JOINT_SERVO0_ANGLE_L+ram_data[DARWIN_GRIPPER_LEFT_BOT_ID]*2]=ram_data[DARWIN_GRIPPER_RIGHT_MIN_ANGLE_L]; + ram_data[DARWIN_JOINT_SERVO0_ANGLE_L+ram_data[DARWIN_GRIPPER_LEFT_BOT_ID]*2+1]=ram_data[DARWIN_GRIPPER_RIGHT_MIN_ANGLE_H]; + ram_data[DARWIN_JOINT_SERVO0_SPEED+ram_data[DARWIN_GRIPPER_LEFT_BOT_ID]]=60; + joint_motion_start(1); + } else if(gripper==GRIPPER_RIGHT) - grippers_right_close=0x01; + { + ram_data[DARWIN_JOINT_SERVO0_ANGLE_L+ram_data[DARWIN_GRIPPER_RIGHT_TOP_ID]*2]=ram_data[DARWIN_GRIPPER_RIGHT_MIN_ANGLE_L]; + ram_data[DARWIN_JOINT_SERVO0_ANGLE_L+ram_data[DARWIN_GRIPPER_RIGHT_TOP_ID]*2+1]=ram_data[DARWIN_GRIPPER_RIGHT_MIN_ANGLE_H]; + ram_data[DARWIN_JOINT_SERVO0_SPEED+ram_data[DARWIN_GRIPPER_RIGHT_TOP_ID]]=60; + ram_data[DARWIN_JOINT_SERVO0_ANGLE_L+ram_data[DARWIN_GRIPPER_RIGHT_BOT_ID]*2]=ram_data[DARWIN_GRIPPER_RIGHT_MIN_ANGLE_L]; + ram_data[DARWIN_JOINT_SERVO0_ANGLE_L+ram_data[DARWIN_GRIPPER_RIGHT_BOT_ID]*2+1]=ram_data[DARWIN_GRIPPER_RIGHT_MIN_ANGLE_H]; + ram_data[DARWIN_JOINT_SERVO0_SPEED+ram_data[DARWIN_GRIPPER_RIGHT_BOT_ID]]=60; + joint_motion_start(2); + } +} + +void grippers_stop(grippers_t gripper) +{ + if(gripper==GRIPPER_LEFT) + joint_motion_stop(1); + else + joint_motion_stop(2); } 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; + { + if(ram_data[DARWIN_GRIPPER_CNTRL]&GRIPPER_OPENED_LEFT) + return 0x01; + else + return 0x00; + } else - return 0x00; + { + if(ram_data[DARWIN_GRIPPER_CNTRL]&GRIPPER_OPENED_RIGHT) + return 0x01; + else + return 0x00; + } +} + +uint8_t gripper_is_close(grippers_t gripper) +{ + if(gripper==GRIPPER_LEFT) + { + if(ram_data[DARWIN_GRIPPER_CNTRL]&GRIPPER_OPENED_LEFT) + return 0x00; + else + return 0x01; + } + else + { + if(ram_data[DARWIN_GRIPPER_CNTRL]&GRIPPER_OPENED_RIGHT) + return 0x00; + else + return 0x01; + } +} + +uint8_t gripper_is_moving(grippers_t gripper) +{ + if(gripper==GRIPPER_LEFT) + return are_joints_moving(1); + else + return are_joints_moving(2); } // operation functions @@ -107,45 +187,32 @@ void grippers_process_write_cmd(unsigned short int address,unsigned short int le } } -// motion manager interface functions void grippers_process(void) { - uint16_t angle; - - if(ram_data[DARWIN_GRIPPER_LEFT_ID]!=0xFF) + if(!are_joints_moving(1)) + { + ram_data[DARWIN_GRIPPER_CNTRL]&=~GRIPPER_MOVING_LEFT; + if(gripper_left_target==0x01) + ram_data[DARWIN_GRIPPER_CNTRL]|=GRIPPER_OPENED_LEFT; + else + ram_data[DARWIN_GRIPPER_CNTRL]&=~GRIPPER_OPENED_LEFT; + } + else { - 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; - } - } + ram_data[DARWIN_GRIPPER_CNTRL]&=~GRIPPER_OPENED_LEFT; + ram_data[DARWIN_GRIPPER_CNTRL]|=GRIPPER_MOVING_LEFT; } - if(ram_data[DARWIN_GRIPPER_RIGHT_ID]!=0xFF) + if(!are_joints_moving(2)) + { + ram_data[DARWIN_GRIPPER_CNTRL]&=~GRIPPER_MOVING_RIGHT; + if(gripper_right_target==0x01) + ram_data[DARWIN_GRIPPER_CNTRL]|=GRIPPER_OPENED_RIGHT; + else + ram_data[DARWIN_GRIPPER_CNTRL]&=~GRIPPER_OPENED_RIGHT; + } + else { - 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; - } - } + ram_data[DARWIN_GRIPPER_CNTRL]&=~GRIPPER_OPENED_RIGHT; + ram_data[DARWIN_GRIPPER_CNTRL]|=GRIPPER_MOVING_RIGHT; } } diff --git a/src/imu.c b/src/imu.c index 3d3f0478946591baac10d9cfa0017ce762f82be9..bbaed728d98168aec6e571a9473b1edc91b65dbc 100755 --- a/src/imu.c +++ b/src/imu.c @@ -31,11 +31,11 @@ // accelerometer registers #define ACCEL_ID 0x32 #define ACCEL_WHO_AM_I 0x0F -#define ACCEL_CNTRL_REG1 0x20 -#define ACCEL_CNTRL_REG2 0x21 -#define ACCEL_CNTRL_REG3 0x22 -#define ACCEL_CNTRL_REG4 0x23 -#define ACCEL_CNTRL_REG5 0x24 +#define ACCEL_CNTRL_REG1 0x20 +#define ACCEL_CNTRL_REG2 0x21 +#define ACCEL_CNTRL_REG3 0x22 +#define ACCEL_CNTRL_REG4 0x23 +#define ACCEL_CNTRL_REG5 0x24 #define ACCEL_HP_FILTER_RESET 0x25 #define ACCEL_REFERENCE 0x26 #define ACCEL_STATUS_REG 0x27 @@ -58,11 +58,11 @@ // gyroscope registers #define GYRO_ID 0xD3 #define GYRO_WHO_AM_I 0x0F -#define GYRO_CNTRL_REG1 0x20 -#define GYRO_CNTRL_REG2 0x21 -#define GYRO_CNTRL_REG3 0x22 -#define GYRO_CNTRL_REG4 0x23 -#define GYRO_CNTRL_REG5 0x24 +#define GYRO_CNTRL_REG1 0x20 +#define GYRO_CNTRL_REG2 0x21 +#define GYRO_CNTRL_REG3 0x22 +#define GYRO_CNTRL_REG4 0x23 +#define GYRO_CNTRL_REG5 0x24 #define GYRO_REFERENCE 0x25 #define GYRO_OUT_TEMP 0x26 #define GYRO_STATUS_REG 0x27 @@ -72,7 +72,7 @@ #define GYRO_OUT_Y_H 0x2B #define GYRO_OUT_Z_L 0x2C #define GYRO_OUT_Z_H 0x2D -#define GYRO_FIFO_CNTRL_REG 0x2E +#define GYRO_FIFO_CNTRL_REG 0x2E #define GYRO_FIFO_SRC_REG 0x2F #define GYRO_INT1_CFG 0x30 #define GYRO_INT1_SRC 0x31 @@ -110,6 +110,7 @@ uint16_t gyro_calibration_num_samples; const uint8_t accel_conf_reg=ACCEL_CNTRL_REG1; const uint8_t accel_conf_len=5; uint8_t accel_conf_data[5]; +int32_t accel_data[3]; const uint8_t accel_data_reg=ACCEL_OUT_X_L; const uint8_t accel_data_len=6; @@ -254,13 +255,12 @@ void imu_accel_get_data(void) void imu_accel_convert_data(uint8_t *data_in,uint8_t *data_out) { uint8_t i; - int16_t value; for(i=0;i<3;i++) { - value=(data_in[i*2]+(data_in[i*2+1]<<8)); - data_out[i*2]=value%256; - data_out[i*2+1]=value/256; + accel_data[i]=(int16_t)(data_in[i*2]+(data_in[i*2+1]<<8)); + data_out[i*2]=accel_data[i]%256; + data_out[i*2+1]=accel_data[i]/256; } } @@ -603,6 +603,13 @@ void imu_get_gyro_data(int32_t *x, int32_t *y, int32_t *z) *z=gyro_data[2]; } +void imu_get_accel_data(int32_t *x, int32_t *y, int32_t *z) +{ + *x=accel_data[0]; + *y=accel_data[1]; + *z=accel_data[2]; +} + // operation functions uint8_t imu_in_range(unsigned short int address,unsigned short int length) { diff --git a/src/joint_motion.c b/src/joint_motion.c index 8e8147aa5f2568e9fbb920ffdccddc71433295b6..395bfc0989f7d682875c94cf5972e15b4bcf4956 100644 --- a/src/joint_motion.c +++ b/src/joint_motion.c @@ -6,6 +6,7 @@ int64_t joint_target_angles[MANAGER_MAX_NUM_SERVOS];//48|16 int64_t joint_target_speeds[MANAGER_MAX_NUM_SERVOS];//48|16 int64_t joint_target_accels[MANAGER_MAX_NUM_SERVOS];//48|16 +int64_t joint_target_stop_angles[MANAGER_MAX_NUM_SERVOS];//48|16 int64_t joint_current_angles[MANAGER_MAX_NUM_SERVOS];//48|16 int64_t joint_current_speeds[MANAGER_MAX_NUM_SERVOS];//48|16 @@ -120,6 +121,8 @@ void joint_motion_start(uint8_t group_id) ram_data[DARWIN_JOINT_SERVO0_ACCEL+i]=joint_target_accels[i]>>16; } } + // stop angles + joint_target_stop_angles[i]=joint_target_speeds[i]*joint_target_speeds[i]/(2*joint_target_accels[i]); // the current angles, speeds and accelerations are in RAM if(joint_target_angles[i]>=joint_current_angles[i]) joint_dir[i]=1; @@ -129,6 +132,7 @@ void joint_motion_start(uint8_t group_id) } } joint_moving[group_id]=0x01; + joint_stop[group_id]=0x00; ram_data[DARWIN_JOINT_GRP0_CNTRL+group_id*5]|=JOINT_STATUS; } @@ -236,7 +240,7 @@ void joint_motion_process(void) } else { - if(abs(joint_target_angles[i]-joint_current_angles[i])>(joint_target_speeds[i]*joint_target_speeds[i]/(2*joint_target_accels[i])))// constant speed phase + if(abs(joint_target_angles[i]-joint_current_angles[i])>joint_target_stop_angles[i])// constant speed phase { joint_current_angles[i]+=((joint_current_speeds[i]*joint_motion_period)>>16); if(joint_dir[i]==1 && joint_current_angles[i]>joint_target_angles[i]) @@ -256,6 +260,8 @@ void joint_motion_process(void) } } } + else + joint_current_speeds[i]=0; manager_current_angles[i]=joint_current_angles[i]; manager_current_slopes[i]=5; } diff --git a/src/motion_manager.c b/src/motion_manager.c index 4672002a904cf6b4af702a78645883c7176ac278..805fc182ad691cd24b4bc3baa1e7a6b315335d22 100755 --- a/src/motion_manager.c +++ b/src/motion_manager.c @@ -11,6 +11,8 @@ #include "imu.h" #include "smart_charger.h" #include "dyn_battery.h" +#include "stairs.h" +#include <stdlib.h> #define MANAGER_TIMER TIM5 #define ENABLE_MANAGER_TIMER_CLK __HAL_RCC_TIM5_CLK_ENABLE() @@ -131,6 +133,7 @@ void manager_balance(void) { uint32_t knee_gain,ankle_roll_gain,ankle_pitch_gain,hip_roll_gain; int32_t gyro_x,gyro_y,gyro_z; + int32_t accel_x,accel_y,accel_z; if(manager_balance_enabled==0x01)// balance is enabled { @@ -146,10 +149,30 @@ void manager_balance(void) manager_balance_offset[R_ANKLE_PITCH]=((((int64_t)gyro_y*(int64_t)ankle_pitch_gain)/12000)>>9); manager_balance_offset[L_KNEE]=((((int64_t)gyro_y*(int64_t)knee_gain)/12000)>>9); manager_balance_offset[L_ANKLE_PITCH]=-((((int64_t)gyro_y*(int64_t)ankle_pitch_gain)/12000)>>9); - manager_balance_offset[R_HIP_ROLL]=-((((int64_t)gyro_x*(int64_t)hip_roll_gain)/12000)>>9); - manager_balance_offset[L_HIP_ROLL]=-((((int64_t)gyro_x*(int64_t)hip_roll_gain)/12000)>>9); - manager_balance_offset[R_ANKLE_ROLL]=((((int64_t)gyro_x*(int64_t)ankle_roll_gain)/12000)>>9); - manager_balance_offset[L_ANKLE_ROLL]=((((int64_t)gyro_x*(int64_t)ankle_roll_gain)/12000)>>9); + manager_balance_offset[R_HIP_ROLL]=((((int64_t)gyro_x*(int64_t)hip_roll_gain)/12000)>>9); + manager_balance_offset[L_HIP_ROLL]=((((int64_t)gyro_x*(int64_t)hip_roll_gain)/12000)>>9); + manager_balance_offset[R_ANKLE_ROLL]=-((((int64_t)gyro_x*(int64_t)ankle_roll_gain)/12000)>>9); + manager_balance_offset[L_ANKLE_ROLL]=-((((int64_t)gyro_x*(int64_t)ankle_roll_gain)/12000)>>9); + } + // fall detection (using accelerometer) + imu_get_accel_data(&accel_x,&accel_y,&accel_z); + if(abs(accel_y)>abs(accel_z)) + { + if(accel_y>0) + { + ram_data[DARWIN_MM_CNTRL]&=~(MANAGER_FWD_FALL); + ram_data[DARWIN_MM_CNTRL]|=MANAGER_BWD_FALL; + } + else + { + ram_data[DARWIN_MM_CNTRL]&=~(MANAGER_BWD_FALL); + ram_data[DARWIN_MM_CNTRL]|=MANAGER_FWD_FALL; + } + } + else + { + ram_data[DARWIN_MM_CNTRL]&=~(MANAGER_FWD_FALL); + ram_data[DARWIN_MM_CNTRL]&=~(MANAGER_BWD_FALL); } } @@ -173,8 +196,10 @@ void MANAGER_TIMER_IRQHandler(void) head_tracking_process(); // call the walking process walking_process(); - // call the grippers process + // call the gripper process grippers_process(); + // call the stairs process + stairs_process(); // balance the robot manager_balance(); // access to smart charger @@ -322,24 +347,25 @@ void manager_init(uint16_t period_us) } //Other devices detected - smart charger - for(i=current; i<num; i++){ + for(i=current; i<num; i++) + { dyn_master_read_word(&darwin_dyn_master,servo_ids[i],BATTERY_MODEL_NUMBER_L,&model); switch(model) { case DYN_BATTERY_MODEL: ram_data[DARWIN_SMART_CHARGER_CNTRL]=SMART_CHARGER_DET; //smart charger detected - ram_data[DARWIN_SMART_CHARGER_ID] = servo_ids[i]; //smart charger ID - smart_charger_set_version(&darwin_dyn_master); //set bus Dynamixel master version - // Read smart charger's memory map - //dyn_master_read_table(&darwin_dyn_master,ram_data[DARWIN_SMART_CHARGER_ID],BATTERY_CHARGER_STATUS,43,&ram_data[DARWIN_BATT_CHARGER_STATUS]); - //Read charger status - dyn_master_read_byte(&darwin_dyn_master,ram_data[DARWIN_SMART_CHARGER_ID],BATTERY_CHARGER_STATUS,&ram_data[DARWIN_SMART_CHARGER_STATUS]); - break; + ram_data[DARWIN_SMART_CHARGER_ID] = servo_ids[i]; //smart charger ID + smart_charger_set_master(&darwin_dyn_master); //set bus Dynamixel master version + // Set smart charger's memory map + dyn_master_read_table(&darwin_dyn_master,ram_data[DARWIN_SMART_CHARGER_ID],BATTERY_AVG_TIME_EMPTY_L,6,&ram_data[DARWIN_SMART_CHARGER_AVG_TIME_EMPTY_L]); + dyn_master_write_table(&darwin_dyn_master,ram_data[DARWIN_SMART_CHARGER_ID],BATTERY_INPUT_MAX_CURRENT_L,2,&ram_data[DARWIN_SMART_CHARGER_LIMIT_CURRENT_L]); + break; default: break; - } + } } darwin_dyn_master_disable_power(); + darwin_dyn_master_v2_enable_power(); // detect the servos connected on the v2 bus dyn_master_scan(&darwin_dyn_master_v2,&num,servo_ids); ram_data[DARWIN_MM_NUM_SERVOS]+=num; @@ -384,22 +410,24 @@ void manager_init(uint16_t period_us) } //Other devices detected - smart charger - for(i=current; i<num; i++){ + for(i=current; i<num; i++) + { dyn_master_read_word(&darwin_dyn_master_v2,servo_ids[i],BATTERY_MODEL_NUMBER_L,&model); switch(model) { + // gpio_set_led(LED_RX); case DYN_BATTERY_MODEL: ram_data[DARWIN_SMART_CHARGER_CNTRL]=SMART_CHARGER_DET; //smart charger detected - ram_data[DARWIN_SMART_CHARGER_ID] = servo_ids[i]; //smart charger ID - smart_charger_set_version(&darwin_dyn_master_v2); //Set bus Dynamixel master version - // Read smart charger's memory map - //dyn_master_read_table(&darwin_dyn_master_v2,ram_data[DARWIN_SMART_CHARGER_ID],BATTERY_CHARGER_STATUS,43,&ram_data[DARWIN_BATT_CHARGER_STATUS]); - //Read charger status - dyn_master_read_byte(&darwin_dyn_master_v2,ram_data[DARWIN_SMART_CHARGER_ID],BATTERY_CHARGER_STATUS,&ram_data[DARWIN_SMART_CHARGER_STATUS]); + ram_data[DARWIN_SMART_CHARGER_ID] = servo_ids[i]; //smart charger ID + smart_charger_set_master(&darwin_dyn_master_v2); //Set bus Dynamixel master version + // Set smart charger's memory map + dyn_master_read_table(&darwin_dyn_master_v2,ram_data[DARWIN_SMART_CHARGER_ID],BATTERY_AVG_TIME_EMPTY_L,6,&ram_data[DARWIN_SMART_CHARGER_AVG_TIME_EMPTY_L]); + //dyn_master_write_table(&darwin_dyn_master_v2,ram_data[DARWIN_SMART_CHARGER_ID],BATTERY_INPUT_MAX_CURRENT_L,2,&ram_data[DARWIN_SMART_CHARGER_LIMIT_CURRENT_L]); break; default: break; - } + } } - + + darwin_dyn_master_v2_disable_power(); ram_data[DARWIN_MM_PRESENT_SERVOS1]=(present_servos&0x000000FF); ram_data[DARWIN_MM_PRESENT_SERVOS2]=((present_servos&0x0000FF00)>>8); @@ -445,6 +473,7 @@ void manager_init(uint16_t period_us) head_tracking_init(period_us); grippers_init(period_us); smart_charger_init(period_us); + stairs_init(period_us); } uint16_t manager_get_period(void) @@ -507,6 +536,24 @@ void manager_disable_balance(void) ram_data[DARWIN_MM_CNTRL]&=(~MANAGER_EN_BAL); } +uint8_t manager_has_fallen(void) +{ + if(ram_data[DARWIN_MM_CNTRL]&(MANAGER_FWD_FALL|MANAGER_BWD_FALL)) + return 0x01; + else + return 0x00; +} + +TFall manager_get_fallen_position(void) +{ + if(ram_data[DARWIN_MM_CNTRL]&MANAGER_FWD_FALL) + return MM_FWD_FALL; + else if(ram_data[DARWIN_MM_CNTRL]&MANAGER_BWD_FALL) + return MM_BWD_FALL; + else + return MM_STANDING; +} + inline uint8_t manager_get_num_servos(void) { return manager_num_servos; @@ -650,6 +697,10 @@ void manager_process_write_cmd(unsigned short int address,unsigned short int len darwin_dyn_master_enable_power(); else darwin_dyn_master_disable_power(); + if(data[DARWIN_MM_CNTRL-address]&MANAGER_EN_PWR_V2) + darwin_dyn_master_v2_enable_power(); + else + darwin_dyn_master_v2_disable_power(); } // balance gains for(i=MM_BAL_KNEE_GAIN_OFFSET;i<=MM_BAL_HIP_ROLL_GAIN_OFFSET+1;i++) diff --git a/src/ram.c b/src/ram.c index f2c505dfb8b5e82c15e1311d9a27dad51bd60416..be8aa9dd975afec953d101fafbc9576ea391ecd4 100755 --- a/src/ram.c +++ b/src/ram.c @@ -10,147 +10,11 @@ void ram_init(void) for(i=0;i<RAM_SIZE;i++) ram_data[i]=0x00; // read contents from EEPROM to RAM - if(EE_ReadVariable(DEVICE_MODEL_OFFSET,&eeprom_data)==0) - ram_data[DEVICE_MODEL_OFFSET]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(DEVICE_MODEL_OFFSET+1,&eeprom_data)==0) - ram_data[DEVICE_MODEL_OFFSET+1]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(FIRMWARE_VERSION_OFFSET,&eeprom_data)==0) - ram_data[FIRMWARE_VERSION_OFFSET]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(DEVICE_ID_OFFSET,&eeprom_data)==0) - ram_data[DEVICE_ID_OFFSET]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(BAUDRATE_OFFSET,&eeprom_data)==0) - ram_data[BAUDRATE_OFFSET]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(RETURN_DELAY_OFFSET,&eeprom_data)==0) - ram_data[RETURN_DELAY_OFFSET]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(MM_PERIOD_OFFSET,&eeprom_data)==0) - ram_data[MM_PERIOD_OFFSET]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(MM_PERIOD_OFFSET+1,&eeprom_data)==0) - ram_data[MM_PERIOD_OFFSET+1]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(MM_BAL_KNEE_GAIN_OFFSET,&eeprom_data)==0) - ram_data[MM_BAL_KNEE_GAIN_OFFSET]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(MM_BAL_KNEE_GAIN_OFFSET+1,&eeprom_data)==0) - ram_data[MM_BAL_KNEE_GAIN_OFFSET+1]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(MM_BAL_ANKLE_ROLL_GAIN_OFFSET,&eeprom_data)==0) - ram_data[MM_BAL_ANKLE_ROLL_GAIN_OFFSET]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(MM_BAL_ANKLE_ROLL_GAIN_OFFSET+1,&eeprom_data)==0) - ram_data[MM_BAL_ANKLE_ROLL_GAIN_OFFSET+1]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(MM_BAL_ANKLE_PITCH_GAIN_OFFSET,&eeprom_data)==0) - ram_data[MM_BAL_ANKLE_PITCH_GAIN_OFFSET]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(MM_BAL_ANKLE_PITCH_GAIN_OFFSET+1,&eeprom_data)==0) - ram_data[MM_BAL_ANKLE_PITCH_GAIN_OFFSET+1]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(MM_BAL_HIP_ROLL_GAIN_OFFSET,&eeprom_data)==0) - ram_data[MM_BAL_HIP_ROLL_GAIN_OFFSET]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(MM_BAL_HIP_ROLL_GAIN_OFFSET+1,&eeprom_data)==0) - ram_data[MM_BAL_HIP_ROLL_GAIN_OFFSET+1]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(RETURN_LEVEL_OFFSET,&eeprom_data)==0) - ram_data[RETURN_LEVEL_OFFSET]=(uint8_t)(eeprom_data&0x00FF); - for(i=0;i<32;i++) + for(i=0;i<NB_OF_VAR;i++) { - if(EE_ReadVariable(MM_SERVO0_OFFSET+i,&eeprom_data)==0) - ram_data[DARWIN_MM_SERVO0_OFFSET+i]=(uint8_t)(eeprom_data&0x00FF); + if(EE_ReadVariable(i,&eeprom_data)==0) + ram_data[i]=(uint8_t)(eeprom_data&0x00FF); } - if(EE_ReadVariable(WALK_X_OFFSET,&eeprom_data)==0) - ram_data[WALK_X_OFFSET]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(WALK_Y_OFFSET,&eeprom_data)==0) - ram_data[WALK_Y_OFFSET]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(WALK_Z_OFFSET,&eeprom_data)==0) - ram_data[WALK_Z_OFFSET]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(WALK_ROLL_OFFSET,&eeprom_data)==0) - ram_data[WALK_ROLL_OFFSET]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(WALK_PITCH_OFFSET,&eeprom_data)==0) - ram_data[WALK_PITCH_OFFSET]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(WALK_YAW_OFFSET,&eeprom_data)==0) - ram_data[WALK_YAW_OFFSET]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(WALK_HIP_PITCH_OFF,&eeprom_data)==0) - ram_data[WALK_HIP_PITCH_OFF]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(WALK_HIP_PITCH_OFF+1,&eeprom_data)==0) - ram_data[WALK_HIP_PITCH_OFF+1]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(WALK_PERIOD_TIME,&eeprom_data)==0) - ram_data[WALK_PERIOD_TIME]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(WALK_PERIOD_TIME+1,&eeprom_data)==0) - ram_data[WALK_PERIOD_TIME+1]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(WALK_DSP_RATIO,&eeprom_data)==0) - ram_data[WALK_DSP_RATIO]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(WALK_STEP_FW_BW_RATIO,&eeprom_data)==0) - ram_data[WALK_STEP_FW_BW_RATIO]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(WALK_FOOT_HEIGHT,&eeprom_data)==0) - ram_data[WALK_FOOT_HEIGHT]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(WALK_SWING_RIGHT_LEFT,&eeprom_data)==0) - ram_data[WALK_SWING_RIGHT_LEFT]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(WALK_SWING_TOP_DOWN,&eeprom_data)==0) - ram_data[WALK_SWING_TOP_DOWN]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(WALK_PELVIS_OFFSET,&eeprom_data)==0) - ram_data[WALK_PELVIS_OFFSET]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(WALK_ARM_SWING_GAIN,&eeprom_data)==0) - ram_data[WALK_ARM_SWING_GAIN]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(WALK_MAX_VEL,&eeprom_data)==0) - ram_data[WALK_MAX_VEL]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(WALK_MAX_ROT_VEL,&eeprom_data)==0) - ram_data[WALK_MAX_ROT_VEL]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(HEAD_PAN_P,&eeprom_data)==0) - ram_data[HEAD_PAN_P]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(HEAD_PAN_P+1,&eeprom_data)==0) - ram_data[HEAD_PAN_P+1]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(HEAD_PAN_I,&eeprom_data)==0) - ram_data[HEAD_PAN_I]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(HEAD_PAN_I+1,&eeprom_data)==0) - ram_data[HEAD_PAN_I+1]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(HEAD_PAN_D,&eeprom_data)==0) - ram_data[HEAD_PAN_D]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(HEAD_PAN_D+1,&eeprom_data)==0) - ram_data[HEAD_PAN_D+1]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(HEAD_PAN_I_CLAMP,&eeprom_data)==0) - ram_data[HEAD_PAN_I_CLAMP]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(HEAD_PAN_I_CLAMP+1,&eeprom_data)==0) - ram_data[HEAD_PAN_I_CLAMP+1]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(HEAD_TILT_P,&eeprom_data)==0) - ram_data[HEAD_TILT_P]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(HEAD_TILT_P+1,&eeprom_data)==0) - ram_data[HEAD_TILT_P+1]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(HEAD_TILT_I,&eeprom_data)==0) - ram_data[HEAD_TILT_I]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(HEAD_TILT_I+1,&eeprom_data)==0) - ram_data[HEAD_TILT_I+1]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(HEAD_TILT_D,&eeprom_data)==0) - ram_data[HEAD_TILT_D]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(HEAD_TILT_D+1,&eeprom_data)==0) - ram_data[HEAD_TILT_D+1]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(HEAD_TILT_I_CLAMP,&eeprom_data)==0) - 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); - if(EE_ReadVariable(SMART_CHARGER_PERIOD,&eeprom_data)==0) - ram_data[SMART_CHARGER_PERIOD]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(SMART_CHARGER_PERIOD+1,&eeprom_data)==0) - ram_data[SMART_CHARGER_PERIOD+1]=(uint8_t)(eeprom_data&0x00FF); } inline void ram_read_byte(uint16_t address,uint8_t *data) diff --git a/src/smart_charger.c b/src/smart_charger.c index 70de2e7d9e8861e467e41ffc048098053149e7f2..03a9ed8f31a5736ee6fee473b1a37b8f5388101b 100644 --- a/src/smart_charger.c +++ b/src/smart_charger.c @@ -8,19 +8,11 @@ uint8_t smart_charger_id; //smart charger dynamixel ID uint8_t smart_charger_enabled; //smart charger module enable signal uint8_t smart_charger_detected; //smart charger detect signal -uint16_t smart_charger_period; //smart charger period value -uint16_t counter; //for read access operations +uint16_t smart_charger_period; //smart charger period value in ms uint16_t smart_charger_count; //counter = sc period / mm period --> Default: (1500ms*1000)/7800us uint8_t smart_charger_write; //write smart charger signal uint8_t init_regs[6]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}; -#define fifosize 32 -unsigned char *infifo; //Pointer to fifo position where to store next input data -unsigned char *outfifo; //Pointer to fifo position where is stored the data to be written -unsigned char numdata; //Number of elements stored in the fifo -unsigned char write_fifo[fifosize]; //Vector with data to write (data_write) -unsigned char current[2]; - //--------------------------------------- TDynamixelMaster *dyn_battery_master; @@ -29,32 +21,28 @@ TDynamixelMaster *dyn_battery_master; void smart_charger_init(uint16_t period_us) { smart_charger_id = ram_data[DARWIN_SMART_CHARGER_ID]; - smart_charger_enabled = 0x00; + smart_charger_enabled = ram_data[DARWIN_SMART_CHARGER_CNTRL]&SMART_CHARGER_EN; smart_charger_detected = ram_data[DARWIN_SMART_CHARGER_CNTRL]&SMART_CHARGER_DET; - counter = 0; - smart_charger_period = ram_data[DARWIN_SMART_CHARGER_PERIOD_L]; - smart_charger_period = (ram_data[DARWIN_SMART_CHARGER_PERIOD_H])<<8; + smart_charger_period = ram_data[DARWIN_SMART_CHARGER_PERIOD_L] + (ram_data[DARWIN_SMART_CHARGER_PERIOD_H]<<8); smart_charger_count = (smart_charger_period*1000)/period_us; smart_charger_write = 0x00; - infifo=outfifo=&write_fifo[0]; - numdata=0; //fifo empty ram_write_table(DARWIN_SMART_CHARGER_AVG_TIME_EMPTY_L, 6, init_regs); } -inline void smart_charger_set_version(TDynamixelMaster *master) +inline void smart_charger_set_master(TDynamixelMaster *master) { dyn_battery_master=master; } -inline TDynamixelMaster* smart_charger_get_version(void) +inline TDynamixelMaster* smart_charger_get_master(void) { return dyn_battery_master; } -void smart_charger_set_period(uint16_t period) //en ms +void smart_charger_set_period(uint16_t period) { - uint16_t mm_period=manager_get_period_us(); //default: 7800us - smart_charger_count = (period*1000)/mm_period; //(ms*1000)/us + uint16_t mm_period=manager_get_period_us(); + smart_charger_count = (period*1000)/mm_period; smart_charger_period = period; ram_data[DARWIN_SMART_CHARGER_PERIOD_L]=period&0x00FF; ram_data[DARWIN_SMART_CHARGER_PERIOD_H]=(period&0xFF00)>>8; @@ -94,8 +82,8 @@ void smart_charger_process_read_cmd(unsigned short int address,unsigned short in void smart_charger_process_write_cmd(unsigned short int address,unsigned short int length,unsigned char *data) { - //uint8_t i; - uint16_t period,i; + uint16_t period; + //Enable/Disable smart charger if(ram_in_range(DARWIN_SMART_CHARGER_CNTRL,address,length)) @@ -115,28 +103,8 @@ void smart_charger_process_write_cmd(unsigned short int address,unsigned short i //Write Battery limit current if(ram_in_range(DARWIN_SMART_CHARGER_LIMIT_CURRENT_L,address,length) && ram_in_range(DARWIN_SMART_CHARGER_LIMIT_CURRENT_H,address,length)) { - current[0]=data[DARWIN_SMART_CHARGER_LIMIT_CURRENT_L-address]; - current[1]=data[DARWIN_SMART_CHARGER_LIMIT_CURRENT_H-address]; - - - /* if(infifo==&write_fifo[fifosize]); - infifo=&write_fifo[0]; //go to first position of fifo - if(numdata<fifosize) //free space in fifo - { - for(i=DARWIN_SMART_CHARGER_LIMIT_CURRENT_L;i<=DARWIN_SMART_CHARGER_LIMIT_CURRENT_H;i++) - { - *infifo=data[i-address]; - infifo++; - numdata++; - } - */ - /* *infifo=data[DARWIN_SMART_CHARGER_LIMIT_CURRENT_L-address]; //copy first byte to fifo - numdata++; - infifo++; - *infifo=data[DARWIN_SMART_CHARGER_LIMIT_CURRENT_H-address]; //copy second byte to fifo - numdata++; - infifo++; */ - // } + ram_data[DARWIN_SMART_CHARGER_LIMIT_CURRENT_L]=data[DARWIN_SMART_CHARGER_LIMIT_CURRENT_L-address]; + ram_data[DARWIN_SMART_CHARGER_LIMIT_CURRENT_H]=data[DARWIN_SMART_CHARGER_LIMIT_CURRENT_H-address]; smart_charger_write = 0x01; } } @@ -144,37 +112,28 @@ void smart_charger_process_write_cmd(unsigned short int address,unsigned short i // motion manager interface function void smart_charger_process(void) -{ - gpio_set_led(LED_TX);//amarillo - counter++; +{ + //gpio_set_led(LED_3); uint8_t error; + static uint16_t counter=0; + + counter++; + //Write smart_charger - Battery limit current (EEPROM) if(smart_charger_detected && smart_charger_enabled && smart_charger_write && counter!=smart_charger_count) { - error=dyn_master_write_table(dyn_battery_master,smart_charger_id,BATTERY_INPUT_MAX_CURRENT_L,2, current); - if(error==DYN_SUCCESS){ -/* dyn_master_write_table(dyn_battery_master,smart_charger_id,BATTERY_INPUT_MAX_CURRENT_L,2,outfifo); - if(outfifo==&write_fifo[fifosize-1]) - outfifo=&write_fifo[0]; //go to first position of fifo - else - outfifo=outfifo+2; - numdata=numdata-2; - if(numdata==0) //empty fifo - */ + error=dyn_master_write_table(dyn_battery_master,smart_charger_id,BATTERY_INPUT_MAX_CURRENT_L,2,&ram_data[DARWIN_SMART_CHARGER_LIMIT_CURRENT_L]); + if(error==DYN_SUCCESS) smart_charger_write = 0x00; - } } //Read smart charger - time to empty, time to full and battery_status if(smart_charger_detected && smart_charger_enabled && counter==smart_charger_count) { - error=dyn_master_read_table(dyn_battery_master,smart_charger_id,BATTERY_AVG_TIME_EMPTY_L,6,&ram_data[DARWIN_SMART_CHARGER_AVG_TIME_EMPTY_L]); if(error!=DYN_SUCCESS){ + // gpio_set_led(LED_TX); ram_write_table(DARWIN_SMART_CHARGER_AVG_TIME_EMPTY_L, 6, init_regs); - gpio_set_led(LED_RX); //naranja - }else{ - gpio_set_led(LED_3);//verde } counter = 0; } diff --git a/src/stairs.c b/src/stairs.c new file mode 100755 index 0000000000000000000000000000000000000000..68795d993ac479c7ea8754f35b6f40b2b1a4ccb0 --- /dev/null +++ b/src/stairs.c @@ -0,0 +1,580 @@ +#include "stairs.h" +#include "darwin_kinematics.h" +#include "darwin_math.h" +#include "ram.h" +#include <math.h> + +typedef enum {SHIFT_WEIGHT_LEFT=0x10,RISE_RIGHT_FOOT=0x20,ADVANCE_RIGHT_FOOT=0x30,CONTACT_RIGHT_FOOT=0x40,SHIFT_WEIGHT_RIGHT=0x50,RISE_LEFT_FOOT=0x60,ADVANCE_LEFT_FOOT=0x70,CONTACT_LEFT_FOOT=0x80,CENTER_WEIGHT=0x90} stairs_phase_t; + +// internal motion variables +float stairs_Z_stair_height; +float stairs_Z_overshoot; +float stairs_Y_shift_amplitude; +float stairs_X_shift_amplitude; +float stairs_R_shift_amplitude; +float stairs_P_shift_amplitude; +float stairs_A_shift_amplitude; +float stairs_Y_spread_amplitude; +float stairs_X_shift_body; + +// internal offset variables +float stairs_Hip_Pitch_Offset; +float stairs_X_Offset; +float stairs_Y_Offset; +float stairs_Z_Offset; +float stairs_R_Offset; +float stairs_P_Offset; +float stairs_A_Offset; + +// internal time variables +float stairs_Time; +float stairs_period; +float stairs_shift_weight_left_time; +float stairs_rise_right_foot_time; +float stairs_advance_right_foot_time; +float stairs_contact_right_foot_time; +float stairs_shift_weight_right_time; +float stairs_rise_left_foot_time; +float stairs_advance_left_foot_time; +float stairs_contact_left_foot_time; +float stairs_center_weight_time; + +// control variables +uint8_t stairs_Ctrl_Running; +uint8_t stairs_up; + +// private functions + +// public functions +void stairs_init(uint16_t period_us) +{ + // initialize the internal motion variables + + + // initialize internal control variables + stairs_Time=0; + stairs_period=((float)period_us)/1000.0; + stairs_Ctrl_Running=0x00; + stairs_up=0x00; +} + +inline void stairs_set_period(uint16_t period_us) +{ + stairs_period=((float)period_us)/1000.0; +} + +inline uint16_t stairs_get_period(void) +{ + return (uint16_t)(stairs_period*1000); +} + +void stairs_start(uint8_t up) +{ + // load all parameters + stairs_shift_weight_left_time=((float)ram_data[DARWIN_STAIRS_PHASE1_TIME_L]+(ram_data[DARWIN_STAIRS_PHASE1_TIME_H]<<8)); + stairs_rise_right_foot_time=((float)ram_data[DARWIN_STAIRS_PHASE2_TIME_L]+(ram_data[DARWIN_STAIRS_PHASE2_TIME_H]<<8)); + stairs_advance_right_foot_time=((float)ram_data[DARWIN_STAIRS_PHASE3_TIME_L]+(ram_data[DARWIN_STAIRS_PHASE3_TIME_H]<<8)); + stairs_contact_right_foot_time=((float)ram_data[DARWIN_STAIRS_PHASE4_TIME_L]+(ram_data[DARWIN_STAIRS_PHASE4_TIME_H]<<8)); + stairs_shift_weight_right_time=((float)ram_data[DARWIN_STAIRS_PHASE5_TIME_L]+(ram_data[DARWIN_STAIRS_PHASE5_TIME_H]<<8)); + stairs_rise_left_foot_time=((float)ram_data[DARWIN_STAIRS_PHASE6_TIME_L]+(ram_data[DARWIN_STAIRS_PHASE6_TIME_H]<<8)); + stairs_advance_left_foot_time=((float)ram_data[DARWIN_STAIRS_PHASE7_TIME_L]+(ram_data[DARWIN_STAIRS_PHASE7_TIME_H]<<8)); + stairs_contact_left_foot_time=((float)ram_data[DARWIN_STAIRS_PHASE8_TIME_L]+(ram_data[DARWIN_STAIRS_PHASE8_TIME_H]<<8)); + stairs_center_weight_time=((float)ram_data[DARWIN_STAIRS_PHASE9_TIME_L]+(ram_data[DARWIN_STAIRS_PHASE9_TIME_H]<<8)); + stairs_Z_stair_height=((float)((int8_t)ram_data[DARWIN_STAIRS_Z_HEIGHT])); + stairs_Z_overshoot=((float)((int8_t)ram_data[DARWIN_STAIRS_Z_OVERSHOOT])); + stairs_Y_shift_amplitude=((float)((int8_t)ram_data[DARWIN_STAIRS_Y_SHIFT])); + stairs_X_shift_amplitude=((float)((int8_t)ram_data[DARWIN_STAIRS_X_SHIFT])); + stairs_Hip_Pitch_Offset=((float)((int16_t)(ram_data[DARWIN_WALK_HIP_PITCH_OFF_L]+(ram_data[DARWIN_WALK_HIP_PITCH_OFF_H]<<8))))/1024.0; + stairs_R_shift_amplitude=((float)((int8_t)ram_data[DARWIN_STAIRS_R_SHIFT]))*PI/720.0;// (r_shift/4)*(pi/180) + stairs_P_shift_amplitude=((float)((int8_t)ram_data[DARWIN_STAIRS_P_SHIFT]))*PI/720.0;// (p_shift/4)*(pi/180) + stairs_A_shift_amplitude=((float)((int8_t)ram_data[DARWIN_STAIRS_A_SHIFT]))*PI/720.0;// (a_shift/4)*(pi/180) + stairs_Y_spread_amplitude=((float)((int8_t)ram_data[DARWIN_STAIRS_Y_SPREAD])); + stairs_X_shift_body=((float)((int8_t)ram_data[DARWIN_STAIRS_X_SHIFT_BODY])); + stairs_X_Offset=((float)((int8_t)ram_data[DARWIN_STAIRS_X_OFFSET])); + stairs_Y_Offset=((float)((int8_t)ram_data[DARWIN_STAIRS_Y_OFFSET])); + stairs_Z_Offset=((float)((int8_t)ram_data[DARWIN_STAIRS_Z_OFFSET])); + stairs_R_Offset=((float)((int8_t)ram_data[DARWIN_STAIRS_X_OFFSET]))*PI/1440.0; + stairs_P_Offset=((float)((int8_t)ram_data[DARWIN_STAIRS_Y_OFFSET]))*PI/1440.0; + stairs_A_Offset=((float)((int8_t)ram_data[DARWIN_STAIRS_Z_OFFSET]))*PI/1440.0; + // start operation + ram_data[DARWIN_STAIRS_CNTRL]|=STAIRS_STATUS; + stairs_Ctrl_Running=0x01; + stairs_up=up; +} + +void stairs_stop(void) +{ + stairs_Ctrl_Running=0x00; +} + +uint8_t is_climbing_stairs(void) +{ + if(ram_data[DARWIN_STAIRS_CNTRL]&STAIRS_STATUS) + return 0x01; + else + return 0x00; +} + +uint8_t stairs_get_phase(void) +{ + return (int8_t)ram_data[DARWIN_STAIRS_CNTRL]&STAIRS_PHASE; +} + +// motion manager interface functions +void stairs_process(void) +{ + float angle[14]={0},ep[12]={0}; + float delta; + + if(ram_data[DARWIN_STAIRS_CNTRL]&STAIRS_STATUS) + { + ram_data[DARWIN_STAIRS_CNTRL]&=(~STAIRS_PHASE); + if(stairs_up) + { + if(stairs_Time>=0 && stairs_Time<=stairs_shift_weight_left_time) + { + //1 + delta=stairs_Time/stairs_shift_weight_left_time; + ep[0]=stairs_X_Offset; + ep[1]=-stairs_Y_Offset/2.0+stairs_Y_shift_amplitude*delta; + ep[2]=stairs_Z_Offset; + ep[3]=stairs_R_Offset; + ep[4]=stairs_P_Offset; + ep[5]=stairs_A_Offset; + ep[6]=stairs_X_Offset; + ep[7]=stairs_Y_Offset/2.0+stairs_Y_shift_amplitude*delta; + ep[8]=stairs_Z_Offset; + ep[9]=stairs_R_Offset; + ep[10]=stairs_P_Offset; + ep[11]=stairs_A_Offset; + ram_data[DARWIN_STAIRS_CNTRL]|=SHIFT_WEIGHT_LEFT; + } + else if(stairs_Time>stairs_shift_weight_left_time && stairs_Time<=stairs_rise_right_foot_time) + { + //2 + delta=(stairs_Time-stairs_shift_weight_left_time)/(stairs_rise_right_foot_time-stairs_shift_weight_left_time); + ep[0]=stairs_X_Offset; + ep[1]=-stairs_Y_Offset/2.0+stairs_Y_shift_amplitude; + ep[2]=stairs_Z_Offset; + ep[3]=stairs_R_Offset-stairs_R_shift_amplitude*delta; + ep[4]=stairs_P_Offset; + ep[5]=stairs_A_Offset; + ep[6]=stairs_X_Offset; + ep[7]=stairs_Y_Offset/2.0+stairs_Y_shift_amplitude; + ep[8]=stairs_Z_Offset+(stairs_Z_overshoot+stairs_Z_stair_height)*delta; + ep[9]=stairs_R_Offset-stairs_R_shift_amplitude*delta; + ep[10]=stairs_P_Offset; + ep[11]=stairs_A_Offset; + ram_data[DARWIN_STAIRS_CNTRL]|=RISE_RIGHT_FOOT; + } + else if(stairs_Time>stairs_rise_right_foot_time && stairs_Time<=stairs_advance_right_foot_time) + { + //3 + delta=(stairs_Time-stairs_rise_right_foot_time)/(stairs_advance_right_foot_time-stairs_rise_right_foot_time); + ep[0]=stairs_X_Offset; + ep[1]=-stairs_Y_Offset/2.0+stairs_Y_shift_amplitude-(stairs_Y_spread_amplitude/2.0)*delta; + ep[2]=stairs_Z_Offset; + ep[3]=stairs_R_Offset-stairs_R_shift_amplitude; + ep[4]=stairs_P_Offset+stairs_P_shift_amplitude*delta; + ep[5]=stairs_A_Offset+stairs_A_shift_amplitude*delta; + ep[6]=stairs_X_Offset+stairs_X_shift_amplitude*delta; + ep[7]=stairs_Y_Offset/2.0+stairs_Y_shift_amplitude+(stairs_Y_spread_amplitude/2.0)*delta; + ep[8]=stairs_Z_Offset+stairs_Z_overshoot+stairs_Z_stair_height; + ep[9]=stairs_R_Offset-stairs_R_shift_amplitude; + ep[10]=stairs_P_Offset+stairs_P_shift_amplitude*delta; + ep[11]=stairs_A_Offset+stairs_A_shift_amplitude*delta; + ram_data[DARWIN_STAIRS_CNTRL]|=ADVANCE_RIGHT_FOOT; + } + else if(stairs_Time>stairs_advance_right_foot_time && stairs_Time<=stairs_contact_right_foot_time) + { + //4 + delta=(stairs_Time-stairs_advance_right_foot_time)/(stairs_contact_right_foot_time-stairs_advance_right_foot_time); + ep[0]=stairs_X_Offset; + ep[1]=-stairs_Y_Offset/2.0+stairs_Y_shift_amplitude-(stairs_Y_spread_amplitude/2.0); + ep[2]=stairs_Z_Offset; + ep[3]=stairs_R_Offset-stairs_R_shift_amplitude; + ep[4]=stairs_P_Offset+stairs_P_shift_amplitude; + ep[5]=stairs_A_Offset+stairs_A_shift_amplitude; + ep[6]=stairs_X_Offset+stairs_X_shift_amplitude; + ep[7]=stairs_Y_Offset/2.0+stairs_Y_shift_amplitude+(stairs_Y_spread_amplitude/2.0); + ep[8]=stairs_Z_Offset+stairs_Z_overshoot+stairs_Z_stair_height-stairs_Z_overshoot*delta; + ep[9]=stairs_R_Offset-stairs_R_shift_amplitude; + ep[10]=stairs_P_Offset+stairs_P_shift_amplitude; + ep[11]=stairs_A_Offset+stairs_A_shift_amplitude; + ram_data[DARWIN_STAIRS_CNTRL]|=CONTACT_RIGHT_FOOT; + } + else if(stairs_Time>stairs_contact_right_foot_time && stairs_Time<=stairs_shift_weight_right_time) + { + //5 + delta=(stairs_Time-stairs_contact_right_foot_time)/(stairs_shift_weight_right_time-stairs_contact_right_foot_time); + ep[0]=stairs_X_Offset-stairs_X_shift_body*delta; + ep[1]=-stairs_Y_Offset/2.0+stairs_Y_shift_amplitude-(stairs_Y_spread_amplitude/2.0)-(2*stairs_Y_shift_amplitude)*delta; + ep[2]=stairs_Z_Offset; + ep[3]=stairs_R_Offset-stairs_R_shift_amplitude+2.0*stairs_R_shift_amplitude*delta; + ep[4]=stairs_P_Offset+stairs_P_shift_amplitude-3.0*stairs_P_shift_amplitude*delta; + ep[5]=stairs_A_Offset+stairs_A_shift_amplitude; + ep[6]=stairs_X_Offset+stairs_X_shift_amplitude-stairs_X_shift_body*delta; + ep[7]=stairs_Y_Offset/2.0+stairs_Y_shift_amplitude+(stairs_Y_spread_amplitude/2.0)-(2*stairs_Y_shift_amplitude)*delta; + ep[8]=stairs_Z_Offset+stairs_Z_stair_height; + ep[9]=stairs_R_Offset-stairs_R_shift_amplitude+2.0*stairs_R_shift_amplitude*delta; + ep[10]=stairs_P_Offset+stairs_P_shift_amplitude-3.0*stairs_P_shift_amplitude*delta; + ep[11]=stairs_A_Offset+stairs_A_shift_amplitude; + ram_data[DARWIN_STAIRS_CNTRL]|=SHIFT_WEIGHT_RIGHT; + } + else if(stairs_Time>stairs_shift_weight_right_time && stairs_Time<=stairs_rise_left_foot_time) + { + //6 + delta=(stairs_Time-stairs_shift_weight_right_time)/(stairs_rise_left_foot_time-stairs_shift_weight_right_time); + ep[0]=stairs_X_Offset-stairs_X_shift_body; + ep[1]=-stairs_Y_Offset/2.0-stairs_Y_shift_amplitude-(stairs_Y_spread_amplitude/2.0); + ep[2]=stairs_Z_Offset+(stairs_Z_overshoot+stairs_Z_stair_height)*delta; + ep[3]=stairs_R_Offset+stairs_R_shift_amplitude; + ep[4]=stairs_P_Offset-2.0*stairs_P_shift_amplitude; + ep[5]=stairs_A_Offset+stairs_A_shift_amplitude; + ep[6]=stairs_X_Offset+stairs_X_shift_amplitude-stairs_X_shift_body; + ep[7]=stairs_Y_Offset/2.0-stairs_Y_shift_amplitude+(stairs_Y_spread_amplitude/2.0); + ep[8]=stairs_Z_Offset+stairs_Z_stair_height; + ep[9]=stairs_R_Offset+stairs_R_shift_amplitude; + ep[10]=stairs_P_Offset-2.0*stairs_P_shift_amplitude; + ep[11]=stairs_A_Offset+stairs_A_shift_amplitude; + ram_data[DARWIN_STAIRS_CNTRL]|=RISE_LEFT_FOOT; + } + else if(stairs_Time>stairs_rise_left_foot_time && stairs_Time<=stairs_advance_left_foot_time) + { + //7 + delta=(stairs_Time-stairs_rise_left_foot_time)/(stairs_advance_left_foot_time-stairs_rise_left_foot_time); + ep[0]=stairs_X_Offset-stairs_X_shift_body+stairs_X_shift_body*delta; + ep[1]=-stairs_Y_Offset/2.0-stairs_Y_shift_amplitude-(stairs_Y_spread_amplitude/2.0)+(stairs_Y_spread_amplitude/2.0)*delta; + ep[2]=stairs_Z_Offset+stairs_Z_overshoot+stairs_Z_stair_height; + ep[3]=stairs_R_Offset+stairs_R_shift_amplitude; + ep[4]=stairs_P_Offset-2.0*stairs_P_shift_amplitude+stairs_P_shift_amplitude*delta; + ep[5]=stairs_A_Offset+stairs_A_shift_amplitude-stairs_A_shift_amplitude*delta; + ep[6]=stairs_X_Offset+stairs_X_shift_amplitude-stairs_X_shift_body-(stairs_X_shift_amplitude-stairs_X_shift_body)*delta; + ep[7]=stairs_Y_Offset/2.0-stairs_Y_shift_amplitude+(stairs_Y_spread_amplitude/2.0)-(stairs_Y_spread_amplitude/2.0)*delta; + ep[8]=stairs_Z_Offset+stairs_Z_stair_height; + ep[9]=stairs_R_Offset+stairs_R_shift_amplitude; + ep[10]=stairs_P_Offset-2.0*stairs_P_shift_amplitude+stairs_P_shift_amplitude*delta; + ep[11]=stairs_A_Offset+stairs_A_shift_amplitude-stairs_A_shift_amplitude*delta; + ram_data[DARWIN_STAIRS_CNTRL]|=ADVANCE_LEFT_FOOT; + } + else if(stairs_Time>stairs_advance_left_foot_time && stairs_Time<=stairs_contact_left_foot_time) + { + //8 + delta=(stairs_Time-stairs_advance_left_foot_time)/(stairs_contact_left_foot_time-stairs_advance_left_foot_time); + ep[0]=stairs_X_Offset; + ep[1]=-stairs_Y_Offset/2.0-stairs_Y_shift_amplitude; + ep[2]=stairs_Z_Offset+stairs_Z_overshoot+stairs_Z_stair_height-stairs_Z_overshoot*delta; + ep[3]=stairs_R_Offset+stairs_R_shift_amplitude-stairs_R_shift_amplitude*delta; + ep[4]=stairs_P_Offset-stairs_P_shift_amplitude+stairs_P_shift_amplitude*delta; + ep[5]=stairs_A_Offset; + ep[6]=stairs_X_Offset; + ep[7]=stairs_Y_Offset/2.0-stairs_Y_shift_amplitude; + ep[8]=stairs_Z_Offset+stairs_Z_stair_height; + ep[9]=stairs_R_Offset+stairs_R_shift_amplitude-stairs_R_shift_amplitude*delta; + ep[10]=stairs_P_Offset-stairs_P_shift_amplitude+stairs_P_shift_amplitude*delta; + ep[11]=stairs_A_Offset; + ram_data[DARWIN_STAIRS_CNTRL]|=CONTACT_LEFT_FOOT; + } + else if(stairs_Time>stairs_contact_left_foot_time && stairs_Time<=stairs_center_weight_time) + { + //9 + delta=(stairs_Time-stairs_contact_left_foot_time)/(stairs_center_weight_time-stairs_contact_left_foot_time); + ep[0]=stairs_X_Offset; + ep[1]=-stairs_Y_Offset/2.0-stairs_Y_shift_amplitude+stairs_Y_shift_amplitude*delta; + ep[2]=stairs_Z_Offset+stairs_Z_stair_height-stairs_Z_stair_height*delta; + ep[3]=stairs_R_Offset; + ep[4]=stairs_P_Offset; + ep[5]=stairs_A_Offset; + ep[6]=stairs_X_Offset; + ep[7]=stairs_Y_Offset/2.0-stairs_Y_shift_amplitude+stairs_Y_shift_amplitude*delta; + ep[8]=stairs_Z_Offset+stairs_Z_stair_height-stairs_Z_stair_height*delta; + ep[9]=stairs_R_Offset; + ep[10]=stairs_P_Offset; + ep[11]=stairs_A_Offset; + ram_data[DARWIN_STAIRS_CNTRL]|=CENTER_WEIGHT; + } + else + { + ram_data[DARWIN_STAIRS_CNTRL]&=(~STAIRS_STATUS); + stairs_Ctrl_Running=0x00; + } + } + else + { + if(stairs_Time>=0 && stairs_Time<=stairs_shift_weight_left_time) + { + //1 + delta=stairs_Time/stairs_shift_weight_left_time; + ep[0]=stairs_X_Offset; + ep[1]=stairs_Y_Offset/2.0+stairs_Y_shift_amplitude*delta; + ep[2]=stairs_Z_Offset+stairs_Z_stair_height*delta; + ep[3]=stairs_R_Offset; + ep[4]=stairs_P_Offset; + ep[5]=stairs_A_Offset; + ep[6]=stairs_X_Offset; + ep[7]=stairs_Y_Offset/2.0+stairs_Y_shift_amplitude*delta; + ep[8]=stairs_Z_Offset+stairs_Z_stair_height*delta; + ep[9]=stairs_R_Offset; + ep[10]=stairs_P_Offset; + ep[11]=stairs_A_Offset; + ram_data[DARWIN_STAIRS_CNTRL]|=SHIFT_WEIGHT_LEFT; + } + else if(stairs_Time>stairs_shift_weight_left_time && stairs_Time<=stairs_rise_right_foot_time) + { + //2 + delta=(stairs_Time-stairs_shift_weight_left_time)/(stairs_rise_right_foot_time-stairs_shift_weight_left_time); + ep[0]=stairs_X_Offset; + ep[1]=stairs_Y_Offset/2.0+stairs_Y_shift_amplitude; + ep[2]=stairs_Z_Offset+stairs_Z_stair_height; + ep[3]=stairs_R_Offset-stairs_R_shift_amplitude; + ep[4]=stairs_P_Offset; + ep[5]=stairs_A_Offset; + ep[6]=stairs_X_Offset; + ep[7]=stairs_Y_Offset/2.0+stairs_Y_shift_amplitude; + ep[8]=stairs_Z_Offset+stairs_Z_stair_height+stairs_Z_overshoot*delta; + ep[9]=stairs_R_Offset-stairs_R_shift_amplitude*delta; + ep[10]=stairs_P_Offset; + ep[11]=stairs_A_Offset; + ram_data[DARWIN_STAIRS_CNTRL]|=RISE_RIGHT_FOOT; + } + else if(stairs_Time>stairs_rise_right_foot_time && stairs_Time<=stairs_advance_right_foot_time) + { + //3 + delta=(stairs_Time-stairs_rise_right_foot_time)/(stairs_advance_right_foot_time-stairs_rise_right_foot_time); + ep[0]=stairs_X_Offset; + ep[1]=stairs_Y_Offset/2.0+stairs_Y_shift_amplitude-(stairs_Y_spread_amplitude/2.0)*delta; + ep[2]=stairs_Z_Offset+stairs_Z_stair_height; + ep[3]=stairs_R_Offset-stairs_R_shift_amplitude; + ep[4]=stairs_P_Offset+stairs_P_shift_amplitude*delta; + ep[5]=stairs_A_Offset+stairs_A_shift_amplitude*delta; + ep[6]=stairs_X_Offset+stairs_X_shift_amplitude*delta; + ep[7]=stairs_Y_Offset/2.0+stairs_Y_shift_amplitude+(stairs_Y_spread_amplitude/2.0)*delta; + ep[8]=stairs_Z_Offset+stairs_Z_overshoot+stairs_Z_stair_height; + ep[9]=stairs_R_Offset-stairs_R_shift_amplitude; + ep[10]=stairs_P_Offset+stairs_P_shift_amplitude*delta; + ep[11]=stairs_A_Offset+stairs_A_shift_amplitude*delta; + ram_data[DARWIN_STAIRS_CNTRL]|=ADVANCE_RIGHT_FOOT; + } + else if(stairs_Time>stairs_advance_right_foot_time && stairs_Time<=stairs_contact_right_foot_time) + { + //4 + delta=(stairs_Time-stairs_advance_right_foot_time)/(stairs_contact_right_foot_time-stairs_advance_right_foot_time); + ep[0]=stairs_X_Offset; + ep[1]=stairs_Y_Offset/2.0+stairs_Y_shift_amplitude-(stairs_Y_spread_amplitude/2.0); + ep[2]=stairs_Z_Offset+stairs_Z_stair_height+stairs_Z_overshoot*delta; + ep[3]=stairs_R_Offset-stairs_R_shift_amplitude; + ep[4]=stairs_P_Offset+stairs_P_shift_amplitude; + ep[5]=stairs_A_Offset+stairs_A_shift_amplitude; + ep[6]=stairs_X_Offset+stairs_X_shift_amplitude; + ep[7]=stairs_Y_Offset/2.0+stairs_Y_shift_amplitude+(stairs_Y_spread_amplitude/2.0); + ep[8]=stairs_Z_Offset+stairs_Z_overshoot+stairs_Z_stair_height-stairs_Z_stair_height*delta; + ep[9]=stairs_R_Offset-stairs_R_shift_amplitude; + ep[10]=stairs_P_Offset+stairs_P_shift_amplitude; + ep[11]=stairs_A_Offset+stairs_A_shift_amplitude; + ram_data[DARWIN_STAIRS_CNTRL]|=CONTACT_RIGHT_FOOT; + } + else if(stairs_Time>stairs_contact_right_foot_time && stairs_Time<=stairs_shift_weight_right_time) + { + //5 + delta=(stairs_Time-stairs_contact_right_foot_time)/(stairs_shift_weight_right_time-stairs_contact_right_foot_time); + ep[0]=stairs_X_Offset-stairs_X_shift_body*delta; + ep[1]=stairs_Y_Offset/2.0+stairs_Y_shift_amplitude-(stairs_Y_spread_amplitude/2.0)-(2*stairs_Y_shift_amplitude)*delta; + ep[2]=stairs_Z_Offset+stairs_Z_stair_height+stairs_Z_overshoot; + ep[3]=stairs_R_Offset-stairs_R_shift_amplitude+2.0*stairs_R_shift_amplitude*delta; + ep[4]=stairs_P_Offset+stairs_P_shift_amplitude-(2.0*stairs_P_shift_amplitude)*delta; + ep[5]=stairs_A_Offset+stairs_A_shift_amplitude; + ep[6]=stairs_X_Offset+stairs_X_shift_amplitude-stairs_X_shift_body*delta; + ep[7]=stairs_Y_Offset/2.0+stairs_Y_shift_amplitude+(stairs_Y_spread_amplitude/2.0)-(2*stairs_Y_shift_amplitude)*delta; + ep[8]=stairs_Z_Offset+stairs_Z_overshoot; + ep[9]=stairs_R_Offset-stairs_R_shift_amplitude+2.0*stairs_R_shift_amplitude*delta; + ep[10]=stairs_P_Offset+stairs_P_shift_amplitude-(2.0*stairs_P_shift_amplitude)*delta; + ep[11]=stairs_A_Offset+stairs_A_shift_amplitude; + ram_data[DARWIN_STAIRS_CNTRL]|=SHIFT_WEIGHT_RIGHT; + } + else if(stairs_Time>stairs_shift_weight_right_time && stairs_Time<=stairs_rise_left_foot_time) + { + //6 + delta=(stairs_Time-stairs_shift_weight_right_time)/(stairs_rise_left_foot_time-stairs_shift_weight_right_time); + ep[0]=stairs_X_Offset-stairs_X_shift_body; + ep[1]=stairs_Y_Offset/2.0-stairs_Y_shift_amplitude-(stairs_Y_spread_amplitude/2.0); + ep[2]=stairs_Z_Offset+stairs_Z_overshoot+stairs_Z_stair_height; + ep[3]=stairs_R_Offset+stairs_R_shift_amplitude; + ep[4]=stairs_P_Offset-1.0*stairs_P_shift_amplitude; + ep[5]=stairs_A_Offset+stairs_A_shift_amplitude; + ep[6]=stairs_X_Offset+stairs_X_shift_amplitude-stairs_X_shift_body; + ep[7]=stairs_Y_Offset/2.0-stairs_Y_shift_amplitude+(stairs_Y_spread_amplitude/2.0); + ep[8]=stairs_Z_Offset+stairs_Z_overshoot-stairs_Z_overshoot*delta; + ep[9]=stairs_R_Offset+stairs_R_shift_amplitude; + ep[10]=stairs_P_Offset-1.0*stairs_P_shift_amplitude; + ep[11]=stairs_A_Offset+stairs_A_shift_amplitude; + ram_data[DARWIN_STAIRS_CNTRL]|=RISE_LEFT_FOOT; + } + else if(stairs_Time>stairs_rise_left_foot_time && stairs_Time<=stairs_advance_left_foot_time) + { + //7 + delta=(stairs_Time-stairs_rise_left_foot_time)/(stairs_advance_left_foot_time-stairs_rise_left_foot_time); + ep[0]=stairs_X_Offset-stairs_X_shift_body+stairs_X_shift_body*delta; + ep[1]=stairs_Y_Offset/2.0-stairs_Y_shift_amplitude-(stairs_Y_spread_amplitude/2.0)+(stairs_Y_spread_amplitude/2.0)*delta; + ep[2]=stairs_Z_Offset+stairs_Z_overshoot+stairs_Z_stair_height; + ep[3]=stairs_R_Offset+stairs_R_shift_amplitude;//+stairs_R_shift_amplitude*delta; + ep[4]=stairs_P_Offset-1.0*stairs_P_shift_amplitude+1.0*stairs_P_shift_amplitude*delta; + ep[5]=stairs_A_Offset+stairs_A_shift_amplitude-stairs_A_shift_amplitude*delta; + ep[6]=stairs_X_Offset+stairs_X_shift_amplitude-stairs_X_shift_body-(stairs_X_shift_amplitude-stairs_X_shift_body)*delta; + ep[7]=stairs_Y_Offset/2.0-stairs_Y_shift_amplitude+(stairs_Y_spread_amplitude/2.0)-(stairs_Y_spread_amplitude/2.0)*delta; + ep[8]=stairs_Z_Offset; + ep[9]=stairs_R_Offset+stairs_R_shift_amplitude;//+stairs_R_shift_amplitude*delta; + ep[10]=stairs_P_Offset-1.0*stairs_P_shift_amplitude+1.0*stairs_P_shift_amplitude*delta; + ep[11]=stairs_A_Offset+stairs_A_shift_amplitude-stairs_A_shift_amplitude*delta; + ram_data[DARWIN_STAIRS_CNTRL]|=ADVANCE_LEFT_FOOT; + } + else if(stairs_Time>stairs_advance_left_foot_time && stairs_Time<=stairs_contact_left_foot_time) + { + //8 + delta=(stairs_Time-stairs_advance_left_foot_time)/(stairs_contact_left_foot_time-stairs_advance_left_foot_time); + ep[0]=stairs_X_Offset; + ep[1]=stairs_Y_Offset/2.0-stairs_Y_shift_amplitude; + ep[2]=stairs_Z_Offset+stairs_Z_overshoot+stairs_Z_stair_height-(stairs_Z_stair_height+stairs_Z_overshoot)*delta; + ep[3]=stairs_R_Offset+stairs_R_shift_amplitude-stairs_R_shift_amplitude*delta; + ep[4]=stairs_P_Offset; + ep[5]=stairs_A_Offset; + ep[6]=stairs_X_Offset; + ep[7]=stairs_Y_Offset/2.0-stairs_Y_shift_amplitude; + ep[8]=stairs_Z_Offset; + ep[9]=stairs_R_Offset+stairs_R_shift_amplitude-stairs_R_shift_amplitude*delta; + ep[10]=stairs_P_Offset; + ep[11]=stairs_A_Offset; + ram_data[DARWIN_STAIRS_CNTRL]|=CONTACT_LEFT_FOOT; + } + else if(stairs_Time>stairs_contact_left_foot_time && stairs_Time<=stairs_center_weight_time) + { + //9 + delta=(stairs_Time-stairs_contact_left_foot_time)/(stairs_center_weight_time-stairs_contact_left_foot_time); + ep[0]=stairs_X_Offset; + ep[1]=stairs_Y_Offset/2.0-stairs_Y_shift_amplitude+stairs_Y_shift_amplitude*delta; + ep[2]=stairs_Z_Offset; + ep[3]=stairs_R_Offset+stairs_R_shift_amplitude-stairs_R_shift_amplitude*delta; + ep[4]=stairs_P_Offset; + ep[5]=stairs_A_Offset; + ep[6]=stairs_X_Offset; + ep[7]=stairs_Y_Offset/2.0-stairs_Y_shift_amplitude+stairs_Y_shift_amplitude*delta; + ep[8]=stairs_Z_Offset; + ep[9]=stairs_R_Offset+stairs_R_shift_amplitude-stairs_R_shift_amplitude*delta; + ep[10]=stairs_P_Offset; + ep[11]=stairs_A_Offset; + ram_data[DARWIN_STAIRS_CNTRL]|=CENTER_WEIGHT; + } + else + { + ram_data[DARWIN_STAIRS_CNTRL]&=(~STAIRS_STATUS); + stairs_Ctrl_Running=0x00; + } + } + + if(ram_data[DARWIN_STAIRS_CNTRL]&STAIRS_STATUS) + stairs_Time += stairs_period; + else + stairs_Time=0; + + // Compute angles with the inverse kinematics + if((darwin_leg_ik(&angle[0],ep[0],ep[1],ep[2],ep[3],ep[4],ep[5])!=1) || + (darwin_leg_ik(&angle[6],ep[6],ep[7],ep[8],ep[9],ep[10],ep[11])!=1)) + return;// Do not use angles + + // Compute motor value + if(manager_get_module(R_HIP_YAW)==MM_WALKING) + { + manager_current_angles[R_HIP_YAW]=((-180.0*angle[0])/PI)*65536.0; + manager_current_slopes[R_HIP_YAW]=5; + } + if(manager_get_module(R_HIP_ROLL)==MM_WALKING) + { + manager_current_angles[R_HIP_ROLL]=((-180.0*angle[1])/PI)*65536.0; + manager_current_slopes[R_HIP_ROLL]=5; + } + if(manager_get_module(R_HIP_PITCH)==MM_WALKING) + { + manager_current_angles[R_HIP_PITCH]=((180.0*angle[2])/PI-stairs_Hip_Pitch_Offset)*65536.0; + manager_current_slopes[R_HIP_PITCH]=5; + } + if(manager_get_module(R_KNEE)==MM_WALKING) + { + manager_current_angles[R_KNEE]=((180.0*angle[3])/PI)*65536.0; + manager_current_slopes[R_KNEE]=5; + } + if(manager_get_module(R_ANKLE_PITCH)==MM_WALKING) + { + manager_current_angles[R_ANKLE_PITCH]=((-180.0*angle[4])/PI)*65536.0; + manager_current_slopes[R_ANKLE_PITCH]=5; + } + if(manager_get_module(R_ANKLE_ROLL)==MM_WALKING) + { + manager_current_angles[R_ANKLE_ROLL]=((180.0*angle[5])/PI)*65536.0; + manager_current_slopes[R_ANKLE_ROLL]=5; + } + if(manager_get_module(L_HIP_YAW)==MM_WALKING) + { + manager_current_angles[L_HIP_YAW]=((-180.0*angle[6])/PI)*65536.0; + manager_current_slopes[L_HIP_YAW]=5; + } + if(manager_get_module(L_HIP_ROLL)==MM_WALKING) + { + manager_current_angles[L_HIP_ROLL]=((-180.0*angle[7])/PI)*65536.0; + manager_current_slopes[L_HIP_ROLL]=5; + } + if(manager_get_module(L_HIP_PITCH)==MM_WALKING) + { + manager_current_angles[L_HIP_PITCH]=((-180.0*angle[8])/PI+stairs_Hip_Pitch_Offset)*65536.0; + manager_current_slopes[L_HIP_PITCH]=5; + } + if(manager_get_module(L_KNEE)==MM_WALKING) + { + manager_current_angles[L_KNEE]=((-180.0*angle[9])/PI)*65536.0; + manager_current_slopes[L_KNEE]=5; + } + if(manager_get_module(L_ANKLE_PITCH)==MM_WALKING) + { + manager_current_angles[L_ANKLE_PITCH]=((180.0*angle[10])/PI)*65536.0; + manager_current_slopes[L_ANKLE_PITCH]=5; + } + if(manager_get_module(L_ANKLE_ROLL)==MM_WALKING) + { + manager_current_angles[L_ANKLE_ROLL]=((180.0*angle[11])/PI)*65536.0; + manager_current_slopes[L_ANKLE_ROLL]=5; + } + } +} + +// operation functions +uint8_t stairs_in_range(unsigned short int address, unsigned short int length) +{ + if(ram_in_window(STAIRS_BASE_ADDRESS,STAIRS_MEM_LENGTH,address,length) || + ram_in_window(STAIRS_EEPROM_ADDRESS,STAIRS_EEPROM_LENGTH,address,length)) + return 0x01; + else + return 0x00; +} + +void stairs_process_read_cmd(unsigned short int address,unsigned short int length,unsigned char *data) +{ + +} + +void stairs_process_write_cmd(unsigned short int address,unsigned short int length,unsigned char *data) +{ + uint16_t i; + + // walk control + if(ram_in_range(DARWIN_STAIRS_CNTRL,address,length)) + { + if(data[DARWIN_STAIRS_CNTRL-address]&STAIRS_START_UP) + stairs_start(0x01); + if(data[DARWIN_STAIRS_CNTRL-address]&STAIRS_START_DOWN) + stairs_start(0x00); + if(data[DARWIN_STAIRS_CNTRL-address]&STAIRS_STOP) + stairs_stop(); + } + for(i=STAIRS_EEPROM_ADDRESS;i<=STAIRS_EEPROM_ADDRESS+STAIRS_EEPROM_LENGTH;i++) + if(ram_in_range(i,address,length)) + ram_data[i]=data[i-address]; +} + diff --git a/src/test_charger.c b/src/test_charger.c index 5a547fceff13e6ed90be00b86f97142b1f391d35..23cb9b869118c00872faf71c98f56b5019823381 100644 --- a/src/test_charger.c +++ b/src/test_charger.c @@ -74,7 +74,7 @@ int main(void) gpio_set_led(LED_3);//Si existen dispositivos conectados -> luz verde } - +/* ////READ CHARGER STATUS unsigned short int address=DARWIN_SMART_CHARGER_STATUS; unsigned short int length=1; @@ -84,9 +84,9 @@ int main(void) error=darwin_on_read(address,length,&data_read); if(data_read&0x01) gpio_set_led(LED_2); //verde - +*/ -/* ////READ PERIOD SMART CHARGER + ////READ PERIOD SMART CHARGER unsigned short int address=DARWIN_SMART_CHARGER_PERIOD_L; unsigned short int length=2; unsigned char data_read[2]; @@ -98,7 +98,7 @@ int main(void) gpio_set_led(LED_3); //verde else if(dread==0) gpio_set_led(LED_4); //azul -*/ + /* ////READ ID SMART CHARGER unsigned char data_read2; @@ -110,7 +110,7 @@ int main(void) //else if(data_read==0) */ -/* ////WRITE PERIOD SMART CHARGER + ////WRITE PERIOD SMART CHARGER //HAL_Delay(500); unsigned short int address=DARWIN_SMART_CHARGER_PERIOD_L; unsigned short int length=2; @@ -126,9 +126,9 @@ int main(void) gpio_set_led(LED_3); //verde else if(dread==1500) gpio_set_led(LED_4); //azul -*/ -/* ////ENABLE SMART CHARGER MODULE + + ////ENABLE SMART CHARGER MODULE address=DARWIN_SMART_CHARGER_CNTRL; length=1; uint8_t data_read; @@ -145,14 +145,21 @@ int main(void) darwin_on_read(address,length,&data_read); if(data_read==3) //Smart charger control = detected + enabled gpio_set_led(LED_3); //verde -*/ + -/* ////ENABLE MOTION MANAGER TIMER + ////ENABLE MOTION MANAGER TIMER address=DARWIN_MM_CNTRL; data_write=MANAGER_ENABLE; darwin_on_write(address,length,&data_write); HAL_Delay(500); -*/ + + ////WRITE LIMIT CURRENT +/* address=DARWIN_SMART_CHARGER_LIMIT_CURRENT_L; + length=2; + data_write=0.512; + darwin_on_write(address,length,&data_write); + HAL_Delay(500); +*/ /* //Read battery status address=DARWIN_BATT_AVG_TIME_EMPTY_L;