E’ passato un po’ di tempo da quando ho pubblicato la prima versione della libreria “max7219array” per la gestione di matrici led 8×8 multiple. All’epoca terminai il post ripromettendomi di sviluppare ulteriormente la libreria e:

  • Rimuovere il limite per cui permette di aggiungere fino a 8 moduli e alloca il buffer per tutti e 8 staticamente.
  • Implementare i metodi per lo scorrimento di testo la cui dimensione ecceda le dimensioni della matrice virtuale.
  • Implementare i meccanismi di ottimizzazione del ridisegno della matrice virtuale.

Con l’aggiornamento di oggi saranno disponibili nella libreria alcuni nuovi metodi per la gestione delle funzioni relative ai primi due punti: aggiunta dinamica dei moduli e testo scorrevole. Vediamo dunque nel dettaglio le novità.

Aggiunta dinamica delle matrici

La versione precedente della libreria prevedeva un massimo di 8 moduli mappati sulla matrice virtuale. Raggiunta questa dimensione non era più possibile aggiungere module per espandere ulteriormente la matrice virtuale.

Questa limitazione è stata rimossa e ora è possibile aggiungere moduli fino a quando si hanno a disposizione pin CS e RAM.

Su un Arduino Uno sono disponibili in tutto 13 pin digitali e 5 analogici; tenendo presente che 2 pin sono necessari per il clock e per il bus dati, il massimo numero di moduli utilizzabili è 11. Per quanto riguarda la RAM sono necessari 9 byte per ogni modulo (8 per l’immagine del modulo nella matrice virtuale e 1 per memorizzare il pin da utilizzare come CS).

Rispetto alla versione precedente, il metodo che permette di “registrare” i singoli moduli specificando il pin CS ritorna un valore di tipo bool che indica se l’operazione di allocazione dinamica del modulo è andata o meno a buon fine.

bool max7219array::addModule(byte moduleCsPin)

Nel caso in cui il valore di ritorno della funzione è true, tutto è andato a buon fine. Viceversa nel caso in cui il valore ritornato è false, qualcosa non è andato a buon fine con l’allocazione della memoria.

Dal punto di vista del codice dello sketch Arduino tutto rimane retrocompatibile. Non è necessario apportare alcuna modifica agli sketch che utilizzano la libreria dopo l’aggiornamento.

Testo scorrevole

A grande richiesta ho aggiunto alla libreria le funzioni necessarie per far scorrere sulla matrice virtuale un testo le cui dimensioni eccedano la dimensione totale della matrice virtuale.

In questo modo sarà possibile far scorrere sulle matrici LED un testo di lunghezza arbitraria, non limitato quindi dalla dimensione effettiva della matrice virtuale.

I nuovi metodi da utilizzare per sfruttare questa nuova funzionalità sono: scrolltextset e scrolltextanimate. Le loro definizioni sono:

void max7219array::scrolltextset(const char string[], 
                                 unsigned long delay, 
                                 byte unload)
void max7219array::scrolltextset(const __FlashStringHelper *ifsh,
                                 unsigned long delay, 
                                 byte unload)
bool max7219array::scrolltextanimate()

Impostazione del testo

Per impostare il testo da far scorrere sulla matrice LED virtuale si utilizza il metodo scrolltextset. Questo è disponibile in due varianti che permettono di utilizzare sia un testo caricato in RAM, sia un testo caricato in flash utilizzando PROGMEM o F. In entrambi i casi il primo parametro è la stringa di testo da far scorrere.

Il secondo parametro è il tempo che la libreria dovrà attendere prima che la stringa di testo venga fatta scorrere verso sinistra in millisecondi. In pratica determina la velocità con la quale la scritta viene scrollata sulla matrice: più questo valore è grande, più la scritta scorre lentamente, più è piccolo, più la scritta scorre velocemente.

Terzo e ultimo parametro è il numero di colonne che la libreria deve scrollare al termine della scritta prima di ricominciare a caricare da capo la visualizzazione. Un valore pari a 1 significa che la scritta ricomincerà immediatamente senza lasciare spazio da quella precedente. Un valore pari a 8*numero_moduli avrà l’effetto di svuotare tutta la matrice virtuale dalla scritta prima che una nuova visualizzazione abbia inizio.

Animazione del testo

Per attivare effettivamente l’animazione del testo scorrevole è necessario richiamare ciclicamente il metodo scrolltextanimate. Solitamente questo avviene all’interno del loop dello sketch.

Il metodo scrolltextanimate verifica se è trascorso il tempo impostato come ritardo di scroll e, nel caso, effettua l’operazione di spostamento della scritta. Se il tempo previsto non è ancora trascorso la funzione ritorna false, viceversa se il tempo è trascorso e la funzione ha effettuato lo scorrimento della stringa, ritorna true.

