Experiencia 7a
-
Upload
ignacio-andres-suarez-laengle -
Category
Documents
-
view
218 -
download
0
Transcript of Experiencia 7a
-
7/25/2019 Experiencia 7a
1/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
-
7/25/2019 Experiencia 7a
2/12
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 cantidadde 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
FuncionamientoEl mdulo Serial para el display se conecta como muestra la figura anterior, donde primero se
prueba un temporizador simple, con el siguiente cdigo:
#include // Paquete la comunicacin con I2C
#include
#include //librera a utilizar
// Addr, En, Rw, Rs, d4, d5, d6, d7, backlighpin, polarity
-
7/25/2019 Experiencia 7a
3/12
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
#include //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 lcdSerial.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);
-
7/25/2019 Experiencia 7a
4/12
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, parala 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;
-
7/25/2019 Experiencia 7a
5/12
}
if (inChar == '\n') {
vf = (inString.toInt());
inString = "";
}
}
}
Serial.println("Movimiento Horizontal");
int pos = -1;
for (int j = 1; j
-
7/25/2019 Experiencia 7a
6/12
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
-
7/25/2019 Experiencia 7a
7/12
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
-
7/25/2019 Experiencia 7a
8/12
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 homelcd.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);
}
}
}
}
-
7/25/2019 Experiencia 7a
9/12
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
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.");
-
7/25/2019 Experiencia 7a
10/12
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
#include
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!");
-
7/25/2019 Experiencia 7a
11/12
}
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 protocoloes 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 27direcciones 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 queindica 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 existeo 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
-
7/25/2019 Experiencia 7a
12/12
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.
ConclusionesCon 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.