Note

Bonjour et bienvenue dans la Communauté Facebook des passionnés de Raspberry Pi, Arduino et ESP32 de SunFounder ! Plongez plus profondément dans l’univers des Raspberry Pi, Arduino et ESP32 avec d’autres passionnés.

Pourquoi rejoindre ?

  • Support d’experts : Résolvez les problèmes après-vente et les défis techniques avec l’aide de notre communauté et de notre équipe.

  • Apprendre et partager : Échangez des astuces et des tutoriels pour améliorer vos compétences.

  • Aperçus exclusifs : Accédez en avant-première aux annonces de nouveaux produits et aux aperçus.

  • Réductions spéciales : Profitez de réductions exclusives sur nos produits les plus récents.

  • Promotions festives et cadeaux : Participez à des cadeaux et des promotions de vacances.

👉 Prêt à explorer et à créer avec nous ? Cliquez [Ici] et rejoignez-nous aujourd’hui !

1.1.4 Afficheur 7 segments

Introduction

Essayons de piloter un afficheur 7 segments pour afficher les chiffres de 0 à 9 et les lettres de A à F.

Composants nécessaires

Dans ce projet, nous avons besoin des composants suivants.

../_images/1.1.4_7_segment_list.png

Il est très pratique d’acheter un kit complet, voici le lien :

Nom

ARTICLES DANS CE KIT

LIEN

Kit Raphael

337

Raphael Kit

Vous pouvez également les acheter séparément via les liens ci-dessous.

INTRODUCTION AUX COMPOSANTS

LIEN D’ACHAT

Carte d’extension GPIO

ACHETER

Plaque d’expérimentation (Breadboard)

ACHETER

Fils de Liaison

ACHETER

Résistance

ACHETER

Affichage à 7 segments

ACHETER

74HC595

ACHETER

Schéma de montage

Connectez la broche ST_CP du 74HC595 au GPIO18 du Raspberry Pi, SH_CP au GPIO27, DS au GPIO17, les ports de sortie parallèle aux 8 segments de l’afficheur LED.

Entrez les données dans la broche DS vers le registre à décalage lorsque SH_CP (l’entrée d’horloge du registre à décalage) est à la montée, et vers le registre de mémoire lorsque ST_CP (l’entrée d’horloge de la mémoire) est à la montée.

Vous pouvez alors contrôler les états de SH_CP et ST_CP via les GPIOs du Raspberry Pi pour transformer l’entrée de données série en sortie de données parallèle afin de sauvegarder les GPIOs du Raspberry Pi et piloter l’afficheur.

Nom T-Board

Physique

BCM

GPIO17

Pin 11

17

GPIO18

Pin 12

18

GPIO27

Pin 13

27

../_images/1.1.4_7_segment_schematic.png

Procédures expérimentales

Étape 1 : Construire le circuit.

../_images/1.1.4_7-Segment_circuit.png

Étape 2 : Accéder au dossier du code.

cd ~/raphael-kit/python-pi5

Étape 3 : Exécuter.

sudo python3 1.1.4_7-Segment_zero.py

Après l’exécution du code, vous verrez l’afficheur 7 segments afficher 0-9, A-F.

Avertissement

Si vous recevez le message d’erreur RuntimeError: Cannot determine SOC peripheral base address, veuillez consulter Si « gpiozero » ne fonctionne pas.

Code

Note

Vous pouvez Modifier/Réinitialiser/Copier/Exécuter/Arrêter le code ci-dessous. Mais avant cela, vous devez accéder au chemin source du code comme raphael-kit/python-pi5. Après avoir modifié le code, vous pouvez l’exécuter directement pour voir l’effet. Après avoir confirmé qu’il n’y a pas de problèmes, vous pouvez utiliser le bouton Copier pour copier le code modifié, puis ouvrir le code source dans Terminal via la commande nano et le coller.

#!/usr/bin/env python3
from gpiozero import OutputDevice
from time import sleep

# GPIO pins connected to 74HC595 shift register
SDI = OutputDevice(17)   # Serial Data Input
RCLK = OutputDevice(18)  # Memory Clock Input (Register Clock)
SRCLK = OutputDevice(27) # Shift Register Clock

# Hexadecimal digit codes for a common cathode 7-segment display
segCode = [
    0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d,
    0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71
]

def hc595_shift(data):
    # Shift 8 bits of data into the 74HC595
    for bit in range(8):
        # Set SDI high or low based on data bit
        SDI.value = 0x80 & (data << bit)
        # Trigger shift register clock
        SRCLK.on()
        sleep(0.001)
        SRCLK.off()
    # Latch data to output by triggering memory clock
    RCLK.on()
    sleep(0.001)
    RCLK.off()

def display_all_on():
    # Function to turn all segments on (for common cathode 7-segment display)
    all_on_code = 0x3f
    hc595_shift(all_on_code)
    print("Displaying all segments on")

try:
    while True:
        # Display each hexadecimal digit on 7-segment display
        for code in segCode:
            hc595_shift(code)  # Shift the code into 74HC595
            # Print the displayed segment code
            print(f"Displaying segCode[{segCode.index(code)}]: 0x{code:02X}")
            sleep(0.5)  # Pause between displaying each digit

except KeyboardInterrupt:
    # Gracefully handle script interruption (e.g., Ctrl+C)
    pass

Explication du Code

  1. Ce snippet importe les classes nécessaires pour le projet. OutputDevice de gpiozero est utilisé pour contrôler les composants matériels connectés aux broches GPIO, et sleep de time est utilisé pour ajouter des délais.

    #!/usr/bin/env python3
    from gpiozero import OutputDevice
    from time import sleep
    
  2. SDI, RCLK, et SRCLK correspondent aux broches d’entrée de données série, d’entrée d’horloge de mémoire (horloge de registre) et d’horloge de registre à décalage du 74HC595.

    # GPIO pins connected to 74HC595 shift register
    SDI = OutputDevice(17)   # Serial Data Input
    RCLK = OutputDevice(18)  # Memory Clock Input (Register Clock)
    SRCLK = OutputDevice(27) # Shift Register Clock
    
  3. segCode est un tableau contenant les codes hexadécimaux pour chaque chiffre à afficher sur l’afficheur 7 segments.

    # Hexadecimal digit codes for a common cathode 7-segment display
    segCode = [
        0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d,
        0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71
    ]
    
  4. Cette fonction décale 8 bits de données dans le 74HC595. Elle saisit chaque bit en série dans SDI, bascule SRCLK pour décaler le bit et utilise RCLK pour verrouiller les données à la sortie.

    def hc595_shift(data):
        # Shift 8 bits of data into the 74HC595
        for bit in range(8):
            # Set SDI high or low based on data bit
            SDI.value = 0x80 & (data << bit)
            # Trigger shift register clock
            SRCLK.on()
            sleep(0.001)
            SRCLK.off()
        # Latch data to output by triggering memory clock
        RCLK.on()
        sleep(0.001)
        RCLK.off()
    
  5. Cette fonction allume tous les segments de l’afficheur en envoyant un code spécifique à hc595_shift.

    def display_all_on():
        # Function to turn all segments on (for common cathode 7-segment display)
        all_on_code = 0x3f
        hc595_shift(all_on_code)
        print("Displaying all segments on")
    
  6. Dans la boucle principale, chaque code dans segCode est envoyé à l’afficheur en séquence, avec un délai entre chaque affichage.

    try:
        while True:
            # Display each hexadecimal digit on 7-segment display
            for code in segCode:
                hc595_shift(code)  # Shift the code into 74HC595
                # Print the displayed segment code
                print(f"Displaying segCode[{segCode.index(code)}]: 0x{code:02X}")
                sleep(0.5)  # Pause between displaying each digit
    
  7. Cette partie du code gère gracieusement l’interruption du script (comme Ctrl+C).

    except KeyboardInterrupt:
        # Gracefully handle script interruption (e.g., Ctrl+C)
        pass