[RISOLTO] 8x8 Matrix pilotato da un MAX 7219

Salve a tutti,
sto usando la libreria:

https://www.pjrc.com/teensy/td_libs_Matrix.html

per controllare un display 8x8, ma c'è un problema:
Prendendo come riferimento l'esempio:

ed accendendo i singoli led con il comando:

myMatrix.write (X, Y, HIGH);

Se accendo i LED della "riga 7" si accendono i LED della "riga 0" mentre se accendendo i LED della "riga 0" si accendono i LED della "riga 7", quasi come se la matrice sul display fosse shiftata di un +1.

Ho usato questo semplice codice (preso dagli esempi della libreria):

#include <Sprite.h>
#include <Matrix.h>

Matrix myMatrix = Matrix(8, 10, 9);

void setup ()
{
  myMatrix.clear();
  myMatrix.write (0,0, HIGH); //1
  delay (1000);
  myMatrix.write (0,7, HIGH ); //2
  delay (1000);
  myMatrix.write (7,0, HIGH ); //3
  delay (1000);
  myMatrix.write (7,7, HIGH) ; //4
  delay (1000);
}

void loop()
{
}

Questo codice "dovrebbe" accendere i led nei quattro angoli:

Invece mi accende i due LED degli angoli in alto, e poi quelli immediatamente sotto:

Per far accendere i LED dei quattro angoli devo usare il codice:

  myMatrix.clear();
  myMatrix.write (0,0, HIGH); //1
  delay (1000);
  myMatrix.write (0,7, HIGH ); //2
  delay (1000);
  myMatrix.write (1,0, HIGH ); //3
  delay (1000);
  myMatrix.write (1,7, HIGH) ; //4
  delay (1000);

Analizzando il codice dell'esempio "sprite_animation":

ho notato che per far scorrere lo sprite sul display, viene usato un doppio sprite:

myMatrix.write (0,0, wave) // place sprite on screen
myMatrix.write (x-8,2, wave) // place sprite again, elsewhere on screen

Effettivamente lo sprite "myMatrix.write(x - 8, 2, wave);" viene translato di 8 posizioni per accendere correttamente tutta la matrice, ma come mai? E' lo stesso problema rilevato in questo post:

http://wiring.org.co/cgi-bin/yabb/YaBB.pl?num=1126118886/26#26

Come mai? come si può risolvere questo problema nella matrice?
Usando una libreria diversa, ad esempio la LedControl:

http://playground.arduino.cc//Main/LedControl

La matrice si comporta correttamente. Ma per me che sono alle prime armi è più semplice (o almeno ho trovato molto più semplice) utilizzare matrix.h e sprite.h e non la LedControl.

Questo un video per spiegare meglio l' "anomalia":

Grazie a tutti
Luc@

per il problema seconda e ottava righa: Sono invertiti i pin.
per il resto non so.
Ciao Uwe

quali pin sono invertiti? usando altre librerie (ad esempio la LedControl) funziona tutto correttamente, ma con le altre non riesco a fare una shape che scorre!

Escludi un problema hardware? Nel senso, sei sicuro che la matrice abbia i collegamenti fatti come si deve?
E se piloti tu i led con uno sketch base che accenda i led uno ad uno, hai lo stesso comportamento di led invertiti oppure no? Perché allora sarebbe la lib e magari dovresti provare a contattare il suo autore.

esatto, escludo un problema hardware in quanto usando altre librerie funziona tutto correttamente. Usando invece quella libreria, anche accendendo i LED singolarmente, ho quel comportamento anomalo! quindi mi sa che è un problema alla libreria. E' anomalo anche l'esempio allegato che per far scorrere uno shape usa 2 chiamate della stessa funzione ma sfalsate di 7 posizioni:

myMatrix.write (0,0, wave) // place sprite on screen
myMatrix.write (x-8,2, wave) // place sprite again, elsewhere on screen

Ho provato a contattare lo sviluppatore, vediamo se mi risponde e se sa aiutarmi.

Luc@

Ho guardato l'esempio che citavi perché con quelle 2 righe di codice non si capiva nulla.
Ma leggendo tutto il codice ho capito.
Quelle righe non sono un errore, simulano l'effetto di scorrimento :wink: :wink:

