Go Down

Topic: ayuda proyecto robot android sensor ultrasonico (Read 4644 times) previous topic - next topic

poli88

Apr 10, 2012, 01:14 pm Last Edit: Apr 11, 2012, 12:02 pm by poli Reason: 1
hola, me preguntaba si alguno de vosotros me podría decir como programar un SRF05 para que cuando detecte un obstaculo como por ejemplo una pared pare los motores de un robot. a continuacion os dejo el codigo que he implementado hasta ahora y una foto. el robot lo estoy controlando con una pequeña aplicación que he hecho para un móvil android. actualmente tengo el SRF05 montado en un servo que gire de izquierda a derecha constantemente  

Code: [Select]
#include <Servo.h>
Servo servoloco;  // create servo object to control a servo
char puertoserie; // variable to receive data from the serial port

int motor_izquierda[] = {3, 5};
int motor_derecha[] = {6, 9};
int val = 0;       // variable to store the value coming from the sensor
void setup() {
 servoloco.attach(11);  // attaches the servo on pin 11 to the servo object v
 Serial.begin(9600);       // start serial communication at 9600bps

int i;
for(i = 0; i < 2; i++){
pinMode(motor_izquierda[i], OUTPUT);
pinMode(motor_derecha[i], OUTPUT);
}
}
void loop() {
 if( Serial.available() )       // if data is available to read
 {
   puertoserie = Serial.read();         // read it and store it in 'val'
 }
 if( puertoserie == 'w' )              
 {
   go_forward_both_motors_on();  
 }
  if( puertoserie == 's' )              
 {
   go_backwards_both_motors_on();
 }
  if( puertoserie == 'd' )              
 {
   go_right();  
 }
  if( puertoserie == 'a' )              
 {
   go_left();  
 }
 if( puertoserie == 'q' )              
 {
   stop_motors_both_motors_off();
 }
 if ( puertoserie == 'o' )
 {
 }
if ( puertoserie == 'z' )
{
 stop_motors_both_motors_off();
}
{
 servoloco.write(10);                  // sets the servo position according to the scaled value
 delay(600);                           // waits for the servo to get there
 servoloco.write(170);                  // sets the servo position according to the scaled value
 delay(600);                           // waits for the servo to get there
}
}

void stop_motors_both_motors_off(){
digitalWrite(motor_izquierda[0], LOW);
digitalWrite(motor_izquierda[1], LOW);

digitalWrite(motor_derecha[0], LOW);
digitalWrite(motor_derecha[1], LOW);
}

void go_left(){
digitalWrite(motor_izquierda[0], HIGH);
digitalWrite(motor_izquierda[1], LOW);

digitalWrite(motor_derecha[0], HIGH);
digitalWrite(motor_derecha[1], LOW);
}

void go_right(){
digitalWrite(motor_izquierda[0], LOW);
digitalWrite(motor_izquierda[1], HIGH);

digitalWrite(motor_derecha[0], LOW);
digitalWrite(motor_derecha[1], HIGH);
}

void go_forward_both_motors_on(){
digitalWrite(motor_izquierda[0], LOW);
digitalWrite(motor_izquierda[1], HIGH);

digitalWrite(motor_derecha[0], HIGH);
digitalWrite(motor_derecha[1], LOW);
}

void go_backwards_both_motors_on(){
digitalWrite(motor_izquierda[0], HIGH);
digitalWrite(motor_izquierda[1], LOW);

digitalWrite(motor_derecha[0], LOW);
digitalWrite(motor_derecha[1], HIGH);
}


Gracias  por adelantado

curro92

Hola,
puedes buscar en Google SRF05 Arduino, hay mucha info. Por ejemplo, http://jsadalid.wordpress.com/category/ultrasonico-srf05-y-arduino/

a9965

Me gustaría saber que pautas has seguido para montar la aplicación en Android.
Otra cosa,estaría bien que en el título especificaras de que va el asunto. Lo digo porque sino sería un caos ésto.
Gracias

poli88

la aplicación android la e montado con el appinventor de google, es sencillisimo usarlo, tarde media hora en hacer la aplicación y no soy ningún fuera de serie programando. a todo esto, es posible parar los motores del robot a determinada distancia para que no colisione con cualquier objeto?

gracias

a9965

if( puertoserie == 'w' )               
  {
    adelante();
    if( distanciasensor<10){
    stop();
    dalavuelta();
}


Siguiendo tu código ésto es lo que yo haría. 
Te lo pongo a modo esquema. Espero que lo entiendas.

a9965

#5
Apr 11, 2012, 01:26 pm Last Edit: Apr 12, 2012, 12:13 am by a9965 Reason: 1
Otra solución sería usando ésto:

|| (OR lógico)

Verdadero si alguno de los dos operadores es Verdadero, por ejemplo:
if ( puertoserie == 'S' )  || distanciasensor < 10) {
stop();
}

Ésto lo que hace es parar el robot si:
1. Se lo has mandado mediante la aplicación, O SI
2. Si la distancia es menor a 10


Personalmente elegiría ésta. De alguna manera es más certera o 'lógica'.

poli88

#6
Apr 12, 2012, 10:55 am Last Edit: Apr 12, 2012, 11:08 am by poli Reason: 1
@a9965 muchísimas gracias!
el codigo lo e dejado asi:
Code: [Select]
if( puertoserie == 'w' )              
 {
   go_forward_both_motors_on();
 }
     if (initPin <10)
     {
       stop_motors_both_motors_off();


aun no lo e probado, dejándolo así tu crees que funcionara de momento? osea que antes de colisionar se detendrá? como puedes ver e puesto el initPin, es esa la declaración que debo usar? o debería poner echoPin o pulseTime.

gracias por adelantado

yopero

Code: [Select]

do
{
    go_forward_both_motors_on();
} while (initPin >=10);

   maniobra_escape();

void maniobra_escape()/*parar e ir a la izquierda o  el algoritmo que se te ocurra */
    {
     stop_motors_both_motors_off();
     go_left();
   }


poli88

he intentado hacer eso, pero nada... cuando le digo de tirar para delante no funciona, y si conecto el servo y el lcd al circuito nada sucede... estoy bastante desesperado, alguien podría solucionarme la papeleta?

gracias y un saludo!

sixto


Code: [Select]
#include <Servo.h>
#include <LiquidCrystal.h>
Servo servoloco;  // create servo object to control a servo
char puertoserie; // variable to receive data from the serial port


int motor_izquierda[] = {3, 5};
int motor_derecha[] = {6, 9};
int val = 0;       // variable to store the value coming from the sensor


#define echoPin 36             // the SRF05's echo pin
#define initPin 37             // the SRF05's init pin
unsigned long pulseTime = 0;  // variable for reading the pulse
LiquidCrystal lcd(22, 24, 26, 28, 30, 32);

void setup() {
  servoloco.attach(11);  // attaches the servo on pin 11 to the servo object v
  Serial.begin(9600);       // start serial communication at 9600bps

int i;
for(i = 0; i < 2; i++){
pinMode(motor_izquierda[i], OUTPUT);
pinMode(motor_derecha[i], OUTPUT);

lcd.begin(16, 2);
pinMode(initPin, OUTPUT);
pinMode(echoPin, INPUT);
}
}


void loop() {
  if( Serial.available() )       // if data is available to read
  {
    puertoserie = Serial.read();         // read it and store it in 'val'
  }
  if( puertoserie == 'w'  )
//do
  {
    go_forward_both_motors_on();
  }
 
  //if (pulseTime<=15);
  //{
  //stop_motors_both_motors_off2();
  //}
     //while  (initPin >=15);
      //{
       // stop_motors_both_motors_off2();     
     // }
   if( puertoserie == 's' )               
  {
   
    go_forward_both_motors_on();
  }
   if( puertoserie == 'd' )               
  {
    go_right(); 
  }
   if( puertoserie == 'a' )             
  {
    go_left(); 
  }
  if( puertoserie == 'q' )             
  {
    stop_motors_both_motors_off();
  }
  if ( puertoserie == 'o' )
  {
  }
if ( puertoserie == 'z' )
{
  stop_motors_both_motors_off();
}


{
  servoloco.write(10);                  // sets the servo position according to the scaled value
  delay(600);                           // waits for the servo to get there
  servoloco.write(170);                  // sets the servo position according to the scaled value
  delay(600);                           // waits for the servo to get there
}
{
digitalWrite(initPin, HIGH);
delayMicroseconds(10);
digitalWrite(initPin, LOW);
pulseTime = pulseIn(echoPin, HIGH);
lcd.setCursor(0,0);
lcd.print(pulseTime / 58, DEC);
//lcd.clear();
lcd.print("cm");
delay(100);
//lcd.clear();
}
}
void stop_motors_both_motors_off(){
digitalWrite(motor_izquierda[0], LOW);
digitalWrite(motor_izquierda[1], LOW);

digitalWrite(motor_derecha[0], LOW);
digitalWrite(motor_derecha[1], LOW);
}

void go_left(){
digitalWrite(motor_izquierda[0], HIGH);
digitalWrite(motor_izquierda[1], LOW);

digitalWrite(motor_derecha[0], HIGH);
digitalWrite(motor_derecha[1], LOW);
}

void go_right(){
digitalWrite(motor_izquierda[0], LOW);
digitalWrite(motor_izquierda[1], HIGH);

digitalWrite(motor_derecha[0], LOW);
digitalWrite(motor_derecha[1], HIGH);
}

void go_forward_both_motors_on(){
digitalWrite(motor_izquierda[0], LOW);
digitalWrite(motor_izquierda[1], HIGH);

digitalWrite(motor_derecha[0], HIGH);
digitalWrite(motor_derecha[1], LOW);
}

void go_backwards_both_motors_on(){
digitalWrite(motor_izquierda[0], HIGH);
digitalWrite(motor_izquierda[1], LOW);

digitalWrite(motor_derecha[0], LOW);
digitalWrite(motor_derecha[1], HIGH);
}

void stop_motors_both_motors_off2(){
digitalWrite(motor_izquierda[0], LOW);
digitalWrite(motor_izquierda[1], LOW);

digitalWrite(motor_derecha[0], LOW);
digitalWrite(motor_derecha[1], LOW);
}

Cheyenne

Hay alguna cosa que no entiendo. No sé lo que quieres hacer con el barrido del sensor en el servo. Creo que lo primero deberías explicar bien qué es lo que quieres que haga tu robot, éste es el punto de partida que tienes que tener muy claro. Por ejemplo el barrido que haces está con delay así que sólo tomas medidas del sensor cuando el servo está en las dos posiciones extremas. ¿Es eso lo que quieres?

Yo en principio veo dos formas de funcionamiento. Una fácil sería dejar el sensor fijo mirando al frente. Entonces empezamos a mover el robot según los comandos que envías y siempre que el sensor no detecte obstáculo. En cuanto detecte un obstáculo hay que hacer girar el robot hasta que vea vía libre. En este momento también hay que decidir si el robot toma una instrucción de movimiento automática o si ejecuta el movimiento que se le dio con la última instrucción.

La otra opción, instalando el sensor en el servo, la veo más para implementar un funcionamiento más autónomo que guiado. Podría ser programar el robot para estar continuamente tomando lecturas el sensor en los 360 grados y hacer que el robot se oriente hacia donde detecte que hay más espacio. Esto lo veo ya algo complicado de programar más que nada porque por el servo sabes la posición en la que se detecta el mayor espacio pero después no tienes un control exacto de lo que gira el robot para ponerlo en la dirección exacta.
También podría ser que el robot siguiera las instrucciones enviadas y cuando detectara un obstáculo se pare, haga barrido con el sensor los 360 grados, detecte la dirección de máxima distancia, posiciones el robot en esa dirección y siga.

¿Qué opciones de éstas o alguna otra es la que quieres hacer?
http://cuadricopterodiyarduino.blogspot.com/

Go Up