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.



Regulador de 3V3

Si bien ya conocemos los reguladores mas comunes como los 78XX (caso positivo), 79XX (caso negativo), y los ajustables como viejo LM317 (el cual con solo una resistencia y un potenciómetro podemos hacerlo variable de 1,2 a 35V para la versión estándar, y hasta 50V para la versión de alto desempeño).
Existen otros reguladores fijos o ajustables en base a un transistor en configuración en base común, es una de las mejores opciones cuando necesitamos regular cargas con intensidades mayores a 2A ya que los reguladores mencionados al principio manejan intensidades hasta 1,5A con un buen disipador térmico.
En este caso les voy a mostrar como hacer un híbrido entre un regulador integrado y un regulador con zener.
Este circuito esta basado en el LM317T el mismo soporta 1,5A máximo y la configuración que mas me interesa ya que es lo mas difícil de conseguir es que regule 3,3V ya que hay muchos dispositivos, módulos, sensores y circuitos integrados que requieren hasta 3,3V, en si existen reguladores fijos a esta tensión como el LM3940, DS1117, etc..., en este caso opte por eliminar el potenciómetro del LM317T como viene por defecto en su datasheet y cambiarlo por un zener en inversa como suele configurarse cuando se usa como regulador.
Nótese que en el circuito se esta utilizando un diodo zener 1N4371A el mismo es de 2,7V 500mW, ahora se preguntaran porque no puse un zener de 3,3V, porque el mismo LM317T genera una caída de tensión extra a la entrada de comparación de ajuste, eso quiere decir que si le ponen un zener de 3,3V a la salida tendrán al rededor de 4V, por eso se incluye un diodo 1N4007 para decrementar en 500mV la salida y por esa razón se utiliza un zener de 2,7V.
Estos valores son netamente configurables, pueden cambiar el zener o quitar el diodo de la salida para modificar la tensión, lo recomendable es testearlo antes de alimentar el circuito.
NOTA: en el primer diagrama se alimenta con 12V y es necesario el diodo 1N4007 de salida, y en la segunda imagen se alimenta con 5V y no es necesario el diodo, por ende en el PCB solo tendrán que hacer un puente donde iría el diodo.


Modulo Bluetooth HC-06

Antes de comenzar el detalle del mismo debo mencionar que existen otros módulos muy comunes como el HC-05 que muchas veces lo venden como reemplazo, o bien en la compra no detallan cual es pero es importante conocer la diferencia,.
Una simple diferencia es que el módulo HC-06 funciona como Slave solamente, y el HC-05 funciona como Master y Slave, básicamente es eso, lo cual podría condicionarnos algún desarrollo, pero la realidad es que el HC-06 tiene un valor menor y nos sirve tanto para enviar y recibir (siempre y cuando utilicemos de a uno por vez, por este tema de Maestro y Esclavo).
Si compramos uno de estos módulos y no sabemos cual es, la forma más sencilla es alimentándolo (no nos olvidemos que se alimenta con 3,3V), por suerte y para nuestra seguridad y ventaja tanto el módulo HC-05 como el HC-06 disponen de la alimentación en los mismos pines, por ende solo debemos alimentar el módulo y una vez alimentado buscarlo con algún dispositivo bluetooth (como un Celular, Tablet, PC, etc...) una vez que lo busquemos en nuestro dispositivo nos aparecerá el nombre, si dice “Linvor” es el HC-06 y si dice “HC-05” es el otro.





Antes de comunicar nuestro módulo con la computadora para setear el mismo debemos tener en cuenta que el módulo en sus pines TX y RX envía y recibe datos mediante un protocolo serial pero con un nivel lógico TTL (igual que un microcontrolador). La computadora en su puerto serial mediante la norma RS232 maneja niveles de tensión de +/-10V por lo que si conectamos directamente el módulo al puerto serial quedará inservible. Tenemos que poner el medio un transceptor como el MAX232 el cual convierte el TTL en RS232 y el RS232 en TTL de esta forma podemos comunicar nuestro módulo.

En mi caso he utilizado el integrado MCP2200 que es un conversor UART / USB, el mismo se conecta por USB al PC y genera un puerto serial virtual y los pines de comunicación TX y RX del MCP2200 son de nivel TTL por lo que no hay necesidad de un MAX232. Pero es solo porque ya lo tenia armado y me pareció mas practico.

El módulo viene con un usuario y una clave por defecto al igual que un seteo de velocidad de transmisión: User: linvor, Pass: 1234, Baud: 9600,8,N,1.
Esta es la configuración por defecto para el módulo HC-06 que es el que trataremos en este post.
Estos módulos son configurables tanto el nombre de usuario, la password y los baudios (entre otras cosas) mediante los comandos AT, estos comandos son los viejos comandos que se utilizaban en los módems telefónicos para configurarlos y comandarlos, se tratan de comandos en código ASCII que se envían por medio de una terminal serial a nuestro módulo.
Si escribimos el comando:
AT [Nos devolverá “OK”] esto sirve para saber que esta bien conectado y buen funcionamiento.
Para Setear las siguientes configuraciones es necesario que el módulo no esté conectado a un dispositivo, el Led debe parpadear sino no nos tomará los comandos.

NOTA: Los comandos más largos que “AT” deben escribirse en un block de notas o algo similar ya que tenemos que copiarlos de ahí y pegarlos en la terminal, si escribimos a mano en la terminal AT+XXXXXXX el módulo bluetooth leerá AT y nos enviará OK sin dejarnos terminar de escribir el comando entero.

AT+BAUD# [Por ejemplo AT+BAUD4 y nos devolverá el comando OK9600]
(donde # es un número hexadecimal del 1 al C)
1 - 1200
2 - 2400
3 - 4800
4 - 9600 (Default)
5 - 19200
6 - 38400
7 - 57600
8 - 115200
9 - 230400
A - 460800
B - 921600
C - 1382400
Esta es la velocidad a la cual va a funcionar nuestro módulo, es necesario saberla ya que sino no se podrá establecer la comunicación serial con el microcontrolador.
AT+VERSION [Nos devolverá la versión del dispositivo casi siempre “OKlinvorV1.5”]
AT+NAMEuser [Donde user será el nombre que le daremos. por ejemplo AT+NAMEelectgpl
Nos devolverá el comando OKsetname].
AT+PINxxxx [nos permitirá cambiarle la clave onde xxxx será la nueva clave por ejemplo AT+PIN7890 y nos devolverá el comando OKsetPIN].

Entonces nuestro modelo esta listo para funcionar con nuestro nuevo nombre de usuario, nueva clave y nueva velocidad.
En mi ejemplo lo he seteado en 9600,8,N,1 por estándar y porque no requiere de mayor velocidad, por eso mismo en el microcontrolador seteare esos mismos parámetros para que pueda comunicarse fácilmente con el microcontrolador, y todos los datos que el microcontrolador envía por serial al módulo serán recibidos mediante bluetooth en el terminal del celular, en mi caso utilizo android y he descargado Bluetooth Terminal el cual funciona muy bien.

El datasheet en pdf lo pueden descargar de Google, es el primero que aparece, podrían entrar a la pagina www.linvor.com que es la pagina del fabricante pero esta en chino y la verdad que se complica un poco, pero con este tutorial ya es posible configurarlo como empezar a usarlo.