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:

By | 2016-09-10T18:06:12+00:00 marzo 19th, 2014|Arduino, Robótica|23 Comments

About the Author:

Desarrollador de software de profesión, apasionado de la informática y todo lo relacionado con la tecnología

23 Comments

  1. Juan crespo junio 30, 2014 at 1:30 am - Reply

    Nosé porque usan todos esa porqueria de arduino ? porqué buscan lo mas facil ? porqué no aprender a pogramar en pic c o un proton o algo que valga la pena !  una persona no va estar comprando un modulo de arduino para cada proyecto o para deber de la Universidad ?  osea si a alguien le mandan un proyecto complejo no va a poner en su proyecto unos 5 modulos de arduino porqué nunca aprendio a programar en un buen lenguaje…..

    • dolphin junio 30, 2014 at 12:06 pm - Reply

      Hola Juan, probablemente tengas razón y digo probablemente porque no soy un experto en el tema, pero creo que la tienes.

      La cuestión es que muchos no sabemos de electrónica, en mi caso concreto simplemente quería (y quiero) aprender cosas sobre el tema, y Arduino es una “plataforma” que facilita mucho las cosas, desde lo más básico, que puede que haya otras cosas mucho mejores para aprender, pues sí, pero quizá hayan sido los de Arduino los que han sabido desmarcarse mejor sobre los demás y establecerse como los “mejores” para el aprendizaje.

      Para un proyecto grande y complejo está claro que Arduino no es la mejor plataforma.

      Respecto a lo de un buen lenguaje… Por lo que tengo entendido C (que es lo que “usa” Arduino) es el lenguaje más extendido en programación de hardware y creo que es un lenguaje muy bueno más allá de los años que tiene y lo “básico” que es.

      Muchas gracias por comentar, siempre es bueno conocer opiniones contrarias y de ellas se aprende mucho.

    • Hell julio 4, 2015 at 5:54 pm - Reply

      ¿Y cual es el problema con arduino?

      Arduino ha abierto las puertas a gente que no sabemos nada de electrónica a este mundo, arduino sirve para muchas cosas, no solo para hacer proyectitos como prender led's, la cosa es imaginación y un poquito de lógica.

      Ahora yo me preguntaría:para que usar pic o proton o algo tan complejo si con un arduino podemos hacer lo mismo y de manera más sencilla, es cuestión de enfoques.

      Si yo me dedicara a hacer circuitos electrónicos en masa y venderlos lo más barato posible pues me hago ingeniero en electrónica y me pongo a programar pic's pero como mi necesidad no llega a tal nivel y solo necesito llegar a mi casa y encender las luces vía bluetooth o wifi y abrir la puerta con una llave plástica pues para que estudio 4 o 5 años si lo puedo hacer en un rato, yo soy diseñador industrial y me interesa esto porque puedo incluir electrónica en algunos productos, si la gente lo paga porqué no hacerlo???

  2. Fabian agosto 27, 2014 at 12:57 am - Reply

    Amigo.. Como quedaria el codigo si no deseo usar el adaptador para la LCD?
    Me podrias ayudar.. Gracias

    • dolphin agosto 27, 2014 at 12:44 pm - Reply

      Hola Fabian, ¿no quieres usar el adaptador o la pantalla LCD?

      Si no vas a usar una pantalla LCD tienes que eliminar las tres primeras líneas y la que dice:

      LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Addr, En, Rw, Rs, d4, d5, d6, d7, backlighpin, polarity

      Después en todo el resto de código eliminas todas las líneas en las que aparezca la variable "lcd" y ya te debería funcionar.

      Si lo que quieres es usar el LCD sin adaptador tienes aquí cómo hacerlo: Wiki Arduino

      Saludos.

  3. Rebeca septiembre 26, 2014 at 12:35 am - Reply

    Muy buen información, sigue adelante, finalmente nosotros elegimos la mejor manera de aprender y arduino es maravilloso.

  4. richard octubre 18, 2014 at 8:34 pm - Reply

    muy bueno  …yo  soy de Ing de sistemas  cuando supe que arduino usaba programacion C++  empece hacer  muchas aplicaciones ,con java  ,android y con otras aplicaciones …..tuve algunas complicaciones con la electronica pero averiguando se logra resolver y se aprende mucho ….se que hay componentes de arduino caritos  pero no es limite para mi ya que me voy a  la cachinas encuentro maravillas  ,las   LCD por ejemplos  estos los consigo de impresoras desechadas de todos los tamaños ,MOTORES,SERVOMOTORES,etc ,….pero bueno es gratificante  ,Ahora estare haciendo aplicaciones  industriales con  Arduino ya que tambien ya se esta entrando en  las industrias de a poco  a poco…hay estudiantes   que ya estan experimentando con arduino en maquinas Mayores ,y tienen buenos resultados…..Arduino estara evolucionando con el tiempo….saludos..

    • dolphin octubre 18, 2014 at 9:04 pm - Reply

      Hola Richard. Muchas gracias por comentar y aportar tus experiencias con Arduino, se agradece de verdad. Sí que es algo muy gratificante, yo tengo 0 o -1 de idea de electrónica, sí que me dedico a la programación de aplicaciones Android, a pesar de venir de sistemas jeje. Pero me  gusta mucho la electrónica y sobre todo la robótica, por ello he decidido hace un tiempo intentar aprender algo de electrónica, cuánto más mejor, a través de Arduino, no tengo ningún proyecto concreto, ni planes de futuro en cuánto a electrónica se refiere, simplemente me gusta ir proponiéndome pequeñas metas y así poco a poco ir adquiriendo conocimientos de electrónica básica.

      De nuevo gracias por comentar.

      Saludos.

  5. richard octubre 18, 2014 at 11:05 pm - Reply

    PODRIAS FACILITAR LAS LIBRERIAS TODAS…GRACIAS

  6. Francisco noviembre 18, 2014 at 6:47 am - Reply

    Hola, a la hora de meter el programa al software arduino me aparece o siguiente:

    sketch_nov17a:21: error: 'LiquidCrystal_I2C' does not name a type
    sketch_nov17a.ino: In function 'void setup()':
    sketch_nov17a:40: error: 'lcd' was not declared in this scope
    sketch_nov17a.ino: In function 'void loop()':
    sketch_nov17a:60: error: 'lcd' was not declared in this scope
    sketch_nov17a:111: error: 'lcd' was not declared in this scope
    sketch_nov17a:120: error: 'lcd' was not declared in this scope

    me podrias hechar una mano…

     

    • dolphin noviembre 19, 2014 at 11:49 pm - Reply

      Hola Francisco, el error que te está dando es porque la variable “lcd” no existe. ¿Has verificado que has copiado bien todo el código? La línea que define la variable “lcd” es la siguiente:  LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Addr, En, Rw, Rs, d4, d5, d6, d7, backlighpin, polarity

      Para que funcione también necesitas la librería en cuestión.

      Saludos

       

  7. Eddie Alexander noviembre 21, 2014 at 3:12 pm - Reply

    Hola, me sale el mismo error que el comentario de arriba, esa libreria de donde la sacaste? no tienes el archivo para anexarlo al arduino?

    • dolphin noviembre 21, 2014 at 3:21 pm - Reply

      Hola Eddie, perdonad las molestias, debería haber incluido las librerías y se me pasó en su momento, en cuánto tenga un momento actualizo el post. Mientras tanto aquí os dejo la librería, ya que la he estado buscando y no la encuentro por internet:

      LiquidCrystal_I2C (Tecno Game)

      Espero que ahora sí que os funcione. Comentadme.

      Saludos

      • JOSE A. junio 3, 2015 at 7:15 pm - Reply

        Hola, buena aportacion solo tengo un problema con el codigo es este: 
        "sketch_mini.ino:2:31: fatal error: LiquidCrystal_I2C.h: No such file or directory
        compilation terminated.
        Error de compilación"

        ¿me podrias ayudar con eso?

         

        • JOSE A. junio 3, 2015 at 7:16 pm - Reply

          "sketch_mini.ino:2:17: fatal error: LCD.h: No such file or directory
          compilation terminated.
          Error de compilación"

  8. HUMBERTO GONZALEZ GARCIA noviembre 25, 2014 at 5:16 am - Reply

    Me encanto, de echo me encuentro armandolo para probarlo pero me encontre con un problema la pantalla no muestra nada. Lo demas funciona bien pero la pantalla no muestra nada. Me podrias ayudar?

  9. franz abril 30, 2015 at 3:50 pm - Reply

    Hola, me podria ayudar si lo que necesito es que un led se encienda cuando llegue específicamente auna distancia y no de manera secuencial es decir cuando se encienda sea solo este el que lo aga mientras el resto seamtienen apagados. No usando un lcd

  10. jonatan mayo 4, 2015 at 9:25 pm - Reply

    buenas, si no tengo el LCM1602, como hago?

  11. Pepe junio 6, 2015 at 8:06 am - Reply

    El código seria el mismo si utilizo la pantalla pero sin el adaptador? Si fuera otro podrias decirmelo.

    • dolphin julio 2, 2015 at 8:27 pm - Reply

      Sin el adaptador lo único que puedo decirte es que el código no es el mismo, siento no poder ayudarte más.

      Saludos
       

  12. Hell julio 4, 2015 at 1:24 am - Reply

    De lujo, el primer buen proyecto que me sale, muchas gracias.

  13. Alexis Platero agosto 26, 2015 at 2:43 am - Reply

    Hola, te felicito por tan bonito proyecto, si fueras gan amable de sacarme de una duda, si yo kiciera sustituir el buzzer o zumbador por una bocina normal, pero pequeña no resultaria en un problema a la hora de ejutar el codigo? Gracias y sigue con tan buen trabajo… saludos desde El Salvador

    • dolphin agosto 26, 2015 at 9:06 pm - Reply

      Hola Alexis, pues la verdad que no puedo decirte más que no creo que la cosa cambie mucho, supongo que será un poco diferente pero casi nada, nunca he usado otra cosa más que un buzzer por lo que siento no poder ayudarte, espero que consigas tu propósito, ya nos contarás si quieres.

      Saludos y muchas gracias

Leave A Comment