Scopriamo come utilizzare il MAX7219 per pilotare una matrice LED. Collegamenti, librerie Arduino e sketch ci guideranno nella realizzazione di display grafici e numerici personalizzati.
Un display a matrice LED è tra i componenti più affascinanti per chi inizia a sperimentare con Arduino: con un piccolo modulo quadrato possiamo dare vita a numeri, lettere, simboli e animazioni che catturano subito l’attenzione. Il problema? Una matrice 8×8 significa ben 64 LED da controllare singolarmente: un compito quasi impossibile senza un supporto dedicato. Ecco perché viene in aiuto l’integrato MAX7219, un chip progettato appositamente per semplificare la gestione di display a matrice e 7 segmenti, riducendo a pochi pin il collegamento con la scheda Arduino. In questo articolo vedremo come collegare il MAX7219 a una matrice 8×8, come utilizzare i moduli già pronti in commercio e come programmare il tutto con la libreria LedControl.
Il MAX7219

L’integrato MAX7219 ha 24 pin. Il display 8×8 (Fig. 1) viene collegato in modo che le righe siano connesse ai pin DIG e le colonne ai pin SEG del MAX7219.
La luminosità si varia via software dopo aver fissato la corrente massima con una resistenza esterna collegata al pin Iset. I pin dedicati alla comunicazione con la scheda di controllo sono tre: DIN (per trasferire i dati dalla scheda all’integrato), CS (per la selezione del dispositivo) e CLK (per il clock dei dati). Un ulteriore pin, DOUT, serve per collegare il DIN dell’integrato successivo, nel caso si vogliano connettere in serie più matrici LED (ad esempio per realizzare scritte scorrevoli).
Lo schema completo del collegamento tra integrato e display è mostrato in Fig. 2, con particolare evidenza per i collegamenti verso la scheda Arduino e un secondo integrato. L’uso del MAX7219 è ulteriormente semplificato grazie alla disponibilità in commercio di moduli (come quelli in Fig. 3) che integrano sia l’integrato sia la matrice LED, oltre al relativo cablaggio.


L’impiego di un modulo riduce il cablaggio ai soli collegamenti tra modulo e scheda Arduino, e tra moduli eventualmente disposti in serie. Ogni modulo dispone di 5 pin di ingresso (VCC, GND, DIN, CS/LOAD e CLK, da collegare a una scheda come l’Arduino UNO R3) e di 5 pin di uscita (VCC, GND, DOUT, CS e CLK, per eventuali moduli successivi in serie). La scheda Arduino UNO R3 può essere sostituita dalle più recenti versioni Arduino UNO R4, disponibili nei modelli Minima e WIFI, entrambe completamente compatibili a livello elettrico e software con la precedente R3. Entrambe le versioni mantengono la stessa disposizione dei pin e sono compatibili con la maggior parte delle shield e librerie già sviluppate per la R3.
Programmazione con Arduino
Alcune librerie facilitano la programmazione del MAX7219; tra queste, in particolare, la libreria LedControl, molto diffusa e semplice da utilizzare.
I comandi di base sono i seguenti:
#include “LedControl.h”
LedControl LC=LedControl (DIN, CLK, CS, moduli numerici)
Viene creato un oggetto della classe LedControl, al quale si assegna un nome identificativo (ad esempio, LC). I parametri DIN, CLK e CS verranno sostituiti con i numeri dei pin di Arduino (ad esempio: 2, 4, 3) ai quali sono collegati i rispettivi segnali.
LC.SHUT (numero modulo, 0/1)
Permette di attivare o disattivare l’integrato. Il valore 0 lo rende operativo, mentre 1 lo pone in standby. All’accensione, l’integrato è in modalità standby per impostazione predefinita. Il parametro numero_modulo identifica il modulo in una catena seriale, numerato a partire da 0.
lc.setIntensity (numero modulo, intensità)
Regola l’intensità luminosa dei LED, con un valore compreso tra 0 (minimo) e 15 (massimo). Il valore 0 non spegne completamente i LED; per farlo, è necessario usare LC.Shutdown(numero_modulo, 1).
lc.clearDisplay (numero modulo)
Spegne tutti i LED del modulo specificato, cancellando il contenuto visualizzato.
lc.setLed (numero modulo, numero riga, numero colonna, stato)
Accende o spegne un singolo LED. numero_riga e numero_colonna indicano la posizione del LED (numerati da 0 a 7). stato = true (o 1) accende il LED, false (o 0) lo spegne. Le righe sono numerate da 0 (in alto) a 7 (in basso), le colonne da 0 (a sinistra) a 7 (a destra).
Ad esempio, il LED in alto a sinistra occupa la posizione (0, 0), quello in basso a destra la (7, 7).
lc.setRow (numero modulo, numero riga, byte)
Permette di accendere o spegnere tutti i LED di una riga, specificandone lo stato tramite un byte binario. Ad esempio, per accendere i primi quattro LED di una riga si usa: B11110000.
lc.setColumn (numero modulo, numero colonna, byte)
Funziona in modo analogo a setRow, ma agisce su una colonna. Il byte definisce quali LED accendere o spegnere nella colonna specificata.
Vediamo ora alcuni esempi pratici di utilizzo.
Esempio 1
Il primo sketch, riportato nel Listato 1, ha lo scopo di visualizzare in sequenza le 8 righe, una alla volta, a partire dall’alto; successivamente le 8 colonne, una alla volta, partendo da sinistra; poi le 8 righe partendo dal basso; quindi le 8 colonne a partire da destra. Infine, vengono accesi tutti i LED gradualmente a coppie di righe, iniziando dalle due righe centrali e seguendo l’ordine: 4-5, 3-6, 2-7, 1-8. In quest’ultima fase, l’accensione avviene a bassa intensità, con la luminosità che varia progressivamente da 10 a 2.

