Example #1
0
 void reacttoprox()
 {
 	int proxy0;
	int proxy1;
	int proxy2;
	int proxy3;
	int proxy4;
	int proxy5;
	int proxy6;
	int proxy7;

	e_init_motors();
 	e_init_port();
	e_init_sound();
	e_set_speed_left(0);
	e_set_speed_right(0);
	e_start_agendas_processing();
	e_init_ad_scan(ALL_ADC);
 	while(1)
 	{
 		long i;
 		proxy0 = e_get_prox(0);
		proxy1 = e_get_prox(1);
 		proxy2 = e_get_prox(2);
 		proxy3 = e_get_prox(3);
 		proxy4 = e_get_prox(4);
 		proxy5 = e_get_prox(5);
 		proxy6 = e_get_prox(6);
		proxy7 = e_get_prox(7);

 		if(proxy0 > 100){
 			e_set_speed_left(1000);
			e_set_speed_right(800);
			LED0 = 1;
			LED1 = 0;
			LED2 = 0;
			LED3 = 0;
			LED4 = 0;
			LED5 = 0;
			LED6 = 0;
			LED7 = 0;
			}
		else if(proxy1 > 100){
			LED0 = 1;
			LED1 = 1;
			LED2 = 1;
			LED3 = 1;
			LED4 = 1;
			LED5 = 1;
			LED6 = 1;
			LED7 = 1;
			e_set_speed_left(0);
			e_set_speed_right(0);
			long j;
			e_play_sound(7294, 3732);
			for(j=0; j<4000000; j++) {asm("nop");}
 			}
		else if(proxy2 > 100){
 			e_set_speed_left(1000);
 			LED0 = 0;
			LED1 = 0;
			LED2 = 1;
			LED3 = 0;
			LED4 = 0;
			LED5 = 0;
			LED6 = 0;
			LED7 = 0;
		}
		else if(proxy3 > 100){
 			e_set_speed_left(-1000);
 			LED0 = 0;
			LED1 = 0;
			LED2 = 0;
			LED3 = 1;
			LED4 = 0;
			LED5 = 0;
			LED6 = 0;
			LED7 = 0;
		}
		else if(proxy4 > 100){
			e_set_speed_right(-1000);
 			LED0 = 0;
			LED1 = 0;
			LED2 = 0;
			LED3 = 0;
			LED4 = 1;
			LED5 = 0;
			LED6 = 0;
			LED7 = 0;
		}
		else if(proxy5 > 100){
			e_set_speed_right(1000);
 			LED0 = 0;
			LED1 = 0;
			LED2 = 0;
			LED3 = 0;
			LED4 = 0;
			LED5 = 1;
			LED6 = 0;
			LED7 = 0;
		}
		else if(proxy6 > 100){
			e_set_speed_right(1000);
 			LED0 = 0;
			LED1 = 0;
			LED2 = 0;
			LED3 = 0;
			LED4 = 0;
			LED5 = 0;
			LED6 = 1;
			LED7 = 0;
		}
		else if(proxy7 > 100){
			e_set_speed_right(1000);
			e_set_speed_left(800);
 			LED0 = 0;
			LED1 = 0;
			LED2 = 0;
			LED3 = 0;
			LED4 = 0;
			LED5 = 0;
			LED6 = 0;
			LED7 = 1;
		}			
 		else {
			e_set_speed_left(0);
			e_set_speed_right(0);
 			LED0 = 0;
			LED1 = 0;
			LED2 = 0;
			LED3 = 0;
			LED4 = 0;
			LED5 = 0;
			LED6 = 0;
			LED7 = 0;
			}
		
 		
 	}
 }
Example #2
0
/*! \brief The "main" function of the demo */
void run_accelerometer() {
	int accx, accy, accz;
	long ampl;
	long amplavg;
//	char buffer[80];
	int state;
	int lednum;
	double angle;
	int soundsel;

	// Init sound
	e_init_port();
    e_init_ad_scan(ALL_ADC);
	e_init_sound();
#ifdef MOVE
	e_init_motors();
	e_start_agendas_processing();
#endif

	// Calibrate accelerometers
	e_set_led(8, 1);
	e_acc_calibr();
	e_set_led(8, 0);

#ifdef MOVE
	// Move forwards
	e_set_speed_left(100);
	e_set_speed_right(100);
#endif
	// Detect free fall and shocks
	state=STATE_NORMAL;
	amplavg=1000;
	while (1) {

		accx = e_get_acc(0);
		accy = e_get_acc(1);
		accz = e_get_acc(2) + 744; //744 is 1g

		if ((accz<0) && (accz>-600)) {accz=0;}
		ampl=((long)(accx)*(long)(accx))+((long)(accy)*(long)(accy))+((long)(accz)*(long)(accz));
		amplavg=(amplavg>>2)+ampl;

		if (! e_dci_unavailable) {
			if (state!=STATE_NORMAL) {
				state=STATE_NORMAL;
				e_set_led(8, 0);
				e_set_body_led(0);
			}
		}

		if (amplavg<1000) {
			if (state!=STATE_FREEFALL) {
				state=STATE_FREEFALL;
				e_stop_flag=1;
				while (e_dci_unavailable);
//				sprintf(buffer, "Free fall: %ld, (%d, %d, %d) -> (%ld)\r\n", amplavg, accx, accy, accz, ampl);
//				e_send_uart1_char(buffer, strlen(buffer));
				e_play_sound(11028, 8016);
				e_set_body_led(1);
				e_set_led(8, 0);
			}
		} else if (amplavg>4000000) {
			if (state!=STATE_SHOCK) {
				state=STATE_SHOCK;
				e_stop_flag=1;
				while (e_dci_unavailable);
//				sprintf(buffer, "Shock: %ld, (%d, %d, %d) -> (%ld)\r\n", amplavg, accx, accy, accz, ampl);
//				e_send_uart1_char(buffer, strlen(buffer));
				soundsel=(accx & 3);
				if (soundsel==0) {
					e_play_sound(0, 2112);
				} else if (soundsel==1) {
					e_play_sound(2116, 1760);
				} else {
					e_play_sound(3878, 3412);
				}
				e_set_body_led(0);

				angle=atan2(accy, accx);
				lednum=floor(atan2(accy, accx)/PI*4+PI/2+PI/8);
				while (lednum>8) {lednum=lednum-8;}
				while (lednum<0) {lednum=lednum+8;}
//				sprintf(buffer, "(x=%d, y=%d) -> angle=%f, led=%d\r\n", accx, accy, angle, lednum);
//				e_send_uart1_char(buffer, strlen(buffer));
				e_set_led(lednum, 1);
			}
		}
	}
}
Example #3
0
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);