L’operazione viene eseguita esclusivamente sulla matrice virtuale generata dalla libreria, è quindi necessario verificare il valore ritornato da scrolltextanimate per decidere se chiamare il metodo flush per poter vedere gli effetti dello scroll sulle matrici reali (Ricordiamo infatti che è possibile effettuare un numero arbitrario di operazioni sulla matrice virtuale prima di visualizzare gli effetti di tali operazioni sulle matrici reali con il comando flush).

Ecco un esempio del loop che esegue l’animazione facendo conto che la variabile array sia stata opportunamente definita nel setup():

void loop()
{
   if(array.scrolltextanimate())
     array.flush();
}

Un esempio completo

Di seguito un esempio completo dello sketch necessario per inizializzare una matrice virtuale a quattro moduli e far scorrere un testo di lunghezza maggiore rispetto a quello della matrice stessa.

Per quanto riguarda l’hardware puoi fare riferimento all’articolo relativo alla prima versione della libreria che trovi qui: Matrice led virtuale con matrici 8×8 multiple per Arduino

// Include the library and the 4px font

   #include "max7219array.h"
   #include "max7219_font_4px.h"

// Create the array instance in the global scope

   max7219array array;

void setup()
{
  // Set the clock pin to 10 - 
  // The clock pin on the Arduino will be connected to the
  // clock pin of any Max7219 controller
  
     array.setClkPin(10);
     
  // Set the data pin to 8 - 
  // The data pin on the Arduino will be connected to the
  // data pin of any Max7219 controller
 
     array.setDinPin(8);
 
  // Configure 4 LED matrix modules with their 
  // CS pin from left to right - The CS pins
  // on the Arduino will be connected to the 
  // CS pin of the proper Max7219 controller
 
     array.addModule(9);
     array.addModule(11);
     array.addModule(12);
     array.addModule(13);

  // Load the matrix buffer with a string saved in Flash Memory
  // Note the use of F() macro.

   array.scrolltextset(F("Matrice LED virtuale con matrici 8×8 multiple per Arduino"),100,16);
}

void loop()
{ 
  // Let the matrix animate the scolling text

   if(array.scrolltextanimate())
     array.flush();
}


Download della libreria

Per installare la libreria è sufficiente scaricare il file compresso linkato qui sotto e scompattarne il contenuto nella cartella delle librerie di Arduino. In alternativa se si utilizza il nuovo IDE (dalla versione 1.6.x in avanti) è possibile utilizzare la apposita funzione di caricamento semplificato delle librerie.

Per chi preferisce, la libreria è disponibile per il download o il checkout anche su github all’indirizzo:

Reference

Qui di seguito riporto tutti i metodi disponibili nella libreria, il formato dei parametri per chiamarli e il loro utilizzo.

Funzioni di animazione del testo

scrolltextset(const char string[], unsigned long delay, byte unload)
Imposta la stringa da far scorrere sulla matrice, il tempo che deve passare tra un movimento e il successivo e il numero di colonne da attendere al termine della animazione perima di ricominciare a visualizzare la stringa di testo animata.

scrolltextanimate()
Effettua l’avanzamento della stringa di testo animata sulla matrice virtuale.

Per tutte le altre funzioni si può fare riferimento all’articolo relativo alla prima versione della libreria.

Prossimi passi

Rimane ancora in sospeso la possibilità di aggiornare solo le matrici fisiche che mappano una parte della matrice virtuale effettivamente modificata. L’idea è fare in modo che se una matrice fisica mappa una parte di matrice virtuale che, al momento del flush, non è cambiata nessun dato viene inviato a quella matrice risparmiando “tempo macchina”.

Questo dovrebbe essere propedeutico allo sviluppo di una nuova funzionalità di aggiornamento automatico che, come idea di base, dovrebbe consentire di mantenere sempre allineato in modo automatico il contenuto della matrice virtuale con quello delle matrici fisiche.

L’intenzione è quella di farlo configurando un interrupt basato su timer che, una volta ogni tot millisecondi, esegua una funzione che verifica lo stato di allineamento delle matrici fisiche con la matrice virtuale e nel caso ci sia disallineamento, riallinei il tutto.



Altra possibilità che vorrei integrare in questa libreria è quella di poter disporre le matrici fisiche su più righe e quindi poter creare una matrice virtuale la cui altezza può essere maggiore della attuale di 8 righe.

Idee o richieste?


Avete qualche idea su come espandere questa libreria? Oppure vi piacerebbe che questa libreria facesse qualcosa di particolare che ancora non fa? Lasciate un commento qui sotto! Tempo e Arduino permettendo cercherò di aggiungere quello che chiederete.