jueves, 22 de enero de 2015

Marcador con display de 4 digitos y controlado con mando IR


Tras mostraros como hacer un marcador con un display de 7 segmentos de un dígito, ahora os enseño como hacernos un marcador con un display de 4 dígitos que utilizaré en un proyecto que tengo en marcha.
¿Queréis verlo? Adelante!

En la anterior entrada utilicé un display de 7 segmentos de un dígito. Como vimos, el componente se controla con 9 patillas de conexión, 7 para cada segmento, una para el punto decimal y otra de alimentación. 


El problema de algunos componentes electrónicos como este es que se necesitan muchas conexiones para controlarlos (conexiones que no sobran en una placa arduino) y es posible que no tengas suficientes en el caso de que necesites utilizar varios de ellos. Por suerte, hay fabricantes que encapsulan estos componentes añadiéndoles un pequeño microcontrolador que gestiona dichas conexiones y permite controlar el componente mediante librerías software, reduciendo considerablemente el número de conexiones necesarias.

Este es el caso del componente que voy a utilizar: un display de 4 dígitos de 7 segmentos.



Como podéis comprobar, es una pequeña placa con el display y un microcontrolador, que reduce de 12 conexiones que necesitaría el display de 4 dígitos (7 para los segmentos, una por cada dígito y otra para los puntos)  a tan solo dos, CLK para la señal de reloj y DIO o señal digital de entrada/salida (sin contar las de VCC y GND). Además tiene otra ventaja, el circuito tiene integradas las resistencias necesarias para que puedas conectar la patilla VCC a la salida de alimentación estándar de las placas arduino que es de 5V.

También utilizaré un mando a distancia y un receptor de infrarrojos parecidos a estos:




El esquema de conexiones que vamos a utilizar es el siguiente:


Para utilizar el display de Catalex necesitaremos descargar las librerías del componente. La librería se llama TM1637 que es como se llama el chip que controla el display.

También necesitaremos descargar la librería para el manejo del receptor de infrarrojos. En este caso utilizaremos las librerías de Adafruit_NECremote que maneja el estándar de códigos infrarrojos de NEC y que es el que funciona con el mando que utilizo.

Para captar los códigos de cada tecla del mando utilizaremos el siguiente programa que escribe en el monitor serial el código de la tecla pulsada:

  #include "Adafruit_NECremote.h"
  
  #define IRpin 4
  
  Adafruit_NECremote remote(IRpin);
  
  void setup(void) {
    Serial.begin(9600);
  }
  
  void loop(void) {
    int c = remote.listen();
    if (c >= 0) {
      Serial.print("Código recibido: #"); 
      Serial.println(c, DEC);
    }
  }

Es muy sencillo: inicializa el receptor de infrarrojos en el pin 4, en el setup define la salida Serial a 9600 bps, y en el loop (bucle infinito), en cada pasada lee el receptor IR y guarda el valor en la variable "c". En caso de que no reciba ninguna señal el receptor devuelve -1, por tanto, en caso de que c sea mayor o igual a 0, pintamos por la salida Serial el código de la tecla pulsada. 

Y ahora le toca el turno para el programa que utiliza el display de 4 dígitos como marcador, como por ejemplo para un partido de fútbol. Para sumar o restar tantos al jugador 1 o jugador 2, utilizaremos el mando a distancia. El código es el siguiente:

  #include "TM1637.h"
  #define CLK 3      
  #define DIO 2
  
  TM1637 tm1637(CLK,DIO);
  
  //Mando IR
  #include <Adafruit_NECremote.h>
  
  
  /*
  **** Codigos de los botones del mando
  */
  #define btn_power 0
  #define btn_vol_mas 1
  #define btn_stop 2
  #define btn_pista_atras 4
  #define btn_play 5
  #define btn_pista_siguiente 6
  #define btn_abajo 8
  #define btn_vol_menos 9
  #define btn_arriba 10
  #define btn_0 12
  #define btn_eq 13
  #define btn_REPT 14
  #define btn_1 16
  #define btn_2 17
  #define btn_3 18
  #define btn_4 20
  #define btn_5 21
  #define btn_6 22
  #define btn_7 24
  #define btn_8 25
  #define btn_9 26
  
  #define IRpin 4
  Adafruit_NECremote remote(IRpin);
  
  int jug1=0; //Contador Inicial
  int jug2=0;
  
  void setup()
  {
    tm1637.init();
    tm1637.set(BRIGHT_TYPICAL);//BRIGHT_TYPICAL = 2,BRIGHT_DARKEST = 0,BRIGHTEST = 7;
    tm1637.clearDisplay();
    tm1637.point(true);
    marcador(jug1,jug2);
  }
  void loop()
  {
    
    int c = remote.listen(); //Leemos el IR
  
  
  // actualizar contador jug1
  if(c == btn_arriba){ //sumamos uno al contador
  if(jug1<99) jug1++;
  marcador(jug1,jug2);
  }
  
  
  if(c == btn_abajo){ //restamos uno al contador
  if(jug1>0) jug1--;
  marcador(jug1,jug2);
  }
  
  // actualizar contador jug2
  if(c == btn_pista_siguiente){ //sumamos uno al contador
  if(jug2<99) jug2++;
  marcador(jug1,jug2);
  }
  
  
  if(c == btn_pista_atras){ //restamos uno al contador
  if(jug2>0) jug2--;
  marcador(jug1,jug2);
  }
      
    
  }
  
  void marcador(int jug1, int jug2){
      if(jug1<10){//Si tiene un digito
        tm1637.display(0,jug1);
        tm1637.display(1,26); //blanco
      }else{
        int digito1=jug1/10;
        int digito2=jug1%10;
        tm1637.display(0,digito1);
        tm1637.display(1,digito2);
      }
      
      if(jug2<10){//Si tiene un digito
        tm1637.display(3,jug2);
        tm1637.display(2,26); //blanco
      }else{
        int digito1=jug2/10;
        int digito2=jug2%10;
        tm1637.display(2,digito1);
        tm1637.display(3,digito2);
      }
      
  }

Si desglosamos un poco el código, en el setup inicializamos el display indicando el brillo, limpiando el display e indicando que los puntos estarán activos, y por último, pintando el marcador por primera vez (0 : 0).

En loop, la cosa es sencilla: leemos el estado del receptor infrarrojos, y dependiendo de la tecla pulsada sumamos o restamos uno al jugador correspondiente y pintamos el marcador en el display.

Como habréis observado, para pintar el display utilizamos la función "marcador" que recibe la puntuación del jugador 1 y el jugador 2. Lo único destacable de la función es diferenciar si la puntuación del jugador tiene un dígito o dos. Si la puntuación tiene un dígito, utilizo el primer y último dígito del display para que las cifras estén lo más alejadas posible. En caso de que alguna cifra tenga dos dígitos, dividimos la cifra haciendo una división por 10 para obtener el primer dígito y un modulo 10 para obtener el segundo dígito, y seguidamente pintamos el display. 

Ya veis que no es complicado el código y que puede tener múltiples utilidades. Yo lo utilizaré en un proyecto que tengo en mente y del que os hablaré más adelante. 

Os dejo el vídeo del marcador en funcionamiento y espero que os haya gustado!

No hay comentarios:

Publicar un comentario