venerdì 7 febbraio 2014

Giocando con i Led Matrix 8x8

Mi sono finalmente arrivati per posta alcuni moduli LED Matrix 8x8, gestiti dal Max7219.
Quando li ho comperati avevo intenzione di montarli a mo' di mattonella per giocare un po' con la grafica spartana che consentono. Ho trovato alcuni progetti che utilizzano mattonelle a matrice di led che sono composte da 4 pezzi messi a comporre un quadrato, sui quali viene trasferito un disegno creato con un cellulare ed inviato via bluetooth.

Nell'attesa del loro arrivo però, come al solito, mi sono venuti in mente diversi altri progetti che li vedono protagonisti, infatti, al loro arrivo ho iniziato subito a montarli in linea, in orizzontale anzichè in vetricale come avevo pensato inizialmente, in modo da poter scrivere delle frasi ed ottenere una leggibilità anche a qualche metro di distanza.
Non voglio svelare completamente il progetto finale, che è piuttosto impegnativo
e che da solo sono sicuro di non saper portare a termine, considerate le mie scarse capacità nella programmazione, voglio però intanto descrivere i test che ho fatto fino ad oggi e le cose che ho scoperto.
Se poi qualcuno volesse aiutarmi nell'impresa.... e' sempre il benvenuto.
Dunque il modulo in questione comunica attraverso la porta SPI (non credo che sia proprio standard) con il nostro Arduino,l' alimentazione necessaria  sono i 5 volt ed e' sufficiente quella fornita dalla scheda Arduino. Il protocollo SPI consente di collegare piu' devices sulla stessa linea di comunicazione, infatti della nostra Led Matrix se ne possono collegare fino a 8 in cascata. Ho iniziato a caricare lo sketch di test su Arduino dopo aver provveduto al montaggio del kit (eh si, la Matrice di led arriva spezzettata e con le istruzioni di montaggio da reperire sul web in un linguaggio cino-angolosassone-casareccio che deve assolutamente essere interpretato, soprattutto per quanto riguarda il montaggio della matrice in lattice sullo zoccolo fornito nel kit. Se dovrai montarne uno e' bene ricordare che la scritta laterale stampata su un solo lato della matrice in lattice deve rimanere a destra guardando il circuito appena montato, tenendo  il Max7219 in basso.
Come si puo' vedere in figura qui a fianco.
PS, se qualcuno riesce a decifrare cosa ha scritto nelle istruzioni il venditore cinese  nel suo inglese inventato, gli pago da bere!
Quindi, come si puo' vedere dalle foto che sto allegando all'articolo, ho montato le mattonelline tutte in fila a comporre una matrice di 8x40 led.
Completato questa parte del montaggio e del cablaggio, sono passato ad aggiustare il software per i miei scopi.
Inizialmente ho caricato il programma di test che si puo' trovare nella cartella examples allegata alla libreria.











Qui di seguito lo sketch che accompagna la libreria che gestisce la matrice,
questo e' il primo sketch che ho caricato nei prossimi articoli le modifiche apportate per farlo funzionare nel  progetto Talkin'Car


Sketch LCDemoMatrix

//We always have to include the library
#include "LedControl.h"

/*
 Now we need a LedControl to work with.
 ***** These pin numbers will probably not work with your hardware *****
 pin 12 is connected to the DataIn 
 pin 11 is connected to the CLK 
 pin 10 is connected to LOAD 
 We have only a single MAX72XX.
 */
LedControl lc=LedControl(12,11,10,1);

/* we always wait a bit between updates of the display */
unsigned long delaytime=100;

void setup() {
  /*
   The MAX72XX is in power-saving mode on startup,
   we have to do a wakeup call
   */
  lc.shutdown(0,false);
  /* Set the brightness to a medium values */
  lc.setIntensity(0,8);
  /* and clear the display */
  lc.clearDisplay(0);
}

/*
 This method will display the characters for the
 word "Arduino" one after the other on the matrix. 
 (you need at least 5x7 leds to see the whole chars)
 */
