Arduino Menu Shield: LCD + Rotatory encoder

26 12 2009

Hace unas semanas compré en seeedstudio.com una pantalla LCD 16×2 de 7.95$. Desde entonces la he utilizado pocas veces, debido a la “complejidad” del montaje para hacerla funcionar con Arduino. Así que uno de mis pensamientos desde que tengo esta pantalla era hacer un shield para conectarla a Arduino cuando quisiese, y que además me dejase libres la mayor parte de las entradas/salidas.

Viendo este esquema me di cuenta de que hacer una PCB iba a ser complicado (demasiados cables cruzándose), de modo que tuve que usar una perfboard recortada a medida.

Que desasstre de cableado, pero no quedaba otra opción...

Pero entonces me di cuenta de que iba a necesitar algún tipo de dispositivo de input para poder controlar la LCD, así que decidí comprar un encoder de rotación en bricogeek. Su uso más conocido está en los ratones, el sensor que detecta el movimiento de la rueda de scroll.

El sensor tiene 3 patillas, una común (V+ ó GND) y dos patillas de salida, A y B. Al ir girando la palanca en sentido de las agujas del reloj, estas salidas generan la siguiente señal:

Si hacemos un programa que interprete esta señal, podemos conseguir un “potenciómetro infinito”, es decir, un dispositivo con el que puedas contar infinitas vueltas (con una precisión de 1/12 vueltas). Además, tiene un pulsador que se cierra al presionar la palanca hacia dentro.

Para aprender a utilizar este encoder, recurrí al Playground de Arduino, donde encontré varios sketches acerca del tema. Modificando y añadiendo algunas líneas para adaptarlo a la LCD, creé este programa, que por una parte muestra el estado de las salidas del encoder, y además cuenta los pasos que ha girado, almacenándolos en una variable para que se pueda utilizar en cualquier programa.

/*Rotatory encoder Debugger.

2009 Sergio Vilches, vlxs.wordpress.com
Feel free to use and distribute it.

Encoder usage by max wolf / www.meso.net
(http://www.arduino.cc/playground/Main/RotaryEncoders)

*/
#include <LiquidCrystal.h>

LiquidCrystal lcd(7, 6, 5, 4, 3, 2);

int val;
int encoder0PinA = 1;
int encoder0PinB = 0;
int encoder0Pos = 0;
int encoder0PinALast = LOW;
int n = LOW;

void setup() {                    //Here the screen is formated
  lcd.begin(16, 2);
  lcd.print("Rotatory encoder");  //A little banner
  lcd.setCursor(0, 1);
  lcd.print("debuger   Vlxs09");
  delay(1000);
  lcd.clear();                    //Here we print the template for the screen
  lcd.setCursor(0, 0);
  lcd.print("A=>");
  lcd.setCursor(0, 1);
  lcd.print("B=>");
  lcd.setCursor(7, 0);
  lcd.print("Button=>");
  lcd.setCursor(7, 1);
  lcd.print("Pos=>");
  digitalWrite(8,HIGH);
}

void loop() {

  if (digitalRead(0)==LOW)  //In all of these loops we are only displaying the output of the rotatory encoders (1 = -,0 = _)
  {
    lcd.setCursor(4, 0);
    lcd.print("_");
  }
  else
  {
    lcd.setCursor(4, 0);
    lcd.print("-");
  }

  if (digitalRead(1)==LOW)
  {
    lcd.setCursor(4, 1);
    lcd.print("_");
  }
  else
  {
    lcd.setCursor(4, 1);
    lcd.print("-");
  }

  if (digitalRead(8)==LOW)
  {
    lcd.setCursor(15, 0);
    lcd.print("_");
    encoder0Pos=0;
  }
  else
  {
    lcd.setCursor(15, 0);
    lcd.print("-");
  }

  n = digitalRead(encoder0PinA);                  //Here is the encoder reader
  if ((encoder0PinALast == HIGH) && (n == LOW)) {
    if (digitalRead(encoder0PinB) == LOW) {
      encoder0Pos--;
    } 
    else {
      encoder0Pos++;
    }

    lcd.setCursor(12, 1);
    lcd.print("     ");
    lcd.setCursor(12, 1);
    lcd.print(encoder0Pos);
  } 
  encoder0PinALast = n;

}

El resultado general es éste:

(La imágen se ve doble porque estoy rotando el encoder)

Y ahora, algunos usos:

Laptop Battery Display:

En esta página viene bastante información sobre como interactuar mediante arduino con Linux. Una vez que configuras la tty (terminal de linux), puedes hacer que CUALQUIER comando de linux se vea en la pantalla, así que con un poco de imaginación, se pueden hacer cosas bastante curiosas. En este caso, sólo hay que escribir: acpi > /dev/ttyUSB0, con el arduino cargado con "Serial Display", de los ejemplos.

Rhythmbox "Now Playing" display

En este foro, Junke1990 explica cómo utilizar arduino para ver qué canción se está reproduciendo en el conocido reproductor de Ubuntu "Rhythmbox".

Consta de dos partes, un script en python a ejecutar en el ordenador, y otro para arduino.

Las opciones no acaban aquí, es muuuy fácil hacer cosas muy interesantes con esta LCD, y estas navidades quiero conseguir añadir menús interactivos a Arduino mediante esta LCD, para, por ejemplo, poder editar parámetros de mi robot (velocidad, sensibilidad a las líneas, comportamiento...).

Para más detalles o dudas sobre la construcción del shield, comentario!

About these ads

Acciones

Information

2 responses

31 12 2009
R a y d e n

Flipo! ¿¡Pero por qué no nos dedicamos a hacer esto cuando quedamos, en vez de intentar reproducir semáforos!?

Feliz Navidad (un poco atrasadas) y esperemos que también un fliz año! Jesusito, Mixelo y yo estamos con los últimos retoques antes de ir a Penelope xDD!

1 01 2010
vilxes91

XD, feliss 11111011010!
Espero que haya sido fructífera la noche en Penelope, nos vemos en unos días por allí!
Suerte ahora con los reyes magos!

Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s




Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.

%d personas les gusta esto: