Sensor ultrasónico, montando el circuito

Se trata de un circuito muy sencillo. Por un lado vamos a tener toda la parte de alertas, acústica y visual, y por otra parte el sensor de ultrasonidos. En el siguiente esquema te muestro el conexionado.

Sensor aparcamiento asistido

Las resistencias son de 220 Ω y se colocan en serie con los LEDs. El sensor ultrasónico Arduino se conecta a dos pines digitales, uno para el trigger o disparador y otro para el echo o receptor. El buzzer Arduino se conecta a una salida PWM. [icon name=»exclamation-triangle» class=»» unprefixed_class=»»] Intenta poner el sensor ultrasónico Arduino lo más al borde posible de la protoboard.

Programando el sensor ultrasónico Arduino para medir distancia

Vamos a empezar por la programación. Lo primero es una breve descripción de lo que queremos conseguir. Esto nos ayudará a plantear el problema general y posteriormente dividirlo en trozos más pequeños. A esto se le llama pensamiento computacional y si eres usuario asiduo de este blog, ya estarás familiarizado con este concepto.

El sistema de aparcamiento consiste en detectar un objeto a través del sensor ultrasónico y avisar con señales de luz y sonido. Por lo tanto, ya tenemos la primera división, detectar el obstáculo y alertas con sonido y luces.

Lo primero que haré será plantear el algoritmo del sistema de detección de obstáculos.

  1. Comprobar la distancia de los objetos
    1. ¿Está dentro del rango para avisar?
        1. Lanzar alarma visual y sonora
        2. Continuar
      1. No
        1. Continuar

El algoritmo del sistema de alerta visual y sonora sería el siguiente.

  1. ¿Está en zona verde?
      1. Encender LED verde
      2. Emitir sonido 1
      3. Salir
    1. No
      1. Continuar
  2. ¿Está en zona amarilla?
      1. Encender LED amarillo
      2. Emitir sonido 2
      3. Salir
    1. No
      1. Continuar
  3. ¿Está en zona roja?
      1. Encender LED rojo
      2. Emitir sonido 2
      3. Salir
    1. No
      1. Continuar

De los dos algoritmos anteriores, deducimos que vamos a necesitar varios umbrales de decisión, uno para cada situación. Podemos coger una simple regla y determinarlos.

  • Umbral 1: está en zona verde desde 30 cm a 20 cm.
  • Umbral 2: está en zona amarilla, desde 20 cm a 10 cm.
  • Umbral 3: está en zona roja, menos de 10 cm.

Es importante conocer el rango de funcionamiento del sensor de ultrasonidos. Va de 2 cm a 400 cm según la hoja de especificaciones técnicas.

Variables y constantes

A través del sensor de ultrasonidos vamos a detectar el obstáculo. Comenzamos a programar declarando las variables y constantes. Siempre que trabajemos con pines digitales o analógicos, es una buena práctica declarar una constante por cada uno de ellos.

Definimos los pines para los LEDs, para el sensor de ultrasonidos y para el buzzer Arduino. Siempre debemos fijarnos en el esquema eléctrico mostrado anteriormente. Luego declaramos 4 constantes. La primera es la velocidad del sonido convirtiendo de metros por segundo a centímetros por segundo. Esto lo hacemos multiplicando por 100. Las siguientes constantes son los umbrales de decisión que hemos marcado antes.

Función setup

En la función setup iniciamos el monitor serie y ponemos los pines en el modo correspondiente. Los LEDs, el Trigger del sensor de ultrasonidos y el buzzer son en modo salida (OUTPUT). El pin Echo del sensor ultrasónico en modo entrada (INPUT).

Por último vamos a empezar desde un estado conocido, todos los LEDs apagados. He creado una función para realizar esta tarea.

[icon name=»lightbulb-o» class=»» unprefixed_class=»»] Las funciones son muy útiles por dos razones, nos permiten ordenar el código para que sea más legible y también reutilizar el código. En este caso vamos a necesitar apagar todos los LEDs más de una vez y es más fácil escribir una llamada a una función con una línea de código que hacer las 3 llamadas a la función digitalWrite para apagar cada LED.

Función Loop

La función loop() contiene el código que se repetirá una y otra vez. Aquí es donde vamos a ir poniendo todo nuestro algoritmo, el que hemos detallado anteriormente. He dividido esta función en varias funciones para hacer el código más legible.

