void turn_direction(float direction) { int end_turn; if (direction < PI) // turn clockwise { e_set_steps_left(0); e_set_speed_left(TURN_SPEED); // motor speed in steps/s e_set_speed_right(-TURN_SPEED); // motor speed in steps/s // calculate how many steps the robot needs to turn end_turn = (int)(STEPS_FOR_2PI*(direction/(2*PI))); while(e_get_steps_left() < end_turn){ flick_led(); } // turn until done } else // turn counterclockwise { e_set_steps_right(0); e_set_speed_left(-TURN_SPEED); // motor speed in steps/s e_set_speed_right(TURN_SPEED); // motor speed in steps/s // calculate how many steps the robot needs to turn end_turn = (int)(STEPS_FOR_2PI*((2*PI-direction)/(2*PI))); while(e_get_steps_right() < end_turn){ flick_led(); } // turn until done } // stop motors e_set_speed_left(0); // motor speed in steps/s e_set_speed_right(0); // motor speed in steps/s }
void send_steps() { int steps_right,steps_left; steps_right = e_get_steps_right(); steps_left = e_get_steps_left(); e_set_steps_right(0); e_set_steps_left(0); ve_send_int(steps_right); ve_send_int(steps_left); }
int run_asercom(void) { static char c1,c2,wait_cam=0; static int i,j,n,speedr,speedl,positionr,positionl,LED_nbr,LED_action,accx,accy,accz,sound; static int cam_mode,cam_width,cam_heigth,cam_zoom,cam_size,cam_x1,cam_y1; static char first=0; char *ptr; static int mod, reg, val; #ifdef IR_RECEIVER char ir_move = 0,ir_address= 0, ir_last_move = 0; #endif static TypeAccSpheric accelero; //static TypeAccRaw accelero_raw; int use_bt=0; //e_init_port(); // configure port pins //e_start_agendas_processing(); e_init_motors(); //e_init_uart1(); // initialize UART to 115200 Kbaud //e_init_ad_scan(); selector = getselector(); //SELECTOR0 + 2*SELECTOR1 + 4*SELECTOR2 + 8*SELECTOR3; if(selector==10) { use_bt=0; } else { use_bt=1; } #ifdef FLOOR_SENSORS if(use_bt) { // the I2C must remain disabled when using the gumstix extension e_i2cp_init(); } #endif #ifdef IR_RECEIVER e_init_remote_control(); #endif if(RCONbits.POR) { // reset if power on (some problem for few robots) RCONbits.POR=0; RESET(); } /*read HW version from the eeprom (last word)*/ static int HWversion=0xFFFF; ReadEE(0x7F,0xFFFE,&HWversion, 1); /*Cam default parameter*/ cam_mode=RGB_565_MODE; cam_width=40; // DEFAULT_WIDTH; cam_heigth=40; // DEFAULT_HEIGHT; cam_zoom=8; cam_size=cam_width*cam_heigth*2; if(use_bt) { e_poxxxx_init_cam(); //e_po6030k_set_sketch_mode(E_PO6030K_SKETCH_COLOR); e_poxxxx_config_cam((ARRAY_WIDTH -cam_width*cam_zoom)/2,(ARRAY_HEIGHT-cam_heigth*cam_zoom)/2,cam_width*cam_zoom,cam_heigth*cam_zoom,cam_zoom,cam_zoom,cam_mode); e_poxxxx_set_mirror(1,1); e_poxxxx_write_cam_registers(); } e_acc_calibr(); if(use_bt) { uart1_send_static_text("\f\a" "WELCOME to the SerCom protocol on e-Puck\r\n" "the EPFL education robot type \"H\" for help\r\n"); } else { uart2_send_static_text("\f\a" "WELCOME to the SerCom protocol on e-Puck\r\n" "the EPFL education robot type \"H\" for help\r\n"); } while(1) { if(use_bt) { while (e_getchar_uart1(&c)==0) #ifdef IR_RECEIVER { ir_move = e_get_data(); ir_address = e_get_address(); if (((ir_address == 0)||(ir_address == 8))&&(ir_move!=ir_last_move)){ switch(ir_move) { case 1: speedr = SPEED_IR; speedl = SPEED_IR/2; break; case 2: speedr = SPEED_IR; speedl = SPEED_IR; break; case 3: speedr = SPEED_IR/2; speedl = SPEED_IR; break; case 4: speedr = SPEED_IR; speedl = -SPEED_IR; break; case 5: speedr = 0; speedl = 0; break; case 6: speedr = -SPEED_IR; speedl = SPEED_IR; break; case 7: speedr = -SPEED_IR; speedl = -SPEED_IR/2; break; case 8: speedr = -SPEED_IR; speedl = -SPEED_IR; break; case 9: speedr = -SPEED_IR/2; speedl = -SPEED_IR; break; case 0: if(first==0){ e_init_sound(); first=1; } e_play_sound(11028,8016); break; default: speedr = speedl = 0; } ir_last_move = ir_move; e_set_speed_left(speedl); e_set_speed_right(speedr); } } #else ; #endif } else { while (e_getchar_uart2(&c)==0) #ifdef IR_RECEIVER { ir_move = e_get_data(); ir_address = e_get_address(); if (((ir_address == 0)||(ir_address == 8))&&(ir_move!=ir_last_move)){ switch(ir_move) { case 1: speedr = SPEED_IR; speedl = SPEED_IR/2; break; case 2: speedr = SPEED_IR; speedl = SPEED_IR; break; case 3: speedr = SPEED_IR/2; speedl = SPEED_IR; break; case 4: speedr = SPEED_IR; speedl = -SPEED_IR; break; case 5: speedr = 0; speedl = 0; break; case 6: speedr = -SPEED_IR; speedl = SPEED_IR; break; case 7: speedr = -SPEED_IR; speedl = -SPEED_IR/2; break; case 8: speedr = -SPEED_IR; speedl = -SPEED_IR; break; case 9: speedr = -SPEED_IR/2; speedl = -SPEED_IR; break; case 0: if(first==0){ e_init_sound(); first=1; } e_play_sound(11028,8016); break; default: speedr = speedl = 0; } ir_last_move = ir_move; e_set_speed_left(speedl); e_set_speed_right(speedr); } } #else ; #endif } if (c<0) { // binary mode (big endian) i=0; do { switch(-c) { case 'a': // Read acceleration sensors in a non // filtered way, some as ASCII accx = e_get_acc_filtered(0, 1); accy = e_get_acc_filtered(1, 1); accz = e_get_acc_filtered(2, 1); //accx = e_get_acc(0); //too much noisy //accy = e_get_acc(1); //accz = e_get_acc(2); buffer[i++] = accx & 0xff; buffer[i++] = accx >> 8; buffer[i++] = accy & 0xff; buffer[i++] = accy >> 8; buffer[i++] = accz & 0xff; buffer[i++] = accz >> 8; /* accelero_raw=e_read_acc_xyz(); ptr=(char *)&accelero_raw.acc_x; buffer[i++]=(*ptr); ptr++; buffer[i++]=(*ptr); ptr++; ptr=(char *)&accelero_raw.acc_y; buffer[i++]=(*ptr); ptr++; buffer[i++]=(*ptr); ptr++; ptr=(char *)&accelero_raw.acc_z; buffer[i++]=(*ptr); ptr++; buffer[i++]=(*ptr); ptr++; */ break; case 'A': // read acceleration sensors accelero=e_read_acc_spheric(); ptr=(char *)&accelero.acceleration; buffer[i++]=(*ptr); ptr++; buffer[i++]=(*ptr); ptr++; buffer[i++]=(*ptr); ptr++; buffer[i++]=(*ptr); ptr=(char *)&accelero.orientation; buffer[i++]=(*ptr); ptr++; buffer[i++]=(*ptr); ptr++; buffer[i++]=(*ptr); ptr++; buffer[i++]=(*ptr); ptr=(char *)&accelero.inclination; buffer[i++]=(*ptr); ptr++; buffer[i++]=(*ptr); ptr++; buffer[i++]=(*ptr); ptr++; buffer[i++]=(*ptr); break; case 'b': // battery ok? buffer[i++] = BATT_LOW; break; case 'D': // set motor speed if(use_bt) { while (e_getchar_uart1(&c1)==0); while (e_getchar_uart1(&c2)==0); } else { while (e_getchar_uart2(&c1)==0); while (e_getchar_uart2(&c2)==0); } speedl=(unsigned char)c1+((unsigned int)c2<<8); if(use_bt) { while (e_getchar_uart1(&c1)==0); while (e_getchar_uart1(&c2)==0); } else { while (e_getchar_uart2(&c1)==0); while (e_getchar_uart2(&c2)==0); } speedr=(unsigned char)c1+((unsigned int)c2<<8); e_set_speed_left(speedl); e_set_speed_right(speedr); break; case 'E': // get motor speed buffer[i++] = speedl & 0xff; buffer[i++] = speedl >> 8; buffer[i++] = speedr & 0xff; buffer[i++] = speedr >> 8; break; case 'I': // get camera image if(use_bt) { e_poxxxx_launch_capture(&buffer[i+3]); wait_cam=1; buffer[i++]=(char)cam_mode&0xff;//send image parameter buffer[i++]=(char)cam_width&0xff; buffer[i++]=(char)cam_heigth&0xff; i+=cam_size; } break; case 'L': // set LED if(use_bt) { while (e_getchar_uart1(&c1)==0); while (e_getchar_uart1(&c2)==0); } else { while (e_getchar_uart2(&c1)==0); while (e_getchar_uart2(&c2)==0); } switch(c1) { case 8: if(use_bt) { e_set_body_led(c2); } break; case 9: if(use_bt) { e_set_front_led(c2); } break; default: e_set_led(c1,c2); break; } break; case 'M': // optional floor sensors #ifdef FLOOR_SENSORS if(use_bt) { e_i2cp_init(); e_i2cp_enable(); e_i2cp_read(0xC0, 0); for(j = 0; j < 6; j++) { if (j % 2 == 0) buffer[i++] = e_i2cp_read(0xC0, j + 1); else buffer[i++] = e_i2cp_read(0xC0, j - 1); } #ifdef CLIFF_SENSORS for(j=13; j<17; j++) { if (j % 2 == 0) buffer[i++] = e_i2cp_read(0xC0, j - 1); else buffer[i++] = e_i2cp_read(0xC0, j + 1); } #endif e_i2cp_disable(); } #else for(j=0;j<6;j++) buffer[i++]=0; #endif break; case 'N': // read proximity sensors if(use_bt) { for(j=0;j<8;j++) { n=e_get_calibrated_prox(j); // or ? n=e_get_prox(j); buffer[i++]=n&0xff; buffer[i++]=n>>8; } } else { for(j=0;j<10;j++) { n=e_get_calibrated_prox(j); // or ? n=e_get_prox(j); buffer[i++]=n&0xff; buffer[i++]=n>>8; } } break; case 'O': // read light sensors if(use_bt) { for(j=0;j<8;j++) { n=e_get_ambient_light(j); buffer[i++]=n&0xff; buffer[i++]=n>>8; } } else { for(j=0;j<10;j++) { n=e_get_ambient_light(j); buffer[i++]=n&0xff; buffer[i++]=n>>8; } } break; case 'Q': // read encoders n=e_get_steps_left(); buffer[i++]=n&0xff; buffer[i++]=n>>8; n=e_get_steps_right(); buffer[i++]=n&0xff; buffer[i++]=n>>8; break; case 'u': // get last micro volumes n = e_get_micro_volume(0); buffer[i++] = n & 0xff; buffer[i++] = n >> 8; n = e_get_micro_volume(1); buffer[i++] = n & 0xff; buffer[i++] = n >> 8; n = e_get_micro_volume(2); buffer[i++] = n & 0xff; buffer[i++] = n >> 8; break; case 'U': // get micro buffer ptr=(char *)e_mic_scan; if(use_bt) { e_send_uart1_char(ptr,600);//send sound buffer } else { e_send_uart2_char(ptr,600);//send sound buffer } n=e_last_mic_scan_id;//send last scan buffer[i++]=n&0xff; break; default: // silently ignored break; } if(use_bt) { while (e_getchar_uart1(&c)==0); // get next command } else { while (e_getchar_uart2(&c)==0); // get next command } } while(c);