Di Stefano Lovati

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 24

Tramite 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.
 
 Tali pin, che ora esamineremo, sono evidenziati con un rettangolo blu, mentre i due rettangoli rossi evidenziano due strutture di memoria interne al driver particolarmente importanti: il registro a scorrimento a 16 bit (parte inferiore dell’immagine) e la memoria SRAM interna da 8x8 bit (parte centrale dell’immagine). Il pin DIN corrisponde all’ingresso seriale dei dati ricevuti dal microcontrollore host. I dati vengono caricati dal driver nel registro a scorrimento interno a 16 bit, sincronizzandosi sul fronte di salita del segnale di clock CLK. I bit D8-D11 (si osservi la Figura 2) contengono l’indirizzo del registro interno al driver a cui l’host vuole eseguire la scrittura, i bit D0-D7 contengono il byte dati, mentre i bit D12-D15 non sono utilizzati (“don’t care”). L’elenco completo degli indirizzi dei registri è indicato in Figura 3 ed è comunque reperibile sul datasheet del componente [1].  
Figura 3: Mappa dei registri interni del driver led.
 
Il pin CLK è associato all’ingresso del clock seriale, la cui frequenza massima è pari a 10 MHz. Sul fronte di salita del clock i dati ricevuti sono caricati nel registro a scorrimento interno, mentre sul fronte di discesa gli stessi sono propagati sul pin di uscita DOUT, necessario per il collegamento di più moduli in cascata. Nel MAX7221, l’ingresso CLK è attivo solo quando l’ingresso /CS è basso. Il pin 12 svolge una funzione differente a seconda del tipo di driver. Nel MAX7219 il pin è associato al comando LOAD (attivo sul fronte di salita), utilizzato per eseguire il latch dei dati fino a quel momento caricati nel registro a scorrimento interno a 16 bit. Nel MAX7221 lo stesso pin è associato al segnale /CS (attivo basso) utilizzato per caricare i dati nel registro a scorrimento interno. Il latch degli ultimi 16 bit ricevuti serialmente viene invece eseguito sul fronte di salita di /CS. Con il termine latch si intende il trasferimento del contenuto corrente del registro a scorrimento nella memoria SRAM interna del driver (se l’indirizzo corrisponde ad uno degli 8 segmenti) oppure nel corrispondente registro di controllo (ad esempio nel “Mode Register” se si vuole regolare la luminosità del display). Ovviamente viene trasferito solo il byte dati, corrispondente ai bit D0-D7, mentre i bit indirizzo vengono utilizzati per eseguire la decodifica svolta dal blocco “Address Register Decoder” (si osservi come tale modulo riceva in ingresso proprio il segnale LOAD /CS).

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.
 
Oltre ad avere una linea pulita ed elegante, il display è molto economico e facilmente reperibile online. I led sono annegati all’interno di un contenitore plastico quadrato, con una copertura superiore opaca di colore bianco perfettamente liscia: l’accensione dei singoli led produce un’immagine puntiforme, visibile anche in condizioni di elevata luminosità ambientale e dotata di un ampio angolo visivo. Come indicato nello schema elettrico di Figura 4, i led sono organizzati in una matrice 8x8 con configurazione a catodo comune. Il display dispone pertanto di 16 pin, organizzati in due file da 8 pin ciascuna, poste su due lati opposti del quadrato (R1-R8 corrispondono alle righe, mentre C1-C8 alle colonne della matrice). Il collegamento di un display siffatto alla scheda Arduino, anche se tecnicamente possibile, risulterebbe alquanto problematico a causa dell’elevato numero di connessioni richieste dal cablaggio e dalla necessità di inserire le opportune resistenze di limitazione della corrente. Il driver MAX7219/MAX7221 che abbiamo descritto nei paragrafi precedenti interviene in nostro aiuto, semplificando enormemente i collegamenti e richiedendo una sola resistenza di limitazione. In commercio sono dunque comparsi dei piccoli moduli che integrano, su un unico PCB di dimensioni compatte, sia il display a matrice di led 8x8 che il driver MAX7219. In Figura 5 è visibile un esempio di tale modulo, in questo caso equipaggiato con un driver led nella versione con package DIP 24. Moduli di questo tipo sono dotati di un connettore a 5 vie per i collegamenti in ingresso (inclusa l’alimentazione) ed eventualmente di un connettore identico al precedente per il collegamento in cascata. I pin del connettore di uscita sono gli stessi presenti sul connettore di ingresso, con la sola differenza che al posto del segnale DIN avremo il segnale DOUT. Come si può osservare dalla serigrafia del PCB di Figura 5, i pin sono esattamente quelli citati in precedenza (VCC corrisponde a V+ e va quindi collegato a +5V).
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.
 
Il segnale DOUT uscente del primo modulo è collegato al segnale di ingresso DIN del secondo modulo (quello in posizione centrale) e così via fino a raggiungere l’ultimo modulo. Se dal punto di vista elettrico abbiamo visto come operare il collegamento in cascata, potremmo chiederci come, a livello software, venga gestita l’accensione dei singoli led appartenenti a uno specifico modulo. Questa operazione, eseguita all’interno della libreria software utilizzata per gestire il display, è molto semplice. Ad ogni singola matrice di led viene associata un’area di memoria pari a 8x8=64 bit=8 byte e durante la fase di configurazione dell’applicazione si comunica alla libreria il numero NMOD di moduli da gestire. Quando si vuole accendere o spegnere un particolare led, si comunicano alla libreria le informazioni per indirizzare univocamente il led stesso, ad esempio: numero del modulo, numero di riga e di colonna all’interno del modulo e lo stato ON/OFF da applicare al led. La libreria provvede a tenere aggiornato in memoria lo stato di ogni led, in una struttura che avrà dimensione pari (8 x NMOD) byte. Nel caso di collegamento fino a 8 moduli, saranno necessari 64 byte di memoria RAM. Tale memoria dovrà essere aggiornata a ogni comando di accensione o spegnimento di led proveniente dall’applicativo. Per comunicare a uno specifico modulo lo stato di accensione/spegnimento dei propri led, la libreria prepara una serie di comandi che, per quello specifico modulo, avranno come indirizzo uno tra i registri (DIGIT 0 – DIGIT 7) e come campo dati lo stato desiderato dei led, mentre per gli altri moduli i comandi avranno come indirizzo il registro NO-OP (si osservi la Figura 3) e campo dati qualsiasi (“don’t care”). Come dice il nome stesso (no operation), NO-OP è un registro che comunica al modulo di non eseguire il trasferimento dati dal registro a scorrimento alla memoria RAM interna quando viene ricevuto il comando di LOAD. In pratica equivale a dire: “guarda che i dati che hai appena ricevuto non sono per te, quindi ignorali”. Possiamo chiarire il concetto con un esempio. Supponiamo per semplicità di avere solo due moduli collegati in cascata, MOD1 e MOD2: da un punto di vista logico, possiamo considerarli come due registri a scorrimento da 16 bit collegati in serie. Sappiamo che sul fronte di salita del segnale LOAD i 16 bit contenuti nel registro a scorrimento di ciascun modulo vengono decodificati e, se sono comandi di stato dei led, vanno ad aggiornare la memoria RAM interna al modulo. Se abbiamo due moduli in cascata e vogliamo aggiornare solo lo stato dei led appartenenti al primo, dovremo inviare 32 bit: i primi 16 bit contengono i dati effettivi, seguiti da un NO-OP con area dati qualsiasi. Terminato il trasferimento, verrà generato il fronte di salita sul segnale LOAD: il primo modulo caricherà e applicherà ai propri led lo stato ricevuto (contenuto nei primi 16 bit), mentre il secondo modulo ignorerà i dati ricevuti (i 16 bit successivi). In modo del tutto analogo si può modificare solo e soltanto lo stato dei led del secondo modulo inviando un NO-OP nei primi 16 bit, seguito da 16 bit effettivi che saranno interpretati dal secondo modulo.

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.

 
L’obiettivo del progetto è visualizzare su un display a matrice di 32x8 led lo spettro di potenza di un segnale audio, calcolato in tempo reale da Arduino utilizzando la trasformata veloce di Fourier (FFT). Le librerie software e il circuito di condizionamento e acquisizione del segnale audio verranno descritti nei prossimi paragrafi, mentre ora descriveremo il particolare tipo di display utilizzato. La scelta è ricaduta su un modulo a matrice di led 32x8, ottenuto collegando in cascata 4 pannelli led 8x8, ciascuno equipaggiato con un proprio driver MAX7219. Display di questo tipo (in Figura 8 è visibile un esempio)  
Figura 8: Esempio di classico display a led 32x8 di tipo commerciale.

 
sono facilmente reperibili online al costo di pochi euro. Il display, il cui funzionamento è già stato descritto nei precedenti paragrafi, è composto da 32 colonne, ognuna composta da 8 led. I primi 32 valori prodotti dalla trasformata FFT verranno associati alle 32 colonne del display per la relativa visualizzazione: si potranno così osservare le componenti di frequenza del segnale audio campionato e processato dalla scheda Arduino. L’ADC verrà programmato nella modalità free running, monitorando in polling il registro di stato per determinare il completamento della conversione. In questo modo si riducono al minimo le latenze, eseguendo le conversioni in stretta sequenza. Le prestazioni del sistema non sono elevatissime, ma del resto non si vuole realizzare un analizzatore di spettro, bensì una sorta di VU meter digitale in grado di accompagnare e intrattenere l’utente durante l’ascolto musicale.

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.
 
    Il segnale IN corrisponde alla sorgente audio, mentre il segnale OUT andrà applicato all’ingresso dell’ADC di Arduino. L’alimentazione è di +5V, prelevabile direttamente dal connettore della scheda Arduino. Le resistenze R1 e R2 formano un partitore di tensione la cui funzione è quella di traslare verso l’alto (aggiungendo un offset di tensione positivo) il segnale audio in ingresso. La resistenza R3 e il condensatore C1 formano invece un filtro passa alto con frequenza di taglio pari a fT=1/2ΠR3C1. I parametri del filtro possono essere modificati, l’importante è che fT sia tale da eliminare le componenti in continua, ovvero le basse frequenze.

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.
 
Il collegamento tra il display di 32x8 led e Arduino è riassunto nella Tabella1.  
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.

Come visibile nello schema a blocchi di Figura 7, l’applicazione richiede la presenza, nell’ambiente di sviluppo Arduino IDE, di due librerie: arduinoFFT per eseguire la trasformata di Fourier veloce e MD_MAX72xx per la gestione del display di 32x8 led. Relativamente a quest’ultima, occorre precisare come esista anche un’altra libreria per Arduino molto valida (LedControl) che permette di gestire lo stesso tipo di display. Tuttavia, la scelta è ricaduta sulla MD_MAX72xx in quanto la stessa è più adatta a gestire display composti da 4 moduli, come quello utilizzato nel progetto (Figura 8). L’installazione delle librerie avviene nel modo tradizionale: dall’ambiente Arduino IDE si seleziona la voce di menu Sketch->Include Library->Manage Libraries.., inserendo poi nell’apposita casella la chiave di ricerca (arduinoFFT o MD_MAX72xx). Nella finestra con i risultati della ricerca, si seleziona poi la libreria desiderata e si clicca sulla voce Install (si osservino le Figure 11 e 12).
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.
In Figura 13 si possono osservare le informazioni visualizzate sul display durante una riproduzione musicale reale.

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