A continuación te describo cada una de las funciones que ejecutamos en el loop().

Iniciar sensor ultrasónico

Lo primero que hacemos es preparar el sensor de ultrasonidos. Esto lo hacemos con la función iniciarTrigger() que manda un pulso. Comienza en estado bajo durante 2 milisegundos, luego 10 milisegundos estado alto y por último ponemos en estado bajo. Esto indica que a continuación se mandará la señal para que la capte el echo.

Calcular la distancia de los objetos

Una vez que está preparado el sensor, ya podemos utilizarlo para calcular la distancia. Eso lo hacemos con la función calcularDistancia(). Es una función particular ya que nos va a devolver un valor. Eso se hace poniendo al final (o donde quieras) la palabra reservada return seguido del valor que quieres devolver. Todo el código que haya por debajo del return no se ejecuta así que precaución. En este caso yo devuelvo la distancia calculada dentro de la función que es una variable del tipo float.

Para calcular el tiempo se utiliza la función nativa de Arduino pulseIn. Esta función nos devuelve el tiempo transcurrido hasta que cambia de estado. Anteriormente hemos preparado el sensor dejando el pin, donde tenemos conectado el trigger, en estado bajo. Cuando la onda ultrasónica viaja por el aire, rebota en el objeto y es detectada por el echo, el pin cambia de estado a alto (HIGH).

La función pulseIn detecta eso precisamente, y devuelve el tiempo transcurrido en microsegundos. Por este motivo se debe convertir a segundos multiplicando por 0,000001 que es lo mismo que dividir por 1.000.000. Con esta información ya podemos aplicar la fómula para calcular la distancia en función del tiempo y la velocidad.

[icon name=»exclamation-triangle» class=»» unprefixed_class=»»] El tiempo obtenido por la función pulseIn debe ser dividido por 2. Esto es devido a que recorre dos veces la distancia, va hacia el objeto, rebota y vuelve hasta el sensor y por lo tanto tarda el doble.

Lanzar alertas

Una vez tenemos la distancia calculada ya podemos decidir si estamos en la situación de enviar alerta o no. Siempre que la distancia esté por debajo del primer umbral (umbral del LED verde y el menos restrictivo), lanzaremos la correspondiente alerta visual y sonora.

Antes de hacer nada es conveniente apagar todos los LEDs. Esto lo hacemos llamando a la función que hemos generado anteriormente.

Para reproducir un sonido con buzzer, utilizamos la función nativa de Arduino tone(pin, frecuencia, duración). Esta función admite hasta 3 parámetros aunque con los 2 primeros, sería suficiente.

  • pin: es el pin donde hemos conectado el buzzer. Recuerda que debe ser un pin PWM.
  • frecuencia: podemos poner un valor entre 20 Hz y 20.000 Hz. Juega con estos valores hasta conseguir un sonido adecuado.
  • duración: la duración en milisegundos que quieres que dure el sonido.

[icon name=»lightbulb-o» class=»» unprefixed_class=»»] Si no utilizas el parámetro de duración, el sonido se reproducirá continuamente hasta que llames a la función noTone(pin).

La función comprueba que tipo de alerta hay que lanzar. Si está dentro del rango umbral 1 y umbral 2, enciende el LED verde y reproduce un sonido de 2.000 Hz durante 200 milisegundos. Si está dentro del rango umbral 2 y umbral 3, enciende el LED amarillo y reproduce un sonido de 2.500 Hz durante 200 milisegundos y si está por debajo de umbral 3, enciende el LED rojo y reproduce un sonido de 3.000 Hz durante 200 milisegundos.

Código final

Aquí te dejo todo el código de este ejercicio para que lo utilices cómo y cuando quiera. Recuerda que la mejor manera de aprender es practicando así que no lo copies entero e intenta escribirlo tu mismo.

Conclusión

En este artículo hemos visto un ejemplo de la vida real, un sensor de aparcamiento asistido. Gracias a placa como Arduino podemos descubrir cómo funciona el mundo. Si te ha gustado, te agradecería que lo compartieras, muchas gracias.

Gracias a Facilito.com y Shutterstock por ceder los derechos de la imagen

0 comments:

Post a Comment