En este tutorial os voy a enseñar a hacer vuestro propio sensor de aparcamiento, este montaje lo podréis implementar en cualquier vehículo sin importar su antigüedad, en mi caso voy a usar el sensor de ultrasonidos HC-SR04 del que podéis ver un tutorial bastante completo aquí.
Material necesario
En principio vamos a hacer un montaje muy simple, utilizando 3 LEDs de colores para indicar la proximidad del obstáculo, a partir de aquí podemos ir complicándolo tanto como queramos.
- 1 Placa Arduino.
- 1 Sensor de ultrasonidos HC-SR04.
- 1 Placa par el montaje rápido (Breadboard).
- 3 LEDs de diferentes colores.
- Cables Dupont para el conexionado.
- 3 Resistencias de 220Ω (opcionales).
Para este proyecto yo voy a usar un Arduino UNO, pero se puede desarrollar en cualquier Arduino, tan solo hay que seleccionar una u otra placa en el IDE de Arduino antes de cargarle el programa.
Las resistencias de los LEDs son opcionales, la corriente que proporcionan los pines de salida de Arduino están limitadas, por lo que no llegará a los LEDs demasiada corriente,
Esquema del montaje
Como se puede observar en el montaje, el circuito es muy sencillo, consta de 3 salidas para cada uno de los LEDs que indicarán la cercanía al objeto, si la distancia es segura (VERDE), si hay que tener cuidado (NARANJA) y si el objeto está muy próximo (ROJO).
Además, también hay que conectar a nuestra placa de Arduino el sensor de ultrasonidos que cuenta con 2 pines, el TRIGER y el ECO, que se usarán para lanzar un pulso sonoro (TRIGER) y para escuchar cuando ese pulso regresa debido a un rebote (ECO).
Programa
El programa que vamos a utilizar aquí es muy similar al utilizado cuando se explicó el funcionamiento del sensor HC-SR04, la única diferencia es que en aquel programa el dato de la distancia tan solo lo queríamos mostrar, no había ninguna lógica dentro del progama que hiciera una u otra cosa en función de la distancia medida. En este caso, vamos a crear 3 zonas, divididas por 2 distancias, una distancia llamada "SIN_PROBLEMA" en el que el obstaculo esté lejano al vehículo y otra distancia llamada "PRECAUCION" donde estemos cercano a la colisión. Habrá una zona intermedia que se situará entre la zona "SIN_PROBLEMA" y la zona de "PRECAUCION" que será la que enciende la luz naranja.
Si la distancia al objeto es mayor que la distancia que hemos marcado como "SIN_PROBLEMA", encenderemos el LED verde, si la distancia al objeto es menor que la que marquemos como "SIN_PROBLEMA", pero mayor que "PRECAUCION", encenderemos el LED naranja.
Para simplificar y no poner más condiciones, el LED rojo se encenderá en cualquier caso en el que no se cumplan las demás condiciones marcadas, esto solo se cumple cuando la distancia es menor que "PRECAUCION".
#define pulso 9 //define la salida por donde se manda el pulso como 9 #define rebote 8 //define la salida por donde se recibe el rebote como 10 #define led_verde 13 //define led_verde = 13 #define led_naranja 12 //define led_naranja = 12 #define led_rojo 11 //define led_rojo = 11 #define SIN_PROBLEMA 100 //Distancia hasta la que consideramos el obstaculo alejado (de infinito a 100cm) #define PRECAUCION 20 //Distancia que consideramos peligrosa y debemos movernos despacio int distancia; //crea la variable "distancia" float tiempo; //crea la variable tiempo (como float) void setup() { Serial.begin(9600); //inicializa el puerto serie pinMode(pulso, OUTPUT); //Declaramos el pin 9 como salida (pulso ultrasonido) pinMode(rebote, INPUT); //Declaramos el pin 8 como entrada (recepción del pulso) pinMode(led_verde, OUTPUT); //declara led_verde como salida pinMode(led_naranja, OUTPUT); //declara led_naranja como salida pinMode(led_rojo, OUTPUT); //declara led_rojo como salida } void loop() { digitalWrite(pulso,LOW); //Por cuestión de estabilización del sensor delayMicroseconds(5); digitalWrite(pulso, HIGH); //envío del pulso ultrasónico delayMicroseconds(10); tiempo = pulseIn(rebote, HIGH); //funcion para medir el tiempo y guardarla en la variable "tiempo" distancia = 0.01715*tiempo; //fórmula para calcular la distancia if(distancia > SIN_PROBLEMA) //si la distancia es mayor a la que consideramora SIN_PROBLEMA { digitalWrite(led_verde, HIGH); digitalWrite(led_naranja, LOW); digitalWrite(led_rojo, LOW); } else if (distancia <= SIN_PROBLEMA && distancia > PRECAUCION) //si la distancia esta entre la que consideramos SIN_PROBLEMA y PRECAUCIÖN { digitalWrite(led_verde, LOW); digitalWrite(led_naranja, HIGH); digitalWrite(led_rojo, LOW); } else //si la distancia es menor de 30cm { digitalWrite(led_verde, LOW); digitalWrite(led_naranja, LOW); digitalWrite(led_rojo, HIGH); } delay(10); }
Cabecera del programa
Como la mayoría del código se explicó en el tutorial del HC-SR04, voy a pasar a explicar tan sólo la parte que es diferente.
#define SIN_PROBLEMA 100 //Distancia hasta la que consideramos el obstaculo alejado (de infinito a 100cm) #define PRECAUCION 20 //Distancia que consideramos peligrosa y debemos movernos despacio
En la cabecera del programa definimos la distancia que nosotros consideramos "SIN_PROBLEMA" y "PRECAUCION", en mi caso he decidido que una distancia cómoda y para la que no hay problemas es de 100cm y la zona en la que hay que empezar a tener cuidado es en la tenemos 20cm.
Podeis cambiar estos valores para establecer los que vosotros consideréis en cada caso.
Bloque loop()
if(distancia > SIN_PROBLEMA) //si la distancia es mayor a la que consideramora SIN_PROBLEMA { digitalWrite(led_verde, HIGH); digitalWrite(led_naranja, LOW); digitalWrite(led_rojo, LOW); } else if (distancia <= SIN_PROBLEMA && distancia > PRECAUCION) //si la distancia esta entre la que consideramos SIN_PROBLEMA y PRECAUCIÖN { digitalWrite(led_verde, LOW); digitalWrite(led_naranja, HIGH); digitalWrite(led_rojo, LOW); } else //si la distancia es menor de 30cm { digitalWrite(led_verde, LOW); digitalWrite(led_naranja, LOW); digitalWrite(led_rojo, HIGH); }
Dentro del bloque loop(), lo que nos interesa es la lógica que hemos usado, como comenté anteriormente, tenemos 3 bloques separados por 2 distancias, en función de la distancia medida entrará a ejecutar uno u otro bloque.
Por ejemplo, en el primer bloque if, solo va a entrar si la distancia es mayor que la que marcamos como "SIN_PROBLEMA".
if (distancia > SIN_PROBLEMA)
En mi caso es de 100cm, por lo que el LED verde tan sólo se encenderá cuando la distancia esté entre infinito y 100 cm.
En el segundo bloque if tenemos 2 condiciones, que la distancia sea menor que "SIN_PROBLEMA" y mayor que "PRECAUCION"
else if (distancia <= SIN_PROBLEMA && distancia > PRECAUCION)
Esto en mi caso sólo se va a cumplir si la distancia es menor que 100cm y mayor que 20, lo que activaría el LED naranja.
Para cerrar el bloque condicional, en lugar de hacer otra condición marcando que se encienda el LED rojo si la distancia es menor a 20cm, lo que he hecho es poner un "else" o lo que es lo mismo, tener cualquier otra condición, que en el caso de este bloque lógico no hay otra posibilidad que la de ser menor o igual a 20cm.
Ampliación del Proyecto (ZUMBADOR)
Ya que hemos llegado hasta aquí y hemos construido un sensor de aparcamiento que nos ayudará a estacionar nuestro vehículo guiándonos por LEDs, ¿por qué no añadir también un zumbador, para que de pitiditos en funciónde la distancia? Pues bien, eso es lo que vamos a hacer en esta segunda parte, para eso dejamos todo el montaje tal y como lo teníamos y añadimos al circuito un zumbador como se muestra a continuación.
El uso del zumbador en Arduino, es algo que está implementado prácticamente desde sus inicios e incluso tiene una instrucción sólo para la utilización de estos dispositivos, esta función es TONE y esta es su estructura:
tone (PIN, frecuencia, duración)
Donde los parámetros que debemos pasarles son:
- PIN: Establece el PIN en el que hemos conectado la patilla positiva del zumbador
- Frecuencia: es la frecuencia a la que sonará el zumbador. Hay que tener en cuenta que las frecuencias audibles por las personas van de 20Hz a 20KHz y que según el zumbador que compréis puede que su rango de frecuencias sea incluso mayor, por lo que no podréis reproducir todo el espectro audible.
- Duración: Es el tiempo que estará sonando el zumbador (en milisegundos)
En el programa vamos a introducir la instrucción TONE en cada uno de los estados, haciendo sonar con diferentes frecuencias el zumbador (más agudo cuanto más cerca estemos del objeto).
#define pulso 9 //define la salida por donde se manda el pulso como 9 #define rebote 8 //define la salida por donde se recibe el rebote como 10 #define led_verde 13 //define led_verde = 13 #define led_naranja 12 //define led_naranja = 12 #define led_rojo 11 //define led_rojo = 11 #define SIN_PROBLEMA 100 //Distancia hasta la que consideramos el obstaculo alejado (de infinito a 100cm) #define PRECAUCION 20 //Distancia que consideramos peligrosa y debemos movernos despacio int distancia; //crea la variable "distancia" float tiempo; //crea la variable tiempo (como float) void setup() { Serial.begin(9600); //inicializa el puerto serie pinMode(pulso, OUTPUT); //Declaramos el pin 9 como salida (pulso ultrasonido) pinMode(rebote, INPUT); //Declaramos el pin 8 como entrada (recepción del pulso) pinMode(led_verde, OUTPUT); //declara led_verde como salida pinMode(led_naranja, OUTPUT); //declara led_naranja como salida pinMode(led_rojo, OUTPUT); //declara led_rojo como salida } void loop() { digitalWrite(pulso,LOW); //Por cuestión de estabilización del sensor delayMicroseconds(5); digitalWrite(pulso, HIGH); //envío del pulso ultrasónico delayMicroseconds(10); tiempo = pulseIn(rebote, HIGH); //funcion para medir el tiempo y guardarla en la variable "tiempo" distancia = 0.01715*tiempo; //fórmula para calcular la distancia if(distancia > SIN_PROBLEMA) //si la distancia es mayor a la que consideramora SIN_PROBLEMA { digitalWrite(led_verde, HIGH); digitalWrite(led_naranja, LOW); digitalWrite(led_rojo, LOW); tone(10, 1500, 200); //Zumbador en el PIN 10, a una frecuencia de 1500Hz y con una duración de 200ms } else if (distancia <= SIN_PROBLEMA && distancia > PRECAUCION) //si la distancia esta entre la que consideramos SIN_PROBLEMA y PRECAUCIÖN { digitalWrite(led_verde, LOW); digitalWrite(led_naranja, HIGH); digitalWrite(led_rojo, LOW); tone(10, 2500, 200); //Zumbador en el PIN 10, a una frecuencia de 2500Hz y con una duración de 200ms } else //si la distancia es menor de 30cm { digitalWrite(led_verde, LOW); digitalWrite(led_naranja, LOW); digitalWrite(led_rojo, HIGH); tone(10, 3500, 200); //Zumbador en el PIN 10, a una frecuencia de 3500Hz y con una duración de 200ms } delay(500); }
Como se puede apreciar, al final del programa también se ha modificado el delay, ampliándolo hasta 500ms, esto se ha hecho, porque la función TONE, indica en su último parámetro el tiempo que estará sonando el zumbador, pero no hay nada que indique el tiempo que no suena, por lo que si no se pone ningun delay, el zumbador sonará 200ms e irá a ejecutar de nuevo la lógica de programa, esto lo ejecutará tan rápido que no dará tiempo a dejar de sonar el zumbador, apareciendo un pitido continuo en lugar de discontinuo.
Comentarios potenciados por CComment