Sensor Ultrasonido HC-SR04 con PSoC5LP

¿Que es?

El sensor de ultrasonido ayuda mucho en las mediciones de distancia de objetos, como su nombre lo indica, envía ráfagas de ultrasonido las cuales rebotan en los objetos cercanos y regresan al origen. El tiempo transcurrido entre que se envía la ráfaga de ultrasonido y vuelve es el que nos indica a través de una equivalencia, la distancia del objeto.

Estos sensores de ultrasonido son baratos y son fáciles de usar, en teoría su funcionamiento está entre los 2cm y los 400cm con una resolución de 0.3cm. Pero en la práctica su funcionamiento óptimo esta entre los 10cm y los 250 cm.

Estos sensores no son confiables del todo, puede que dependiendo la superficie del obstáculo, refleje la onda de ultrasonido provocando que sean erróneas las mediciones, aunque para aplicaciones sencillas esta más que bien.

¿Como funciona?

Como se dijo antes su funcionamiento se basa en la emisión de ondas ultrasonicas y su retorno luego de rebotar en un obstáculo, como lo muestra la imagen:

sensor-ultrasonico-explicacion

La manera de utilizar este sensor es midiendo el tiempo que se demora en volver la onda que rebota desde que sale del sensor y vuelve a el, este tiempo a través de una equivalencia nos va a dar el resultado directamente en centímetros o en pulgadas.

El proyecto:

Implementaremos este sensor con un PSoC5LP, hay que pensar muy bien de que manera se va a acoplar el sensor con PSoC, se va a explicar con los siguientes diagrama:

ultrasonido

Físicamente el modulo del sensor trae 4 pines, los de siempre, el VCC que va conectado a los 5 Volts y el GND que va a la tierra total del circuito. Ademas de estos trae el pin trig y el pin Echo, que vamos a entender con el siguiente diagrama:

timing

Se puede entender el funcionamiento del sensor viendo el gráfico, una vez se le aplica una señal TTL de 10uS al pin trigg, el modulo va a enviar una ráfaga de ondas de ultrasonido, una vez termina de enviar las ráfagas se activa el pin echo, en este momento se tiene que contar el tiempo que transcurre hasta que el pin echo se vuelve a colocar en estado 0, este tiempo y pasándolo por la ecuación que según el datasheet es :

distancia = uS/58 (Para centímetros)

distancia = uS/148 (Para Pulgadas)

se obtendrá entonces la distancia Sensor – Objeto en centímetros.

Entonces sabemos que el pin Trigg va a ser un pin digital de salida de el PSoC y el pin Echo va a ser un pin digital de entrada de nuestro PSoC.

Diagrama Esquemático

esquematico

Para entender el diagrama esquemático primero hay que recordar el funcionamiento del bloque timer.

El bloque timer funciona contando los ciclos del reloj que se le ingrese, dependiendo el periodo tiene una cuenta máxima y una vez alcanzada esta cuenta, activa el pin de terminal count. Como se sabe que cuenta los ciclos del reloj que tiene, lo pondremos a contar el tiempo que transcurre entre que el pin echo se activa y se desactiva, para esto mismo se configuró el timer para que tuviera un enable por hardware. De la misma manera el reloj que se le pone al timer es de 1MHz que en tiempo es igual a 1uS, de esta manera el numero que lleve la cuenta el timer representará directamente micro segundos, de esa manera se hará la conversión directa.

Para generar el pulso en el pin trigg de 10uS se utilizará un pin digital de salida y un Control Register, el cual estará conectado directamente al pin trigger y al reset del timer. Se conecta al timer de esta manera por que es sencillo implementar el reset. Viendo el diagrama de las señales de el módulo se da cuenta de que el pin trigg es siempre quien inicia la secuencia de lectura y para este momento las cuentas del timer deben estar en 0, por esto se aprovecha el pin trigger para reiniciar el timer y asegurar que este en cero para cuando el pin de echo se active y active a su vez el timer.

