domingo, 1 de diciembre de 2013

Sensor de distancias




Si estas buscando un módulo para medir distancias el módulo de ultrasonidos HC-SR04 tiene muy buen precio (unos 3-4€), tiene una buena calidad/precio, tan solo 4 pines de conexión, un código de programación muy simple y un tamaño no muy grande de 4,5 x 2 cm.



Características

·       Voltaje: 5 VDC
·       Corriente en reposo: < 2 mA
·       Salida: High 5V/Low 0V
·       Angulo: < 15º
·       Distancia: 2 a 400 cm
·       Resolución: 3 mm


El sensor HC-SR04 y su funcionamiento
Este sensor contiene un emisor y un receptor de ondas de ultrasonidos, y funciona a modo de sonar, de tal forma que el emisor lanza un tren de pulsos ultrasónicos – de 40 kHz en este caso  – y el receptor espera el “eco” de dicho tren de pulsos en algún objeto.

La onda se dispersa y luego rebota siendo captada por el sensor permitiendo calcular la distancia que hay entre el sensor y determinado objeto.ç

Si queremos probar cómo funcionaría podemos acceder a un simulador gráfico que han montado los de la Universidad de Reading. Es muy sencillo, solo tenéis que pulsar el botón "Press Start" y veremos cómo se genera la señal, y cómo rebota en los obstáculos que tiene frente a él. Si queréis mover el sensor o bien los obstáculos, sólo tenéis que hacer clic sobre él, y luego clic en el sitio donde queréis que se encuentre.

Como sabemos la velocidad del sonido en el aire, si apuntamos el tiempo que tarda la onda sonora en emitirse y en regresar al receptor, un poco de física nos daría la distancia a la que se encuentra el objeto. Básicamente lo mismo que hacen los murciélagos o los delfines.



Ecolocalización murciélago

Fórmula para medir la distancia

Si tenemos en cuenta que la velocidad del sonido es de: 343 m/s o 34300 cm/s, podemos calcular que las ondas tardan en recorrer 1 centímetro:

1 centímetro = 1 segundo / 34300 = 29,15 uS

Sabiendo que la onda acústica tarda 29,15 uS en recorrer 1 cm, y que el sensor nos dará el tiempo de la señal desde que es enviada hasta que el receptor captura su eco, calculamos la distancia de la siguiente manera: “Distancia en cm = (tiempo de la señal / 29,15 uS) / 2 “

Nota: La división por 2 se debe a que la señal desde que es enviada por el emisor, recorre la distancia hasta el objeto, y vuelve por el mismo camino hasta el receptor como se puede ver en la siguiente imagen, de modo que la onda recorre 2 veces el mismo camino, por lo que si no realizamos esta operación, la distancia resultante en centímetros sería el doble de la que hay realmente entre el sensor y el objeto

O sea dado que la fórmula general para calcular la distancia en función del tiempo y la velocidad de un objeto en movimiento es:

Distancia = tiempo x Velocidad 

Esto significa que la distancia real  a la que se encuentra nuestro objeto será la mitad de la distancia total recorrida por nuestra onda, dado que ésta ha tenido que viajar hasta el objeto y luego regresar de él, por lo tanto ha recorrido el doble de distancia.

Distancia real = ( tiempo x (Velocidad Sonido)/ 2 )


Esquema de conexión del Sensor
A continuación vamos a dar el esquema de conexión del Sensor a nuestra placa Arduino


En este esquema lo hemos montado de frente para que nos sea más fácil enseñaos donde se conecta cada pin, pero la configuración más habitual es montar el sensor de espaldas para que los ecos de los cables no le interfieran en sus medidas.



Pines de conexión

·       VCC = 5 V
·       Trig (Disparo del ultrasonido) en Pin 12
·       Echo (Recepción del ultrasonido) en Pin 13
·       GND = Gnd


La foto real de como quedaría este esquema que os hemos presentado, sería algo así como









Fórmula para medir la distancia

Distancia = {(Tiempo entre Trig y el Echo) * (V.Sonido 340 m/s)}/2