Il programma crea uno sprite composto da 4 righe da 8 bit l'una.
Poi "posiziona" 2 volte lo sprite sul display, la prima volta alla posizione x e la seconda alla posizione x-8.
Siccome lo sprite è largo 8 bit, la seconda posizione è del tutto fuori della matrice 8x8
Facendo scorrere il primo sprite, però, a SX rimarrebbe un vuoto, ed ecco che il 2° sprite entra pian piano da SX DX andando ad occupare i pixel lasciati vuoti :wink: :wink:

Se non hai programmato i computer ad 8 bit anni '80 quanto ti ho detto potrà risultarti un pò difficile da capire, ma se prendi carta e penna e metti il 1° sprite dal 4 pixel in poi ed il 2° sprite dal pixel -4 in poi vedrai benissimo cosa intendevo :wink:

Ecco cosa intendevo :wink:

.......o|o......o|o.......
......o.|.o....o.|.o......
.....o..|..o..o..|..o.....
....o...|...oo...|...o....

Ho alcune perplessità in merito, non tanto per la spiegazione che mi hai dato che è chiara e concordo in pieno, ma per l'applicazione pratica della libreria. Infatti credo a questo punto di non essermi riuscito a spiegare, ci riprovo con esempi pratici. Inizio con l'illuminazione statica e poi passiamo a quella scorrevole:

Volendo illuminare staticamente i 4 angoli del display come faresti?

Guardando lo schema del matrix allegato alla libreria e sapendo che la matrice è:

0 1 2 3 4 5 6 7
0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0
2 0 0 0 0 0 0 0 0
3 0 0 0 0 0 0 0 0
4 0 0 0 0 0 0 0 0
5 0 0 0 0 0 0 0 0
6 0 0 0 0 0 0 0 0
7 0 0 0 0 0 0 0 0

Per accendere i singoli LED si usa la funzione:

myMatrix.write (X,Y, HIGH);

Io farei (e penso sia giusto):

myMatrix.write (0,0, HIGH);
myMatrix.write (0,7, HIGH);
myMatrix.write (7,0, HIGH);
myMatrix.write (7,7, HIGH);

Tu?

Allo stesso modo, ammettendo di voler illuminare la cornice esterna della matrice usando uno sprite non in movimento:

0 1 2 3 4 5 6 7
0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0
2 0 0 0 0 0 0 0 0
3 0 0 0 0 0 0 0 0
4 0 0 0 0 0 0 0 0
5 0 0 0 0 0 0 0 0
6 0 0 0 0 0 0 0 0
7 0 0 0 0 0 0 0 0

Creo lo sprite:

Sprite out = Sprite(8, 8, B11111111, B10000001, B10000001, B10000001, B10000001, B10000001, B10000001, B11111111);

Sei d'accordo con me?

Non conoscendo la lib (non ho visto il codice) e non sapendo come lavorano i suoi metodi, di primo acchito sarei d'accordo con te.

Ma la riprova potresti averla facendo un semplice codicino che ti accenda singolarmente i led della cornice.

void cornice() {
  for (byte x=0; x<8; x++) {
    myMatrix.write (x,0, HIGH);
    myMatrix.write (x,7, HIGH);
  }
  for (byte y=0; y<8; y++) {
    myMatrix.write (0,y, HIGH);
    myMatrix.write (7,y, HIGH);
  }
}

Senza usare gli sprite. Così facendo dovresti accendere i 28 led della cornice esterna

Eccomi! stasera ho potuto fare vari test con due librerie diverse! Ho usato la MaxMatrix che funziona bene, e l'altra che presenta l'anomalia. Diversamente da quanto avevo premesso, il problema è diverso, cioè:

Analizzando meglio il comportamento ho riscontrato che la matrice di indirizzamenti sul mio display, sembra slittata di un +1 rispetto al normale indirizzamento delle X. Mi spiego meglio:

In genere l'asse X si intende da 0 a 7 e quindi: 0,1,2,3,4,5,6,7
Mentre quello gestito dalla libreria è indirizzato: 7,1,2,3,4,5,6,0