Esempio 2
Scopo di questo sketch (Listato 2) è di far accendere gradualmente i LED delle righe della matrice a partire dal basso come conseguenza della variazione di una tensione tra 0 V e 5 V imposta tramite un potenziometro collegato al pin A5; nei commenti all’interno dello sketch vengono indicate le modalità di accensione graduale.

Impiego degli array
Gli obiettivi dei due esempi precedenti si possono raggiungere in modo analogo utilizzando gli array. Un approccio consiste nel definire la struttura delle righe all’interno di un array di byte (ad esempio in binario): con 8 elementi da 8 bit si descrive lo stato dei LED di tutto il display. Alla prima cella dell’array si fa corrispondere lo stato degli otto LED della riga 0 (da sinistra a destra), alla seconda quella della riga 1, e così via fino alla riga 7.
Se, per esempio, si vogliono spegnere tutti i LED delle prime quattro righe e accendere quelli delle ultime quattro, si può usare il seguente array:
Array di byte [8]={B00000000,B00000000,B00000000,B00000000,B11111111,B11111111,B11111111,B11111111};
Per la visualizzazione sul display si può procedere utilizzando il codice seguente:
per (row=0; fila<8; row++) {lc.setRow(0,row,array[row]);}ritardo (3000);
Un editor che consente di ottenere più velocemente i codici binari dei simboli più utilizzati è accessibile al link seguente:
https://xantorohara.github.io/led-matrix-editor
Esempio 3
Scopo di questo sketch (Listato 3) è di visualizzare in sequenza tutti i numeri compresi tra 0 e 9 utilizzando 10 array che definiscono i numeri e 10 cicli for che li richiamano.

Esempio 4


Scopo di questo sketch (Listato 4) è di visualizzare il superamento di determinate soglie di temperatura e umidità (variabili da programma) nel modo indicato in Fig. 4.
Nella metà sinistra del display (colonne 0–1–2) vengono visualizzati i dati di temperatura, mentre nella metà destra (colonne 5–6–7) vengono visualizzati i dati di umidità.
Nella parte alta del display (righe 0–1–2) compaiono le lettere T e U; nella parte bassa (righe 4–5–6–7) l’accensione dei LED indica il raggiungimento di una determinata soglia di temperatura o umidità.
Nel codice sono definite quattro soglie: al crescere del valore si accendono, a partire dalla riga 7, le righe corrispondenti in modo progressivo. Per la misura della temperatura e dell’umidità viene utilizzato il sensore HTS221, integrato nella scheda di espansione IKS01A3 di STMicroelectronics (Fig. 5), montata sulla scheda Arduino UNO. Chi non dispone di tale scheda può impiegare altri sensori, come DHT11 o DHT22, adattando di conseguenza il software per la parte di acquisizione dati.

Conclusione
Il MAX7219 rende accessibile a tutti la gestione di una matrice LED, trasformando un compito complesso in un’esperienza divertente, stimolante e creativa. Una volta compresi i comandi di base, le possibilità diventano praticamente infinite: scritte scorrevoli personalizzate, piccole animazioni, indicatori grafici, semplici giochi luminosi e visualizzazioni di dati in tempo reale. Non resta che sperimentare, adattare gli sketch proposti e lasciarsi ispirare: con una semplice matrice LED il vostro progetto Arduino potrà finalmente “parlare con la luce” in modo chiaro, dinamico e originale.


