Vous êtes sur la page 1sur 12

Universidad Tcnica Federico Santa Mara

Ingeniera Civil Mecnica


Mecatrnica en Ingeniera Mecnica
Segundo Semestre 2015

Mdulo Serial Para


Display LCD

Integrantes: Jorge Salas


Ignacio Suarez
Francisco Pino

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

Para esta experiencia se utiliza:


- Arduino Duemilanove
- Motor paso a paso
- Easy Driver
- Set de Jumpers.
- Pantalla lcd
- Potencimetro B10K
- Modulo Serial Para LCD I2C.
Se conecta el Serial display de la siguiente manera:

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

LiquidCrystal_I2C lcd( 0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE ); //


unsigned long tAntes = 0;
unsigned long tAhora = 0;
unsigned long tEjecucion = 1000;
void setup(){
lcd.begin(16,2); //define la medida del lcd LCD 16X2
lcd.backlight();
lcd.setCursor(0,0); //Posiciona el primer elemento en la lnea 1
lcd.print("Tiempo");
}
void loop(){
tAhora = millis(); //tAhora son los milisegundos
if( tAhora - tAntes >= tEjecucion ) { // Cada 1000 milisegundos, cambia el valor de la pantalla es un contador.
tAntes = tAhora;
lcd.setCursor(0,1); //posiciona el elemento en la lnea 2
lcd.print(tAhora/1000);
}
}

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);

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("Subiendo");
lcd.setCursor(0, 1); //Se imprime en el lcd la posicion
lcd.print(hf);
lcd.print(":");
lcd.print(pos);
Serial.print("Posicion actual: "); //Se imprime por la pantalla del pc la posicion
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);
//Depositar-Retirar
lcd.clear();
lcd.print("Depositando o"); //Se muestra por el lcd que el carrito esta depositando o
retirando
lcd.setCursor(0, 1);
//el item solicitado
lcd.print("Retirando");
for (int j = 1; j <= 1600; j = j + 1) {
digitalWrite(9, LOW); //El carrito deposita o retira a un octavo de la velocidad de
referencia
delayMicroseconds(vref * 8);
digitalWrite(9, HIGH);
delayMicroseconds(vref * 8);
if (j % 1600 == 0) {
Serial.println("Objeto Depositado/Retirado");
tone(6, 494, 1000 / 4); //Por cada ciclo suena una vez el tono durante un tiempo.
delay(500);
noTone(6);
}
}
lcd.clear();
lcd.print("Posicion");

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) {

digitalWrite(9, LOW); //Se comienza el movimiento horizontal a la velocidad de


referencia.
delayMicroseconds(vref);
digitalWrite(9, HIGH);
delayMicroseconds(vref);
if (j % 1600 == 0) { //Se indica la posicion en la que se encuentra el carrito
pos = pos - 1;
if (pos > -1) {
lcd.clear();
lcd.print("Regresando");
lcd.setCursor(0, 1);
lcd.print(pos);
lcd.print(":");
lcd.print(vi);
Serial.print("Posicion actual: ");
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);
}
else {
Serial.println("Home"); //Cuando termina el recorrido se devuelve al home
lcd.clear();
lcd.print("Home");
tone(6, 550, 1000 / 2); //Por cada ciclo suena una vez el tono durante un tiempo.
delay(500);
noTone(6);
delay(500);
tone(6, 550, 1000 / 2); //Por cada ciclo suena una vez el tono durante un tiempo.
delay(500);
noTone(6);
delay(5000);
}
}
}
}

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.");

Serial.print ("Found ");


Serial.print (count, DEC);
Serial.println (" device(s).");
} // fin del setup.
void loop() {}
Adems es posible cambiar el la direccin del bus de cada I2C para poder utilizarlos, si uno
o ms coinciden en direccin. Luego con esta direccin podemos definir qu debe hacer
cada dispositivo, como lo muestra el ejemplo del paquete LiquidCrystal_I2C llamado
MultipleLcd.ino mostrado a continuacin
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd1(0x20,16,2); // Determina la direccin del primer LCD que est en


0x20 y que tiene un display de 16x2
LiquidCrystal_I2C lcd2(0x21,16,2); // Determina la direccin del primer LCD que est en
0x21 y que tiene un display de 16x2

void setup()
{
lcd1.init();

// inicia el primer lcd

lcd2.init();

// inicia el Segundo lcd

// Imprime un mensaje en el lcd 1


lcd1.backlight();
lcd1.print("Hola mundo 1!");

// Imprime un mensaje en el lcd 2


lcd2.backlight();
lcd2.print("Hola mundo 2!");

void loop()
{
}

El protocolo de comunicacin I2C es un sistema de comunicacin que permite la interaccin


entre un dispositivo maestro y mltiples dispositivos esclavo e incluso puede establecer
comunicacin de mltiples dispositivos maestros. Lo que ms se aprecia de este protocolo
es que slo necesita 2 cables de comunicacin entre todos los dispositivos.
Para una comunicacin de 8-Bits es posible tener comunicados 128 dispositivos o visto de
otra manera se pueden escribir 27 direcciones de dispositivos, ya que el octavo bit es el que
indica si el dispositivo maestro debe leer del esclavo o decirle que hacer.
Por otro lado es necesario entender que el I2C tiene 2 puertos de entrada adems de la
tierra y la alimentacin, estos 2 puertos son los datos de manera serial (SDA) y una seal de
reloj, la seal de reloj (SCL) es la velocidad de sincronizacin de los dispositivos y es
generada por la unidad maestra, la seal serial de datos es la que transmite los datos a los
dispositivos.
Entonces un ciclo tpico de datos tiene la siguiente forma:

Figura 2 Ciclo Tpico de un transmisor Serial I2C

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

si el dispositivo esclavo ha recibido los datos, y si los ha entendido o si no puede recibir ms


datos y finalmente termina con una condicin de parada o stop.

Si vemos el panorama completo con un ejemplo tenemos la siguiente figura:

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.

Vous aimerez peut-être aussi