.. note::
Ciao, benvenuto nella SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts Community su Facebook! Approfondisci Raspberry Pi, Arduino ed ESP32 insieme ad altri appassionati.
**Perché unirti a noi?**
- **Supporto Esperti**: Risolvi problemi post-vendita e sfide tecniche con l’aiuto della nostra community e del nostro team.
- **Impara e Condividi**: Scambia suggerimenti e tutorial per migliorare le tue competenze.
- **Anteprime Esclusive**: Ottieni accesso anticipato agli annunci di nuovi prodotti e anteprime.
- **Sconti Speciali**: Approfitta di sconti esclusivi sui nostri prodotti più recenti.
- **Promozioni e Omaggi Festivi**: Partecipa a omaggi e promozioni durante le festività.
👉 Pronto per esplorare e creare con noi? Clicca [|link_sf_facebook|] e unisciti oggi stesso!
1.1.4 Display a 7 segmenti
=============================
Introduzione
-----------------
In questo progetto, impareremo a controllare un display a 7 segmenti per mostrare cifre da 0 a 9 e lettere da A a F.
Componenti
----------------
.. image:: img/list_7_segment.png
Principio di Funzionamento
-----------------------------
**Display a 7 Segmenti**
Un display a 7 segmenti è un componente a forma di 8 che contiene 7 LED,
ciascuno dei quali rappresenta un segmento. Quando energizzato, ogni segmento
forma parte di una cifra da visualizzare.
Esistono due tipi di connessione per i pin: Catodo Comune (CC) e Anodo Comune (CA).
Come suggerisce il nome, un display CC ha tutti i catodi dei 7 LED collegati
insieme, mentre un display CA ha tutti gli anodi dei 7 segmenti collegati
insieme. In questo kit utilizziamo il primo tipo.
.. image:: img/image70.jpeg
:width: 3.89514in
:height: 3.32222in
:align: center
Ciascuno dei LED nel display ha un segmento posizionale, con uno dei suoi
pin di connessione collegato all'interno del pacchetto plastico rettangolare.
Questi pin LED sono etichettati da "a" a "g" rappresentando ciascun LED
individuale. Collegando opportunamente i pin di ciascun segmento, alcuni
segmenti si illumineranno e altri resteranno spenti, formando così il
carattere desiderato sul display.
**Codici per la Visualizzazione**
Per comprendere come i display a 7 segmenti (Catodo Comune) mostrino i numeri,
abbiamo disegnato la seguente tabella. I numeri da 0 a F sono mostrati con le
configurazioni GFEDCBA per i LED, rappresentate da 0 o 1. Ad esempio, 00111111
indica che DP e G sono impostati a 0, mentre gli altri sono a 1, mostrando così
il numero 0 sul display. Il Codice HEX corrisponde al numero in esadecimale.
.. image:: img/common_cathode.png
**74HC595**
Il 74HC595 consiste in un registro a scorrimento a 8 bit e un registro di
memorizzazione con uscite parallele a tre stati, che convertono l’ingresso
seriale in uscita parallela, risparmiando i pin IO di un microcontrollore.
Quando MR (pin10) è a livello alto e OE (pin13) è a livello basso, i dati
vengono inseriti al fronte di salita di SHcp e passano al registro di memoria
tramite il fronte di salita di SHcp. Se i due clock sono collegati insieme,
il registro a scorrimento è sempre un impulso avanti rispetto al registro di
memoria. Sono presenti un pin di ingresso seriale (Ds), un’uscita seriale (Q)
e un pulsante di reset asincrono (a livello basso) nel registro di memoria,
che fornisce un bus di uscita parallelo a 8 bit.
.. image:: img/74hc595_sche.png
:width: 400
:align: center
**Pin del 74HC595 e le loro Funzioni**:
* **Q0-Q7**: Uscite dati paralleli a 8 bit, in grado di controllare direttamente 8 LED o 8 pin del display a 7 segmenti.
* **Q7’**: Uscita in serie, connessa al pin DS di un altro 74HC595 per collegare più 74HC595 in serie.
* **MR**: Pin di reset, attivo a livello basso.
* **SHcp**: Ingresso di clock del registro a scorrimento; al fronte di salita, i dati si spostano di un bit.
* **STcp**: Ingresso di clock del registro di memoria; al fronte di salita, i dati passano dal registro a scorrimento al registro di memoria.
* **CE**: Pin di abilitazione dell'uscita, attivo a livello basso.
* **DS**: Pin di ingresso dati seriali.
* **VCC**: Alimentazione positiva.
* **GND**: Massa.
Diagramma Schematico
------------------------
Collega il pin ST_CP del 74HC595 al GPIO18 del Raspberry Pi, SH_CP al GPIO27
e DS al GPIO17. Le porte di uscita parallela vanno collegate agli 8 segmenti
del display LED. Inserisci i dati nel pin DS e controlla gli stati di SH_CP e
ST_CP attraverso i GPIO del Raspberry Pi, in modo da trasformare i dati seriali
in ingresso in dati paralleli in uscita e risparmiare GPIO del Raspberry Pi per
controllare il display.
============ ======== ======== ===
T-Board Name physical wiringPi BCM
GPIO17 Pin 11 0 17
GPIO18 Pin 12 1 18
GPIO27 Pin 13 2 27
============ ======== ======== ===
.. image:: img/schematic_7_segment.png
:width: 800
Procedure Sperimentali
------------------------------
**Passo 1:** Assembla il circuito.
.. image:: img/image73.png
:width: 800
Per utenti di linguaggio C
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Passo 2: Entra nella cartella del codice.
.. raw:: html
.. code-block::
cd ~/davinci-kit-for-raspberry-pi/c/1.1.4/
Passo 3: Compila.
.. raw:: html
.. code-block::
gcc 1.1.4_7-Segment.c -lwiringPi
Passo 4: Esegui il file eseguibile creato.
.. raw:: html
.. code-block::
sudo ./a.out
Dopo l'esecuzione del codice, vedrai il display a 7 segmenti mostrare i numeri da 0 a 9 e le lettere da A a F.
.. note::
Se il programma non funziona dopo l'esecuzione, oppure appare un messaggio di errore: \"wiringPi.h: Nessun file o directory", fai riferimento a :ref:`faq_c_nowork`.
**Codice**
.. code-block:: c
#include
#include
#define SDI 0 // ingresso dati seriali
#define RCLK 1 // ingresso clock memoria (STCP)
#define SRCLK 2 // ingresso clock registro a scorrimento (SHCP)
unsigned char SegCode[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void init(void){
pinMode(SDI, OUTPUT);
pinMode(RCLK, OUTPUT);
pinMode(SRCLK, OUTPUT);
digitalWrite(SDI, 0);
digitalWrite(RCLK, 0);
digitalWrite(SRCLK, 0);
}
void hc595_shift(unsigned char dat){
int i;
for(i=0;i<8;i++){
digitalWrite(SDI, 0x80 & (dat << i));
digitalWrite(SRCLK, 1);
delay(1);
digitalWrite(SRCLK, 0);
}
digitalWrite(RCLK, 1);
delay(1);
digitalWrite(RCLK, 0);
}
int main(void){
int i;
if(wiringPiSetup() == -1){ // se l'inizializzazione di wiring fallisce, stampa il messaggio sullo schermo
printf("setup wiringPi failed !");
return 1;
}
init();
while(1){
for(i=0;i<16;i++){
printf("Print %1X on Segment\n", i); // %X significa output in esadecimale
hc595_shift(SegCode[i]);
delay(500);
}
}
return 0;
}
**Spiegazione del Codice**
unsigned char SegCode[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
Array di codici segmenti per rappresentare valori da 0 a F in esadecimale (catodo comune).
.. code-block:: c
void init(void){
pinMode(SDI, OUTPUT);
pinMode(RCLK, OUTPUT);
pinMode(SRCLK, OUTPUT);
digitalWrite(SDI, 0);
digitalWrite(RCLK, 0);
digitalWrite(SRCLK, 0);
}
Imposta i pin ds, st_cp, sh_cp su OUTPUT, e lo stato iniziale a 0.
void hc595_shift(unsigned char dat){}
Assegna un valore a 8 bit al registro a scorrimento del 74HC595.
.. code-block:: c
digitalWrite(SDI, 0x80 & (dat << i));
Assegna i dati di "dat" a SDI(DS) per bit. Qui assumiamo dat=0x3f (0011 1111); quando i=2, 0x3f viene spostato a sinistra (<<) di 2 bit. 1111 1100 (0x3f << 2) & 1000 0000 (0x80) = 1000 0000, è vero.
.. code-block:: c
digitalWrite(SRCLK, 1);
Il valore iniziale di SRCLK era impostato a 0; qui è impostato a 1 per generare un impulso di salita e spostare i dati DS nel registro a scorrimento.
.. code-block:: c
digitalWrite(RCLK, 1);
Il valore iniziale di RCLK era impostato a 0; qui è impostato a 1 per generare un fronte di salita e trasferire i dati dal registro a scorrimento al registro di memorizzazione.
.. code-block:: c
while(1){
for(i=0;i<16;i++){
printf("Print %1X on Segment\n", i); // %X significa output esadecimale
hc595_shift(SegCode[i]);
delay(500);
}
}
In questo ciclo for, utilizziamo \"%1X\" per stampare i in esadecimale. Applichiamo i per trovare il codice segmento corrispondente nell'array SegCode[] e utilizziamo hc595_shift() per passare SegCode nel registro a scorrimento del 74HC595.
Per utenti di linguaggio Python
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Passo 2: Entra nella cartella del codice.
.. raw:: html
.. code-block::
cd ~/davinci-kit-for-raspberry-pi/python/
Passo 3: Esegui.
.. raw:: html
.. code-block::
sudo python3 1.1.4_7-Segment.py
Dopo l'esecuzione del codice, vedrai il display a 7 segmenti mostrare i numeri da 0 a 9 e le lettere da A a F.
**Codice**
.. note::
Puoi **Modificare/Reimpostare/Copiare/Eseguire/Arrestare** il codice seguente. Ma prima, è necessario accedere al percorso del codice sorgente come ``davinci-kit-for-raspberry-pi/python``.
.. raw:: html
.. code-block:: python
import RPi.GPIO as GPIO
import time
# Configura i pin
SDI = 17
RCLK = 18
SRCLK = 27
# Definisce il codice segmento da 0 a F in esadecimale
# Catodo comune
segCode = [0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71]
def setup():
GPIO.setmode(GPIO.BCM)
GPIO.setup(SDI, GPIO.OUT, initial=GPIO.LOW)
GPIO.setup(RCLK, GPIO.OUT, initial=GPIO.LOW)
GPIO.setup(SRCLK, GPIO.OUT, initial=GPIO.LOW)
# Sposta i dati nel 74HC595
def hc595_shift(dat):
for bit in range(0, 8):
GPIO.output(SDI, 0x80 & (dat << bit))
GPIO.output(SRCLK, GPIO.HIGH)
time.sleep(0.001)
GPIO.output(SRCLK, GPIO.LOW)
GPIO.output(RCLK, GPIO.HIGH)
time.sleep(0.001)
GPIO.output(RCLK, GPIO.LOW)
def main():
while True:
# Sposta il codice uno alla volta dalla lista segCode
for code in segCode:
hc595_shift(code)
print ("segCode[%s]: 0x%02X"%(segCode.index(code), code)) # %02X significa stampa in HEX a due cifre
time.sleep(0.5)
def destroy():
GPIO.cleanup()
if __name__ == '__main__':
setup()
try:
main()
except KeyboardInterrupt:
destroy()
**Spiegazione del Codice**
.. code-block:: python
segCode = [0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71]
Array di codici segmenti da 0 a F in esadecimale (catodo comune).
.. code-block:: python
def setup():
GPIO.setmode(GPIO.BCM)
GPIO.setup(SDI, GPIO.OUT, initial=GPIO.LOW)
GPIO.setup(RCLK, GPIO.OUT, initial=GPIO.LOW)
GPIO.setup(SRCLK, GPIO.OUT, initial=GPIO.LOW)
Imposta i tre pin ds, st_cp, sh_cp come output e con stato iniziale a livello basso.
.. code-block:: python
GPIO.output(SDI, 0x80 & (dat << bit))
Assegna i dati di "dat" a SDI (DS) bit per bit. Qui assumiamo dat=0x3f (0011 1111); quando bit=2, 0x3f viene spostato a destra (<<) di 2 bit. 1111 1100 (0x3f << 2) & 1000 0000 (0x80) = 1000 0000, è vero.
.. code-block:: python
GPIO.output(SRCLK, GPIO.HIGH)
Il valore iniziale di SRCLK era impostato a LOW, e qui è impostato a HIGH, il che genera un impulso di salita e sposta i dati DS nel registro a scorrimento.
.. code-block:: python
GPIO.output(RCLK, GPIO.HIGH)
Il valore iniziale di RCLK era impostato a LOW, e qui è impostato a HIGH, il che genera un impulso di salita e trasferisce i dati dal registro a scorrimento al registro di memorizzazione.
.. note::
Il formato esadecimale dei numeri da 0 a 15 è (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F)
Immagine del Fenomeno
-------------------------
.. image:: img/image74.jpeg