Académique Documents
Professionnel Documents
Culture Documents
Introduccin
Para conectar un LCD al arduino es necesario el uso de muchos pines, por lo que se puede utilizar
un mdulo serial I2C, lo que significa que enva datos secuencialmente un bit por vez sobre un
canal de comunicacin, de manera que se utilizan menos cables para mandar la misma cantidad
de informacin.
Para esta experiencia utilizamos el mismo cdigo del motor paso a paso
Figura 1 conexin del Serial Display para conectar el LCD con slo 2 pines de informacin
Funcionamiento
El mdulo Serial para el display se conecta como muestra la figura anterior, donde primero se
prueba un temporizador simple, con el siguiente cdigo:
#include <Wire.h> // Paquete la comunicacin con I2C
#include <LCD.h>
#include <LiquidCrystal_I2C.h> //librera a utilizar
// Addr, En, Rw, Rs, d4, d5, d6, d7, backlighpin, polarity
Luego se procede a modificar el cdigo de la experiencia anterior, para el uso del Mdulo
Serial para el LCD. Con el siguiente cdigo:
float vref = 300; //Se definen todas las variables a utilizar, vref es la velocidad de
referencia que se utiliza para
int hi = -1;
//generar los diferentes patrones de vueltas por segundos solicitados,
tambien se definen las
int vi = 0;
//Posiciones iniciales del home para poder asi calcular la distancia a recorrer
de ida y vuelta
int hf = -1;
int vf = 0;
String inString = ""; //Variable para la asignacin de nmeros (sirve para escribir cualquier
numero mayor a 9)
#include <Wire.h>
#include <LiquidCrystal_I2C.h>//Recuerda descargar la libreria en electrocrea.com
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);//Direccion de LCD
void setup () {
lcd.begin(16, 2); //Se inicia la pantalla lcd
Serial.begin(19200);
pinMode(13, OUTPUT); //Se definen los pines a utilizar para hacer girar el motor y darle
direccion
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
}
void loop() {
digitalWrite(8, LOW); //Se define el pin de direccion como LOW para comenzar el
recorrido en un sentido
lcd.clear();
lcd.print("Coordenada"); //Se muestra en el lcd el mensaje que indica que se debe
ingresar la coordenada
lcd.setCursor(0, 1); //Horizontal
lcd.print("Horizontal");
Serial.println("Ingrese coordenada horizontal"); //Se muestra por pantalla que se debe
ingresar la coordenada
int hf = -1; //Designa un interruptor para mantener la identificacion de los numeros, para
la coordenada horizontal
while (hf == -1) {
while (Serial.available() > 0) {
int inChar = Serial.read(); //Se leern los caracteres en la consola
if (isDigit(inChar)) { //Si se encuentra un caracter tipo char, se agregar a inString
inString += (char)inChar;
}
if (inChar == '\n') { //Cuando se detecte el salto de lnea (enter), la "palabra" en
inString se convertir en nmero.
hf = (inString.toInt());
inString = ""; //Finalmente se reinicia inString para actuar con la coordenada vertical.
}
}
}
Serial.println("Ingrese coordenada vertical"); //Se solicita la coordenada vertical
lcd.clear();
lcd.print("Coordenada"); //Se muestra en el lcd el mensaje que indica que se debe
ingresar la coordenada
lcd.setCursor(0, 1);
//Vertical
lcd.print("Vertical");
int vf = -1; //Interruptor para escribir la coordenada vertical
while (vf == -1) { //el sistema es el mismo que para la coordenada horizontal.
while (Serial.available() > 0) {
int inChar = Serial.read();
if (isDigit(inChar)) {
inString += (char)inChar;
}
if (inChar == '\n') {
vf = (inString.toInt());
inString = "";
}
}
}
Serial.println("Movimiento Horizontal");
int pos = -1;
for (int j = 1; j <= 1600 * (hf - hi); j = j + 1) {
digitalWrite(9, LOW); //Se mueve de forma horizontal a la velocidad de referencia
delayMicroseconds(vref);
digitalWrite(9, HIGH);
delayMicroseconds(vref);
if (j % 1600 == 0) { //Se indicara la posicion en la que se encuentra el carrito
pos = pos + 1; //de acuerdo a la celda de posiciones.
lcd.clear();
lcd.print("Avanzando"); //Se imprime en el lcd la posicion
lcd.setCursor(0, 1);
lcd.print(pos);
lcd.print(":");
lcd.print(vi);
Serial.print("Posicion actual: "); //Se imprime por la pantalla del pc la posicion
Serial.print(pos);
Serial.print(":");
Serial.println(vi);
tone(6, 494, 1000 / 4); //Por cada ciclo suena una vez el tono durante un tiempo.
delay(500);
noTone(6);
}
}
delay(500);
Serial.println("Movimiento Vertical");
pos = 0;
for (int j = 1; j <= 1600 * (vf - vi); j = j + 1) {
digitalWrite(9, LOW); //Se mueve de forma vertical a la mitad de la velocidad de
referencia
delayMicroseconds(vref * 2);
digitalWrite(9, HIGH);
delayMicroseconds(vref * 2);
lcd.setCursor(0, 1);
lcd.print(hf);
lcd.print(":");
lcd.print(pos);
delay(500);
Serial.println("Devolviendose");
Serial.println("Movimiento Vertical");
digitalWrite(8, HIGH);
pos = vf;
for (int j = 1; j <= 1600 * (vf - vi); j = j + 1) { //Se comienza a devolver el carrito
digitalWrite(9, LOW); //Se devuelve primero de forma vertical a la mitad de la
velocidad de referencia
delayMicroseconds(vref * 2);
digitalWrite(9, HIGH);
delayMicroseconds(vref * 2);
if (j % 1600 == 0) { //Se indica la posicion en la que se encuentra el carrito
pos = pos - 1;
lcd.clear();
lcd.print("Bajando");
lcd.setCursor(0, 1);
lcd.print(hf);
lcd.print(":");
lcd.print(pos);
Serial.print("Posicion actual: ");
Serial.print(hf);
Serial.print(":");
Serial.println(pos);
tone(6, 494, 1000 / 4); //Por cada ciclo suena una vez el tono durante un tiempo.
delay(500);
noTone(6);
}
}
delay (500);
Serial.println("Movimiento Horizontal");
pos = hf;
for (int j = 1; j <= 1600 * (hf - hi); j = j + 1) {
Investigar
Se pide averiguar la opcin de conectar 2 o ms display LCD al Microcontrolador. Esto se
puede realizar utilizando la direccin del bus de cada I2C que controla cada pantalla ya que
cada dispositivo I2C presenta una direccin. El cdigo para conocer la direccin de cada uno
de los display se presenta a continuacin:
#include <Wire.h>
void setup() {
Serial.begin (115200);
// Espera conectar el Puerto serial
while (!Serial)
{
}
Serial.println ();
Serial.println ("I2C scanner. Scanning ...");
byte count = 0;
Wire.begin();
for (byte i = 8; i < 120; i++)
{
Wire.beginTransmission (i);
if (Wire.endTransmission () == 0)
{
Serial.print ("Found address: ");
Serial.print (i, DEC);
Serial.print (" (0x");
Serial.print (i, HEX);
Serial.println (")");
count++;
delay (1); // Puede que no lo necesites
} // end of good response
} // Termino del loop de busqueda
Serial.println ("Done.");
void setup()
{
lcd1.init();
lcd2.init();
void loop()
{
}
Primero antes de todo la seal de datos se transfiere en secuencias de 8 bits, primero debe
haber un bit de partida (o condicin de partida), luego sigue la primera secuencia de 8 que
indica la direccin del esclavo (considerando el bit que determina si debe leer del
dispositivo o darle instrucciones). Luego viene el bit de acknowledge o bit de acuerdo, el
cul responde con un bit LOW o HIGH si el esclavo existe o no. Luego puede venir una
secuencia de 8 bits con el registro interno del dispositivo esclavo seguido de otro bit de
acuerdo. Luego viene la secuencia de datos, tantas como sea necesario para enviar toda la
data, terminado el envo de datos viene otro bit de acknowledge, que es el que confirma
Figura 3 Ejemplo con un sensor de direccin 0X53 y registro interno de 0x32 (0101 0011 y 0011 0010 respectivamente).
Luego vemos que la condicin de inicio es que la seal de datos pasa a LOW mientras que la seal
de reloj sigue en HIGH, Luego vemos en la lnea azul que se presenta la direccin del dispositivo
esclavo en los 7 bits siguientes y que en el octavo (que est en posicin HIGH) est en modo de
lectura, luego pasa al registro interno del dispositivo con un cdigo de 8 bits, y luego del bit de que
existen estos registros, se enva la data, finalmente la condicin de parada es cuando la seal SDA
pasa de LOW a HIGH mientras la seal SCL est en posicin HIGH.
Conclusiones
Con lo aprendido en esta experiencia, podemos ver que el manejo de los protocolos de seales es
parte importante de la mecatrnica ya que nos permite controlar diversos dispositivos con un solo
controlador o maestro, dando flexibilidad para la toma de decisiones, ya que tambin podramos
utilizar un protocolo paralelo que necesita ms cables para funcionar. Por otro lado estos protocolos
seriales simplifican las conexiones entre dispositivos, permitiendo que se comuniquen entre ellos
por lo que se pueden programar relaciones lgicas y condiciones entre los dispositivos, adems este
protocolo nos permite obtener informacin especfica de cada subdispositivo, lo que nos ahorra
tiempo y espacio, tenemos slo el dato que necesitamos.