.. 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 [|link_sf_facebook|] et rejoignez-nous aujourd'hui !
.. _1.1.4_py_pi5:
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.
.. image:: ../python_pi5/img/1.1.4_7_segment_list.png
Il est très pratique d'acheter un kit complet, voici le lien :
.. list-table::
:widths: 20 20 20
:header-rows: 1
* - Nom
- ARTICLES DANS CE KIT
- LIEN
* - Kit Raphael
- 337
- |link_Raphael_kit|
Vous pouvez également les acheter séparément via les liens ci-dessous.
.. list-table::
:widths: 30 20
:header-rows: 1
* - INTRODUCTION AUX COMPOSANTS
- LIEN D'ACHAT
* - :ref:`cpn_gpio_extension_board`
- |link_gpio_board_buy|
* - :ref:`cpn_breadboard`
- |link_breadboard_buy|
* - :ref:`cpn_wires`
- |link_wires_buy|
* - :ref:`cpn_resistor`
- |link_resistor_buy|
* - :ref:`cpn_7_segment`
- |link_7segment_buy|
* - :ref:`cpn_74hc595`
- |link_74hc595_buy|
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
============ ======== ===
.. image:: ../python_pi5/img/1.1.4_7_segment_schematic.png
Procédures expérimentales
------------------------------
**Étape 1 :** Construire le circuit.
.. image:: ../python_pi5/img/1.1.4_7-Segment_circuit.png
**Étape 2 :** Accéder au dossier du code.
.. raw:: html
.. code-block::
cd ~/raphael-kit/python-pi5
**Étape 3 :** Exécuter.
.. raw:: html
.. code-block::
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.
.. warning::
Si vous recevez le message d'erreur ``RuntimeError: Cannot determine SOC peripheral base address``, veuillez consulter :ref:`faq_soc`
**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.
.. raw:: html
.. code-block:: python
#!/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**
#. 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.
.. code-block:: python
#!/usr/bin/env python3
from gpiozero import OutputDevice
from time import sleep
#. 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.
.. code-block:: python
# 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
#. ``segCode`` est un tableau contenant les codes hexadécimaux pour chaque chiffre à afficher sur l'afficheur 7 segments.
.. code-block:: python
# 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
]
#. 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.
.. code-block:: python
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()
#. Cette fonction allume tous les segments de l'afficheur en envoyant un code spécifique à ``hc595_shift``.
.. code-block:: python
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")
#. Dans la boucle principale, chaque code dans ``segCode`` est envoyé à l'afficheur en séquence, avec un délai entre chaque affichage.
.. code-block:: python
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
#. Cette partie du code gère gracieusement l'interruption du script (comme Ctrl+C).
.. code-block:: python
except KeyboardInterrupt:
# Gracefully handle script interruption (e.g., Ctrl+C)
pass