Es notable que todo el funcionamiento del proyecto gira entorno al bloque timer, es el quien ayudado del pin echo va a llevar las cuentas del tiempo que se demora en regresar la onda de ultrasonido una vez rebota con el obstáculo.

Por último se añade la librería de la LCD que siempre utilizamos y le asignamos sus respectivos pines digitales de salida.

Software

La implementación del código gira entorno a la secuencia que se debe seguir para asegurar que la lectura del modulo sea la correcta. La secuencia puede ser descrita de la siguiente manera:

Primero se tiene que activar en 1 lógico el control register durante 10uS, de esta manera el sensor de ultrasonido envía las ráfagas de ondas ultrasonicas y también se reinicia el timer para asegurar que sus cuentas estén en cero listas para iniciar a contar el tiempo. Luego hay que dar una espera de 1mS, esto con el fin de dar el tiempo a que el sensor termine de enviar la ráfaga de ondas ultrasonicas. Seguido hay que dejar que termine de pasar el tiempo que se demora en volver la onda de ultrasonido, se tiene que tener en cuenta que el timer esta implementado en hardware y que empezará a contar simplemente con que se active el pin enable, como el pin echo es la respuesta del sensor, que se activa cuando tiene que iniciar la cuenta y se desactiva cuando tiene que terminar de esperar, el timer empezará a contar con los estados de este pin. Una vez esperado el tiempo, solamente hay que recoger el dato de cuenta del timer que representarán directamente los micro segundos transcurridos entre los estados del pin echo que representan la distancia a la cual esta el obstáculo. se convierte de forma descendente a forma ascendente y se le aplica la fórmula para convertir a centímetros, terminado esto basta con hacer uso de la función sprintf para publicar este resultado en la LCD.

De esta manera se construyo el siguiente código (Todo comentado):

 

 

Terminado el código lo único que resta por hacer es asignar los pines. La LCD se conecta normalmente, y los pines del modulo también se puede poner a donde se desee, como recomendación digo que no utilicen el puerto cero para realizar aplicaciones digitales, estos tienen algunos condensadores útiles para aplicaciones análogas, puede utilizar el resto de puertos para conectar su módulo, el diagrama esquemático del proyecto que aquí realizados queda de la siguiente manera:

 

 

schematic

 

Antes de compilar y ya que se esta usando la librería sprintf, se tendrán que hacer dos cosas, la primera es en el archivo de configuración de pines  y en la parte de sistema buscar la opción de heap size y cambiar el 0x80 por 0x200 como lo muestra la siguiente imagen:

heapsize

 

Y por ultimo en los archivos del proyecto se da clic derecho sobre el proyecto y luego en Build Settings , aquí hay que buscar la opción linker y general, y se busca la opción Use newlib-nano Float Formating, y se pasa de false a true, como muestra la siguiente imagen:

libnanofloatformating

Por ultimo se compila y se programa el micro-controlador.

Resultados

img_20161124_113042

img_20161124_113119

 

Para verificar que tan bien esta midiendo el sensor de ultrasonido, se utilizo un metro como patrón vamos a ver los resultados :

 

patron1

 

Teniendo en cuenta que comenzamos la medida desde unos 4 centímetros y que el obstáculo fue colocado a 18 centímetros, se puede decir que la medida del sensor es bastante acertada, mide 13.8cm mas lo 4cm desde donde comenzamos en total son 17.8 centímetros, que es lo que marca el metro patrón.

En general, el sensor de ultrasonido es bastante preciso en las mediciones, gracias a estas pruebas se comprueba que el sensado mínimo es de 10cm y un máximo de un 2.5m, de todas maneras con este margen es un muy buen sensor.

Si desean una mejor explicación, a continuación dejo un vídeo explicado al detalle:

(Recomendado ver en youtube)

 

Por último se dejan los archivos del proyecto:

Todos sus comentarios son bienvenidos!.

 

 

Brayan Bermudez

Ingeniero en Telecomunicaciones, Aficionado a la Electrónica, comunicaciones y sistemas informáticos en general.