Escolar Documentos
Profissional Documentos
Cultura Documentos
en un sistema de aparcamiento
Comentarios(20)
Luis del Valle Hernández
El sensor ultrasónico Arduino nos permite medir distancias a través de los ultrasonidos.
Si ya tienes un kit seguramente tengas este tipo de sensor. En este tutorial te voy a enseñar
cómo puedes construir un sistema de aparcamiento asistido.
Es muy común encontrar este tipo de sensores en los coches actuales. El objetivo es
mostrar cómo podemos construir sistemas reales con esta placa de prototipado. Te
explicaré el conexionado de los componentes y el código necesario para hacerlo funcionar.
Indice de contenidos
Solo hace falta utilizar la famosa fórmula de la velocidad que aprendimos en el colegio.
La velocidad del sonido es 343 m/s a una temperatura de 20ºC. La velocidad aumenta o
disminuye 0,6 m/s por grado centígrado. Podemos ser más exactos si utilizamos un sensor
de temperatura como el LM35.
Por lo tanto, es importante conocer las frecuencias del espectro audible. No vamos a ver
una masterclass sobre este tipo de señales, solo debemos quedarnos con el rango de
frecuencias va de 20 Hz (hercios) a 20 kHz (kilohercio).
Cerca de los 20 Hz el sonido es muy grabe. Cuando vamos subiendo de frecuencia, el
sonido se va haciendo cada vez más agudo. Esto nos servirá para alertar de que nos
estamos acercando a un obstáculo al aparcar.
Tampoco podemos esperar un sistema de alta fidelidad con un buzzer Arduino, pero nos da
la posibilidad de generar tonos audibles para alarmas e incluso alguna melodía musical
fácilmente reconocible.
Componentes necesarios
Ya hemos visto una breve explicación de lo que vamos a necesitar. La siguiente lista te
muestra todo el material necesario.
Arduino UNO
Protoboard donde conectaremos los componentes
Cables para hacer las conexiones
3 resistencias de 220 Ω
1 LED verde
1 LED amarillo
1 LED rojo
1 sensor ultrasónico Arduino (HC-SR04)
1 buzzer
Lo primero que haré será plantear el algoritmo del sistema de detección de obstáculos.
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.
1 // Pines utilizados
2 #define LEDVERDE 2
3 #define LEDAMARILLO 3
4 #define LEDROJO 4
5 #define TRIGGER 5
6 #define ECHO 6
7 #define BUZZER 9
8
9 // Constantes
10 const float sonido = 34300.0; // Velocidad del sonido en cm/s
11 const float umbral1 = 30.0;
12 const float umbral2 = 20.0;
13 const float umbral3 = 10.0;
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
Por último vamos a empezar desde un estado conocido, todos los LEDs apagados. He
creado una función para realizar esta tarea.
1 void setup() {
2 // Iniciamos el monitor serie
3 Serial.begin(9600);
4
5 // Modo entrada/salida de los pines
6 pinMode(LEDVERDE, OUTPUT);
7 pinMode(LEDAMARILLO, OUTPUT);
8 pinMode(LEDROJO, OUTPUT);
9 pinMode(ECHO, INPUT);
10 pinMode(TRIGGER, OUTPUT);
11 pinMode(BUZZER, OUTPUT);
12
13 // Apagamos todos los LEDs
14 apagarLEDs();
15
16 }
digitalWrite(LEDVERDE, LOW);
digitalWrite(LEDAMARILLO, LO
digitalWrite(LEDROJO, LOW);
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.
1 void loop() {
2 // Preparamos el sensor de ultrasonidos
3 iniciarTrigger();
4
5 // Obtenemos la distancia
6 float distancia = calcularDistancia();
7
8 // Apagamos todos los LEDs
9 apagarLEDs();
10
11 // Lanzamos alerta si estamos dentro del rango de peligro
12 if (distancia < umbral1)
13 {
14 // Lanzamos alertas
15 alertas(distancia);
16 }
17
18 }
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).
Lanzar alertas
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.
1 // Función que comprueba si hay que lanzar alguna alerta visual o sonora
2 void alertas(float distancia)
3 {
4 if (distancia < umbral1 && distancia >= umbral2)
5 {
6 // Encendemos el LED verde
7 digitalWrite(LEDVERDE, HIGH);
8 tone(BUZZER, 2000, 200);
9 }
10 else if (distancia < umbral2 && distancia > umbral3)
11 {
12 // Encendemos el LED amarillo
13 digitalWrite(LEDAMARILLO, HIGH);
14 tone(BUZZER, 2500, 200);
15 }
16 else if (distancia <= umbral3)
17 {
18 // Encendemos el LED rojo
19 digitalWrite(LEDROJO, HIGH);
20 tone(BUZZER, 3000, 200);
21 }
22 }
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.
1 // Pines utilizados
2 #define LEDVERDE 2
3 #define LEDAMARILLO 3
4 #define LEDROJO 4
5 #define TRIGGER 5
6 #define ECHO 6
7 #define BUZZER 9
8
9 // Constantes
10 const float sonido = 34300.0; // Velocidad del sonido en cm/s
11 const float umbral1 = 30.0;
12 const float umbral2 = 20.0;
13 const float umbral3 = 10.0;
14
15 void setup() {
16 // Iniciamos el monitor serie
17 Serial.begin(9600);
18
19 // Modo entrada/salida de los pines
20 pinMode(LEDVERDE, OUTPUT);
21 pinMode(LEDAMARILLO, OUTPUT);
22 pinMode(LEDROJO, OUTPUT);
23 pinMode(ECHO, INPUT);
24 pinMode(TRIGGER, OUTPUT);
25 pinMode(BUZZER, OUTPUT);
26
27 // Apagamos todos los LEDs
28 apagarLEDs();
29
30 }
31
32 void loop() {
33 // Preparamos el sensor de ultrasonidos
34 iniciarTrigger();
35
36 // Obtenemos la distancia
37 float distancia = calcularDistancia();
38
39 // Apagamos todos los LEDs
40 apagarLEDs();
41
42 // Lanzamos alerta si estamos dentro del rango de peligro
43 if (distancia < umbral1)
44 {
45 // Lanzamos alertas
46 alertas(distancia);
47 }
48
49 }
50
51 // Apaga todos los LEDs
52 void apagarLEDs()
53 {
54 // Apagamos todos los LEDs
55 digitalWrite(LEDVERDE, LOW);
56 digitalWrite(LEDAMARILLO, LOW);
57 digitalWrite(LEDROJO, LOW);
58 }
59
60 // Función que comprueba si hay que lanzar alguna alerta visual o sonora
61 void alertas(float distancia)
62 {
63 if (distancia < umbral1 && distancia >= umbral2)
64 {
65 // Encendemos el LED verde
66 digitalWrite(LEDVERDE, HIGH);
67 tone(BUZZER, 2000, 200);
68 }
69 else if (distancia < umbral2 && distancia > umbral3)
70 {
71 // Encendemos el LED amarillo
72 digitalWrite(LEDAMARILLO, HIGH);
73 tone(BUZZER, 2500, 200);
74 }
75 else if (distancia <= umbral3)
76 {
77 // Encendemos el LED rojo
78 digitalWrite(LEDROJO, HIGH);
79 tone(BUZZER, 3000, 200);
80 }
81 }
82
83 // Método que calcula la distancia a la que se encuentra un objeto.
84 // Devuelve una variable tipo float que contiene la distancia
85 float calcularDistancia()
86 {
87 // La función pulseIn obtiene el tiempo que tarda en cambiar entre estados, en este
88 caso a HIGH
89 unsigned long tiempo = pulseIn(ECHO, HIGH);
90
91 // Obtenemos la distancia en cm, hay que convertir el tiempo en segudos ya que está
92 en microsegundos
93 // por eso se multiplica por 0.000001
94 float distancia = tiempo * 0.000001 * sonido / 2.0;
95 Serial.print(distancia);
96 Serial.print("cm");
97 Serial.println();
98 delay(500);
99
100 return distancia;
101 }
102
103 // Método que inicia la secuencia del Trigger para comenzar a medir
104 void iniciarTrigger()
105 {
106 // Ponemos el Triiger en estado bajo y esperamos 2 ms
107 digitalWrite(TRIGGER, LOW);
108 delayMicroseconds(2);
109
110 // Ponemos el pin Trigger a estado alto y esperamos 10 ms
111 digitalWrite(TRIGGER, HIGH);
112 delayMicroseconds(10);
113
114 // Comenzamos poniendo el pin Trigger en estado bajo
digitalWrite(TRIGGER, LOW);
}