Applicazioni Pratiche del Driver LED MAX7219
su
Il progetto presentato in questo articolo permette la realizzazione di un utile e moderno VU meter, in grado di visualizzare su un display composto da una matrice d 32x8 led, le componenti di frequenza di un segnale audio campionato con la scheda Arduino Uno. Il progetto rappresenta inoltre l'occasione per studiare e apprendere il funzionamento del MAX7219, un driver led programmabile utilizzabile in numerose applicazioni pratiche. In questo articolo analizzeremo le caratteristiche tecniche, il funzionamento e le principali applicazioni di un componente che, per versatilità, basso costo e semplicità di utilizzo deve necessariamente fare parte del bagaglio tecnico di ogni maker: il MAX7219/MAX7221 prodotto da Maxim Integrated. Il settore di riferimento è quello optoelettronico, in particolare il pilotaggio tramite interfaccia digitale di diverse tipologie di display: dai classici display a 7 segmenti, fino ai più moderni display con matrici di led. Il display, indipendentemente dalla tecnologia utilizzata per la sua fabbricazione (LCD, LED, OLED, a matrice di led o altro ancora), rappresenta un componente fondamentale per ogni appassionato di elettronica, uno strumento indispensabile per molti progetti embedded dove l’interfaccia uomo macchina, per ragioni legate alla disponibilità limitata di risorse hardware oppure al budget, è ridotta ai minimi termini. Come applicazione pratica del MAX7219 presenteremo un progetto che, utilizzando Arduino e un display realizzato con una matrice di 32x8 led, visualizza lo spettro a 32 bande relativo a un segnale audio acquisito in tempo reale. Cercheremo quindi di unire l’utile al dilettevole, integrando le nozioni teoriche con un’utile applicazione dove si potranno mettere a frutto e comprendere meglio i concetti assimilati.
Il MAX 7219/MAX 72121
Partiamo dunque con l’analisi di questo componente di Maxim, un driver per display led fino a 8 cifre e interfaccia di comunicazione seriale. Quest’ultimo aspetto, l’interfaccia di comunicazione e configurazione di tipo seriale, lascia presagire come il driver sia stato concepito sin dalle origini per essere controllato da un dispositivo logico evoluto, sia esso un microprocessore oppure un normale microcontrollore. Come già anticipato in precedenza, in questo articolo proporremo l’utilizzo del driver in ambiente Arduino ma, a condizione di disporre o di eseguire manualmente il “porting” della relativa libreria di gestione in altro ambiente, il driver led può essere utilizzato anche con il Raspberry Pi o con un qualunque microcontrollore equipaggiato con interfaccia seriale “SPI-like”. Il MAX7219/MAX7221 può quindi essere definito come un driver per display led a catodo comune in grado di interfacciare una CPU con display led a 7 segmenti, display a barra per applicazioni grafiche oppure matrici composte ciascuna da 64 led. Ogni singolo driver può gestire fino a 8 display led a singola cifra, oppure fino a 8 matrici di 64 led ciascuna. Come vedremo tra poco, questa caratteristica consente di realizzare facilmente (sia a livello hardware che a livello software) dei pannelli luminosi composti da più moduli, ognuno formato da una matrice di 8x8 led, collegati in cascata. Nel caso si volessero realizzare pannelli composti da un maggiore numero di cifre o di moduli di 8x8 led, sarà sufficiente aggiungere al progetto un secondo chip dello stesso tipo, modificando opportunamente il relativo firmware di gestione. L’integrato include un decodificatore BCD-7 segmenti (attivabile a livello software), un multiplexer, circuiti driver per il pilotaggio dei segmenti led e una memoria RAM statica in grado di contenere le informazioni relative a ciascuna cifra (oppure “pattern” nel caso di una matrice di led) visualizzata. Per il pilotaggio dei led o dei segmenti è richiesta una sola resistenza esterna, semplificando notevolmente il circuito di pilotaggio. Rispetto alla versione base, il modello MAX7221 offre il supporto per un numero maggiore di interfacce, tra cui QSPI e MICROWIRE. Inoltre, la velocità di aggiornamento dei segmenti (slew rate) è stata limitata per migliorare l’immunità alle interferenze di tipo elettromagnetico. Per entrambe le versioni, la massima velocità sopportabile dall’interfaccia seriale è pari a 10 MHz. In Figura 1 è visibile il pinout del driver, disponibile nei package DIP e SO a 24 pin.
Figura 1: Pinout del MAX7219/MAX7221 con package DIP 24Tramite l’interfaccia di comunicazione è possibile indirizzare i singoli elementi del display senza doverne riscrivere interamente il contenuto. Non mancano le funzionalità per il risparmio energetico e per la diagnostica, come la modalità “shutdown” (con mantenimento della memoria) caratterizzata da un assorbimento di soli 150μA, la regolazione della luminosità sia a livello digitale che analogico, la forzatura allo stato OFF di tutti i led durante l’accensione e una modalità di test che forza automaticamente l’accensione di tutti i led.
Descrizione dei pin
I pin di alimentazione sono rappresentati da V+, al quale va fornita un’alimentazione continua stabilizzata di +5V, e GND. Il pin ISET, come dice il nome stesso, serve ad impostare la corrente utilizzata per pilotare il display. Più precisamente, occorre collegare una resistenza RSET tra questo pin e la sorgente utilizzata per alimentare il modulo (la stessa a cui fa capo V+). Il valore di RSET, che determina la luminosità del display, può essere fisso oppure variabile, consentendo dunque una regolazione fine della luminosità dei led tramite un controllo esterno. Il valore minimo di RSET non deve essere inferiore a 9,53 kΩ, valore a cui corrisponde una corrente di pilotaggio dei segmenti pari a 40 mA. Come regola generale, si tenga presente che la corrente di picco utilizzata per il pilotaggio del display è pari a circa 100 volte la corrente che percorre il pin ISET. Oltre a una regolazione di tipo analogico, il driver consente di effettuare una regolazione dell’intensità luminosa di tipo digitale, impostando opportunamente via software il contenuto di un registro. Il controllo digitale è attuato da un circuito PWM interno, con 16 step differenti di luminosità corrispondenti al contenuto del nibble meno significativo del registro. Le intensità luminose massima e minima, nella modalità digitale, corrispondono rispettivamente a 31/32 e 1/32 della corrente di picco impostata tramite RSET. I sette pin da SEG A a SEG F servono per fornire corrente alle uscite corrispondenti ai sette segmenti, mentre il pin SEG DP pilota la corrente per il punto decimale. Nel caso di una matrice di led 8x8, le uscite sono tipicamente associate alle otto colonne (o righe) della matrice. Nel MAX7219, quando si vuole tenere spento un segmento il corrispondente segnale di uscita viene tirato verso massa, mentre nel MAX7221 viene posto nello stato di alta impedenza. I pin DIG 0 – DIG 7 ricevono corrente dal catodo comune del display. Quando un segmento è spento, il pin viene portato alla tensione V+ nel MAX7219 e nello stato di alta impedenza nel caso del MAX7221. Nel prossimo paragrafo, parlando del modulo matrice di led 8x8 utilizzato per il progetto, vedremo più in dettaglio come i pin SEGx e DIGx debbano essere collegati al display. I pin che non abbiamo ancora citato, utilizzati per il controllo del led driver tramite interfaccia seriale e per il collegamento di più led driver in cascata (daisy-chain), possono essere meglio compresi osservando lo schema funzionale di Figura 2.
Figura 2: Schema funzionale del led driver.
Figura 3: Mappa dei registri interni del driver led.Display a matrice di led
Uno dei display più apprezzati e utilizzati dai maker e dagli appassionati di elettronica è senza ombra di dubbio il display a matrice di led 8x8, visibile in Figura 4.
Figura 4: Display a matrice di led 8x8.
Figura 5: Un modulo completo, con matrice di led 8x8 e integrato driver.Collegamento in cascata
La possibilità di collegare più moduli led, ciascuno controllato da un proprio led driver Maxim, è molto importante, in quanto permette la realizzazione di display modulari composti da più matrici collegate in daisy-chain. Questa funzionalità offerta dal MAX7219/MAX7221 è di facile implementazione: è infatti sufficiente collegare uno a uno i pin del connettore di uscita di un modulo con i corrispondenti pin del connettore di ingresso del modulo successivo. Un esempio pratico di come ciò possa essere realizzato è visibile in Figura 6, riferita al caso particolare di tre moduli (nel progetto ne utilizzeremo quattro). I segnali CLK e LOAD sono inviati in parallelo a tutti i driver MAX7219, mentre il segnale dati uscente da Arduino viene inviato al pin DIN del primo modulo, quello più a destra in Figura 6.
Figura 6: Esempio di collegamento in cascata di tre moduli.
Descrizione del progetto
Dopo aver esposto i concetti basilari relativi alle caratteristiche e alle modalità operative del driver led e del display a matrice di led, possiamo esaminare più in dettaglio il progetto che rappresenta la parte pratica e applicativa di quanto precedentemente esposto. Il progetto, il cui schema a blocchi è visibile in Figura 7, si compone delle seguenti parti hardware e software:- scheda Arduino Uno Rev. 3 o compatibile;
- display a matrice di led 32x8 (4 moduli 8x8 in cascata);
- circuito di condizionamento del segnale audio;
- libreria FFT;
- libreria MD_MAX72xx.

Figura 7: Schema a blocchi dell’applicazione.
Figura 8: Esempio di classico display a led 32x8 di tipo commerciale.Circuito di ingresso audio
La trasformata di Fourier veloce (FFT) viene eseguita da Arduino su una serie di campioni digitali acquisiti tramite il convertitore analogico-digitale integrato, caratterizzato da una risoluzione di 10 bit. Il segnale audio in ingresso, prelevabile dall’uscita di un dispositivo mobile, portatile, o di un PC, deve essere opportunamente elaborato prima di raggiungere l’ADC. In particolare, occorre traslare il livello in modo da ricondurlo sempre in zona positiva e filtrare le componenti in continua del segnale in ingresso, che produrrebbero inevitabilmente delle frequenze indesiderate nello spettro audio. Il circuito proposto, semplificato al massimo, è visibile in Figura 9.
Figura 9: Circuito di condizionamento del segnale audio.
Assemblaggio
Seguendo la filosofia della prototipazione rapida imposta da Arduino, l’intero progetto può essere assemblato utilizzando una piccola breadboard su cui posizionare i componenti relativi al circuito di condizionamento del segnale audio e i cavetti jumper per collegare tra loro display, breadboard e scheda Arduino. In Figura 10 è visibile una porzione del circuito assemblato.
Figura 10: Vista parziale del circuito assemblato.
| Pin Display | Pin Arduino |
| VCC | 5V |
| GND | GND |
|
DIN |
D11 |
| CS | D10 |
| CLK | D13 |
Librerie e sketch
Per quanto riguarda il circuito di Figura 9, il segnale IN va prelevato da un jack audio. Per semplicità non sono stati distinti i due canali left e right, quindi l’ingresso va considerato come monofonico. Il segnale OUT va invece collegato all’ingresso dell’ADC0 di Arduino, ovvero il pin A0.
Figura 11: Installazione della libreria Arduino FFT.
.
Figura 12: Installazione della libreria MD_MAX72xx.Lo sketch, allegato all’articolo, è composto da una parte iniziale in cui vengono incluse le librerie utilizzate, seguita dalla definizione di alcune costanti e variabili globali. Degna di nota è la seguente definizione che comunica alla libreria il tipo hardware di display, normalmente impresso sulla serigrafia del PCB: #define TIPO_DISPLAY MD_MAX72XX::FC16_HW Se si hanno dei dubbi, è sufficiente estrarre delicatamente uno dei pannelli led (si osservi la Figura 8) e leggere il codice impresso sul PCB. Nel nostro caso il display era di tipo FC16, ma la libreria gestisce tutte le versioni attualmente disponibili in commercio, le cui costanti sono definite nel file MD_MAX72xx.h. La creazione dell’oggetto display avviene tramite la seguente istruzione: MD_MAX72XX disp = MD_MAX72XX(TIPO_DISPLAY, CS_PIN, NUM_MODULI); Dove CS_PIN (=10) indica il pin di Arduino utilizzato per pilotare il segnale CS del display, mentre NUM_MODULI (=4) indica il numero di matrici di led 8x8 che compongono il display (la libreria, come del resto lo stesso MAX7219, ne può gestire fino a 8). Si noti come i pin DIN e LOAD siano assegnati implicitamente dalla libreria. La creazione dell’oggetto FFT è molto più semplice e non richiede parametri: arduinoFFT FFT = arduinoFFT(); Nella funzione setup() si provvede ad inizializzare la porta seriale (usata esclusivamente per scopi di debug) e il display, configurando poi l’ADC0 nella modalità free running. Prima di uscire dalla funzione viene eseguito un test del display tramite la chiamata alla funzione test_display(). Il test esegue un’accensione sequenziale dei led, procedendo prima con le colonne e poi con le righe: l’utente ha così modo di verificare che tutti i led siano funzionanti. Successivamente, visualizza sul display i caratteri “E&M!” (Elettronica & Maker) per qualche secondo, dopodiché ritorna al chiamante. La funzione loop() si articola su tre distinte fasi, eseguite ripetutamente in sequenza:
- campionamento del segnale: consiste in un ciclo di acquisizione dei campioni digitali tramite l’ADC0, ripetuto sul numero totale di punti (=64) utilizzati per il calcolo della trasformata FFT. Dopo ogni conversione, l’ADC viene nuovamente armato. Si noti come al valore letto dal registro di uscita del convertitore venga sottratto il valore 512, esattamente pari alla metà del range di acquisizione (pari a 2^10=1024). Il motivo è legato alla traslazione di tensione operata dal circuito di condizionamento del segnale: in assenza di segnale in ingresso si dovrebbe sempre leggere dall’ADC il valore 512;
- calcolo della trasformata FFT: viene eseguita nel modo classico suggerito nella documentazione che accompagna la libreria. Dapprima si applica al segnale una finestra di Hamming, con lo scopo di pesare i dati. Successivamente, si procede con il calcolo della FFT: al termine dell’operazione, i vettori parte_reale e parte_immaginaria conterranno il risultato della trasformata. Infine, si procede con il calcolo delle ampiezze, il cui valore sarà disponibile nel vettore parte_reale; visualizzazione dei dati sul display: la prima metà dei dati (32 valori) calcolati al punto precedente viene opportunamente scalata e inviata al display per la visualizzazione. Le 32 colonne del display riceveranno ciascuna un dato da visualizzare, scalato in modo tale da sfruttare al meglio la “dinamica” limitata agli 8 led disponibili su ogni colonna. Tale dinamica, contenuta nell’array profilo[], può essere modificata a piacimento dall’utente.

Figura 13: Esempio dell’output prodotto sul display durante una riproduzione musicale.
Conclusioni
Abbiamo visto in questo articolo come è fatto e come possa essere utilizzato il driver per display led MAX7219/MAX7221, un componente utile ed economico per realizzare display e interfacce grafiche molto accattivanti. Per meglio comprendere ed assimilare i concetti esposti è stato presentato un progetto applicativo del display, attraverso il quale si può osservare, in tempo reale, lo spettro di frequenza relativo a un segnale audio campionato da una scheda Arduino Uno.Riferimenti
[1] https://datasheets.maximintegrated.com/en/ds/MAX7219-MAX7221.pdf

Commenti (0 commenti)