A
la hora de desarrollar proyectos mecatrónicos suele ser fundamental el poder
cuantificar distancias y emplearlas como datos de entrada que permitan a
nuestros autómatas tomar decisiones.
Usando
como base de programación el Entorno de Desarrollo Integrado de Arduino (IDE),
la adquisición de componentes se vuelve bastante económica. Pero aparece la
complejidad a la que todo técnico debe enfrentarse con gratos resultados, que
versa sobre la conexión e interacción entre distintos dispositivos.
Yo
ya había programado un medidor de distancias mediante un sensor de ultrasonidos
HC-SR04 de 45 x 20 mm y una placa programable Arduino UNO. Pero los valores
medidos sólo los podía ver en el monitor serie del propio (IDE). Así que el
siguiente reto ha sido poder mostrar dichos valores en un display LCD alfanumérico
de 16 columnas por 2 filas.
Afortunadamente
he podido simplificar bastante las conexiones del display gracias al módulo adaptador
serie I2C. Se trata de un bus de comunicación serie que simplifica las
conexiones a sólo dos líneas para transmitir la información. Una se dedica al
tráfico de datos y la otra a la señal de reloj. Dado que los circuitos que se
comunican mediante este bus suelen compartir la misma masa, no se considera
necesaria una tercera línea. Como indica Luis Llamas en su web, el I2C es un
bus síncrono. Todos los dispositivos que lo conforman permanecen sincronizados
gracias a la señal de reloj proporcionada por el dispositivo maestro. Así se
evita que cada dispositivo tenga su propio reloj, reduciendo la complejidad
para mantener una transmisión sincronizada. Para ampliar y aclarar
conocimientos, recomiendo visitar la web de Luis Llamas.
La
conexión entre el módulo serie I2C y el display LCD la he realizado de la
manera más simple pinchando sus patillas en la placa Protoboard. Para poder
usarlo he necesitado descargar la librería LiquidCrystal_I2C
y añadirla al IDE.
Para
la realizar el código de programa me he servido de estos dos tutoriales en
Internet:
El
buen ingeniero tiende a ser vago y pesetero. Pero lejos de dedicarme a hacer un
simple copia/pega, los códigos facilitados por los autores de las mencionadas
webs me han servido de ingredientes base para la creación de mi propio
programa. Considero que no merece la pena comenzar a realizar la programación
desde cero. Si, en cambio, reservar fuerzas y tiempo para la adecuada
comprensión de lo que estoy haciendo y adaptarlo a mi propio proyecto.
Programa
Programa
#include <Wire.h> // librería con las
funciones necesarias para el control del hardware integrado
#include <LiquidCrystal_I2C.h> // librería que gestiona el display LCD
LiquidCrystal_I2C lcd(0x3F,16,2); //
creación objeto LCD de 16 columnas x 2 filas y dirección 0x3F
const int EchoPin = 5;
const int TrigPin = 6;
const int LedPin = 13;
void setup()
{
lcd.init(); // inicializamos el display LCD
lcd.backlight(); // encendemos la luz de fondo del display LCD
lcd.setCursor(0, 0); // cursor en la primera posición(columna:0) de la
primera línea línea(fila:0)
lcd.print("Medidor distancia"); //
imprimimos en el display LCD la primera parte del texto
Serial.begin(9600);
pinMode(LedPin, OUTPUT);
pinMode(TrigPin, OUTPUT);
pinMode(EchoPin, INPUT);
}
void loop()
{
int cm = ping(TrigPin,
EchoPin);
Serial.print("Distancia:
");
Serial.println(cm);
delay(1000);
}
int ping(int TrigPin, int EchoPin) {
long duration, distanceCm;
digitalWrite(TrigPin, LOW); // para generar un pulso limpio ponemos a
LOW 4 microsegundos
delayMicroseconds(4);
digitalWrite(TrigPin, HIGH); // generamos un disparo de 10 microsegundos
delayMicroseconds(10);
digitalWrite(TrigPin, LOW);
duration = pulseIn(EchoPin, HIGH); // medimos el tiempo entre pulsos, en
microsegundos
distanceCm = duration * 10 / 292/ 2; // convertimos a distancia, en cm
long distancia = distanceCm;
lcd.setCursor(0, 1); // cursor en la primera posición(columna:0) de la
segunda línea(fila:1)
lcd.print(" "); //
dedicamos un espacio a la impresión del valor de la distancia
lcd.print(distancia);
lcd.print("cm "); // imprimimos el texto "cm" en el
display LCD
return distanceCm;
}
Una vez depurados los
errores y superadas las dificultades, ya tenemos confeccionado este módulo para
usarlo en próximos proyectos mecatrónicos. Tanto el código como el hardware son
susceptibles de ser ampliados, añadiendo señales de alarma ante distancias críticas,
actuación sobre motores y otros dispositivos de salida.
No hay comentarios:
Publicar un comentario