Differenze tra le versioni di "Display a 7 segmenti"

Da Fablab Imperia Wiki.
(Creata pagina con "Ciao!<br> Quando in un nostro progetto abbiamo bisogno di visualizzare dei valori alfanumerici, al posto di utlizzare un grosso display LCD possiamo ricorrere ai semplici e se...")
 
m
 
(4 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
Ciao!<br>
+
{{#eimage:http://i.imgur.com/pvhoGPgl.jpg|alt="!!TITLE!!"|320x280px|thumb|link=http://i.imgur.com/pvhoGPg.jpg|inline|Test di display a 7 segmenti)}}
 +
__TOC__
 
Quando in un nostro progetto abbiamo bisogno di visualizzare dei valori alfanumerici, al posto di utlizzare un grosso display LCD possiamo ricorrere ai semplici e sempre giovani display a 7 segmenti.<br>
 
Quando in un nostro progetto abbiamo bisogno di visualizzare dei valori alfanumerici, al posto di utlizzare un grosso display LCD possiamo ricorrere ai semplici e sempre giovani display a 7 segmenti.<br>
<div style="text-align: left;">
+
Tramite l'accensione di una combinazione di LED, disposti e ordinati in un unico display secondo lo standard indicato in figura, è possibile mostrare cifre numeriche e anche alcune lettere, oltre al punto decimale.
Tramite l'accensione di una combinazione di LED, disposti e ordinati in un unico display secondo lo standard indicato in figura, è possibile mostrare cifre numeriche e anche alcune lettere, oltre al punto decimale.
+
Esistono sul mercato display con colori e dimensioni molto diverse, singoli o appaiati, a catodo comune o ad anodo comune. A seconda dell'uso che se ne vuole fare, è opportuno scegliere quelli più adatti al proprio progetto.
</div><br>
+
<br clear="all">
<br>
+
{| style="margin-left: auto; margin-right: auto;"
<div style="text-align: center;">
+
|-
http://i.imgur.com/LqowBFC.png https://upload.wikimedia.org/wikipedia/commons/2/2b/Seven_segment_display-animated.gif
+
| {{#eimage:http://upload.wikimedia.org/wikipedia/commons/2/2b/Seven_segment_display-animated.gif|alt="!!TITLE!!"|150x178px|frame|left|Esempio dei caratteri che si possono mostrare (wikimedia.org)}}
(CC - BY SA v3) wikimedia.org
+
||
 
+
{{#eimage:http://i.imgur.com/LqowBFC.png|alt="!!TITLE!!"|170x178px|frame|left|Schema della denominazione dei segmenti}}
 
+
|}
Esistono sul mercato display con colori e dimensioni molto diverse, singoli o appaiati, a catodo comune o ad anodo comune. A seconda dell'uso che se ne vuole fare, è opportuno scegliere quelli più adatti al proprio progetto.<br>
+
== Descrizione ==
<br>
 
 
La relativa semplicità di funzionamento di questi display può consentirci di utilizzarli anche i progetti dove non sono presenti microcontrollori programmabili. D'altro canto, però, per gestire ogni singola cifra alfanumerica vanno pilotati ben 7 LED (+1 per il punto decimale) e questo può creare dei problemi, perchè con le usuali schede di prototipazione in uso nei Fablab (tipo Arduino o Raspberry) si farebbe molto presto a esaurire i pin disponibili per la loro accensione.<br>
 
La relativa semplicità di funzionamento di questi display può consentirci di utilizzarli anche i progetti dove non sono presenti microcontrollori programmabili. D'altro canto, però, per gestire ogni singola cifra alfanumerica vanno pilotati ben 7 LED (+1 per il punto decimale) e questo può creare dei problemi, perchè con le usuali schede di prototipazione in uso nei Fablab (tipo Arduino o Raspberry) si farebbe molto presto a esaurire i pin disponibili per la loro accensione.<br>
<br>
 
 
Per fortuna, esistono "microchip" appositamente creati per risolvere questo problema, che utilizzano la tecnica cosiddetta del [https://it.wikipedia.org/wiki/Multiplazione multiplexing]", e&nbsp;&nbsp;abbinati a un microcontrollore esterno (ad esempio un Arduino), invece di accendere simultaneamente tutti i led necessari per visualizzare le cifre sui display, attivano solo 1 LED per volta, ma a una velocità talmente rapida da ingannare l'occhio umano e dare la percezione di una accensione simultanea (sfruttando in pratica lo stesso principio dei fotogrammi nel cinema).<br>
 
Per fortuna, esistono "microchip" appositamente creati per risolvere questo problema, che utilizzano la tecnica cosiddetta del [https://it.wikipedia.org/wiki/Multiplazione multiplexing]", e&nbsp;&nbsp;abbinati a un microcontrollore esterno (ad esempio un Arduino), invece di accendere simultaneamente tutti i led necessari per visualizzare le cifre sui display, attivano solo 1 LED per volta, ma a una velocità talmente rapida da ingannare l'occhio umano e dare la percezione di una accensione simultanea (sfruttando in pratica lo stesso principio dei fotogrammi nel cinema).<br>
<br>
+
 
 +
<br clear="all">
 +
{{#eimage:http://i.imgur.com/OM6qTuxm.jpg|alt="!!TITLE!!"|250x250px|thumb|link=http://i.imgur.com/OM6qTuxm.jpg|Max72**}}
 
Usando questo stratagemma, un&nbsp;integrato della serie&nbsp; [http://playground.arduino.cc/Main/MAX72XXHardware MAX7219/7221] (o equivalente)&nbsp;può controllare 8 cifre a display (quindi ben 64 LED) occupando solo 3 pin digitali. Se questo vi sembrasse ancora poco, è possibile collegare in cascata fino a 8 di questi MAX7219 / MAX7221, con il risultato di riuscire a governare ben 64 cifre a display (512 LED!) sfruttanto sempre i soli 3 pin. &nbsp;Naturalmente, se governare un numero di led così elevato è tecnicamente possibile, aumentando considerevolmente il numero di display da gestire con soli 3 pin, il periodo di refresh dei display potrebbe apparire visibile. In genere quindi la regola è che meno display numerici vengono gestiti, migliore è il risultato.<br>
 
Usando questo stratagemma, un&nbsp;integrato della serie&nbsp; [http://playground.arduino.cc/Main/MAX72XXHardware MAX7219/7221] (o equivalente)&nbsp;può controllare 8 cifre a display (quindi ben 64 LED) occupando solo 3 pin digitali. Se questo vi sembrasse ancora poco, è possibile collegare in cascata fino a 8 di questi MAX7219 / MAX7221, con il risultato di riuscire a governare ben 64 cifre a display (512 LED!) sfruttanto sempre i soli 3 pin. &nbsp;Naturalmente, se governare un numero di led così elevato è tecnicamente possibile, aumentando considerevolmente il numero di display da gestire con soli 3 pin, il periodo di refresh dei display potrebbe apparire visibile. In genere quindi la regola è che meno display numerici vengono gestiti, migliore è il risultato.<br>
 
<br>
 
<br>
<div style="text-align: center;">
 
http://i.imgur.com/OM6qTuxm.jpg
 
  
=== Collegamenti ===
+
<br clear="all">
 +
== Collegamenti ==
 
Abbiamo 3 dispositivi in gioco:<br>
 
Abbiamo 3 dispositivi in gioco:<br>
1) La nostra schedina di prototipzione (Arduino o simile)<br>
+
1) La nostra schedina di prototipazione (Arduino o simile)<br>
 
2) L'integrato MAX7219 o MAX7221<br>
 
2) L'integrato MAX7219 o MAX7221<br>
 
3) Il display o un array di display a 7 segmenti<br>
 
3) Il display o un array di display a 7 segmenti<br>
 
<br>
 
<br>
 
I collegamenti tra Arduino (o simile) e MAX 7219 dovranno essere:<br>
 
I collegamenti tra Arduino (o simile) e MAX 7219 dovranno essere:<br>
<div style="text-align: center;">
+
{{#eimage:http://i.imgur.com/V8fSRya.jpg|alt="!!TITLE!!"|link=http://tronixstuff.com/2013/10/11/tutorial-arduino-max7219-led-display-driver-ic|480x320px|center|frame|[http://tronixstuff.com/2013/10/11/tutorial-arduino-max7219-led-display-driver-ic source tronixstuff.com - (CC - BY NC SA v4])}}
http://i.imgur.com/V8fSRya.jpg
 
</div>
 
<div style="text-align: center;">
 
(CC - BY NC SA v4) [[ http://tronixstuff.com/2013/10/11/tutorial-arduino-max7219-led-display-driver-ic/|tronixstuff.com]]
 
</div><br>
 
<br>
 
 
mentre i collegamenti tra&nbsp;un MAX72xx&nbsp;e display sono i seguenti:<br>
 
mentre i collegamenti tra&nbsp;un MAX72xx&nbsp;e display sono i seguenti:<br>
 
<br>
 
<br>
<div style="text-align: center;">
+
{{#eimage:http://i.imgur.com/xSMqceC.jpg|alt="!!TITLE!!"|link="http://playground.arduino.cc/Main/MAX72XXHardware"|480x320px|center|frame|[http://playground.arduino.cc/Main/MAX72XXHardware source Arduino Playground]}}
<a class="external image-view arduinocc" href="http://playground.arduino.cc/uploads/Main/Seg7Matrix.jpg"><img alt="[Immagine: Seg7Matrix.jpg]" border="0" class="lazy" data-original="http://playground.arduino.cc/uploads/Main/Seg7Matrix.jpg" src="http://fablabimperia.org/forum/images/trans/1x1.png"></a>
+
 
</div>
 
<div style="text-align: center;">
 
<span style="font-size: x-small;">&nbsp;(<a class="external arduinocc" href="http://playground.arduino.cc/Main/MAX72XXHardware" rel="nofollow" target="_blank">source&nbsp;Arduino Playground</a>)</span>
 
</div><br>
 
 
Come potete vedere,&nbsp;nonostante i miracoli offerti dalla modalità del multiplexing, specialmente se abbiamo diversi display numerici separati, il numero di connessioni da effettuare per collegare&nbsp;all'integrato&nbsp;ogni singolo display &nbsp;è notevole.&nbsp;Se poi avete scelto di utilizzare dei display di dimensioni ridotte, vi ritroverete a dover effettuare un gran numero di saldature molto ravvicinate.&nbsp;<br>
 
Come potete vedere,&nbsp;nonostante i miracoli offerti dalla modalità del multiplexing, specialmente se abbiamo diversi display numerici separati, il numero di connessioni da effettuare per collegare&nbsp;all'integrato&nbsp;ogni singolo display &nbsp;è notevole.&nbsp;Se poi avete scelto di utilizzare dei display di dimensioni ridotte, vi ritroverete a dover effettuare un gran numero di saldature molto ravvicinate.&nbsp;<br>
 
Anche qua, per fortuna esistono in commercio delle soluzioni già pronte con diversi display numerici già appaiati al cui interno le connessioni sono già state predisposte e che consentono di collegare facilmente i display. Alcune schedine, includono addirittura l'integrato MAX7219 (o equivalente), che permettono quindi di collegare il tutto molto facilmente alla nostra schedina di prototipazione.<br>
 
Anche qua, per fortuna esistono in commercio delle soluzioni già pronte con diversi display numerici già appaiati al cui interno le connessioni sono già state predisposte e che consentono di collegare facilmente i display. Alcune schedine, includono addirittura l'integrato MAX7219 (o equivalente), che permettono quindi di collegare il tutto molto facilmente alla nostra schedina di prototipazione.<br>
 
<br>
 
<br>
<div style="text-align: justify;">
+
Se scegliete di utilizzare un integrato MAX7219 "nudo", dovrete leggere con attenzione il datasheet con le specifiche tecniche per stabilire il valore della resistenza da interporre tra i 5V e il pin 18 e non dovrete dimenticarvi di utilizzare i condensatori a "protezione" del circuito. In questo caso, inoltre, vi consigliamo di ricorrere ad apposite schedine di "breakout" (anche autocostruibili) pensate appositamente per rendere più agevoli i collegamenti tra l'integrato, il vostro Arduino (o simile) e i display. Ad esempio, noi abbiamo fresato alcune schedine di breakout trovate sul sito fritzing.com, che potete vedere in figura.
Se scegliete di utilizzare un integrato MAX7219 "nudo", dovrete leggere con attenzione il datasheet con le specifiche tecniche per stabilire il valore della resistenza da interporre tra i 5V e il pin 18 e non dovrete dimenticarvi di utilizzare i condensatori a "protezione" del circuito. In questo caso, inoltre, vi consigliamo di ricorrere ad apposite schedine di "breakout" (anche autocostruibili) pensate appositamente per rendere più agevoli i collegamenti tra l'integrato, il vostro Arduino (o simile) e i display. Ad esempio, noi abbiamo fresato alcune schedine di breakout trovate sul sito fritzing.com, che potete vedere in figura.
+
 
</div><br>
+
{| style="margin-left: auto; margin-right: auto;" class="wikitable"
<div style="text-align: center;">
+
|-
<a class="external image-view" href="http://4.bp.blogspot.com/-IpAkZbcOkTY/UPLAk_xXREI/AAAAAAAAGKs/tZf5uE_yRh0/s1600/DSC_0002_max7219+%25281%2529.JPG"><img alt="[Immagine: DSC_0002_max7219+%25281%2529.JPG]" border="0" class="lazy" data-original="http://4.bp.blogspot.com/-IpAkZbcOkTY/UPLAk_xXREI/AAAAAAAAGKs/tZf5uE_yRh0/s1600/DSC_0002_max7219+%25281%2529.JPG" height="239" src="http://fablabimperia.org/forum/images/trans/1x1.png" width="360"></a>&nbsp;
+
| {{#eimage:http://i.imgur.com/isAXs8h.jpg|alt="!!TITLE!!"|link="http://fritzing.org/projects/max7219-breakout-board"|480x320px|center|frame|[http://fritzing.org/projects/max7219-breakout-board Il progetto&nbsp;originale stampabile tramite Fritzing]}}  || {{#eimage:http://i.imgur.com/DkCxZOhm.jpg|alt="!!TITLE!!"|link="http://i.imgur.com/DkCxZOhm.jpg"|480x320px|center|thumb|[http://i.imgur.com/DkCxZOhm.jpg La schedina di breakout ricreata da noi]}}
</div>
+
|}
<div style="text-align: center;">
+
<div class="image-caption">
+
== Pilotare l'integrato MAX7219 con Arduino ==
<span class="arrow fa fa-arrow-up"></span><a class="external" href="http://fritzing.org/projects/max7219-breakout-board" rel="nofollow" target="_blank">Il progetto&nbsp;originale stampabile tramite Fritzing</a>
 
</div>
 
</div><br>
 
<div style="text-align: center;">
 
<a class="external image-view" href="http://i.imgur.com/DkCxZOhm.jpg"><img alt="[Immagine: DkCxZOhm.jpg]" border="0" class="lazy" data-original="http://i.imgur.com/DkCxZOhm.jpg" src="http://fablabimperia.org/forum/images/trans/1x1.png"></a>
 
</div>
 
<div style="text-align: center;">
 
<div class="image-caption">
 
<span class="arrow fa fa-arrow-up"></span>La schedina di breakout ricreata da noi
 
</div>
 
</div><br>
 
<br>
 
<br>
 
<div style="text-align: justify;">
 
<span style="font-size: medium;"><span style="font-weight: bold;">Come faccio a pilotare l'integrato MAX7219 con Arduino?</span></span>
 
</div><br>
 
<div style="text-align: justify;">
 
 
Dando per scontato che abbiate a disposizione un prototipo con tutti i collegamenti effettuati correttamente, con la giusta resistenza e condensatori al loro posto, dovremo ora collegare i 3 pin necessari per il collegamento tra Arduino e l'integrato.
 
Dando per scontato che abbiate a disposizione un prototipo con tutti i collegamenti effettuati correttamente, con la giusta resistenza e condensatori al loro posto, dovremo ora collegare i 3 pin necessari per il collegamento tra Arduino e l'integrato.
</div>
+
 
<div style="text-align: justify;">
+
Per questa operazione è possibile scegliere semplicemente 3 pin digitali, ad esempio come segue:
Per questa operazione è possibile scegliere semplicemente 3 pin digitali, ad esempio come sebre:
+
 
</div>
+
{| style="margin-left: auto; margin-right: auto; width:30%" class="wikitable"
<table border="0" cellpadding="3" cellspacing="1" class="tborder" style="width:40%;">
+
! valign="middle" | Arduino Uno
<tbody>
+
! valign="middle" | MAX72xx
<tr>
+
|-
<th class="tcat" valign="middle"><strong>Arduino Uno</strong></th>
+
| align="center" valign="top" | Pin 12
<th class="tcat" valign="middle"><strong>MAX72xx</strong></th>
+
| align="center" valign="top" | Pin 1
</tr>
+
|-
<tr>
+
| align="center" valign="top" | Pin 11
<td align="center" class="trow1" valign="top">Pin 12</td>
+
| align="center" valign="top" | Pin 13 (CLK)
<td align="center" class="trow1" valign="top">Pin 1</td>
+
|-
</tr>
+
| align="center" valign="top" | Pin 10
<tr>
+
| align="center" valign="top" | Pin 12( LOAD)
<td align="center" class="trow1" valign="top">Pin 11</td>
+
|}
<td align="center" class="trow1" valign="top">Pin 13 (CLK)</td>
+
 
</tr>
+
<br />
<tr>
 
<td align="center" class="trow1" valign="top">Pin 10</td>
 
<td align="center" class="trow1" valign="top">Pin 12( LOAD)</td>
 
</tr>
 
</tbody>
 
</table><br>
 
 
Fatto questo, dobbiamo pensare alla programmazione, ma anche questa operazione è piuttosto semplice, in quanto ci viene in soccorso l'apposita libreria LedControl (non è l'unica...).<br>
 
Fatto questo, dobbiamo pensare alla programmazione, ma anche questa operazione è piuttosto semplice, in quanto ci viene in soccorso l'apposita libreria LedControl (non è l'unica...).<br>
 
Nel codice di esempio che segue, viene inizializzato un MAX7219, quindi vengono accesi in sequenza una fila di trattini su tutti i display numerici collegati e viene visualizzato un numero progressivo, il tutto ciclicamente. Nel video più sotto potete osservare il risultato di questo test su un array di 6 piccoli display numerici collegato a una scheda Teensy (tipo Arduino).<br>
 
Nel codice di esempio che segue, viene inizializzato un MAX7219, quindi vengono accesi in sequenza una fila di trattini su tutti i display numerici collegati e viene visualizzato un numero progressivo, il tutto ciclicamente. Nel video più sotto potete osservare il risultato di questo test su un array di 6 piccoli display numerici collegato a una scheda Teensy (tipo Arduino).<br>
<br>
+
 
<script src="http://fablabimperia.org/forum/inc/plugins/syntax/scripts/shBrush_cpp.js" type="text/javascript"></script>
+
<syntaxhighlight lang="cpp" line="1">
<div>
+
#include "LedControl.h" // need the library
<div class="syntaxhighlighter cpp" id="highlighter_110831">
+
LedControl lc=LedControl(12,11,10,1); //  
<table border="0" cellpadding="0" cellspacing="0">
+
<tbody>
+
// pin 12 is connected to the MAX7219 pin 1
<tr>
+
// pin 11 is connected to the CLK pin 13
<td class="gutter">
+
// pin 10 is connected to LOAD pin 12
<div class="line number1 index0 alt2">
+
// 1 as we are only using 1 MAX7219
1
+
</div>
+
void setup()
<div class="line number2 index1 alt1">
+
{
2
+
  // the zero refers to the MAX7219 number, it is zero for 1 chip
</div>
+
  lc.shutdown(0,false);// turn off power saving, enables display
<div class="line number3 index2 alt2">
+
  lc.setIntensity(0,8);// sets brightness (0~15 possible values)
3
+
  lc.clearDisplay(0);// clear screen
</div>
+
}
<div class="line number4 index3 alt1">
+
void loop()
4
+
{
</div>
+
  for (int row=0; row<8; row++)
<div class="line number5 index4 alt2">
+
  {
5
+
    for (int col=0; col<8; col++)
</div>
+
    {
<div class="line number6 index5 alt1">
+
      lc.setLed(0,col,row,true); // turns on LED at col, row
6
+
      delay(25);
</div>
+
    }
<div class="line number7 index6 alt2">
+
  }
7
+
</div>
+
  for (int row=0; row<8; row++)
<div class="line number8 index7 alt1">
+
  {
8
+
    for (int col=0; col<8; col++)
</div>
+
    {
<div class="line number9 index8 alt2">
+
      lc.setLed(0,col,row,false); // turns off LED at col, row
9
+
      delay(25);
</div>
+
    }
<div class="line number10 index9 alt1">
+
  }
10
+
}
</div>
+
</syntaxhighlight>
<div class="line number11 index10 alt2">
+
<small>source: [http://tronixstuff.com/2013/10/11/tutorial-arduino-max7219-led-display-driver-ic/ tronixstuff.com (CC) BY-NC-SA v.4.0]</small>
11
+
<br><br>
</div>
+
E questo è il risultato della nostra prova:
<div class="line number12 index11 alt1">
 
12
 
</div>
 
<div class="line number13 index12 alt2">
 
13
 
</div>
 
<div class="line number14 index13 alt1">
 
14
 
</div>
 
<div class="line number15 index14 alt2">
 
15
 
</div>
 
<div class="line number16 index15 alt1">
 
16
 
</div>
 
<div class="line number17 index16 alt2">
 
17
 
</div>
 
<div class="line number18 index17 alt1">
 
18
 
</div>
 
<div class="line number19 index18 alt2">
 
19
 
</div>
 
<div class="line number20 index19 alt1">
 
20
 
</div>
 
<div class="line number21 index20 alt2">
 
21
 
</div>
 
<div class="line number22 index21 alt1">
 
22
 
</div>
 
<div class="line number23 index22 alt2">
 
23
 
</div>
 
<div class="line number24 index23 alt1">
 
24
 
</div>
 
<div class="line number25 index24 alt2">
 
25
 
</div>
 
<div class="line number26 index25 alt1">
 
26
 
</div>
 
<div class="line number27 index26 alt2">
 
27
 
</div>
 
<div class="line number28 index27 alt1">
 
28
 
</div>
 
<div class="line number29 index28 alt2">
 
29
 
</div>
 
<div class="line number30 index29 alt1">
 
30
 
</div>
 
<div class="line number31 index30 alt2">
 
31
 
</div>
 
<div class="line number32 index31 alt1">
 
32
 
</div>
 
<div class="line number33 index32 alt2">
 
33
 
</div>
 
<div class="line number34 index33 alt1">
 
34
 
</div>
 
<div class="line number35 index34 alt2">
 
35
 
</div>
 
</td>
 
<td class="code">
 
<div class="container">
 
<div class="line number1 index0 alt2">
 
<code class="cpp preprocessor">#include "LedControl.h" // &nbsp;need the library</code>
 
</div>
 
<div class="line number2 index1 alt1">
 
<code class="cpp plain">LedControl lc=LedControl(12,11,10,1);</code> <code class="cpp comments">//&nbsp;</code>
 
</div>
 
<div class="line number3 index2 alt2">
 
&nbsp;
 
</div>
 
<div class="line number4 index3 alt1">
 
<code class="cpp comments">// pin 12 is connected to the MAX7219 pin 1</code>
 
</div>
 
<div class="line number5 index4 alt2">
 
<code class="cpp comments">// pin 11 is connected to the CLK pin 13</code>
 
</div>
 
<div class="line number6 index5 alt1">
 
<code class="cpp comments">// pin 10 is connected to LOAD pin 12</code>
 
</div>
 
<div class="line number7 index6 alt2">
 
<code class="cpp comments">// 1 as we are only using 1 MAX7219</code>
 
</div>
 
<div class="line number8 index7 alt1">
 
&nbsp;
 
</div>
 
<div class="line number9 index8 alt2">
 
<code class="cpp keyword bold">void</code> <code class="cpp plain">setup()</code>
 
</div>
 
<div class="line number10 index9 alt1">
 
<code class="cpp plain">{</code>
 
</div>
 
<div class="line number11 index10 alt2">
 
<code class="cpp spaces">&nbsp;&nbsp;</code><code class="cpp comments">// the zero refers to the MAX7219 number, it is zero for 1 chip</code>
 
</div>
 
<div class="line number12 index11 alt1">
 
<code class="cpp spaces">&nbsp;&nbsp;</code><code class="cpp plain">lc.shutdown(0,</code><code class="cpp keyword bold">false</code><code class="cpp plain">);</code><code class="cpp comments">// turn off power saving, enables display</code>
 
</div>
 
<div class="line number13 index12 alt2">
 
<code class="cpp spaces">&nbsp;&nbsp;</code><code class="cpp plain">lc.setIntensity(0,8);</code><code class="cpp comments">// sets brightness (0~15 possible values)</code>
 
</div>
 
<div class="line number14 index13 alt1">
 
<code class="cpp spaces">&nbsp;&nbsp;</code><code class="cpp plain">lc.clearDisplay(0);</code><code class="cpp comments">// clear screen</code>
 
</div>
 
<div class="line number15 index14 alt2">
 
<code class="cpp plain">}</code>
 
</div>
 
<div class="line number16 index15 alt1">
 
<code class="cpp keyword bold">void</code> <code class="cpp plain">loop()</code>
 
</div>
 
<div class="line number17 index16 alt2">
 
<code class="cpp plain">{</code>
 
</div>
 
<div class="line number18 index17 alt1">
 
<code class="cpp spaces">&nbsp;&nbsp;</code><code class="cpp keyword bold">for</code> <code class="cpp plain">(</code><code class="cpp color1 bold">int</code> <code class="cpp plain">row=0; row&lt;8; row++)</code>
 
</div>
 
<div class="line number19 index18 alt2">
 
<code class="cpp spaces">&nbsp;&nbsp;</code><code class="cpp plain">{</code>
 
</div>
 
<div class="line number20 index19 alt1">
 
<code class="cpp spaces">&nbsp;&nbsp;&nbsp;</code> <code class="cpp keyword bold">for</code> <code class="cpp plain">(</code><code class="cpp color1 bold">int</code> <code class="cpp plain">col=0; col&lt;8; col++)</code>
 
</div>
 
<div class="line number21 index20 alt2">
 
<code class="cpp spaces">&nbsp;&nbsp;&nbsp;</code> <code class="cpp plain">{</code>
 
</div>
 
<div class="line number22 index21 alt1">
 
<code class="cpp spaces">&nbsp;&nbsp;&nbsp; &nbsp;</code> <code class="cpp plain">lc.setLed(0,col,row,</code><code class="cpp keyword bold">true</code><code class="cpp plain">);</code> <code class="cpp comments">// turns on LED at col, row</code>
 
</div>
 
<div class="line number23 index22 alt2">
 
<code class="cpp spaces">&nbsp;&nbsp;&nbsp; &nbsp;</code> <code class="cpp plain">delay(25);</code>
 
</div>
 
<div class="line number24 index23 alt1">
 
<code class="cpp spaces">&nbsp;&nbsp;&nbsp;</code> <code class="cpp plain">}</code>
 
</div>
 
<div class="line number25 index24 alt2">
 
<code class="cpp spaces">&nbsp;&nbsp;</code><code class="cpp plain">}</code>
 
</div>
 
<div class="line number26 index25 alt1">
 
&nbsp;
 
</div>
 
<div class="line number27 index26 alt2">
 
<code class="cpp spaces">&nbsp;&nbsp;</code><code class="cpp keyword bold">for</code> <code class="cpp plain">(</code><code class="cpp color1 bold">int</code> <code class="cpp plain">row=0; row&lt;8; row++)</code>
 
</div>
 
<div class="line number28 index27 alt1">
 
<code class="cpp spaces">&nbsp;&nbsp;</code><code class="cpp plain">{</code>
 
</div>
 
<div class="line number29 index28 alt2">
 
<code class="cpp spaces">&nbsp;&nbsp;&nbsp;</code> <code class="cpp keyword bold">for</code> <code class="cpp plain">(</code><code class="cpp color1 bold">int</code> <code class="cpp plain">col=0; col&lt;8; col++)</code>
 
</div>
 
<div class="line number30 index29 alt1">
 
<code class="cpp spaces">&nbsp;&nbsp;&nbsp;</code> <code class="cpp plain">{</code>
 
</div>
 
<div class="line number31 index30 alt2">
 
<code class="cpp spaces">&nbsp;&nbsp;&nbsp; &nbsp;</code> <code class="cpp plain">lc.setLed(0,col,row,</code><code class="cpp keyword bold">false</code><code class="cpp plain">);</code> <code class="cpp comments">// turns off LED at col, row</code>
 
</div>
 
<div class="line number32 index31 alt1">
 
<code class="cpp spaces">&nbsp;&nbsp;&nbsp; &nbsp;</code> <code class="cpp plain">delay(25);</code>
 
</div>
 
<div class="line number33 index32 alt2">
 
<code class="cpp spaces">&nbsp;&nbsp;&nbsp;</code> <code class="cpp plain">}</code>
 
</div>
 
<div class="line number34 index33 alt1">
 
<code class="cpp spaces">&nbsp;&nbsp;</code><code class="cpp plain">}</code>
 
</div>
 
<div class="line number35 index34 alt2">
 
<code class="cpp plain">}</code>
 
</div>
 
</div>
 
</td>
 
</tr>
 
</tbody>
 
</table>
 
</div>
 
</div><br>
 
<span style="font-size: x-small;">Source: <a class="external" href="http://tronixstuff.com/2013/10/11/tutorial-arduino-max7219-led-display-driver-ic/" rel="nofollow" target="_blank">tronixstuff.com</a></span><br>
 
<br>
 
E questo è il risultato della nostra prova:<br>
 
 
<div style="text-align: center;">
 
<div style="text-align: center;">
<!-- start: video_youtube_embed --><br>
+
<youtube>http://www.youtube.com/embed/Wdm4Pzc5E4o"</youtube></div>
<iframe allowfullscreen="" frameborder="0" height="315" src="//www.youtube.com/embed/Wdm4Pzc5E4o" width="560"></iframe><br>
+
 
<!-- end: video_youtube_embed -->
+
== Assorbimento di corrente ==
</div><br>
+
Come già anticipato, ogni MAX7219 deve essere corredato di una resistenza adeguata al tipo di display a LED che intendete utilizzare, che è possibile stabilire studiando i datasheet dell'integrato e quelli del vostro display.
<br>
 
<br>
 
<span style="font-size: medium;"><span style="font-weight: bold;">Quanta corrente assorbono i display?</span></span><br>
 
<br>
 
Come già anticipato, ogni MAX7219 deve essere corredato di una resistenza adeguata al tipo di display a LED che intendete utilizzare, che è possibile stabilire studiando i datasheet dell'integrato e quelli del vostro display.<br>
 
 
Una volta stabilito il valore corretto della resistenza, quando sull'IDE di arduino si inizializzano i display, è possibile impostare l'intensità di illuminazione dei LED&nbsp;tramite il comando.<br>
 
Una volta stabilito il valore corretto della resistenza, quando sull'IDE di arduino si inizializzano i display, è possibile impostare l'intensità di illuminazione dei LED&nbsp;tramite il comando.<br>
<script src="http://fablabimperia.org/forum/inc/plugins/syntax/scripts/shBrush_cpp.js" type="text/javascript"></script>
+
<syntaxhighlight lang="cpp" line="1">
<div>
+
lc.setIntensity(0,8);// sets brightness (0~15 possible values)
<div class="syntaxhighlighter cpp" id="highlighter_925212">
+
</syntaxhighlight>
<table border="0" cellpadding="0" cellspacing="0">
+
questo valore è quello che ha il peso maggiore nel determinare gli assorbimenti totali dei vostri display a 7 segmenti.<br>
<tbody>
+
 
<tr>
 
<td class="gutter">
 
<div class="line number1 index0 alt2">
 
1
 
</div>
 
</td>
 
<td class="code">
 
<div class="container">
 
<div class="line number1 index0 alt2">
 
<code class="cpp plain">lc.setIntensity(0,8);</code><code class="cpp comments">// sets brightness (0~15 possible values)</code>
 
</div>
 
</div>
 
</td>
 
</tr>
 
</tbody>
 
</table>
 
</div>
 
</div><br>
 
e questo valore è quello che ha il peso maggiore nel&nbsp;determinare gli assorbimenti totali dei vostri display a 7 segmenti.<br>
 
<br>
 
 
Dai nostri test, effettuati collegando in cascata&nbsp;4 MAX7219 equipaggiati ognuno con 6 display numerici (tot 24 display)&nbsp;completamente accesi simultaneamente&nbsp;(per un totale di 192 LED) e corredati da resistenze da 47K Ohm, pilotati con una schedina Teensy2++, gli assorbimenti sono stati i seguenti:<br>
 
Dai nostri test, effettuati collegando in cascata&nbsp;4 MAX7219 equipaggiati ognuno con 6 display numerici (tot 24 display)&nbsp;completamente accesi simultaneamente&nbsp;(per un totale di 192 LED) e corredati da resistenze da 47K Ohm, pilotati con una schedina Teensy2++, gli assorbimenti sono stati i seguenti:<br>
<span style="font-weight: bold;">Assorbimento a vuoto della Teensy2++</span> = 11 mA<br>
+
{| style="margin-left: auto; margin-right: auto; width:30%" class="wikitable"
<span style="font-weight: bold;">Valore di intensità 13</span> = 193 mA (totali)<br>
+
|-
<span style="font-weight: bold;">Valore di intensità 0</span> = 19,6 mA (totali)<br>
+
| Assorbimento a vuoto della Teensy2++ || 11 mA
(Valori oltre i 200mA non erano raccomandabili per il nostro test.)<br>
+
|-
<br>
+
| Valore di intensità 13 || 193 mA (totali)
<br>
+
|-
<span style="font-size: medium;"><span style="font-weight: bold;">Cos'altro posso fare con il MAX72xx?</span></span><br>
+
| Valore di intensità 0 || 19,6 mA (totali)
<br>
+
|}
Prima di chiudere, vale la pena di citare che con lo stesso tipo di integrato è possibile utilizzare anche delle matrici di LED per visualizzare testo o grafica anche di grosse dimensioni.<br>
+
 
 +
== Altri usi del MAX72xx ==
 +
Vale la pena di citare che con lo stesso tipo di integrato è possibile utilizzare anche delle matrici di LED per visualizzare testo o grafica anche di grosse dimensioni.
 +
Per maggiori informazioni vedere il [http://tronixstuff.com/2013/10/11/tutorial-arduino-max7219-led-display-driver-ic/ tutorial su tronixstuff.com]
  
 
[[Category:Tutorial]]
 
[[Category:Tutorial]]
 
[[Category:Componenti elettronici]]
 
[[Category:Componenti elettronici]]
[[Category:Stubs]]
 

Versione attuale delle 13:56, 24 ago 2016

""
Test di display a 7 segmenti)

Quando in un nostro progetto abbiamo bisogno di visualizzare dei valori alfanumerici, al posto di utlizzare un grosso display LCD possiamo ricorrere ai semplici e sempre giovani display a 7 segmenti.
Tramite l'accensione di una combinazione di LED, disposti e ordinati in un unico display secondo lo standard indicato in figura, è possibile mostrare cifre numeriche e anche alcune lettere, oltre al punto decimale. Esistono sul mercato display con colori e dimensioni molto diverse, singoli o appaiati, a catodo comune o ad anodo comune. A seconda dell'uso che se ne vuole fare, è opportuno scegliere quelli più adatti al proprio progetto.

""
Esempio dei caratteri che si possono mostrare (wikimedia.org)

""
Schema della denominazione dei segmenti

Descrizione

La relativa semplicità di funzionamento di questi display può consentirci di utilizzarli anche i progetti dove non sono presenti microcontrollori programmabili. D'altro canto, però, per gestire ogni singola cifra alfanumerica vanno pilotati ben 7 LED (+1 per il punto decimale) e questo può creare dei problemi, perchè con le usuali schede di prototipazione in uso nei Fablab (tipo Arduino o Raspberry) si farebbe molto presto a esaurire i pin disponibili per la loro accensione.
Per fortuna, esistono "microchip" appositamente creati per risolvere questo problema, che utilizzano la tecnica cosiddetta del multiplexing", e  abbinati a un microcontrollore esterno (ad esempio un Arduino), invece di accendere simultaneamente tutti i led necessari per visualizzare le cifre sui display, attivano solo 1 LED per volta, ma a una velocità talmente rapida da ingannare l'occhio umano e dare la percezione di una accensione simultanea (sfruttando in pratica lo stesso principio dei fotogrammi nel cinema).


""
Max72**
Usando questo stratagemma, un integrato della serie  MAX7219/7221 (o equivalente) può controllare 8 cifre a display (quindi ben 64 LED) occupando solo 3 pin digitali. Se questo vi sembrasse ancora poco, è possibile collegare in cascata fino a 8 di questi MAX7219 / MAX7221, con il risultato di riuscire a governare ben 64 cifre a display (512 LED!) sfruttanto sempre i soli 3 pin.  Naturalmente, se governare un numero di led così elevato è tecnicamente possibile, aumentando considerevolmente il numero di display da gestire con soli 3 pin, il periodo di refresh dei display potrebbe apparire visibile. In genere quindi la regola è che meno display numerici vengono gestiti, migliore è il risultato.


Collegamenti

Abbiamo 3 dispositivi in gioco:
1) La nostra schedina di prototipazione (Arduino o simile)
2) L'integrato MAX7219 o MAX7221
3) Il display o un array di display a 7 segmenti

I collegamenti tra Arduino (o simile) e MAX 7219 dovranno essere:

mentre i collegamenti tra un MAX72xx e display sono i seguenti:

Come potete vedere, nonostante i miracoli offerti dalla modalità del multiplexing, specialmente se abbiamo diversi display numerici separati, il numero di connessioni da effettuare per collegare all'integrato ogni singolo display  è notevole. Se poi avete scelto di utilizzare dei display di dimensioni ridotte, vi ritroverete a dover effettuare un gran numero di saldature molto ravvicinate. 
Anche qua, per fortuna esistono in commercio delle soluzioni già pronte con diversi display numerici già appaiati al cui interno le connessioni sono già state predisposte e che consentono di collegare facilmente i display. Alcune schedine, includono addirittura l'integrato MAX7219 (o equivalente), che permettono quindi di collegare il tutto molto facilmente alla nostra schedina di prototipazione.

Se scegliete di utilizzare un integrato MAX7219 "nudo", dovrete leggere con attenzione il datasheet con le specifiche tecniche per stabilire il valore della resistenza da interporre tra i 5V e il pin 18 e non dovrete dimenticarvi di utilizzare i condensatori a "protezione" del circuito. In questo caso, inoltre, vi consigliamo di ricorrere ad apposite schedine di "breakout" (anche autocostruibili) pensate appositamente per rendere più agevoli i collegamenti tra l'integrato, il vostro Arduino (o simile) e i display. Ad esempio, noi abbiamo fresato alcune schedine di breakout trovate sul sito fritzing.com, che potete vedere in figura.

Pilotare l'integrato MAX7219 con Arduino

Dando per scontato che abbiate a disposizione un prototipo con tutti i collegamenti effettuati correttamente, con la giusta resistenza e condensatori al loro posto, dovremo ora collegare i 3 pin necessari per il collegamento tra Arduino e l'integrato.

Per questa operazione è possibile scegliere semplicemente 3 pin digitali, ad esempio come segue:

Arduino Uno MAX72xx
Pin 12 Pin 1
Pin 11 Pin 13 (CLK)
Pin 10 Pin 12( LOAD)


Fatto questo, dobbiamo pensare alla programmazione, ma anche questa operazione è piuttosto semplice, in quanto ci viene in soccorso l'apposita libreria LedControl (non è l'unica...).
Nel codice di esempio che segue, viene inizializzato un MAX7219, quindi vengono accesi in sequenza una fila di trattini su tutti i display numerici collegati e viene visualizzato un numero progressivo, il tutto ciclicamente. Nel video più sotto potete osservare il risultato di questo test su un array di 6 piccoli display numerici collegato a una scheda Teensy (tipo Arduino).

#include "LedControl.h" //  need the library
LedControl lc=LedControl(12,11,10,1); // 
 
// pin 12 is connected to the MAX7219 pin 1
// pin 11 is connected to the CLK pin 13
// pin 10 is connected to LOAD pin 12
// 1 as we are only using 1 MAX7219
 
void setup()
{
  // the zero refers to the MAX7219 number, it is zero for 1 chip
  lc.shutdown(0,false);// turn off power saving, enables display
  lc.setIntensity(0,8);// sets brightness (0~15 possible values)
  lc.clearDisplay(0);// clear screen
}
void loop()
{
  for (int row=0; row<8; row++)
  {
    for (int col=0; col<8; col++)
    {
      lc.setLed(0,col,row,true); // turns on LED at col, row
      delay(25);
    }
  }
 
  for (int row=0; row<8; row++)
  {
    for (int col=0; col<8; col++)
    {
      lc.setLed(0,col,row,false); // turns off LED at col, row
      delay(25);
    }
  }
}

source: tronixstuff.com (CC) BY-NC-SA v.4.0

E questo è il risultato della nostra prova:

Assorbimento di corrente

Come già anticipato, ogni MAX7219 deve essere corredato di una resistenza adeguata al tipo di display a LED che intendete utilizzare, che è possibile stabilire studiando i datasheet dell'integrato e quelli del vostro display. Una volta stabilito il valore corretto della resistenza, quando sull'IDE di arduino si inizializzano i display, è possibile impostare l'intensità di illuminazione dei LED tramite il comando.

lc.setIntensity(0,8);// sets brightness (0~15 possible values)

questo valore è quello che ha il peso maggiore nel determinare gli assorbimenti totali dei vostri display a 7 segmenti.

Dai nostri test, effettuati collegando in cascata 4 MAX7219 equipaggiati ognuno con 6 display numerici (tot 24 display) completamente accesi simultaneamente (per un totale di 192 LED) e corredati da resistenze da 47K Ohm, pilotati con una schedina Teensy2++, gli assorbimenti sono stati i seguenti:

Assorbimento a vuoto della Teensy2++ 11 mA
Valore di intensità 13 193 mA (totali)
Valore di intensità 0 19,6 mA (totali)

Altri usi del MAX72xx

Vale la pena di citare che con lo stesso tipo di integrato è possibile utilizzare anche delle matrici di LED per visualizzare testo o grafica anche di grosse dimensioni. Per maggiori informazioni vedere il tutorial su tronixstuff.com