Detectando obstáculos con un sensor de ultrasonidos y Arduino

Detectando obstáculos con un sensor de ultrasonidos y Arduino

Siempre me ha gustado la robótica y nunca me he atrevido con ello por lo costoso del proceso de aprendizaje y los componentes, pero hoy en día gracias a "dispositivos" como Raspberry Pi o Arduino lo tenemos un poco más a mano. Por ello hace no mucho tiempo me compré un Starter Kit de Arduino para empezar a ir viendo como son las cosas en robótica.
 Siendo conscientes que de ahí a "construir un robot" hay un largo camino podemos decir que gracias a ellos poco a poco se pueden ir adquiriendo conocimientos relacionados que nos ayudarán a aprender electrónica y programación de hardware.

En este artículo vamos a ver cómo utilizar un sensor de ultrasonidos para detectar obstáculos a cierta distancia y actuar en consecuencia.

Mediante un sensor de ultrasonidos activaremos unos LED y un zumbador (buzzer) dependiendo de la distancia a la que se encuentre un obstáculo, usaremos también una pantalla LCD de 16×2 para mostrar la distancia en centímetros.

Antes de comenzar mencionar que lo aquí expuesto es una adaptación del artículo de Instructables

Componentes necesarios:

  • Arduino (UNO en este caso) y su cable USB
  • Protoboard o breadboard
  • 6 LED (2 verdes, 2 amarillo y 2 rojos)
  • 7 resistencias de 220 ó de 330 ohmios
  • Sensor de ultrasonidos (HC-SR04)
  • Pantalla LCD de 16×2
  • Adaptador LCM1602 para facilitar la conexión de la pantalla al Arduino
  • Un zumbador (buzzer)
  • Cables para realizar conexiones:

    • 20 macho a macho
    • 4 hembra a hembra (Opcional, se puede conectar directamente a la breadboard)
Arduino UNO Rev 3 y cable USB Breadboard Leds Resistencias Sensor de ultrasonidos (HC-SR04)
Pantalla LCD de 16x2 Adaptador LCM1602 para la pantalla LCD Zumbador (Buzzer) Cables macho a macho Cables hembra a hembra

Lógicamente no todo es necesario, es más, para medir la distancia sólo necesitaríamos el sensor de ultrasonidos pudiendo mostrar la distancia por el puerto Serial, pero de esta forma lo haremos mucho más visible y así de paso, aprenderemos a utilizar varios componentes en un único "proyecto".

No voy a mostrar cómo se conectan uno a uno los cables y componentes porque se nos haría muy largo, pero sí que dejo el esquema de cómo se realizan las conexiones:

Esquema de conexiones

¿Qué es un sensor de ultrasonidos?

Según la Wikipedia:

El sensor emite un sonido y mide el tiempo que la señal tarda en regresar. Estos reflejan en un objeto, el sensor recibe el eco producido y lo convierte en señales eléctricas, las cuales son elaboradas en el aparato de valoración. Estos sensores trabajan solamente en el aire, y pueden detectar objetos con diferentes formas, colores, superficies y de diferentes materiales. Los materiales pueden ser sólidos, líquidos o polvorientos, sin embargo han de ser deflectores de sonido. Los sensores trabajan según el tiempo de transcurso del eco, es decir, se valora la distancia temporal entre el impulso de emisión y el impulso del eco.

Las conexiones de los componentes son:

  • Sensor de ultrasonidos:

    • Vcc: Voltaje (5v), es la conexión que da corriente al sensor
    • GND: A masa (GND)
    • Trig: Al pin digital 7 del Arduino
    • Echo: Al pin digital 6 de Arduino
  • Leds:

    • Ánodo: (patilla larga) Van a los pines digitales 8, 9, 10, 11, 12 y 13 del Arduino, de izquierda a derecha (primer rojo al último verde)
    • Cátodo: Mediante una resistencia de 220 ohmios cada uno a masa (GND)
  • Zumbador (buzzer):

    • Terminal positiva (cable rojo en el esquema): Mediante una resistencia de 220 ohmios a un cable que lo conecta con el Pin digital número 3 (PWM) del Arduino
    • Terminal negativa: A masa (GND)
  • Pantalla LCD, mediante el adaptador LCM1602 de cuatro pines va conectado a:

    • Vcc: Voltaje (5v)
    • GND: A masa (GND)
    • SDA: Al pin analógico A4 de Arduino
    • SCL: Al pin analógico A5 de Arduino
  • Del Arduino a la breadboard:

    • GND: A una de las dos fases de color azul
    • 5v: Voltaje, a una de las dos fases de color rojo

Sabiendo esto lo que haremos será calcular la distancia a un objeto mediante el sensor de ultrasonidos, distancia que será mostrada en la pantalla LCD y según ésta sea mayor o menor activará una serie de leds que nos mostrarán visualmente por colores si el objeto está más lejos (leds verdes) o más cerca (leds rojos), también, según la distancia al objeto se reproducirá un sonido a través del zumbador, que será diferente según la distancia a la que se encuentre el obstáculo.

