Matrice LED 8×8 LED con MAX7219 e Arduino

Matrice LED 8×8 LED con MAX7219 e Arduino

Le matrici LED, come l’1088AS (qui potrete scaricare il datasheet) sono composte da una griglia di diodi Led connessi tra loro secondo il seguente schema:

L’anodo dei LED sono le colonne ed il catodo dei LED sono le righe.

Per accendere ogni LED basterà alimentare il corrispondente pin della riga e della colonna e se dovessimo collegare questa matrice di led direttamente ad Arduino ci servirebbero 16 pin, inoltre non sarebbe in grado di alimentare direttamente tutti questi LED. Per utilizzare in maniera semplice la matrice ci viene in contro un integrato appositamente progettato, il MAX7219 (qui potrete scaricare il suo datasheet).

Lo schema di montaggio è molto semplice e per poter funzionare il MAX7219 necessita solo di un condensatore e di una resistenza, che servirà a regolare la tensione e la corrente che arriverà ai LED. Per calcolare il valore della resistenza far riferimento alla seguente tabella:

I pin per poter controllare il MAX7219 sono:
VCC: Alimentazione 5V
GND: Massa di alimentazione
DIN: Ingresso dati
DOUT: Uscita dati, verso DIN del modulo successivo
CLK: Clock dei dati
CS: Selezione del modulo

Per semplificarci ancora di più il lavoro, esistono varie librerie per Arduino che ci permettono di utilizzare direttamente il MAX7219, una di queste è la LedControl che ritroviamo tra le librerie direttamente installabili dal Gestore librerie dell’IDE di Arduino.

Per installarla aprire l’IDE di Arduino, andare su “Strumenti” –> “Gestione librerie…”

Cercare ledcontrol e cliccare su installa.Lo schema da utilizzare sarà il seguente:Questa libreria ci permette di scegliere quali pin di Arduino vogliamo utilizzare.

Iniziamo con includere la libreria LedControl.h e creare l’oggetto LedControl.

#include "LedControl.h"
#define DIN 2
#define CS 3
#define CLK 4
#define Moduli 1

LedControl lc = LedControl(DIN, CLK, CS, Moduli);

I parametri da passare sono, nell’ordine, il pin DIN, il pin CLK, il pin CS e il numero dei moduli connessi, per adesso 1.

void setup() {
  lc.shutdown(0, false);
  lc.setIntensity(0, 6);
  lc.clearDisplay(0);
}

Il comando lc.shutdown(0, false);

Il modulo MAX7219 di default, appena viene alimentato, è in standby e deve essere attivato, il numero indica il numero del modulo, il primo della fila è lo 0. il modulo resta comunque attivo e continua ad interpretare i dati ricevuti, senza però accendere i LED, nel momento che si esce dallo standby verranno accesi i LED programmati.

Il comando lc.setIntensity(0, 1);  setta l’intensità luminosa dei LED. Il valore va da 0 a 15 (nell’esempio è impostato a 6). 0 porta al minimo la luminosità, non spegne del tutto i LED, per farlo si deve mettere in standby il modulo con il comando lc.shutdown(0, true);

Il comando  lc.clearDisplay(0); resetta il modulo  MAX7219 e spegne tutti i led.

Per accendere o spegnere un punto in particolare:

  lc.setLed(modulo , row, col, true);

I parametri da passare sono: il numero del modulo, il numero del Rov (è il numero di riga da 0 a 7), il numero del col (è il numero della colonna da 0 a 7), true / false serve per accendere o spegnere il led selezionato.

Per accendere o spegnere una intera riga è possibile mandare 1 byte ad una determinata riga.

    lc.setRow(modulo , row, BYTE);

I parametri da passare sono: il numero del modulo, il numero della riga ed il byte.

Per esempio lc.setRow(0, 1, B00000000);

Oltre al valore binario è possibile inviare un numero decimale così pesato:

Il valore da utilizzare sarà 128+32+16=176

Il comando visto precedentemente sarà lc.setRow(0, 1, 176);

Si può fare anche con una intera colonna, il comando è simile al precedente:

    lc.setColumn(modulo , col, B00110011);

Come per il comando .setRow i parametri da passare sono: il numero del modulo, il numero della colonna ed il byte o il valore decimale pesato.

Si consiglia di scrivere le righe piuttosto che le colonne, in quanto il modulo è più veloce a indirizzare le righe.

Per poter scrivere un carattere o una immagine dovremo inviare per le 8 righe o per le 8 colonne il BYTE relativo.

Sul sito http://xantorohara.github.io/led-matrix-editor/ è possibile editare la matrice e convertirla nei byte relativi, oltre a trovare degli esempi già pronti di caratteri, numeri e simboli.

Il seguente Sketch mostrerà sulla matrice la lettera A e dopo 2 secondi la lettera B:

#include "LedControl.h"
#define DIN 2
#define CS 3
#define CLK 4
#define Moduli 1

LedControl lc = LedControl(DIN, CLK, CS, Moduli);
byte a[8] = {B01100110,B01100110,B01111110,B01100110,B01100110,B00111100,B00011000,B00000000,};
byte b[8] = {B11111100,B01100110,B01100110,B01111100,B01100110,B01100110,B11111100,B00000000,};

void setup() {
  lc.shutdown(0, false);
  lc.setIntensity(0, 0);
  lc.clearDisplay(0);
}

void loop() {
  for (int row = 0; row < 8; row++) {
    lc.setRow(0, row, a[row]);
  }
  delay(2000);

  for (int row = 0; row < 8; row++) {
    lc.setRow (0, row, b[row]);
  }
  delay(2000);
}