Modulo Ultrasónico SR04

En este post comentare como utilizar el modulo de ultrasonidos SR04, el cual funciona por rebote, es decir envía un serie de pulsos ultrasónicos, y los recibe, el tiempo que tarda entre el envío y la recepción es proporcional a la distancia recorrida por la onda.
Resumiendo, podríamos saber a que distancia se encuentra un objeto situado frente a este modulo por ese tiempo en que tarda el rebote de la señal emitida.
Podríamos decir que funciona como un radar., Detectando objetos en su sector de percepción y también detectando su cercanía.
El modulo cuenta con cuatro pines dos de alimentación y dos de datos.
La alimentación es de 5V por lo que nos facilita las cosas y los pines de datos son Trigger y Echo, o en español (disparo y eco) como les comentaba mas arriba, necesita enviar unos pulsos para luego recibirlo y calcular el tiempo que este tarda en rebotar, de ahí las palabras Disparo y Eco.
En el pin de disparo tenemos que enviar un pulso para que el modulo envíe sus pulsos ultrasónicos al entorno donde este apuntando, y por el eco nos enviara un pulso cuando este el modulo detecte el eco de la señal que envío.
Bueno dejemos un poco esta explicación para hablar del protocolo.


Si bajamos el datasheet de Internet vamos a encontrarnos con este grafico donde nos indica el pulso de inicialización que mayor o igual a 10us, luego envía los pulsos de ultrasonido con el pin “echo” a nivel bajo, y luego una vez enviado pone el “echo” a nivel alto por un determinado tiempo (tiempo que sea el que nos indica a que distancia esta el objeto) nótese que el tiempo puede ir desde 150us a 25ms, pero se considera que si demora mas de 35ms no hay ningún objeto delante de el.
También nos muestra como traducir este tiempo en centímetros y pulgadas, simplemente dividiendo el valor contado (tiempo) sobre esas constantes 58 para centímetros y 148 para pulgadas.
En el programa que les mostrare se puede ver este proceso que les detallaba de forma mas sencilla.
1) podemos ver que ponemos la salida “trigger” a nivel alto, esperamos 20us y la ponemos a nivel bajo. Porque utilice 20us? Y no 10us como dice en su datasheet.. Si recordamos lo que esta mas arriba dice que tiene que ser desde 10us no 10us exactos, por ende elegí 20us por un tema de que nos aseguramos el trigger, y también porque no estoy usando oscilador a cristal sino oscilador interno y es menos eficiente que con un cristal.
2) podemos ver un while(echo==0); esto es porque esta esperando que el modulo envíe sus pulsos de ultrasonido, podría haber utilizado otra sentencia pero esta es rápida y corta, simplemente queda loopeado mientras que el modulo envía sus pulsos ultrasónicos.
3) Una vez que el modulo envío sus pulsos ultrasónicos y rebotan con un obstáculo, pone la salida de echo en nivel alto por eso tenemos while(echo==1), mientras este en 1 contaremos el tiempo que tarda en rebotar ese eco y si nos acordamos lo que les comentaba arriba si dividimos el tiempo en 58 nos dará la distancia en centímetros, por eso el delay_us(58).
4) Luego tenemos un delay de 200ms para mostrarnos el dato ya que sino estaría inestable en el display y luego tenemos una condición de que el dato sea menor a 70cm porque sino el modulo no nos garantiza la medición (es dato del datasheet), de esta forma si supera los 70cm nos enviara el mensaje “Fuera de rango” y si no lo supera nos mostrara la distancia medida.

#include <16F883.h>
#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP,NOMCLR,INTRC
#use delay(int=4000000)
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7, bits=8, parity=N)
#define trigger PIN_A0
#define echo input(PIN_A1)
void main()
{
   unsigned int distancia; 
   while(true){
      output_high(trigger);
      delay_us(20);
      output_low(trigger);
      while(echo==0);
      while(echo==1){
         distancia++;
         delay_us(58);
      }
      delay_ms(200);
      if(distancia>70){
         printf("Fuera de rango 70cm maximo\r");
         delay_ms(500);
         printf("                          \r");
      }  
      else{
         printf("Distancia[cm]: %3d\r",distancia);
         distancia = 0;
      }  
   }
}


En este ejemplo los datos se envían por puerto serie a una PC donde se leen desde híper terminal, solo por comodidad, pero pueden usar un LCD para que sea mas portátil.



3 comentarios:

  1. Hola, excelente explicación!! tengo uno igual y me preocupa lo que decis de los 70cm xq quiero medir hasta 2m, la fluctuación de cuanto es? gracias

    ResponderBorrar
    Respuestas
    1. Uu quedó re colgada la respuesta. Recién la veo perdón. Llega a 2m pero pierde un poco de precision, igual depende del material y la geometría del objeto con el que choca.
      Saludos!

      Borrar
    2. gracias, queria medir el nivel de agua en un tanque de 1000 litros, max 2m de alto.

      Borrar