jueves, 23 de abril de 2015

Tutorial: Matriz de LEDs de 8x8

Matriz de leds de 8x8


En el tutorial de hoy vamos a programar una matriz de Leds de 8x8. 
Para ello el material a utilizar será el siguiente:

- Arduino UNO
- Matriz de Leds de 8x8

Como comenta el programa que sigue a esta explicación las conexiones serán:

  • pin DIN de la matriz con Pin 4 del Arduino.
  • pin CLK de la matriz con Pin 5 del Arduino.
  • pin CS/Load de la matriz con Pin 6 del Arduino.
  • pin VCC de la matriz con Pin de 5V del Arduino.
  • pin GND de la matriz con Pin de GND del Arduino.

El programa que debemos implementar en nuestro Arduino será el siguiente:

// Programa para matriz 8x8  
 // Basado en el libro Arduino Basico, de Michael McRoberts  
   
 #include <pgmspace.h>  
 #include <TimerOne.h>  
   
 int DataPin = 4;  //Pin 4 con la clavija DIN de la matriz  
 int ClockPin = 5; //Pin 5 con la clavija CLK de la matriz  
 int LoadPin = 6;  //Pin 6 con la clavija CS/Load de la matriz  

  //Declaramos la matriz que vamos a rellenar inicializando en binario cada led   
 byte buffer[8];  
   
 static byte font[][8] PROGMEM = {  
   
 {B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000},   
 {B00000100, B00000100, B00000100, B00000100, B00000100, B00000100, B00000000, B00000100},   
 {B00001010, B00001010, B00001010, B00000000, B00000000, B00000000, B00000000, B00000000},   
 {B00000000, B00001010, B00011111, B00001010, B00011111, B00001010, B00011111, B00001010},   
 {B00000111, B00001100, B00010100, B00001100, B00000110, B00000101, B00000110, B00011100},   
 {B00011001, B00011010, B00000010, B00000100, B00000100, B00001000, B00001011, B00010011},   
 {B00000110, B00001010, B00010010, B00010100, B00001001, B00010110, B00010110, B00001001},   
 {B00000100, B00000100, B00000100, B00000000, B00000000, B00000000, B00000000, B00000000},   
 {B00000010, B00000100, B00001000, B00001000, B00001000, B00001000, B00000100, B00000010},   
 {B00001000, B00000100, B00000010, B00000010, B00000010, B00000010, B00000100, B00001000},   
 {B00010101, B00001110, B00011111, B00001110, B00010101, B00000000, B00000000, B00000000},   
 {B00000000, B00000000, B00000100, B00000100, B00011111, B00000100, B00000100, B00000000},   
 {B00000000, B00000000, B00000000, B00000000, B00000000, B00000110, B00000100, B00001000},   
 {B00000000, B00000000, B00000000, B00000000, B00001110, B00000000, B00000000, B00000000},   
 {B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000100},   
 {B00000001, B00000010, B00000010, B00000100, B00000100, B00001000, B00001000, B00010000},   
 {B00001110, B00010001, B00010011, B00010001, B00010101, B00010001, B00011001, B00001110},   
 {B00000100, B00001100, B00010100, B00000100, B00000100, B00000100, B00000100, B00011111},   
 {B00001110, B00010001, B00010001, B00000010, B00000100, B00001000, B00010000, B00011111},   
 {B00001110, B00010001, B00000001, B00001110, B00000001, B00000001, B00010001, B00001110},   
 {B00010000, B00010000, B00010100, B00010100, B00011111, B00000100, B00000100, B00000100},   
 {B00011111, B00010000, B00010000, B00011110, B00000001, B00000001, B00000001, B00011110},   
 {B00000111, B00001000, B00010000, B00011110, B00010001, B00010001, B00010001, B00001110},   
 {B00011111, B00000001, B00000001, B00000001, B00000010, B00000100, B00001000, B00010000},   
 {B00001110, B00010001, B00010001, B00001110, B00010001, B00010001, B00010001, B00001110},   
 {B00001110, B00010001, B00010001, B00001111, B00000001, B00000001, B00000001, B00000001},   
 {B00000000, B00000100, B00000100, B00000000, B00000000, B00000100, B00000100, B00000000},   
 {B00000000, B00000100, B00000100, B00000000, B00000000, B00000100, B00000100, B00001000},   
 {B00000001, B00000010, B00000100, B00001000, B00001000, B00000100, B00000010, B00000001},   
 {B00000000, B00000000, B00000000, B00011110, B00000000, B00011110, B00000000, B00000000},   
 {B00010000, B00001000, B00000100, B00000010, B00000010, B00000100, B00001000, B00010000},   
 {B00001110, B00010001, B00010001, B00000010, B00000100, B00000100, B00000000, B00000100},   
 {B00001110, B00010001, B00010001, B00010101, B00010101, B00010001, B00010001, B00011110},   
 {B00001110, B00010001, B00010001, B00010001, B00011111, B00010001, B00010001, B00010001},   
 {B00011110, B00010001, B00010001, B00011110, B00010001, B00010001, B00010001, B00011110},   
 {B00000111, B00001000, B00010000, B00010000, B00010000, B00010000, B00001000, B00000111},   
 {B00011100, B00010010, B00010001, B00010001, B00010001, B00010001, B00010010, B00011100},  
 {B00011111, B00010000, B00010000, B00011110, B00010000, B00010000, B00010000, B00011111},   
 {B00011111, B00010000, B00010000, B00011110, B00010000, B00010000, B00010000, B00010000},   
 {B00001110, B00010001, B00010000, B00010000, B00010111, B00010001, B00010001, B00001110},   
 {B00010001, B00010001, B00010001, B00011111, B00010001, B00010001, B00010001, B00010001},   
 {B00011111, B00000100, B00000100, B00000100, B00000100, B00000100, B00000100, B00011111},   
 {B00011111, B00000100, B00000100, B00000100, B00000100, B00000100, B00010100, B00001000},   
 {B00010001, B00010010, B00010100, B00011000, B00010100, B00010010, B00010001, B00010001},   
 {B00010000, B00010000, B00010000, B00010000, B00010000, B00010000, B00010000, B00011111},   
 {B00010001, B00011011, B00011111, B00010101, B00010001, B00010001, B00010001, B00010001},   
 {B00010001, B00011001, B00011001, B00010101, B00010101, B00010011, B00010011, B00010001},   
 {B00001110, B00010001, B00010001, B00010001, B00010001, B00010001, B00010001, B00001110},   
 {B00011110, B00010001, B00010001, B00011110, B00010000, B00010000, B00010000, B00010000},   
 {B00001110, B00010001, B00010001, B00010001, B00010001, B00010101, B00010011, B00001111},   
 {B00011110, B00010001, B00010001, B00011110, B00010100, B00010010, B00010001, B00010001},   
 {B00001110, B00010001, B00010000, B00001000, B00000110, B00000001, B00010001, B00001110},   
 {B00011111, B00000100, B00000100, B00000100, B00000100, B00000100, B00000100, B00000100},   
 {B00010001, B00010001, B00010001, B00010001, B00010001, B00010001, B00010001, B00001110},   
 {B00010001, B00010001, B00010001, B00010001, B00010001, B00010001, B00001010, B00000100},   
 {B00010001, B00010001, B00010001, B00010001, B00010001, B00010101, B00010101, B00001010},   
 {B00010001, B00010001, B00001010, B00000100, B00000100, B00001010, B00010001, B00010001},   
 {B00010001, B00010001, B00001010, B00000100, B00000100, B00000100, B00000100, B00000100},   
 {B00011111, B00000001, B00000010, B00000100, B00001000, B00010000, B00010000, B00011111},   
 {B00001110, B00001000, B00001000, B00001000, B00001000, B00001000, B00001000, B00001110},   
 {B00010000, B00001000, B00001000, B00000100, B00000100, B00000010, B00000010, B00000001},   
 {B00001110, B00000010, B00000010, B00000010, B00000010, B00000010, B00000010, B00001110},   
 {B00000100, B00001010, B00010001, B00000000, B00000000, B00000000, B00000000, B00000000},   
 {B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00011111},   
 {B00001000, B00000100, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000},   
 {B00000000, B00000000, B00000000, B00001110, B00010010, B00010010, B00010010, B00001111},   
 {B00000000, B00010000, B00010000, B00010000, B00011100, B00010010, B00010010, B00011100},   
 {B00000000, B00000000, B00000000, B00001110, B00010000, B00010000, B00010000, B00001110},   
 {B00000000, B00000001, B00000001, B00000001, B00000111, B00001001, B00001001, B00000111},   
 {B00000000, B00000000, B00000000, B00011100, B00010010, B00011110, B00010000, B00001110},   
 {B00000000, B00000011, B00000100, B00000100, B00000110, B00000100, B00000100, B00000100},   
 {B00000000, B00001110, B00001010, B00001010, B00001110, B00000010, B00000010, B00001100},   
 {B00000000, B00010000, B00010000, B00010000, B00011100, B00010010, B00010010, B00010010},   
 {B00000000, B00000000, B00000100, B00000000, B00000100, B00000100, B00000100, B00000100},   
 {B00000000, B00000010, B00000000, B00000010, B00000010, B00000010, B00000010, B00001100},   
 {B00000000, B00010000, B00010000, B00010100, B00011000, B00011000, B00010100, B00010000},   
 {B00000000, B00010000, B00010000, B00010000, B00010000, B00010000, B00010000, B00001100},   
 {B00000000, B00000000, B00000000, B00001010, B00010101, B00010001, B00010001, B00010001},   
 {B00000000, B00000000, B00000000, B00010100, B00011010, B00010010, B00010010, B00010010},   
 {B00000000, B00000000, B00000000, B00001100, B00010010, B00010010, B00010010, B00001100},   
 {B00000000, B00011100, B00010010, B00010010, B00011100, B00010000, B00010000, B00010000},   
 {B00000000, B00001110, B00010010, B00010010, B00001110, B00000010, B00000010, B00000001},   
 {B00000000, B00000000, B00000000, B00001010, B00001100, B00001000, B00001000, B00001000},   
 {B00000000, B00000000, B00001110, B00010000, B00001000, B00000100, B00000010, B00011110},   
 {B00000000, B00010000, B00010000, B00011100, B00010000, B00010000, B00010000, B00001100},   
 {B00000000, B00000000, B00000000, B00010010, B00010010, B00010010, B00010010, B00001100},   
 {B00000000, B00000000, B00000000, B00010001, B00010001, B00010001, B00001010, B00000100},   
 {B00000000, B00000000, B00000000, B00010001, B00010001, B00010001, B00010101, B00001010},   
 {B00000000, B00000000, B00000000, B00010001, B00001010, B00000100, B00001010, B00010001},   
 {B00000000, B00000000, B00010001, B00001010, B00000100, B00001000, B00001000, B00010000},   
 {B00000000, B00000000, B00000000, B00011111, B00000010, B00000100, B00001000, B00011111},   
 {B00000010, B00000100, B00000100, B00000100, B00001000, B00000100, B00000100, B00000010},   
 {B00000100, B00000100, B00000100, B00000100, B00000100, B00000100, B00000100, B00000100},   
 {B00001000, B00000100, B00000100, B00000100, B00000010, B00000100, B00000100, B00001000},   
 {B00000000, B00000000, B00000000, B00001010, B00011110, B00010100, B00000000, B00000000}   
 };  
 //fijamos a 0 todas las posiciones de la matriz con el siguiente bucle   
 void clearDisplay() {  
     for (byte x=0; x<8; x++) {  
         buffer[x] = B00000000;  
     }  
     screenUpdate();  
 }  
 //Inicializamos el microcontrolador de la matriz llamando a los pines antes declarados como salida y definimos los pines de salida.   
 void initMAX7219() {  
     pinMode(DataPin, OUTPUT);  
     pinMode(LoadPin, OUTPUT);  
     pinMode(ClockPin, OUTPUT);  
     clearDisplay();  
     writeData(B00001011, B00000111);   
     writeData(B00001001, B00000000);   
     writeData(B00001100, B00000001);   
     intensity(1);   
 }  
 //Programamos que la matriz haga el scroll traduciendo de binario a leds encendidos y apagados    
 void intensity(int intensity) {  
     writeData(B00001010, intensity);   
     }  
   
 void writeData(byte MSB, byte LSB) {  
     byte mask;  
     digitalWrite(LoadPin, LOW);   
       
     for (mask = B10000000; mask>0; mask >>= 1) {   
         digitalWrite(ClockPin, LOW);  
         if (MSB & mask){   
             digitalWrite(DataPin,HIGH);   
         }  
         else{   
             digitalWrite(DataPin,LOW);   
         }  
         digitalWrite(ClockPin, HIGH);   
     }  
       
      for (mask = B10000000; mask>0; mask >>= 1) {   
         digitalWrite(ClockPin, LOW);  
         if (LSB & mask){   
             digitalWrite(DataPin,HIGH);   
         }  
         else{   
             digitalWrite(DataPin,LOW);   
         }  
         digitalWrite(ClockPin, HIGH);   
     }  
     digitalWrite(LoadPin, HIGH);   
     digitalWrite(ClockPin, LOW);  
 }  
   
   
 void scroll(char myString[], int speed) {  
     byte firstChrRow, secondChrRow;  
     byte ledOutput;  
     byte chrPointer = 0;   
     byte Char1, Char2;   
     byte scrollBit = 0;  
     byte strLength = 0;  
     unsigned long time;  
     unsigned long counter;  
   
       
     while (myString[strLength]) {strLength++;}  
   
     counter = millis();  
      while (chrPointer < (strLength-1)) {  
         time = millis();  
         if (time > (counter + speed)) {  
             Char1 = myString[chrPointer];  
             Char2 = myString[chrPointer+1];  
             for (byte y= 0; y<8; y++) {  
                 firstChrRow = pgm_read_byte(&font[Char1 - 32][y]);  
                 secondChrRow = (pgm_read_byte(&font[Char2 - 32][y])) << 1;  
                 ledOutput = (firstChrRow << scrollBit) | (secondChrRow >>  
  (8 - scrollBit) );  
                 buffer[y] = ledOutput;  
             }  
             scrollBit++;   
             if (scrollBit > 6) {   
             scrollBit = 0;  
             chrPointer++;  
             }  
             counter = millis();  
         }  
     }  
 }  
   
 void screenUpdate() {  
     for (byte row = 0; row < 8; row++) {  
         writeData(row+1, buffer[row]);  
     }  
 }  
   
 void setup() {  
     initMAX7219();  
     Timer1.initialize(10000);       
     Timer1.attachInterrupt(screenUpdate);   
 }  
   
 void loop() {  
     clearDisplay();    
     scroll(" El cajon ", 100); //Escribir el mensaje a mostrar con intervalo de 100
     scroll(" de Arduino ", 100);        //Añada m´s lineas para mostrar mas texto

 }

Vídeo de nuestros inicios usando la matriz de leds.

Como siempre, para cualquier duda no dudéis en consultar con nosotros más abajo.

Un saludo.

C.