Esto, más allá de nuestro propósito que es más que nada el aprendizaje, tiene multitud de utilidades como por ejemplo detectar si alguien se aproxima a una puerta y en caso de que se acerque mucho activar una cámara que nos permita ver en tiempo real de quién se trata, "crear una alarma para despertarnos que sólo se desactive al pasar por cierto punto, o al alcanzar cierta distancia a un "objeto" o pared y muchísimas cosas más.

Pues bien, una vez tenemos todo correctamente conectado, tenemos que cargar el programa a nuestro Arduino. Veamos el programa en cuestión y luego lo comentamos:

#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
 
// Pines a los que están conectados el "Trig" y "Echo" del sensor de ultrasonidos
#define trigPin 7
#define echoPin 6
 
// Pines a los que están conectados los LED
#define led 13
#define led2 12
#define led3 11
#define led4 10
#define led5 9
#define led6 8
 
// Pin al que conectamos el buzzer
#define buzzer 3
 
// Conexiones de la pantalla LCD al adaptador
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Addr, En, Rw, Rs, d4, d5, d6, d7, backlighpin, polarity
 
int sound = 250;
 
void setup() {
	// Inicialimos el Serial, sensor de ultrasonidos, leds y buzzer (zumbador)
	Serial.begin (9600);
	pinMode(trigPin, OUTPUT);
	pinMode(echoPin, INPUT);
	pinMode(led, OUTPUT);
	pinMode(led2, OUTPUT);
	pinMode(led3, OUTPUT);
	pinMode(led4, OUTPUT);
	pinMode(led5, OUTPUT);
	pinMode(led6, OUTPUT);
	pinMode(buzzer, OUTPUT);
 
 
	// Inicializamos la pantalla LCD
	lcd.begin(16,2);
//	lcd.noBacklight();
 
	// Situamos el cursor en la primera casilla de la primera fila y escribimos un texto
	lcd.setCursor(0, 0);
	lcd.print("tecnogame.org");
}
 
void loop() {
	long duration, distance;
	digitalWrite(trigPin, LOW); 
	delayMicroseconds(2);
	digitalWrite(trigPin, HIGH);
	delayMicroseconds(10);
	digitalWrite(trigPin, LOW);
	duration = pulseIn(echoPin, HIGH);		// Recogemos la duración entre los pulsos recibidos por el "echo"
	distance = (duration/2) / 29.1;			// Calculamos la distancia al obstáculo según la duración entre los pulsos recibidos
 
	// Limpiamos la segunda linea de la pantalla LCD
	for(int i = 0; i < 16; i++){
	lcd.setCursor(i, 1);
	lcd.print(" ");
	}
 
	// Esta serie de ifs sirven para encender unos led y establecer unos tonos para el zumbador según la distancia al obstáculo
	if (distance <= 100) {
		digitalWrite(led, HIGH);
		sound = 250;
	}else{
		digitalWrite(led,LOW);
	}
 
	if (distance < 83) {
		digitalWrite(led2, HIGH);
		sound = 260;
	}else{
		digitalWrite(led2, LOW);
	}
 
	if (distance < 66) {
		digitalWrite(led3, HIGH);
		sound = 270;
	}else{
		digitalWrite(led3, LOW);
	}
 
	if (distance < 49) {
		digitalWrite(led4, HIGH);
		sound = 280;
	}else{
		digitalWrite(led4,LOW);
	}
 
	if (distance < 32) {
		digitalWrite(led5, HIGH);
		sound = 290;
	}else{
		digitalWrite(led5,LOW);
	}
 
	if (distance < 15) {
		digitalWrite(led6, HIGH);
		sound = 300;
	}else{
		digitalWrite(led6,LOW);
	}
 
	// En caso de que la distancia sea mayor que 1 metro (100 cm) o menor que 2 cm, indicamos que "no hay obstáculos"
	if (distance > 100 || distance <= 2){
		Serial.println("Sin obstáculos");
 
		lcd.setCursor(0, 1);
		lcd.print("Sin obstaculos");  
 
		noTone(buzzer);
	}else{
	// En caso de que se encuentre en ese rango mostramos la distancia al obstáculo en centímetros y reproducimos el zumbido oportuno
		Serial.print(distance);
		Serial.println(" cm");
 
		lcd.setCursor(0, 1);
		lcd.print(int(distance));  
		lcd.setCursor(2, 1);
		lcd.print(" cm");
 
		tone(buzzer, sound);   
	}
 
	delay(200);
}

No hay mucho más que explicar del código que lo que se ve en los comentarios, nada más encender el Arduino con el programa se ejecuta el "setup" que se encarga de inicializar los componentes e indicar en qué "puertos" se encuentran y cuáles son sus estados de inicio. Tras esto, se ejecuta el "loop" de forma reiterativa comprobando cada vez cuál es la distancia al obstáculo y ejecutando las sentencias indicadas según las nuevas mediciones de cada iteración.

Como vemos algo muy sencillo, pero que nos permite conocer las peculiaridades de ciertos componentes que pueden ser utilizados en muchos proyectos con Arduino.

Si quieres puedes ver el resultado del proyecto en el siguiente video:

Relacionado: