En una entrada de hace un par de semanas describía cómo construir un «botón sin contacto», por medio de una célula fotoeléctrica, en previsión que este tipo de interruptores van a utilizarse mucho más a partir de ahora, en este nuevo mundo durante y tras COVID-19…
Cuento ahora otro botón «sin contacto» también muy sencillo, empleando el sensor ultrasónico HC-SR04.
El concepto detrás de este sensor es muy sencillo: se emite un pulso de alta frecuencia que tras rebotar en un objeto es captado de vuelta por un micrófono. Midiendo el tiempo entre la señal emitida y la recepción de su rebote se puede calcular la distancia a la que se encuentra el objeto en cuestión.
Según la hoja de especificaciones, se alimenta de 5V y su rango de medida está entre 2 cm y 400 cm, con un ángulo de 15º. Es un sensor muy típico y barato (menos de 2€).
Instalo la librería NewPing desde el IDE de Arduino, y conecto de la siguiente forma:
HC-SR04 -> Arduino Pro Micro (Leonardo):
Vcc -> VCC
Trig -> 5
Echo -> 5
Gnd -> GND
Puede conectarse «Trig» y «Echo» a pines diferentes, pero con la librería «NewPing», que se puede instalar directamente desde el IDE de Arduino, se puede emplear un mismo pin, en mi caso el 5. A fin de cuentas, cuando se está emitiendo la señal no se está esperando la respuesta, por lo que se puede emplear el mismo pin para los dos propósitos.
Conecto también un led (con su resistencia correspondiente), de forma que me queda conectado así:
Y cargo el siguiente código:
<code>#include <NewPing.h> // HC-SR04 -> Arduino Pro Micro (Leonardo): // Vcc -> VCC // Trig -> 5 // Echo -> 5 // Gnd -> GND const int UltrasonicPin = 5; // Pin al que se envía y recibe la señal del HC-SR04 const int MaxDistance = 200; const int ledPin = 9; // Pin al que está conectado el LED const int distSens = 11; // Distancia por debajo de la cual se enciende el led int dist; NewPing sonar(UltrasonicPin, UltrasonicPin, MaxDistance); void setup() { Serial.begin(9600); } void loop() { delay(50); // esperar 50ms entre pings (29 ms como mínimo) dist=sonar.ping_cm(); Serial.print(dist); Serial.println("cm"); if (dist < distSens) { Serial.println("Enciendo"); digitalWrite(ledPin, HIGH); delay(50); Serial.println("Apago"); digitalWrite(ledPin, LOW); } }</code>
En el vídeo del principio puede verse en funcionamiento.