void writeArduinoOnMatrix() {
  /* here is the data for the characters */
  byte a[5]={B01111110,B10001000,B10001000,B10001000,B01111110};
  byte r[5]={B00111110,B00010000,B00100000,B00100000,B00010000};
  byte d[5]={B00011100,B00100010,B00100010,B00010010,B11111110};
  byte u[5]={B00111100,B00000010,B00000010,B00000100,B00111110};
  byte i[5]={B00000000,B00100010,B10111110,B00000010,B00000000};
  byte n[5]={B00111110,B00010000,B00100000,B00100000,B00011110};
  byte o[5]={B00011100,B00100010,B00100010,B00100010,B00011100};

  /* now display them one by one with a small delay */
  lc.setRow(0,0,a[0]);
  lc.setRow(0,1,a[1]);
  lc.setRow(0,2,a[2]);
  lc.setRow(0,3,a[3]);
  lc.setRow(0,4,a[4]);
  delay(delaytime);
  lc.setRow(0,0,r[0]);
  lc.setRow(0,1,r[1]);
  lc.setRow(0,2,r[2]);
  lc.setRow(0,3,r[3]);
  lc.setRow(0,4,r[4]);
  delay(delaytime);
  lc.setRow(0,0,d[0]);
  lc.setRow(0,1,d[1]);
  lc.setRow(0,2,d[2]);
  lc.setRow(0,3,d[3]);
  lc.setRow(0,4,d[4]);
  delay(delaytime);
  lc.setRow(0,0,u[0]);
  lc.setRow(0,1,u[1]);
  lc.setRow(0,2,u[2]);
  lc.setRow(0,3,u[3]);
  lc.setRow(0,4,u[4]);
  delay(delaytime);
  lc.setRow(0,0,i[0]);
  lc.setRow(0,1,i[1]);
  lc.setRow(0,2,i[2]);
  lc.setRow(0,3,i[3]);
  lc.setRow(0,4,i[4]);
  delay(delaytime);
  lc.setRow(0,0,n[0]);
  lc.setRow(0,1,n[1]);
  lc.setRow(0,2,n[2]);
  lc.setRow(0,3,n[3]);
  lc.setRow(0,4,n[4]);
  delay(delaytime);
  lc.setRow(0,0,o[0]);
  lc.setRow(0,1,o[1]);
  lc.setRow(0,2,o[2]);
  lc.setRow(0,3,o[3]);
  lc.setRow(0,4,o[4]);
  delay(delaytime);
  lc.setRow(0,0,0);
  lc.setRow(0,1,0);
  lc.setRow(0,2,0);
  lc.setRow(0,3,0);
  lc.setRow(0,4,0);
  delay(delaytime);
}

/*
  This function lights up a some Leds in a row.
 The pattern will be repeated on every row.
 The pattern will blink along with the row-number.
 row number 4 (index==3) will blink 4 times etc.
 */
void rows() {
  for(int row=0;row<8;row++) {
    delay(delaytime);
    lc.setRow(0,row,B10100000);
    delay(delaytime);
    lc.setRow(0,row,(byte)0);
    for(int i=0;i<row;i++) {
      delay(delaytime);
      lc.setRow(0,row,B10100000);
      delay(delaytime);
      lc.setRow(0,row,(byte)0);
    }
  }
}

/*
  This function lights up a some Leds in a column.
 The pattern will be repeated on every column.
 The pattern will blink along with the column-number.
 column number 4 (index==3) will blink 4 times etc.
 */
void columns() {
  for(int col=0;col<8;col++) {
    delay(delaytime);
    lc.setColumn(0,col,B10100000);
    delay(delaytime);
    lc.setColumn(0,col,(byte)0);
    for(int i=0;i<col;i++) {
      delay(delaytime);
      lc.setColumn(0,col,B10100000);
      delay(delaytime);
      lc.setColumn(0,col,(byte)0);
    }
  }
}

/* 
 This function will light up every Led on the matrix.
 The led will blink along with the row-number.
 row number 4 (index==3) will blink 4 times etc.
 */
void single() {
  for(int row=0;row<8;row++) {
    for(int col=0;col<8;col++) {
      delay(delaytime);
      lc.setLed(0,row,col,true);
      delay(delaytime);
      for(int i=0;i<col;i++) {
        lc.setLed(0,row,col,false);
        delay(delaytime);
        lc.setLed(0,row,col,true);
        delay(delaytime);
      }
    }
  }
}

void loop() { 
  writeArduinoOnMatrix();
  rows();
  columns();
  single();
}




Nessun commento: