Spiegazione semplice Maxim 7219 + Display 7 segmenti

Salve a tutti, come anticipato tempo fa nella presentazione non sono un esperto di elettronica ma ho una gran voglia di imparare,
attualmente mi sto cimentando in un progetto che mi permetta di capire e controllare il funzionamento di tre display 7 segmenti a catodo comune tramite l'integrato max7219. Vorrei capire come l'arduino comunica con l'integrato così da poter poi provare a fare qualche semplice sketch per conto mio

Ho cercato di informarmi su vari siti e controllando datasheet e progetti di altri, ma mi sono reso conto che spesso si danno molte cose per scontate, mentre per me, essendo totalmente autodidatta in materia, non lo sono affatto ( e spesso, pur provando a ricostruire i stessi circuiti e gli stessi sketch, ho problemi nella compilazione che non so come risolvere).

Capisco che possa sembrare una scocciatura, ma avrei proprio bisogno di una spiegazione su come programmare l'arduino
Grazie e scusate ancora

Ti consiglio di studiarti a fondo questo:
http://playground.arduino.cc/Main/MAX72XXHardware

Ti ringrazio della risposta, in effetti mi sto rendendo conto del fatto che questo progetto mi costringe a fare un "salto" rispetto ai miei soliti progetti che non utilizzano linee di clock, dati, ecc... che molto in astratto ho comunque idea di come funzionino

Più che altro vorrei capire il funzionamento di queste trasmissioni e il modo di utilizzarle con arduino, ma cercherò di fare un passo alla volta

Forse mi pongo in maniera sbagliata o forse mi mancano le basi, ma trovo un bel pò di difficoltà, magari domani posto uno schema dei collegamenti e degli errori che ho trovato durante la compilazione di uno sketch trovato in rete

Controllare il MAX7219 non è difficile ma usare una libreria semplifica le cose.
http://playground.arduino.cc//Main/LedControl

Riducendo all'osso, servono 3 pin per comandare il MAX7219: Din, Clock e Load
Su Din viaggiano i dati in formato seriale, ossia 1 bit alla volta (segnale HIGH per 1 logico, segnale LOW per 0 logico); su Clock il segnale di sincronizzazione affinché il MAX7219 sappia che un nuovo dato è fornito sulla linea Din. E poi Load, che dice al MAX7219 di caricare i dati letti sui pin esterni.

Qui trovi un codice che fa tutto da sé, senza librerie:
http://playground.arduino.cc/LEDMatrix/Max7219

grazie, l'ultimo codice mi sembra ben commentato, dopo me lo spulcio per bene. Grazie anche per la spiegazione dei pin load, clock e din!

P.S. purtroppo ancora nessun risultato, dopo proverò a cambiare collegamenti

Aledexter:
grazie, l'ultimo codice mi sembra ben commentato, dopo me lo spulcio per bene. Grazie anche per la spiegazione dei pin load, clock e din!

P.S. purtroppo ancora nessun risultato, dopo proverò a cambiare collegamenti

Ricontrolla.
Se hai problemi, pubblica lo schema che stai usando e lo sketch.

tra i tanti codici che ho provato questo sembra il più vicino al mio livello, però ho dei problemi con la libreria

// include the library for MAX72XX
#include "LedControl.h"

LedControl lc=LedControl(12,11,10,1);
unsigned long delaytime=200;//  v*75
void setup() {
  /*
   The MAX72XX is in power-saving mode on startup,
   we have to do a wakeup call
   */
  lc.shutdown(0,false);
  /* Set the brightness to a medium values */
  lc.setIntensity(0,8);
  /* and clear the display */
  lc.clearDisplay(0);
}
void loop()
{ 
  // start with up direction "UP"
  lc.setRow(0,1,B0111110); // "U"
  lc.setChar(0,0,'p',false);
  delay(1700);
  for (int v = 0; v < 100; v++){
    printNumber(v); // call printNumber function
    delay (delaytime);
  }
  // have a break and count down "dn"
  delay(1700);
  lc.setRow(0,1,B0111101);
  lc.setRow(0,0,B0010101);
  delay(2000);
  for (int v = 99; v > -1 ;  v = v--){
    printNumber(v); // call function
    delay (delaytime);
  }
}

// function to send digits to 7 seg led

void printNumber(int v)
{
  int ones;
  int tens;
  boolean zero;   
  if(v < 0 || v > 99)
    return;
  ones=v%10;
  v=v/10;
  tens=v%10;
  v=v/10;
  lc.setDigit(0,1,(byte)tens,false);
  lc.setDigit(0,0,(byte)ones,false);
}

l'ho trovato sempre qui sul forum, però al momento della compilazione mi dà questi errori:

sketch_dec18g.ino:2:24: error: LedControl.h: No such file or directory
sketch_dec18g:4: error: 'LedControl' does not name a type
sketch_dec18g.ino: In function 'void setup()':
sketch_dec18g:11: error: 'lc' was not declared in this scope
sketch_dec18g.ino: In function 'void loop()':
sketch_dec18g:20: error: 'lc' was not declared in this scope
sketch_dec18g.ino: In function 'void printNumber(int)':
sketch_dec18g:51: error: 'lc' was not declared in this scope

devo aver fatto qualche errore con la libreria, mi sembra di capire che non la riconosce

E dove l'hai installata la libreria?
L'hai copiata dentro /sketchbook/libraries?

si, non ho la cartella sketchbook, ma ho la cartella libraries in cui sono presenti tutte le librerie di default. Lì ho messo la cartella ledcontrol in cui sono presenti tra gli altri i file .h e .cpp

P.S. ho risolto il problema libreria ri-scaricandola e scompattandola con "estrai qui" dopo aver inserito l'archivio rar nella cartella libraries, per chi avesse lo stesso problema su windows

Normalmente è bene non mettere le librerie scaricate dentro a /arduino-1.0.x/libraries perché se cambi versione dell'IDE o la disinstalli, perdi tutto :wink:

Ecco perché ti ho suggerito di metterla nella cartella /libraries contenuta nella tua cartella degli sketch (apri File/Preferenze per vedere qual'è, cambia da SO a SO). Se non ce l'hai, creala.

Una volta creata, salva la lib lì dentro. Il percorso dei file .h/.cpp deve a questo punto essere questo:
/cartella_degli_sketc/libraries/nome_libreria/file .cpp/.h

Se hai qualcosa in più nel mezzo fra nome_libreria e file .cpp/.h la libreria non viene riconosciuta. Se il nome dei file .h e .cpp principali non coincide con il nome della cartella, la libreria non viene riconosciuta

Acc... si vede che sono agli inizi, non sapevo si creasse una cartella di Arduino nei Documenti, ad essere sincero pensavo che funzionasse tutto attraverso la cartella che ho sul desktop che contiene l' IDE così come scaricato dalla homepage :cold_sweat:

Aledexter:
Acc... si vede che sono agli inizi, non sapevo si creasse una cartella di Arduino nei Documenti, ad essere sincero pensavo che funzionasse tutto attraverso la cartella che ho sul desktop che contiene l' IDE così come scaricato dalla homepage :cold_sweat:

Ed i tuoi progetti dove stavano? :stuck_out_tongue:

si venivano salvati lì, però li ho sempre caricati direttamente dall'ide, quindi non mi ero posto il problema, anche perchè usando questo pc che è di mio padre cerco di tenere i miei file su un lato del desktop per non mischiarli neanche visivamente con i suoi

comunque ho fatto un piccolo passo in avanti, per un istante, quando faccio partire il programma, il punto del display centrale si accende, proverò a cambiare i collegamenti dei digit (i gnd dei display giusto?) del max

Aggiornamento:
Sono riuscito ad accenderli! Ho usato questo codice

//We always have to include the library
#include "LedControl.h"

/*
 Now we need a LedControl to work with.
 ***** These pin numbers will probably not work with your hardware *****
 pin 12 is connected to the DataIn 
 pin 11 is connected to the CLK 
 pin 10 is connected to LOAD 
 We have only a single MAX72XX.
 */
LedControl lc=LedControl(12,11,10,1);

/* we always wait a bit between updates of the display */
unsigned long delaytime=250;

void setup() {
  /*
   The MAX72XX is in power-saving mode on startup,
   we have to do a wakeup call
   */
  lc.shutdown(0,false);
  /* Set the brightness to a medium values */
  lc.setIntensity(0,8);
  /* and clear the display */
  lc.clearDisplay(0);
}


/*
 This method will display the characters for the
 word "Arduino" one after the other on digit 0. 
 */
void writeArduinoOn7Segment() {     
  lc.setChar(0,0,'a',false);
  delay(delaytime);
  lc.setRow(0,0,0x05);
  delay(delaytime);
  lc.setChar(0,0,'d',false);
  delay(delaytime);
  lc.setRow(0,0,0x1c);
  delay(delaytime);
  lc.setRow(0,0,B00010000);
  delay(delaytime);
  lc.setRow(0,0,0x15);
  delay(delaytime);
  lc.setRow(0,0,0x1D);
  delay(delaytime);
  lc.clearDisplay(0);
  delay(delaytime);
} 

/*
  This method will scroll all the hexa-decimal
 numbers and letters on the display. You will need at least
 four 7-Segment digits. otherwise it won't really look that good.
 */
void scrollDigits() {
  for(int i=0;i<13;i++) {
    lc.setDigit(0,3,i,false);
    lc.setDigit(0,2,i+1,false);
    lc.setDigit(0,1,i+2,false);
    lc.setDigit(0,0,i+3,false);
    delay(delaytime);
  }
  lc.clearDisplay(0);
  delay(delaytime);
}

void loop() { 
  writeArduinoOn7Segment();
  scrollDigits();
}

anche se ho notato che ruotando il resistore lineare che ho collegato al gnd del maxim si modifica la velocità e un attimo dopo si interrompe la "riproduzione" e devo resettare l'arduino per farlo riprendere. Per ora si accendono i display ma vengono visualizzati simboli senza senso che cambiano a velocità elevata

credo che, oltre a dedicare del tempo allo sketch, il problema risieda nei digit che ora come ora sono collegati senza tenere conto dell'ordine
p.s. sto cominciando a sospettare di avere dei contatti allentati nella breadboard

Aggiornamento2:
ho tolto tutti i contatti di due display e mi sono dedicato ad uno solo, ho sostituito il resistore lineare con uno fisso, ho modificato i collegamenti sui pin segmento ed ora tutti i simboli sono comprensibili e corretti. sto usando una versione " mutilata" del precedente codice per fare delle semplici prove, ma non capisco perchè la cifra lampeggi nonostante abbia modificato i delay

//We always have to include the library
#include "LedControl.h"

/*
 Now we need a LedControl to work with.
 ***** These pin numbers will probably not work with your hardware *****
 pin 12 is connected to the DataIn 
 pin 11 is connected to the CLK 
 pin 10 is connected to LOAD 
 We have only a single MAX72XX.
 */
LedControl lc=LedControl(12,11,10,1);

/* we always wait a bit between updates of the display */
unsigned long delaytime=1000;

void setup() {
  /*
   The MAX72XX is in power-saving mode on startup,
   we have to do a wakeup call
   */
  lc.shutdown(0,false);
  /* Set the brightness to a medium values */
  lc.setIntensity(0,8);
  /* and clear the display */
  lc.clearDisplay(0);
}


/*
 This method will display the characters for the
 word "Arduino" one after the other on digit 0. 
 */
void writeArduinoOn7Segment() {     
  lc.setChar(0,0,'4',false);
  delay(delaytime);
  
  lc.clearDisplay(0);
  ;
} 


void loop() { 
  writeArduinoOn7Segment();
  
}

x iscrizione

vorrei fare qualcosa con il max ed una matrice 64 led, magari posso contribuire ma non so quando, la cina e' lontana :slight_smile:

Aledexter:
non capisco perchè la cifra lampeggi nonostante abbia modificato i delay

Che intendi per lampeggiare? Con che frequenza?

difficile dirlo a occhio, ma direi che si accende e spegne sulle 4 volte al secondo più o meno, ho fatto delle prove modificando i valori delle resistenze e del condensatore elettrolitico, ma la volta migliore ho avuto le cifre fisse solo per un ciclo, dopo hanno ricominciato a lampeggiare. Pensando fosse merito del condensatore ho provato a scaricarlo, ma non è più accaduto

p.s. il circuito che seguo è questo Arduino Playground - HomePage

Credo dipenda da questo:

  delay(delaytime);
  
  lc.clearDisplay(0);

Fai attendere un certo tempo e poi cancelli il display (=spengi tutti i led).