diff --git a/include/ram.h b/include/ram.h index 188dd50047df6072a559b2634d7bfa501163553d..d9378534607db8f8b1d861a65a4822f0e6199b3b 100644 --- a/include/ram.h +++ b/include/ram.h @@ -107,10 +107,25 @@ typedef enum { BIOLOID_IMU_CONTROL = 0x6D, BIOLOID_IMU_ACCEL_X_L = 0x6E, BIOLOID_IMU_ACCEL_X_H = 0x6F, - BIOLOID_IMU_ACCEL_Y_L = 0x7A, - BIOLOID_IMU_ACCEL_Y_H = 0x7B, - BIOLOID_IMU_ACCEL_Z_L = 0x7C, - BIOLOID_IMU_ACCEL_Z_H = 0x7D + BIOLOID_IMU_ACCEL_Y_L = 0x70, + BIOLOID_IMU_ACCEL_Y_H = 0x71, + BIOLOID_IMU_ACCEL_Z_L = 0x72, + BIOLOID_IMU_ACCEL_Z_H = 0x73, + BIOLOID_IMU_GYRO_X_L = 0x74, + BIOLOID_IMU_GYRO_X_H = 0x75, + BIOLOID_IMU_GYRO_Y_L = 0x76, + BIOLOID_IMU_GYRO_Y_H = 0x77, + BIOLOID_IMU_GYRO_Z_L = 0x78, + BIOLOID_IMU_GYRO_Z_H = 0x79, + BIOLOID_IMU_COMPASS_X_L = 0x7A, + BIOLOID_IMU_COMPASS_X_H = 0x7B, + BIOLOID_IMU_COMPASS_Y_L = 0x7C, + BIOLOID_IMU_COMPASS_Y_H = 0x7D, + BIOLOID_IMU_COMPASS_Z_L = 0x7E, + BIOLOID_IMU_COMPASS_Z_H = 0x7F, + BIOLOID_ACTION_PAGE = 0x80, + BIOLOID_ACTION_CONTROL = 0x81, + BIOLOID_ACTION_SATUTUS = 0x82 } bioloid_registers; #define RAM_SIZE 256 diff --git a/src/action.c b/src/action.c index 0cb22d630121edc529691dbc3afd7ee39bcd3d03..452c2a9635c08878f658f9b605e10b612efa470b 100644 --- a/src/action.c +++ b/src/action.c @@ -190,7 +190,7 @@ void action_init(uint16_t period) { // angle variables action_moving_angles[i]=0;// fixed point 48|16 format - action_current_angles[i]=0;// middle of range + //action_current_angles[i]=0;// middle of range // speed variables action_start_speed[i]=0;// fixed point 48|16 format action_main_speed[i]=0;// fixed point 48|16 format diff --git a/src/bioloid_stm32.c b/src/bioloid_stm32.c index a69bf5f3fb4bfa0f91a7c3514d7dbc7b48ccca8c..23dfffb4763e556da0966edc99a8eba86ac23458 100644 --- a/src/bioloid_stm32.c +++ b/src/bioloid_stm32.c @@ -61,7 +61,7 @@ uint8_t write_operation(uint8_t address,uint8_t length, uint8_t *data) word_value=(word_value*1000000)>>16; manager_set_period(word_value); } - for(i=BIOLOID_MM_MODULE_EN0,j=0;i<BIOLOID_MM_MODULE_EN15;i++,j++) + for(i=BIOLOID_MM_MODULE_EN0,j=0;i<=BIOLOID_MM_MODULE_EN15;i++,j+=2) { if(ram_in_range(i,i,address,length)) { @@ -94,6 +94,15 @@ uint8_t write_operation(uint8_t address,uint8_t length, uint8_t *data) // write operation error=ram_write_table(address,length,data); // post-write operation + if(ram_in_range(BIOLOID_ACTION_PAGE,BIOLOID_ACTION_PAGE,address,length))// load the page identifier + action_load_page(data[address-BIOLOID_ACTION_PAGE]); + if(ram_in_range(BIOLOID_ACTION_CONTROL,BIOLOID_ACTION_CONTROL,address,length)) + { + if(data[address-BIOLOID_ACTION_CONTROL]&0x01) + action_start_page(); + if(data[address-BIOLOID_ACTION_CONTROL]&0x02) + action_stop_page(); + } return error; } @@ -126,7 +135,7 @@ int32_t main(void) EE_ReadVariable(RETURN_LEVEL_OFFSET,&eeprom_data); dyn_slave_set_return_level((uint8_t)eeprom_data); /* initialize the IMU */ - imu_init(); +// imu_init(); // initialize the Analog to digital converter // adc_init(); // initialize motion manager diff --git a/src/dynamixel_master_uart_dma.c b/src/dynamixel_master_uart_dma.c index 8abdfcaa9ecbd800671ea7086fe4fd1ca1014a1d..2c545b89e4df0c76cab573514f92f11a9f57be05 100755 --- a/src/dynamixel_master_uart_dma.c +++ b/src/dynamixel_master_uart_dma.c @@ -69,6 +69,8 @@ uint8_t dyn_master_tx_buffer[MAX_BUFFER_LEN]; volatile uint8_t dyn_master_packet_ready; // sending status packet flag volatile uint8_t dyn_master_sending_packet; +// no answer for sync write operation +uint8_t dyn_master_no_answer; // DMA initialization data structures DMA_InitTypeDef DMA_TX_InitStructure; DMA_InitTypeDef DMA_RX_InitStructure; @@ -106,8 +108,8 @@ uint8_t dyn_master_receive(void) // wait for the status packet while(!dyn_master_packet_ready) { - delay_ms(10); - timeout_left-=10; + delay_ms(1); + timeout_left-=1; if(timeout_left<=0) { dyn_master_reset(); @@ -212,14 +214,19 @@ void USART_IRQHandler(void) USART_ClearFlag(USART,USART_FLAG_TC); USART_ITConfig(USART, USART_IT_TC, DISABLE); dyn_master_sending_packet=0x00; - // set up the DMA RX transaction - DMA_RX_InitStructure.DMA_BufferSize = 4; - DMA_RX_InitStructure.DMA_Memory0BaseAddr = (uint32_t)dyn_master_rx_buffer; - DMA_Init(USART_RX_DMA_STREAM,&DMA_RX_InitStructure); - DMA_ITConfig(USART_RX_DMA_STREAM,DMA_IT_TC,ENABLE); - DMA_Cmd(USART_RX_DMA_STREAM,ENABLE); - USART_DMACmd(USART, USART_DMAReq_Rx, ENABLE); - dyn_master_receiving_header=0x01; + if(dyn_master_no_answer) + dyn_master_no_answer=0x00; + else + { + // set up the DMA RX transaction + DMA_RX_InitStructure.DMA_BufferSize = 4; + DMA_RX_InitStructure.DMA_Memory0BaseAddr = (uint32_t)dyn_master_rx_buffer; + DMA_Init(USART_RX_DMA_STREAM,&DMA_RX_InitStructure); + DMA_ITConfig(USART_RX_DMA_STREAM,DMA_IT_TC,ENABLE); + DMA_Cmd(USART_RX_DMA_STREAM,ENABLE); + USART_DMACmd(USART, USART_DMAReq_Rx, ENABLE); + dyn_master_receiving_header=0x01; + } } } @@ -307,6 +314,7 @@ void dyn_master_init(void) dyn_master_packet_ready=0x00; dyn_master_sending_packet=0x00; dyn_master_receiving_header=0x01; + dyn_master_no_answer=0x00; USART_DeInit(USART); USART_StructInit(&USART_InitStructure); @@ -493,6 +501,7 @@ void dyn_master_sync_write(uint8_t num,uint8_t *ids,uint8_t address, uint8_t len { uint8_t i; + dyn_master_no_answer=0x01; // generate the sync write packet dyn_init_instruction_packet(dyn_master_tx_buffer); // set the ping instruction diff --git a/src/eeprom.c b/src/eeprom.c index cd2df122ceed51f143726c22c2f5af172767d618..37477009408e9a8da640830b2b00f42123f4bcb0 100755 --- a/src/eeprom.c +++ b/src/eeprom.c @@ -31,7 +31,7 @@ #define EEPROM_SIZE 0x09 #define DEFAULT_DEVICE_MODEL 0x7300 #define DEFAULT_FIRMWARE_VERSION 0x13 -#define DEFAULT_DEVICE_ID 0x0D +#define DEFAULT_DEVICE_ID 0xC0 #define DEFAULT_BAUDRATE 0x01 #define DEFAULT_RETURN_DELAY 0x00 #define DEFAULT_MM_PERIOD 0x01FF diff --git a/src/motion_manager.c b/src/motion_manager.c index c7dc63d94f1ae580ce8b2ad454eb0da7e333d85a..11ed9bb7355c68119e3e04549b3ce6b8fb14d71c 100644 --- a/src/motion_manager.c +++ b/src/motion_manager.c @@ -3,12 +3,15 @@ #include "dyn_servos.h" #include "gpio.h" #include "ram.h" +#include "action.h" #define MOTION_TIMER TIM3 #define MOTION_TIMER_IRQn TIM3_IRQn #define MOTION_TIMER_IRQHandler TIM3_IRQHandler #define MOTION_TIMER_CLK RCC_APB1Periph_TIM3 +extern int64_t action_current_angles[MANAGER_MAX_NUM_SERVOS]; + // private variables __IO uint16_t manager_motion_period; uint8_t manager_num_servos; @@ -19,17 +22,20 @@ void manager_send_motion_command(void) { uint8_t servo_ids[MANAGER_MAX_NUM_SERVOS]; uint8_t data[2048]; - uint16_t value; - uint8_t i; + uint8_t i,num=0; for(i=0;i<manager_num_servos;i++) { -// servo_ids[i]=manager_servos[i].id; -// value=manager_get_index_value(i); - data[i*2]=value%256; - data[i*2+1]=value/256; + if(manager_servos[i].enabled) + { + servo_ids[num]=manager_servos[i].id; + data[num*2]=manager_servos[i].current_value%256; + data[num*2+1]=manager_servos[i].current_value/256; + num++; + } } - dyn_master_sync_write(manager_num_servos,servo_ids,P_GOAL_POSITION_L,2,data); + if(num>0) + dyn_master_sync_write(manager_num_servos,servo_ids,P_GOAL_POSITION_L,2,data); } inline uint16_t manager_angle_to_value(uint8_t servo_id,int16_t angle) @@ -58,20 +64,30 @@ void manager_get_current_position(void) { uint8_t i; - for(i=0;i<MANAGER_MAX_NUM_SERVOS;i++) + for(i=0;i<manager_num_servos;i++) { - if(manager_servos[i].model!=0x0000)// servo is present + if(!manager_servos[i].enabled)// servo is enabled { - if(manager_servos[i].enabled)// servo is enabled - { - // the current position is fixed by one of the motion modules - } - else// servo is disabled + dyn_master_read_word(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[BIOLOID_MM_SERVO0_CUR_POS_L+i*2]=(manager_servos[i].current_angle&0xFF); + ram_data[BIOLOID_MM_SERVO0_CUR_POS_H+i*2]=(manager_servos[i].current_angle>>8); + } +} + +void manager_get_target_position(void) +{ + uint8_t i; + + for(i=0;i<manager_num_servos;i++) + { + if(manager_servos[i].enabled)// servo is enabled + { + if(manager_servos[i].module==MM_ACTION) { - dyn_master_read_word(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[BIOLOID_MM_SERVO0_CUR_POS_L+i*2]=(manager_servos[i].current_angle&0xFF); - ram_data[BIOLOID_MM_SERVO0_CUR_POS_H+i*2]=(manager_servos[i].current_angle>>8); + manager_servos[i].current_angle=((action_current_angles[i+1])>>16); + manager_servos[i].current_value=manager_angle_to_value(i,manager_servos[i].current_angle); } } } @@ -87,6 +103,8 @@ void MOTION_TIMER_IRQHandler(void) TIM_ClearITPendingBit(MOTION_TIMER,TIM_IT_CC1); capture = TIM_GetCapture1(MOTION_TIMER); TIM_SetCompare1(MOTION_TIMER, capture + manager_motion_period); + // get the target angles from all modules + // manager_get_target_position(); // call the action process // action_process(); // call the joint motion process @@ -96,8 +114,9 @@ void MOTION_TIMER_IRQHandler(void) // balance the robot // manager_balance(); // send the motion commands to the servos - // manager_send_motion_command(); - manager_get_current_position(); + manager_send_motion_command(); + // get the disabled servos position + // manager_get_current_position(); } } @@ -195,6 +214,8 @@ void manager_init(uint16_t period_us) manager_servos[i].current_angle=manager_value_to_angle(i,manager_servos[i].current_value); ram_data[BIOLOID_MM_SERVO0_CUR_POS_L+i*2]=(manager_servos[i].current_angle&0xFF); ram_data[BIOLOID_MM_SERVO0_CUR_POS_H+i*2]=(manager_servos[i].current_angle>>8); + // set the action current angles + action_current_angles[manager_servos[i].id]=manager_servos[i].current_angle<<16; manager_num_servos++; } else @@ -276,13 +297,13 @@ inline uint8_t manager_get_num_servos(void) void manager_set_module(uint8_t servo_id,TModules module) { - if(servo_id>0 || servo_id<MANAGER_MAX_NUM_SERVOS) + if(servo_id>=0 && servo_id<MANAGER_MAX_NUM_SERVOS) manager_servos[servo_id].module=module; } inline TModules manager_get_module(uint8_t servo_id) { - if(servo_id>0 || servo_id<MANAGER_MAX_NUM_SERVOS) + if(servo_id>=0 && servo_id<MANAGER_MAX_NUM_SERVOS) return manager_servos[servo_id].module; else return MM_NONE; @@ -290,19 +311,22 @@ inline TModules manager_get_module(uint8_t servo_id) inline void manager_enable_servo(uint8_t servo_id) { - if(servo_id>0 || servo_id<MANAGER_MAX_NUM_SERVOS) + if(servo_id>=0 && servo_id<MANAGER_MAX_NUM_SERVOS) + { manager_servos[servo_id].enabled=0x01; + gpio_toggle_led(WEST_LED); + } } inline void manager_disable_servo(uint8_t servo_id) { - if(servo_id>0 || servo_id<MANAGER_MAX_NUM_SERVOS) + if(servo_id>=0 && servo_id<MANAGER_MAX_NUM_SERVOS) manager_servos[servo_id].enabled=0x00; } inline uint8_t manager_is_servo_enabled(uint8_t servo_id) { - if(servo_id>0 || servo_id<MANAGER_MAX_NUM_SERVOS) + if(servo_id>=0 && servo_id<MANAGER_MAX_NUM_SERVOS) return manager_servos[servo_id].enabled; else return 0x00; diff --git a/src/system_stm32f4xx.c b/src/system_stm32f4xx.c index b6a72172346cec06c2cdf05e8277e6466b5fb579..7290a9aca28d73a57011380df2d52a330faab09f 100644 --- a/src/system_stm32f4xx.c +++ b/src/system_stm32f4xx.c @@ -260,6 +260,8 @@ void SystemInit(void) #else SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */ #endif + + NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); } /** diff --git a/src/time.c b/src/time.c index 343f2cc205d2b34e7642a26e3026860be5b27a70..e36a0d2faf74a0998930771b2746028a49c1e8df 100644 --- a/src/time.c +++ b/src/time.c @@ -20,6 +20,7 @@ void time_init(void) { // set the time base to 1ms SysTick_Config(SystemCoreClock / 1000); + NVIC_SetPriority(SysTick_IRQn,0); } void delay_ms(__IO uint32_t time)