sábado, 14 de abril de 2018

Medidor e indicador de distancia con Arduino

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.


Esquema de conexión entre el sensor de ultrasonidos y la placa programable Arduino UNO

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


#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