0
Offline
Newbie
Karma: 0
Posts: 3
Arduino rocks
|
 |
« on: March 12, 2010, 04:08:45 pm » |
Buenas tengo una placa orangutan LV-168 que la programamos con arduino, tenemos que hacer una espera activa, o eso nos han dixo los profesores. EL ROBOT se encuentra dando vueltas, cuando detecte presencia cn GP2d12 tiene que empujar el oponente y si mientras que empuja o da vueltas detecta linea blanca con el sensores de linea tiene q salir de empujar o dar vueltas y modificar la posicion hasta que no detecte linea blanca XX's segundos, y que vuela al bucle otra vez, este es el codigo que tenemos hasta ahora:
void loop() // S'executa permanentment en forma de bucle { gp2d12Adc = analog.readAverage(GP2D12, NUM_MOSTRES_GP2); // Llegeix el canal 5 del ADC corresponent al sensor GP2D12 // Retorna un valor entre 0 - 1023 (0V - 5V) // Fa 'NUM_MOSTRES_GP2' mostres (en el nostre cas 20) i en fa la mitja // Cada mostra tarda aprox. 100us, per tant, una lectura completa en el // nostre cas, suposa aprox. 100us x 20 = 2ms gp2d12mV = analog.toMillivolts(gp2d12Adc); // Converteix el valor format 10bits a Milivolts de l'entrada Analògica (0 - 5000mV) lcd.gotoXY(0,0); // Situa cursor a XY=(0,0) -> posició 0, línea 0 lcd.print("GP2:"); // Mostra text per LCD (8 caràcters) sobrescriu contingut lcd.print(gp2d12Adc); // Printa valor format 10bits a continuació de "GP2:" lcd.print(" "); // Printa 4 espais a continuació per si es passa d'escriure 4 dígits a 3, 2 o 1 lcd.gotoXY(2,1); // Situa cursor a XY=(2,1) -> posició 2, línea 1 lcd.print(gp2d12mV); // Printa valor format Milivolts lcd.print("mV"); // Printa "mV" a continuació del valor en milivolts lcd.print(" "); // Printa 4 espais a continuació per si es passa d'escriure 4 dígits a 3, 2 o 1
qtr.read(sensorsLinea); // Llegeix els sensors configurats, escriu lectures a 'sensorsLinea[]'
if (sensorsLinea[0] < LLINDAR_LINEA) { motors.setSpeeds(-motorSpeed, motorSpeed); //Quan detecta sensor dret es mou eskerra delay(750); motors.setSpeeds(motorSpeed, motorSpeed); delay(300); } else if (sensorsLinea[5] < LLINDAR_LINEA) //Quan detecta sensor eskerre es mou dreta { motors.setSpeeds(motorSpeed, -motorSpeed); delay(750); motors.setSpeeds(motorSpeed, motorSpeed); delay(300); } else // QUAN ESTEM SOBRE NEGRE { for(int i=0; i<300; i++) { gp2d12mV = analog.toMillivolts(analog.readAverage(GP2D12, NUM_MOSTRES_GP2)); // Llegeix el canal 5 del ADC corresponent al sensor GP2D12 if(gp2d12mV > LLINDAR_GP2D12) // DETECTEM RIVAL { leds.red(HIGH); // Si detecta, Enciende LED vermell motors.setSpeeds(motorSpeed, motorSpeed); if((sensorsLinea[0] < LLINDAR_LINEA) | (sensorsLinea[5] < LLINDAR_LINEA)) // QUAN DETECTEM LA LÍNEA, TIREM ENRERE DURANT 2SEGONS { motors.setSpeeds(0,0); //if (i>10) //evitar rebots i=300; //sortida } } else { leds.red(LOW); // Apaguem LED vermell motors.setSpeeds(-motorSpeed, motorSpeed); // girem if((sensorsLinea[0] < LLINDAR_LINEA) | (sensorsLinea[5] < LLINDAR_LINEA)) // QUAN DETECTEM LA LÍNEA, TIREM ENRERE DURANT 2SEGONS { motors.setSpeeds(0,0); //if (i>10) i=300; } }
delay (10);
llinadr linea= al valor que nos dice si es blanco o negro
el problema que tenemos es que cuando detecta oponente empuja pero pasa por la linea blanca y no retrocede, nose si es mejor parar los motores un instante y luego retrocenda o no se que podemos hacer..
Gracias
|