Experiencia 7a

download Experiencia 7a

of 12

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.