Cioè, tutto slittato di una posizione. Ho fatto un video in modo da chiarire la cosa eseguendo il medesimo programma con le 2 librerie (quella "anomala" e una che si comporta come ci si aspetta, la MaxMatrix). Innanzitutto faccio accende tutti i led uno ad uno da sinistra verso destra e dal basso verso l'alto. Successivamente mi accende la cornice esterna del display con uno sprite, ed infine, usando il codice che mi ha suggerito leo72, accende led dopo led tutta la cornice. Il "difetto" a questo punto è chiarissimo:

Ragazzi forse ho risolto seguendo delle linee guida di un utente nel forum internazionele. Mi ha indicato una parte di codice nel Matrix.cpp che si occupava di shiftare l'asse X:

 if (x == 0){
    x = 8;
  }
  --x;

Giusto per fare un test l'ho semplicemente commentato e adesso il display si illumina correttamente. Credo basti semplicemente fare questo, chiedo conferma e metto il tag risolto a questo POST dopo il suo OK! :wink:

Forse sono off topic. Ti consiglio di dare uno sguardo a questo: http://www.instructables.com/id/16x8-LED-dot-matrix-with-MAX7219-module/

grazie mille, era una libreria che già avevo provato ma scartato per mancanza di alcune funzionalità! :wink:

Ho avuto conferma anche dall'altro utente nel forum internazionale. Era quella la parte di codice da eliminare. In pratica va ripristinata qualora si usi un "NEXUS_MATRIX". Non ho idea di cosa sia, ma penso un 8x8 di qualche marca specifica. Al momento il codice può essere rimosso se avete lo stesso problema mio. Come consigliato stesso da lui, più corretto skipparlo in fase di compilazione con l'#if

#if 0
 if (x == 0){
    x = 8;
  }
  --x;
#endif

Luc@

Hecho grazie a questa discussione ho trovato la possibilità di utilizzare una nuova libreria per il mio progetto. :slight_smile: Ho effettuato le modifiche e tutto sembra funzionare come dici.
L'idea è quella di implementare un DHT-22 (termometro e unidità) su 4 matrici MAX7219. Il tutto con valori scorrevoli di umidità e temperatura sulle 4 matrici led.

Ho cercato di farlo utilizzando questa libreria e questo progetto: http://www.instructables.com/id/16x8-LED-dot-matrix-with-MAX7219-module/
Ma ho un problema: Come faccio ad utilizzare i valori provenienti dal DHT-22 che sono int sui valori che accetta la libreria citata e cioè char?

Chiedo scusa ai moderatori forse sono off topic... :~

masteruan:
Hecho grazie a questa discussione ho trovato la possibilità di utilizzare una nuova libreria per il mio progetto. :slight_smile: Ho effettuato le modifiche e tutto sembra funzionare come dici.
L'idea è quella di implementare un DHT-22 (termometro e unidità) su 4 matrici MAX7219. Il tutto con valori scorrevoli di umidità e temperatura sulle 4 matrici led.

Ho cercato di farlo utilizzando questa libreria e questo progetto: http://www.instructables.com/id/16x8-LED-dot-matrix-with-MAX7219-module/
Ma ho un problema: Come faccio ad utilizzare i valori provenienti dal DHT-22 che sono int sui valori che accetta la libreria citata e cioè char?

Chiedo scusa ai moderatori forse sono off topic... :~

converti l'int in char:

http://playground.arduino.cc/Code/PrintingNumbers#.UwcQO4WdI6w

non l'ho mai usato ma dovrebbe fare proprio al caso tuo. Fammi sapere se risolvi :wink:

Luc@

:slight_smile:
Grazie sono riuscito a convertire l'int in char... Funzionaaa !!

Tutto RISOLTO quindi. :wink:

Salve, sono nuovo del forum e anche di arduino quindi chiedo scusa se scrivo o chiedo cose nel posto sbagliato.
Per farla breve sto cercando di creare un tabellone segna punti partendo da questo progetto http://scuola.arduino.cc/lesson/l81bRbQ/Tabellone_Segnapunti e cambiando solo la matrice led con una MAX 7219. Mi piacerebbe inoltre aggiungere due pulsanti per incrementare o decrementare il conteggio in modo manuale.
Ovviamente ogni suggerimento è gradito e immensamente ringraziato!
Grazie,
saluti a tutti,
Gerry1.