From 6ea7938c9bb1c96e3bbd0829ac9cc8b76d096495 Mon Sep 17 00:00:00 2001 From: Irene Garcia <igarcia@iri.upc.edu> Date: Wed, 22 Feb 2017 11:06:57 +0100 Subject: [PATCH] Added to the darwin firmware the smart charger module Added to the motion manager a bloc to detect, in any of the Dynamixel buses, devices other than servos such as the smart charger device. Implemented a initialization bloc for smart charger's module. Added the motion manager interface function of the smart charger into the manager's timer. --- Makefile | 7 ++ include/motion_manager.h | 1 + src/motion_manager.c | 148 +++++++++++++++++++++++++++++++++------ 3 files changed, 134 insertions(+), 22 deletions(-) diff --git a/Makefile b/Makefile index 67bc17e..14e6134 100755 --- a/Makefile +++ b/Makefile @@ -123,6 +123,13 @@ $(MAIN_OUT_LSS): $(MAIN_OUT_ELF) $(BUID_PATH)/$(STARTUP_FILE:.s=.o): $(STM32_STARTUP_FILES_PATH)/$(STARTUP_FILE) $(AS) $(ASFLAGS) -o $(BUILD_PATH)/$(STARTUP_FILE:.s=.o) $(STM32_STARTUP_FILES_PATH)/$(STARTUP_FILE) > $(BUILD_PATH)/$(STARTUP_FILE:.s=.lst) + +doc: + doxygen $(DOC_DIR)/doxygen.conf + clean: -rm -rf $(BUILD_PATH) + #-rm -rf doc/html + +#.PHONY: all clean doc diff --git a/include/motion_manager.h b/include/motion_manager.h index a764496..d4ef7cc 100755 --- a/include/motion_manager.h +++ b/include/motion_manager.h @@ -66,6 +66,7 @@ typedef struct{ TDynVersion dyn_version; }TServoInfo; + #define MANAGER_MAX_NUM_SERVOS 31 // public variables diff --git a/src/motion_manager.c b/src/motion_manager.c index 6a5e3f1..1633cda 100755 --- a/src/motion_manager.c +++ b/src/motion_manager.c @@ -9,6 +9,9 @@ #include "head_tracking.h" #include "grippers.h" #include "imu.h" +#include "smart_charger.h" +#include "dyn_battery.h" +#include "gpio.h" // #define MANAGER_TIMER TIM5 #define ENABLE_MANAGER_TIMER_CLK __HAL_RCC_TIM5_CLK_ENABLE() @@ -21,7 +24,7 @@ TIM_HandleTypeDef MANAGER_TIM_Handle; uint16_t manager_motion_period; uint16_t manager_motion_period_us; uint8_t manager_num_servos; -TServoInfo manager_servos[MANAGER_MAX_NUM_SERVOS]; +TServoInfo manager_servos[MANAGER_MAX_NUM_SERVOS]; //motion_manager.h // current angles used for all motion modules int64_t manager_current_angles[MANAGER_MAX_NUM_SERVOS]; int8_t manager_current_slopes[MANAGER_MAX_NUM_SERVOS]; @@ -31,6 +34,7 @@ uint8_t manager_balance_enabled; // manager offsets int16_t manager_offset[MANAGER_MAX_NUM_SERVOS]; + // private functions void manager_send_motion_command(void) { @@ -174,6 +178,8 @@ void MANAGER_TIMER_IRQHandler(void) grippers_process(); // balance the robot manager_balance(); + // access to smart charger + smart_charger_process(); // get the target angles from all modules manager_get_target_position(); // send the motion commands to the servos @@ -198,13 +204,13 @@ void manager_init(uint16_t period_us) darwin_dyn_master_init(); darwin_dyn_master_v2_init(); - ram_data[DARWIN_MM_CNTRL]|=MANAGER_SCANNING; + ram_data[DARWIN_MM_CNTRL]|=MANAGER_SCANNING; //0X80 -> bit scanning // enable power to the servos darwin_dyn_master_enable_power(); HAL_Delay(1000); // detect the servos connected on the v1 bus dyn_master_scan(&darwin_dyn_master,&num,servo_ids); - ram_data[DARWIN_MM_NUM_SERVOS]=num; + ram_data[DARWIN_MM_NUM_SERVOS]=num; //tmb sumara los otros dispositivos (cargador) manager_num_servos=0; for(i=0;i<MANAGER_MAX_NUM_SERVOS && current<num;i++) { @@ -275,26 +281,37 @@ void manager_init(uint16_t period_us) manager_servos[i].center_angle=180<<7; manager_servos[i].max_speed=270; break; +/* case DYN_BATTERY_MODEL: ram_data[DARWIN_SMART_CHARGER_CNTRL]|=SMART_CHARGER_DET; //smart charger detected + ram_data[DARWIN_SMART_CHARGER_ID] = servo_ids[current]; + //battery_version.dyn_version = &darwin_dyn_master; + smart_charger_set_version(darwin_dyn_master); + //hacer un read table? + dyn_master_read_table(&darwin_dyn_master,ram_data[DARWIN_SMART_CHARGER_ID],BATTERY_CHARGER_STATUS,SMART_CHARGER_MEM_LENGTH,(uint8_t *)&ram_data[DARWIN_BATT_CHARGER_STATUS]); + gpio_set_led(LED_3); + break;*/ default: break; } - manager_servos[i].id=servo_ids[current]; - manager_servos[i].model=model; - manager_servos[i].module=MM_NONE; - manager_servos[i].enabled=0x00; - manager_servos[i].dyn_version=DYN_VER1; - // get the servo's current position - dyn_master_read_word(&darwin_dyn_master,manager_servos[i].id,P_PRESENT_POSITION_L,&manager_servos[i].current_value); - manager_servos[i].current_angle=manager_value_to_angle(i,manager_servos[i].current_value); - ram_data[DARWIN_MM_SERVO0_CUR_POS_L+i*2]=(manager_servos[i].current_angle&0xFF); - ram_data[DARWIN_MM_SERVO0_CUR_POS_H+i*2]=(manager_servos[i].current_angle>>8); - // read the servo limits - dyn_master_read_word(&darwin_dyn_master,manager_servos[i].id,P_CW_ANGLE_LIMIT_L,&value); - manager_servos[i].cw_angle_limit=manager_value_to_angle(i,value); - dyn_master_read_word(&darwin_dyn_master,manager_servos[i].id,P_CCW_ANGLE_LIMIT_L,&value); - manager_servos[i].ccw_angle_limit=manager_value_to_angle(i,value); - // set the action current angles - manager_current_angles[i]=manager_servos[i].current_angle<<9; - manager_num_servos++; + //Config for all servos except battery + // if(model!=DYN_BATTERY_MODEL){ + manager_servos[i].id=servo_ids[current]; + manager_servos[i].model=model; + manager_servos[i].module=MM_NONE; + manager_servos[i].enabled=0x00; + manager_servos[i].dyn_version=DYN_VER1; + // get the servo's current position + dyn_master_read_word(&darwin_dyn_master,manager_servos[i].id,P_PRESENT_POSITION_L,&manager_servos[i].current_value); + manager_servos[i].current_angle=manager_value_to_angle(i,manager_servos[i].current_value); + ram_data[DARWIN_MM_SERVO0_CUR_POS_L+i*2]=(manager_servos[i].current_angle&0xFF); + ram_data[DARWIN_MM_SERVO0_CUR_POS_H+i*2]=(manager_servos[i].current_angle>>8); + // read the servo limits + dyn_master_read_word(&darwin_dyn_master,manager_servos[i].id,P_CW_ANGLE_LIMIT_L,&value); + manager_servos[i].cw_angle_limit=manager_value_to_angle(i,value); + dyn_master_read_word(&darwin_dyn_master,manager_servos[i].id,P_CCW_ANGLE_LIMIT_L,&value); + manager_servos[i].ccw_angle_limit=manager_value_to_angle(i,value); + // set the action current angles + manager_current_angles[i]=manager_servos[i].current_angle<<9; + manager_num_servos++; + // } current++; } else @@ -314,8 +331,27 @@ void manager_init(uint16_t period_us) manager_servos[i].ccw_angle_limit=0; } } + + //Other devices detected + for(i=current; i<num; i++){ + dyn_master_read_word(&darwin_dyn_master,servo_ids[i],P_MODEL_NUMBER_L,&model); + switch(model) + { + case DYN_BATTERY_MODEL: ram_data[DARWIN_SMART_CHARGER_CNTRL]|=SMART_CHARGER_DET; //smart charger detected + //gpio_set_led(LED_TX); + // if(ram_data[DARWIN_SMART_CHARGER_CNTRL] ==1) + // gpio_set_led(LED_3); + ram_data[DARWIN_SMART_CHARGER_ID] = servo_ids[i]; + smart_charger_set_version(&darwin_dyn_master); + dyn_master_read_table(&darwin_dyn_master,ram_data[DARWIN_SMART_CHARGER_ID],BATTERY_CHARGER_STATUS,43,&ram_data[DARWIN_BATT_CHARGER_STATUS]); + break; + default: break; + } + } + darwin_dyn_master_disable_power(); - + +/* ORIGINAL // 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; @@ -358,7 +394,74 @@ void manager_init(uint16_t period_us) current++; } } +*/ + // 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; //aumentar manager_max_num_servos (31)? la bateria se incluira + current=0; + for(i=0;i<MANAGER_MAX_NUM_SERVOS && current<num;i++) + { + if(i==servo_ids[current]) + { + present_servos|=(0x00000001<<i); + // read the model of the i-th device + dyn_master_read_word(&darwin_dyn_master_v2,servo_ids[current],XL_MODEL_NUMBER_L,&model); //o BATTERY_MODEL_NUMBER_L + switch(model) + { + case SERVO_XL320: manager_servos[i].encoder_resolution=1023; + manager_servos[i].gear_ratio=238; + manager_servos[i].max_angle=300<<7; + manager_servos[i].center_angle=150<<7; + manager_servos[i].max_speed=354; + + manager_servos[i].id=servo_ids[current]; + manager_servos[i].model=model; + manager_servos[i].module=MM_NONE; + manager_servos[i].enabled=0x00; + manager_servos[i].dyn_version=DYN_VER2; + // get the servo's current position + //CAMBIAR i POR current? -NO + dyn_master_read_word(&darwin_dyn_master_v2,manager_servos[i].id,XL_PRESENT_POSITION_L,&manager_servos[i].current_value); + manager_servos[i].current_angle=manager_value_to_angle(i,manager_servos[i].current_value); + ram_data[DARWIN_MM_SERVO0_CUR_POS_L+i*2]=(manager_servos[i].current_angle&0xFF); + ram_data[DARWIN_MM_SERVO0_CUR_POS_H+i*2]=(manager_servos[i].current_angle>>8); + // read the servo limits + dyn_master_read_word(&darwin_dyn_master_v2,manager_servos[i].id,XL_CW_ANGLE_LIMIT_L,&value); + manager_servos[i].cw_angle_limit=manager_value_to_angle(i,value); + dyn_master_read_word(&darwin_dyn_master_v2,manager_servos[i].id,XL_CCW_ANGLE_LIMIT_L,&value); + manager_servos[i].ccw_angle_limit=manager_value_to_angle(i,value); + // set the action current angles + manager_current_angles[i]=manager_servos[i].current_angle<<9; + break; + /* case DYN_BATTERY_MODEL: ram_data[DARWIN_SMART_CHARGER_CNTRL]|=SMART_CHARGER_DET; //smart charger detected + ram_data[DARWIN_SMART_CHARGER_ID] = servo_ids[current]; + smart_charger_set_version(darwin_dyn_master_v2); + dyn_master_read_table(&darwin_dyn_master_v2,ram_data[DARWIN_SMART_CHARGER_ID],BATTERY_CHARGER_STATUS,SMART_CHARGER_MEM_LENGTH,(uint8_t *)&ram_data[DARWIN_BATT_CHARGER_STATUS]); + break;*/ + default: break; + } + //antes habia la inicializacion general + manager_num_servos++; + current++; + } + } + + //Other devices detected + for(i=current; i<num; i++){ + dyn_master_read_word(&darwin_dyn_master,servo_ids[i],P_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_set_version(&darwin_dyn_master_v2); + dyn_master_read_table(&darwin_dyn_master_v2,ram_data[DARWIN_SMART_CHARGER_ID],BATTERY_CHARGER_STATUS,43,&ram_data[DARWIN_BATT_CHARGER_STATUS]); + break; + default: break; + } + } + + ram_data[DARWIN_MM_PRESENT_SERVOS1]=(present_servos&0x000000FF); ram_data[DARWIN_MM_PRESENT_SERVOS2]=((present_servos&0x0000FF00)>>8); ram_data[DARWIN_MM_PRESENT_SERVOS3]=((present_servos&0x00FF0000)>>16); @@ -402,6 +505,7 @@ void manager_init(uint16_t period_us) joint_motion_init(period_us); head_tracking_init(period_us); grippers_init(period_us); + smart_charger_init(period_us); } uint16_t manager_get_period(void) -- GitLab