Y nuestro Sketch podría ser algo como esto:
/*
Sensor de distancia con un HC-SR04 y comunicacion externa
por medio de la consola
VCC to arduino 5v GND to arduino GND
Echo to Arduino pin 13 Trig to Arduino pin 12
Basado en un Sketch disponible
http://trollmaker.com/article3/arduino-and-hc-sr04-ultrasonic-sensor
para traducir y comentar el codigo en español, desde un nivel basico
Creado el 2 de julio de 2013
por M.Dominguez
*/
// Vamos a empezar definiendo las variables que vamos a usar en nuestro Sketch
#define trigPin 13 // Aqui le estamos diciendo que vamos a usar para
// disparar la onda sonora
// en ingles llamado trigger o disparador y le damos
//el valor 13, o lo que es lo mismo
// en pin que vamos a usar para el disparador
//sera el pin 13 de nuestro arduion
#define echoPin 12 // Aqui le estamos diciendo que vamos a usar
//para escuchar la onda sonora
// en ingles llamado echo o eco y le damos
//el valor 12, o lo que es lo mismo
// en pin que vamos a usar para recibir el eco
// sera el pin 12 de nuestro arduno
// Configuramos el bloque setup
// En esta parte del sketch, es donde configuramos,
// qué pines y que finalidad va a tener
void setup() {
Serial.begin (9600); // Abre un puerto de comunicacion serie
//y espera a que se abra
// y le estable la velocidad de transmision
// de esta informacion en baudios
// un baudio es un bit por segundo.
// En este caso a 9600 baudios
pinMode(trigPin, OUTPUT); // aqui le decimos a nuestro Arduino
//que el disparador, es un pin tipo OUTPUT (salida en ingles)
pinMode(echoPin, INPUT); // aqui le decimos a nuestro Arduino
//que el eco, lo recibimos en un pin tipo INPUT
//(entrada en ingles)
}
// Configuramos el bloque loop
// Es la parte principal de nuestro programa pues en el tendremos
// que poner el código para que el microcontrolador
// lo ejecute de manera recursiva, es decir, esta parte del Sketch
// se repetirá una y otra vez mientras la placa Arduino tenga energía
void loop() {
int duracion, distancia; // aqui lo que hacemos es definir dos variables
// locales, esto es que solo se utilizan
// en esta parte del codigo
// y le dice al microcontrolador que tanto la
//duracion como la distancia, van a ser numeros enteros
digitalWrite(trigPin, HIGH); // ahora le dice que dispare,
//o sea que el el pin del trigger emita un pulso
// cuando esto sucede, nuestro sensor emite pulsos
// rapidos a 40KHz (frecuencia no audible por
// los humanos) y espera el eco
delayMicroseconds(1000); //
digitalWrite(trigPin, LOW); // transcurridos un tiempo (1000) le dice que
// no siga disparando y se apague,
// o sea que se ponga Bajo (LOW en ingles)
duracion = pulseIn(echoPin, HIGH); // Para calcular la duracion se usa
// una funcion que calcula el tiempo
// que ha tardado un pulso en cambiar
// de Alto a Bajo o viceversa.
// Devuelve la anchura del pulso
// en microsegundos.
distancia = (duracion/2) / 29.1; // aplicando la formula de la
//distancia= velocidad del sonido cm/us por
//el la duracion en calculada con el PulseIn
// obtendremos la distancia en centimetros
if (distancia >= 4000 || distancia <= 0){ // ahora para verificar que no se nos
// queda esperando ecos de objetos muy alejados
// le decimos que si el objeto esta a
// mas de 4 metros o a una distancia
// negativa que alerte con un mensaje
Serial.println("Fuera de rango"); // y este es el mensaje que hemos definido
//para que lo escriba en la consola
}
else { // en caso de que no este fuera de rango, entonces
Serial.print(distancia); // te pinta la distancia
Serial.println(" cm"); // y le suma la coletilla de las unidades
// que ha usado, en este caso centimetros
}
delay(500); // esperamos medio segundo y volvemos a empezar
}


1 comentario: