viernes, 26 de octubre de 2012

Toma de contacto con LKM1638

Este es nuestro módulo, en él tenemos dos packs de pins, para comenzar, me centraré en los de entrada (inputs).

Tenemos que conectarlo a nuestro Arduino de la siguiente forma:

  • Conector el PIN 1 del módulo a 5V.
  • Conector el PIN 2 del módulo a GND.
  • Conector el PIN 3 del módulo a pin de Arduino 9.
  • Conector el PIN 4 del módulo a pin de Arduino 8.
  • Conector el PIN 5 del módulo a pin de Arduino 7.
Este es un esquema de la conexión.

Si no os funciona, comprobar que los habéis conectado correctamente.


Una vez tenemos todo conectado, para empezar a programar nos hace falta añadirle a nuestro programa de Arduino, la librería correspondiente, que se encuentra en TM1638 (la mayor parte de ejemplos los tomaré de esta página y de otras, y los intentaré comentar y/o ampliar), la descomprimimos he introducimos la carpeta, donde tenga nuestra carpeta de librerías, dentro de nuestro programa Arduino.

Para comenzar a programar, le introducimos a nuestro programa, donde se encuentra nuestra librería y le indicamos el pineado que hemos decidido poner, en nuestro caso:
  #include <TM1638.h>
  TM1638 module(8, 9, 7);


Ya podemos empezar a introducirle sentencias,  pero ¿qué sentencias? Las sentencias que admite este módulo están explicadas dentro de la web donde nos hemos descargado las librerías, pero yo voy a intentar hacer un resumen de las más importantes.


Sentencias del display

Este es el apartado más extenso, ya que un visualizador, aunque sea de siete segmentos, nos tiene que poder permitir mostrar todo lo que queramos y como lo queramos (dentro de los límetes).

setdisplay()

Sirve para mostrar exactamente lo que queramos, esto es, si queremos mostrar un linea del visualizador 1. La sintaxis es simple:

   setDisplay()
donde values, es un vector donde la primera posición corresponde con el valor de lo que queremos visualizar del primer segmento. Ejemplo:

  #include <TM1638.h>
  #include <Metro.h> 


  TM1638 module(8, 9, 7);

  void setup() {
  }


  void loop() {

    byte values[] = { 1, 2, 4, 8, 16, 32, 64, 128 };
    module.setDisplay(values);
  }

En el display obtenemos lo siguiente:
 

      1         2        4        8       16      32      64      128
Con esto observamos cual es valor de cada segmento. Si queremos que se muestren dos segmentos, solo tenemos tenemos que sumar sus valores. Ejemplo, queremos mostrar una "A", sumaremos 1+2+4+16+32+64=119
Para mostrar, por ejemplo mi nombre, Alvaro (lo mejor que se puede en un visualizador de 7 segmentos), introduzco los siguiente valores para el vector:
  byte values[] = { 119, 56, 62, 119, 80, 63, 0, 0}; //Los ceros los podemos omitir
Obteniendo en el display mi nombre:






setDisplayDigit()

Nos sirve para mostrar un número decimal (0-9).
  setDisplayDigit(numero, posicion, punto)
Donde 'numero' es el número a mostrar (0-9), 'posición' es la posición comenzando de izquierda a derecha y por el 0 (0-7) y 'punto' es una variable booleana, que estará con el valor 'false' o '0' si no queremos que se muestre y 'true' o '1' si queremos que el punto este iluminado.
Ejemplo
  module.setDisplayDigit(7, 6, true);
nos mostraría:








setDisplayToBinNumber()

Nos sirve para mostrar números binarios.
  module.setDisplayToBinNumber(numero, puntos)
Donde 'numero' es el número que queremos mostrar en binario, lo podemos introducir en decimal y binario; puntos es la posición de dónde queremos que haya puntos, también se puede escribir con distintos formatos:
  module.setDisplayToBinNumber(0b10101010, 0xFF); 

  module.setDisplayToBinNumber(170, 0b11111111);
  module.setDisplayToBinNumber(170, 255);

En todos los casos obtendríamos el numero 170 con todos los puntos:





setDisplayToDecNumber()

Nos sirve para mostrar números decimales.
  module.setDisplayToDecNumber(numero, puntos, ceros)
Donde 'numero', es el numero decimal a mostrar, 'puntos' son los puntos a mostrar y 'ceros' es una variable booleana, que viene activada de serie y nos rellena todo el display con '0' si está activada y no nos muestra nada en los visualizadores que no utilicemos si es '1'.
  module.setDisplayToDecNumber(33, 7);









 module.setDisplayToDecNumber(33, 7, false);










setDisplayToHexNumber()

Nos sirve para mostrar números hexadecimales.
  module.setDisplayToDecNumber(numero, puntos, ceros)

Se usa exactamente igual que setDisplayToDecNumber(), solo que en vez de mostrar números decimales, muestra números hexadecimales.

setDisplayToSignedDecNumber()

Hace exactamente lo mismo que setDisplayToDecNumber(), pero nos permite mostrar números con signo. Como utiliza un display para el signo (en el caso de que lo tenga), nos permite mostrar de -9999999 a +99999999
  module.setDisplayToSignedDecNumber(-33, 7);







setDisplayToError()

Nos muestra la palabra 'error' en el display.
  module.setDisplayToEror;
no tiene ningún argumento, simplemente muestra la palabra error.







clearDisplay()

Esta sentencia, al igual que la anterior, tampoco tiene mucho misterio, simplemente apaga todos los dígitos de la pantalla.
  module.clearDisplay();
No tiene ningún argumento.




clearDisplayDigit()

Esta sentencia nos apaga el display que queramos y activa o desactiva el punto de ese mismo display.
  module.clearDisplay(numero,punto);
Donde 'numero' es el numero del display que queremos apagar (0-7) y punto es una variable booleana que muestra el punto del display que queremos apagar si 'punto' =1 y no lo muestra si 'punto'=0.
Con esto podemos empezar a hacer alguna cosa un poco más aparente. Este ejemplo hace parpadear cada vez un visualizador distinto:
  #include <TM1638.h>
  #include <Metro.h> 


  TM1638 module(8, 9, 7);

  void setup() {
  }


  void loop() {

  
    int i=0;
    while(i<=7)
    {
      module.setDisplayToDecNumber(94856501, 0);
      module.clearDisplayDigit(i, false);
      delay (500);
      i++;
    }
  }
El resultado obtenido es:




setDisplayToString()

Esta instrucción nos permite mostrar texto a partir de unas fuentes ya creadas, si queremos podemos modificarlas o crear las nuestras propias (si no nos gusta como se muestra alguna letra, ya que mostrar algunas letras, como puede ser la 'W' en un display de siete segmentos, pues requiere por lo menos de imaginación).
La sintaxis es la siguiente:
  setDisplayToString(cadena puntos, posicion, fuente)
Donde cadena es la cadena de texto que queremos mostrar, tiene que ser de tipo 'String' o 'char' ; puntos es, como siempre, la posición de los puntos que queremos mostrar; posicion es en display queremos que empiece a mostrarse el texto, hay que tener cuidado en que dos letras distintas no ocupen el mismo display, ya que estará cambiando constantemente entre una y otra; fuente es la fuente que queremos mostrar (ver documentación), si no ponemos nada, muestra la fuente predeterminada.
Ejemplo:
  String aa = "HOLA"; 
  String bb = "ALOH";
  

  module.setDisplayToString(aa, 0b00010000,0);
  module.setDisplayToString(bb, 0, 4); //comienza en el segmento 4









setupDisplay()

Para finalizar con el display, nos queda un último comando, en el que podemos activarlo/desactivarlo, así como darle más o menos intensidad.
  setupDisplay(encendido,intensidad) Donde encendido es una variable booleana que enciende el display si si está activa y lo apaga si está desactivada; 'intensidad' es una variable tipo bit con el que podemos controlar la intensidad de la pantalla, pudiendo regularla entre '0' y '7'.

Sentencias de los Leds

El lkm1638, además de visualizadores, tiene también 8 diodos. Cada diodo tiene 2 colores, rojo y verde, asi que en realidad es como si tuviesemos 16 diodos, 8 verdes y 8 rojos.

setLED()

Esta sentencia nos permite establecer el color de un diodo:
  setLED(color, posicion)
Con 'color' controlamos el color que queremos mostrar, pondremos 'TM1638_COLOR_GREEN' para mostrar el diodo verde y 'TM1638_COLOR_RED' para mostrar el diodo rojo.
Para elegir que led es de cada color, usaremos 'pos', siendo un dato tipo byte, con valores válidos de '0' a '7'.
  module.setLED(TM1638_COLOR_GREEN + TM1638_COLOR_RED, 3);
Este código en principio, enciende el led 3 y lo pone verde y rojo, pero en realidad, el rojo se come al color verde, por lo que solo se ve rojo.
TM1638_COLOR_GREEN y TM1638_COLOR_RED, en realidad son números, así que si no queremos tener que estar poniendo todo esto, si queremos que luzca rojo, podemos poner directamente un '1'1 y si queremos que luzca verde un '2'.  module.setLED(TM1638_COLOR_GREEN , 3)
  module.setLED(2,3)

setLEDs()

Esta sentencia hace lo mismo que el anterior, pero controlando a la vez el encendido/apagado y el color de todos los dios a la vez.
setLEDs(diodos)
El argumento 'diodos' es una palabra de 16 bits. Utiliza los 8 bits de mayor valor para encender o apagar el color verde, y los 8 de menos valor para el color rojo.
Ejemplo:
Si queremos encender de color rojo el diodo 1 el 3 y el 4, de verde el 2, el 6, el 7 y el 8, y dejar el 5 apagado, escribiríamos lo siguiente:
  module.setLEDs(0b1110001000001101)





Analizamos el número:

  • 8 bits de mayor valor (verde):

      11100010
      El primer bit (el de mayor valor)  enciende el diodo 8 y el último deja sin verde el led1


  • 8 bits de menos valor (rojo):

      00001101      El primero deja sin rojo el diodo 8 y enciende de rojo el led1



Sentencias de los pulsadores

En este apartado, solo tenemos una sentencia, que como es lógico es leer el estado de los pulsadores.

getButtons()

Pues eso, esta sentencia lo que hace es leer el estado de todos los pulsadores. Tenemos que tener en cuenta que los pulsadores son una entrada, y no una salida, asi que el comando getbuttons() nos da un valor, y ese valor tenemos que almacenarlo en una variable.
Este es un ejmplo de yo creo, el programa más sencillo que se puede hacer, lo único que hace es mostrar por los leds, el estado de los pulsadores.
 #include <TM1638.h> 
 #include <Metro.h> 

 TM1638 module(8, 9, 7);
  void setup() {
  }

  byte diodos; //declaro una variable para almacenar el estado de los pulsadores

  void loop() {
    diodos=module.getButtons(); //Guardo el estado
    module.setLEDs(diodos);     //Muestro el estado por los leds.
  }

1 comentario:

  1. Buenos dias, estoy usando esta guia que has puesto para un modulo con un TM1638, pero las fotos no estan, podrias resubirlas, gracias.
    Esta todo muy bien explicado y no he encontrado nada parecido en internet, muy buen trabajo.

    ResponderEliminar