Translate

lunes, 24 de agosto de 2015

Programando con el sensor de ultrasonidos

Hemos pensado introducir este sensor para dotar de autonomia a nuestro robot. Lo que pretendemos hacer es que el robot siempre avance hacia delante y que a su misma vez grabe o envíe imágenes a tiempo real del lugar por el que está pasando (como el robot Curiosity que explora la superficie de Marte), pero si encuentra obstáculos en su camino tiene que esquivarlos. 

El sensor irá montado en la parte delantera del robot y cuando encuentre un objeto que obstaculice su paso, frenará y retrocederá unos cinco centímetros. Esto le dará suficiente espacio para girar a izquierda o a derecha. Cuando haya hecho este giro el robot continuará su rumbo hacia delante hasta encontrar otro objeto.

También se puede utilizar el sensor de diferente forma; se puede situar en la parte delantera inferior apuntando al suelo y si encuentra un vacío donde el robot se pueda caer, frene y retroceda. 

Antes de conectar los motores hemos hecho una prueba con un led: cuando el sensor detecte un objeto a una cierta distancia el led se encenderá y si no hay obstáculos, se apagará. 
Para poder visualizar la distancia medida por el sensor en centímetros tenemos que abrir el monitor serie de Arduino, haciendo clic en la lupa que aparece en la esquina superior derecha del IDE, ahí se nos abrirá una nueva pestaña donde podemos ver la información que capta el sensor.

long distancia;  // variable para el cálculo de la distancia detectada por el sensor
long tiempo;     // variable para el cálculo de la distancia detectada por el sensor
int trig = 9;    // emisor del ultrasonido conectado al pin digital 9
int echo = 8;    // receptor del ultrasonido conectado al pin digital 8
int led = 13;    // led conectado al pin digital 13

void setup()
{
 Serial.begin(9600);    // establecimiento de la velocidad de comunicación serie: 9600 bps
 pinMode(trig, OUTPUT); // configuración del pin 9 como salida digital
 pinMode(echo, INPUT);  // configuración del pin 8 como entrada digital
 pinMode(led, OUTPUT);  // definición del pin 13 como salida digital
}

void loop()
{
 digitalWrite(trig,LOW);   // por cuestión de estabilización del sensor
 delayMicroseconds(5);
 digitalWrite(trig, HIGH); // envío del pulso ultrasónico
 delayMicroseconds(10);

 tiempo=pulseIn(echo, HIGH); // función que mide el tiempo transcurrido entre el envío del pulso ultrasónico y la recepción del rebote

 distancia= int(0.017*tiempo); // fórmula para calcular la distancia obteniendo un valor entero

 // Monitorización en centímetros por el monitor serial:
 Serial.println("Distancia ");
 Serial.println(distancia);
 Serial.println(" cm");
 delay(100);

 if(distancia<10) // si la distancia del sensor con el objeto es menor de 10:
 { digitalWrite(led, HIGH); } //digital 13 (LED) encendido
 else /*si no*/
 { digitalWrite(led, LOW); } // digital 13 (LED) apagado
}

A continuación os dejo un vídeo de como queda el programa. Más adelante haremos lo mismo pero sustituyendo el led por dos motores.

7 comentarios:

  1. Hola chicos. He conocido vuestro blog a través de Prometec.net. Soy aficionado a la electrónica, y me parece muy interesante el proyecto vuestro. Solo una consulta. Hace tiempo armé un rover 2wd controlado por bluetooth y una app que diseñé para el móvil. Luego quise añadirle el HC-SR04 para que también detectara obstáculos y retrocediera. Las pruebas no fueron las esperadas pues daba falsos positivos o simplemente se estrellaba ¿Han probado el sensor en vuestro rover oruga?
    Gracias y saludos.

    ResponderEliminar
    Respuestas
    1. Hola Suso, en un instante subiremos un programa que sigue las espectativas de tu pregunta y subiremos un video

      Eliminar
  2. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  3. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  4. Suso, yo también me he peleado con el HC-SR04 en una app y he conseguido dominarlo:

    http://tictecbell.blogspot.com.es/p/robot-solar-programacio.html

    ResponderEliminar
    Respuestas
    1. Gracias Tecno-Lógics. El link no me abre en el navegador.

      Saludos.

      Eliminar
    2. Ya conseguí entrar en vuestro blog, he ojeado un poco y parece muy interesante. Vi por encima el sketch donde sensas la distancia y actua el rover. En mi caso, el sensor funciona perfectamente en la mesa, pero con el rover en movimiento y a cierta velocidad no detecta en el 100% de los casos, o dá falsos positivos. En parado el sensor sigue actuando y al acercale la mano si actua y retrocede evitándola, pero en movimiento....

      Gracias y saludos.

      Eliminar