Guida n. 83
Un modulo con il chip MAX7219, cinque fili e Arduino UNO: una faccina disegnata riga per riga, poi una scritta che scorre su quattro matrici.
A cura di Ada Intelisano · redazione tecnica di informaticait.it
- Il MAX7219 comanda da solo i 64 LED della matrice: Arduino gli manda gli ordini con tre fili, DIN, CLK e CS.
- Cinque fili: VCC al 5V, GND al GND, DIN al pin 11, CLK al 13, CS al 10. Il modulo si tiene con l'ingresso a destra.
- Una figura sono otto numeri, uno per riga: ogni 1 è un LED acceso. Libreria MD_MAX72XX.
- Con il modulo da quattro matrici e la libreria MD_Parola una scritta scorre da destra a sinistra.
Otto righe e otto colonne di LED rossi: con una matrice così si disegnano faccine, frecce, numeri, e con più matrici in fila si fanno scorrere le scritte come sulle insegne dei negozi. Accendere 64 LED uno per uno chiederebbe troppi pin, quindi sul modulo c'è un chip, il MAX7219, che fa tutto il lavoro. Arduino gli parla con tre fili.
1Prepara il materiale
- un modulo matrice 8×8 con il MAX7219: arriva con due pettini a cinque pin da saldare, uno dritto e uno piegato ad angolo;
- Arduino UNO con il cavo USB e cinque cavetti femmina-maschio;
- per l'ultimo passo, il modulo da quattro matrici (32 × 8 LED), che ha già il pettine saldato.
2Come fa un chip a comandare 64 LED
Il MAX7219 non tiene accesi tutti i LED insieme. Accende una riga alla volta e passa alla successiva così in fretta che l'occhio vede l'immagine intera: il datasheet indica 800 giri al secondo tipici su tutte e otto le righe. Una sola resistenza sul modulo decide quanta corrente passa nei LED, e da Arduino arrivano solo gli ordini: quale riga cambiare e con quali LED accesi.
3Salda il pettine e gira il modulo
Salda il pettine ad angolo sui cinque fori del lato IN, quello con DIN, con i pin che escono di lato, verso l'esterno (guida n. 70). Il pettine dritto serve sul lato OUT solo se un giorno vorrai attaccare un secondo modulo.
Poi tieni il modulo con l'ingresso a destra. Le scritte «→IN» e «OUT→» del circuito stampato restano a testa in giù, ed è giusto così: la documentazione della libreria che useremo dice proprio che questi moduli vanno tenuti con il lato DIN a destra e che le scritte possono apparire capovolte.
4Collega i cinque fili
- VCC al 5V e GND al GND: il chip lavora tra 4 e 5,5 V.
- DIN al pin 11 e CLK al 13: sono i pin dell'SPI di Arduino UNO, il collegamento veloce che la libreria usa per mandare i dati, e non si possono cambiare.
- CS al pin 10. Questo invece puoi spostarlo, basta scrivere il nuovo numero nello sketch.
5Installa la libreria
Nel gestore librerie cerca MD_MAX72XX di majicDesigns e installala;
già che ci sei, installa anche MD_Parola dello stesso autore, che servirà alla fine. Se durante la compilazione compare
INFO: ARDUINO SPI interface selected, non preoccuparti: è un avviso che la libreria stampa sempre, non un errore.
6Disegna una faccina
Ogni riga della matrice è un numero di otto cifre binarie, scritto con 0b davanti: 1 è un LED acceso,
0 uno spento, e la cifra a sinistra è il LED a sinistra. Otto numeri, dall'alto in basso, fanno una figura.
// Matrice 8x8 con il MAX7219: una faccina e un cuore, disegnati riga per riga. // Libreria: MD_MAX72XX di majicDesigns. #include <Arduino.h> #include <MD_MAX72xx.h> // DIN al pin 11 e CLK al 13 (sono fissi), CS al 10 MD_MAX72XX matrice(MD_MAX72XX::FC16_HW, 10, 1); // tipo di modulo, pin CS, matrici // otto numeri, uno per riga dall'alto: 1 = LED acceso, 0 = spento const byte FACCINA[8] = { 0b00111100, 0b01000010, 0b10100101, 0b10000001, 0b10100101, 0b10011001, 0b01000010, 0b00111100, }; const byte CUORE[8] = { 0b00000000, 0b01100110, 0b11111111, 0b11111111, 0b01111110, 0b00111100, 0b00011000, 0b00000000, }; void disegna(const byte figura[8]) { for (byte riga = 0; riga < 8; riga++) { matrice.setRow(riga, figura[riga]); // il bit a sinistra è il LED a sinistra } } void setup() { matrice.begin(); matrice.control(MD_MAX72XX::INTENSITY, 2); // luminosità da 0 a 15 } void loop() { disegna(FACCINA); delay(2000); disegna(CUORE); delay(2000); }
setRow(riga, numero) accende i LED di una riga; INTENSITY regola la luminosità da 0 a 15.
FC16_HW dice alla libreria com'è collegata la matrice al chip.
- Tutto spento: VCC è sul 5V? DIN e CLK sono sui pin 11 e 13, non scambiati? I cavetti sono sul lato IN?
- Faccina a testa in giù: gira il modulo di mezzo giro, con il pettine IN a destra.
- Figura a pezzi o di traverso: il tuo modulo collega i LED al chip in un altro modo. Al posto di
FC16_HWprovaGENERIC_HW, poiPAROLA_HWeICSTATION_HW: l'autore della libreria consiglia di provarli uno dopo l'altro, e non si rompe niente.
7Luminosità e corrente
Il MAX7219 regola la luce accendendo i LED per una parte del tempo: con
INTENSITY a 0 restano accesi per 1/32 del giro, con 15 per 31/32 (datasheet). Anche a 0 quindi non si spengono del tutto.
- Con tutti i LED accesi alla corrente massima consigliata, 40 mA, il datasheet indica 330 mA tipici per ogni chip. Quanta corrente passa davvero nel tuo modulo dipende dalla resistenza montata, e chi lo produce non la dichiara.
- Arduino alimentato dalla porta USB del computer ha a disposizione di solito non più di 500 mA. Con quattro matrici tutte accese al massimo si potrebbe arrivare a 4 × 330 = 1,32 A (calcolo nostro, caso peggiore).
- Per questo negli sketch la luminosità è bassa, 2 e 1: si vede bene e la porta USB regge. Per una scritta grande e luminosa usa un alimentatore da 5 V a parte per i moduli, con il GND unito a quello di Arduino, come consiglia l'autore della libreria e come nella guida n. 82.
8La scritta che scorre
Il modulo da quattro matrici ha quattro MAX7219 in fila, ognuno passa i dati al successivo. Si collega con gli stessi cinque fili al pettine di destra, quello d'ingresso. La libreria conta le matrici da destra: la numero 0 è quella attaccata ad Arduino.
// Una scritta che scorre sul modulo da quattro matrici (32 x 8 LED). // Librerie: MD_Parola e MD_MAX72XX di majicDesigns. #include <Arduino.h> #include <MD_Parola.h> // DIN al pin 11, CLK al 13, CS al 10, come per la matrice singola MD_Parola scritta(MD_MAX72XX::FC16_HW, 10, 4); // tipo di modulo, pin CS, matrici void setup() { scritta.begin(); scritta.setIntensity(1); // da 0 a 15 scritta.displayScroll("Ciao da Arduino!", PA_LEFT, PA_SCROLL_LEFT, 50); } void loop() { if (scritta.displayAnimate()) { // vero quando la scritta è uscita tutta scritta.displayReset(); // e allora riparte da destra } }
displayScroll prepara la scritta: allineamento, effetto e velocità, cioè i millesimi di secondo tra un passo e
l'altro (più è basso, più corre). displayAnimate() va chiamata di continuo nel loop, senza
delay: è lei che sposta le lettere al momento giusto.
- Lettere a testa in giù: il pettine d'ingresso dev'essere a destra. È l'errore che l'autore della libreria vede più spesso.
- Scritta tagliata o ripetuta a pezzi: nella riga
MD_Parola scritta(...)l'ultimo numero dev'essere 4. - Lettere accentate che escono strane: la libreria ha un esempio apposta (Parola_UFT-8_Display); per cominciare scrivi senza accenti.
9E con l'ESP32?
Con l'ESP32 il modulo non va collegato direttamente. Il MAX7219 vuole da 4 a 5,5 V e riconosce di sicuro un «1» sui fili dei dati solo da 3,5 V in su (datasheet): i 3,3 V dell'ESP32 stanno sotto. Servono il modulo a 5 V e un traslatore di livello su DIN, CLK e CS (guida n. 21). Per i circuiti a 3 V Analog Devices indica un altro chip, il MAX6951. Con Arduino UNO, che lavora a 5 V, questi problemi non ci sono: per questo la guida usa l'UNO.
- Disegna una freccia, la tua iniziale o una faccina triste: cambia gli otto numeri.
- Fai lampeggiare il cuore con
matrice.clear()e due pause. - Cambia la scritta e la velocità, da 20 a 100.
- il MAX7219 accende a turno le righe, così in fretta che non si vede;
- ogni riga è un numero di otto bit, 1 acceso e 0 spento;
- i moduli si tengono con l'ingresso a destra e si contano da destra.
Prodotti utili
Altre guide
- Codice colori delle resistenze e tolleranze
- MOSFET a canale N e a canale P
- Transistor bipolare (BJT) o MOSFET?
- Il relè: come comandarlo e quanto assorbe
- Componenti THT e SMD/SMT
- Pinout delle schede XIAO
- LED: tensione diretta e resistenza in serie
- Il multimetro: misurare tensione e corrente
- Wemos D1 mini: primi passi
- Modulo MOSFET con Arduino ed ESP32
- Modulo relè con Arduino ed ESP32
- Filamenti per stampa 3D: PLA, PETG e versioni con fibre
- Analogico e digitale: le differenze
- ADS1115: convertitore a 16 bit con Arduino ed ESP32
- Da bit a valore reale: convertire le letture dei sensori
- Orologio RTC DS3231 con Arduino ed ESP32
- Regolatore lineare o switching: quale scegliere
- Step-down, step-up e buck-boost: scegliere il modulo giusto
- Partitore di tensione: leggere tensioni più alte di 5 V o 3,3 V
- Pull-up, pull-down e rimbalzo: collegare un pulsante come si deve
- Livelli logici 3,3 V e 5 V: far parlare ESP32 e Arduino
- Il bus I²C: indirizzi, pull-up e lo scanner
- Batterie al litio: tensioni, carica e protezione
- Consumi e deep sleep dell'ESP32: quanto dura la batteria
- Sensori di temperatura a confronto
- ESP32: quali pin usare e quali evitare
- Primi passi con l'ESP32 in Arduino IDE 2 e PlatformIO
- Display OLED SSD1306 e LCD 16×2 I²C con Arduino ed ESP32
- Sensore di movimento PIR e sensore a ultrasuoni HC-SR04
- Data e ora da Internet con l'ESP32: NTP, fuso italiano e ora legale
- Data logger su microSD: salvare le misure in CSV
- ESP32 a pannello solare: pannello, caricatore e conti per l'Italia
- Web server sull'ESP32: comandare un relè dal telefono
- Il tuo primo LED: collegarlo e farlo lampeggiare
- Il pulsante: far decidere ad Arduino
- Il potenziometro: girare una manopola e leggerne il valore
- Luce morbida: regolare la luminosità di un LED
- Il cicalino: suonare note e melodie
- Il semaforo: tre LED in sequenza
- Il termometro: leggere la temperatura con il TMP36
- Il servomotore: muovere un braccetto con Arduino
- La luce notturna: la fotoresistenza e la prima decisione
- Il relè: accendere una lampadina con Arduino
- Il display LCD: far scrivere Arduino
- Il dado elettronico: il primo progetto completo
- Il LED RGB: tutti i colori con tre luci
- Il joystick: comandi a due assi con uno shield
- L'anello di LED: dodici colori con un solo pin
- Il motore DC: farlo girare con un MOSFET
- L'umidità del terreno: la pianta che chiede acqua
- Il motore passo-passo: girare di quanto vuoi tu
- Il sensore di parcheggio: bip sempre più veloci
- Il display a 7 segmenti: numeri grandi e luminosi
- L'irrigazione automatica: la pianta si annaffia da sola
- Il tastierino: la serratura con il codice segreto
- Stazione meteo in rete: valori e grafico sul telefono
- Un bot Telegram sull'ESP32: casa tua dal telefono
- MQTT con l'ESP32: la lingua degli oggetti connessi
- Aggiornare l'ESP32 via Wi-Fi (OTA)
- ESP-NOW: due ESP32 che si parlano senza router
- WebSocket con l'ESP32: il LED che segue il cursore
- Le letture su un foglio Google, con il deep sleep
- WiFiManager: il Wi-Fi si sceglie dal telefono
- Bluetooth LE con l'ESP32: il telefono senza rete
- La fotocamera nel browser con l'ESP32-S3
- Una cassa Bluetooth portatile, fatta da te
- Diffusori Bluetooth da scrivania, 2 × 20 W
- Lettore MP3 stereo con due pulsanti
- La mensola che suona: un exciter Visaton
- Come si salda bene
- Quanto consuma? Corrente e potenza con l'INA219
- Bilancia con cella di carico e HX711
- Semaforo della CO2: quando aprire le finestre
- Apriporta con tessera RFID
- GPS: registratore di percorso su microSD
- LoRa: fin dove arriva? Prova di portata con due schede
- Cartello meteo a batteria con display e-paper
- Radio web con ESP32 e amplificatore I2S
- Primi passi con il Raspberry Pi Pico 2 in MicroPython
- Il primo amplificatore: LM386 e un altoparlante
- Arduino che parla: il modulo di sintesi vocale DFR0760
- Lo spettro della musica su una matrice di LED
- Una tensione vera: il DAC MCP4725 a 12 bit
- Il battito del cuore su Arduino: ECG con l'AD8232