.. note:: Bonjour, bienvenue dans la communauté SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts sur Facebook ! Plongez plus profondément dans Raspberry Pi, Arduino et ESP32 avec d'autres passionnés. **Pourquoi nous rejoindre ?** - **Support d'experts** : Résolvez vos problèmes après-vente et vos défis techniques avec l'aide de notre communauté et de notre équipe. - **Apprendre et partager** : Échangez des conseils 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 exclusives** : Profitez de réductions exclusives sur nos produits les plus récents. - **Promotions festives et concours** : Participez à des concours et à des promotions saisonnières. 👉 Prêt à explorer et à créer avec nous ? Cliquez sur [|link_sf_facebook|] et rejoignez-nous dès aujourd'hui ! 1.1.4 Affichage 7 segments ============================== Introduction --------------- Essayons de piloter un afficheur 7 segments pour afficher des chiffres de 0 à 9 et des lettres de A à F. Composants ------------- .. image:: img/list_7_segment.png Principe ----------- **Afficheur 7 segments** Un afficheur 7 segments est un composant en forme de 8 qui regroupe 7 LEDs. Chaque LED est appelée un segment. Lorsqu'un segment est alimenté, il forme une partie du chiffre ou de la lettre à afficher. Il existe deux types de connexions de broches : cathode commune (CC) et anode commune (CA). Comme leur nom l'indique, un afficheur CC a toutes les cathodes des 7 LEDs connectées ensemble, tandis qu'un afficheur CA a toutes les anodes connectées ensemble. Dans ce kit, nous utilisons le modèle à cathode commune. .. image:: img/image70.jpeg :width: 3.89514in :height: 3.32222in :align: center Chaque LED de l'afficheur est associée à un segment positionnel, avec une broche de connexion correspondante. Ces broches sont étiquetées de "a" à "g", représentant chaque LED individuelle. Les autres broches sont connectées ensemble pour former une broche commune. En polarisant les broches appropriées dans un ordre particulier, certains segments s'illumineront tandis que d'autres resteront éteints, affichant ainsi le chiffre ou la lettre désirée. **Codes d'affichage** Pour mieux comprendre comment les afficheurs 7 segments (cathode commune) affichent les chiffres, nous avons dressé le tableau suivant. Les chiffres de 0 à F sont représentés sur l'afficheur 7 segments. Le tableau GFEDCBA se réfère aux LED correspondantes qui sont activées (0 ou 1). Par exemple, 00111111 signifie que DP et G sont réglés à 0, tandis que les autres sont à 1. Cela affiche le chiffre 0 sur l'afficheur 7 segments, tandis que le code HEX correspond au nombre en hexadécimal. .. image:: img/common_cathode.png **74HC595** Le 74HC595 est composé d'un registre à décalage de 8 bits et d'un registre de stockage avec sorties parallèles à trois états. Il convertit l'entrée série en sortie parallèle, permettant ainsi d'économiser les ports d'E/S d'un microcontrôleur. Lorsque MR (broche 10) est à niveau haut et que OE (broche 13) est à niveau bas, les données sont saisies sur le front montant de SHcp et vont dans le registre de mémoire via le front montant de SHcp. Si les deux horloges sont connectées ensemble, le registre à décalage est toujours un impulsion en avance par rapport au registre de mémoire. Il y a une broche d'entrée série (Ds), une broche de sortie série (Q) et un bouton de réinitialisation asynchrone (niveau bas) dans le registre de mémoire. Le registre de mémoire fournit une sortie parallèle 8 bits en trois états. Lorsque OE est activé (niveau bas), les données du registre de mémoire sont envoyées sur le bus. .. image:: img/74hc595_sche.png :width: 400 :align: center **Broches du 74HC595 et leurs fonctions** : * **Q0-Q7** : Broches de sortie de données parallèles 8 bits, capables de contrôler directement 8 LEDs ou 8 segments d'un afficheur 7 segments. * **Q7'** : Broche de sortie série, connectée à DS d'un autre 74HC595 pour les connecter en série. * **MR** : Broche de réinitialisation, active à niveau bas. * **SHcp** : Entrée de séquence temporelle du registre à décalage. Sur le front montant, les données du registre à décalage se déplacent successivement d'un bit, par exemple, les données en Q1 se déplacent vers Q2, et ainsi de suite. Sur le front descendant, les données du registre à décalage restent inchangées. * **STcp** : Entrée de séquence temporelle du registre de stockage. Sur le front montant, les données du registre à décalage se déplacent dans le registre de mémoire. * **CE** : Broche d'activation de sortie, active à niveau bas. * **DS** : Broche d'entrée de données série. * **VCC** : Tension d'alimentation positive. * **GND** : Masse. Schéma de montage ------------------- Connectez la broche ST_CP du 74HC595 au GPIO18 du Raspberry Pi, SH_CP au GPIO27, DS au GPIO17, et les ports de sortie parallèles aux 8 segments de l'afficheur à 7 segments. Les données sont saisies via la broche DS dans le registre à décalage lorsque SH_CP (l'entrée d'horloge du registre à décalage) est au front montant, et dans le registre de mémoire lorsque ST_CP (l'entrée d'horloge du registre de mémoire) est au front montant. Vous pouvez ensuite contrôler les états de SH_CP et ST_CP via les GPIOs du Raspberry Pi pour convertir les données d'entrée série en sortie parallèle, économisant ainsi des GPIOs du Raspberry Pi et pilotant l'affichage. ============ ======== ======== === 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 Procédures expérimentales ----------------------------- **Étape 1 :** Construisez le circuit. .. image:: img/image73.png :width: 800 Pour les utilisateurs du langage C ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Étape 2 : Accédez au dossier du code. .. raw:: html .. code-block:: cd ~/davinci-kit-for-raspberry-pi/c/1.1.4/ Étape 3 : Compilez le code. .. raw:: html .. code-block:: gcc 1.1.4_7-Segment.c -lwiringPi Étape 4 : Exécutez le fichier exécutable ci-dessus. .. raw:: html .. code-block:: sudo ./a.out Après l'exécution du code, vous verrez l'affichage 7 segments afficher les chiffres de 0 à 9, puis les lettres de A à F. .. note:: Si cela ne fonctionne pas après l'exécution, ou si un message d'erreur apparaît : "wiringPi.h: No such file or directory", veuillez consulter :ref:`faq_c_nowork`. **Code** .. code-block:: c #include #include #define SDI 0 //entrée de données série #define RCLK 1 //entrée d'horloge mémoire (STCP) #define SRCLK 2 //entrée d'horloge registre à décalage (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){ //en cas d'échec de l'initialisation de wiring, afficher un message à l'écran printf("setup wiringPi failed !"); return 1; } init(); while(1){ for(i=0;i<16;i++){ printf("Print %1X on Segment\n", i); // %X means hex output hc595_shift(SegCode[i]); delay(500); } } return 0; } **Explication du Code** unsigned char SegCode[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; Un tableau de codes de segments de 0 à F en Hexadécimal (cathode commune). .. code-block:: c void init(void){ pinMode(SDI, OUTPUT); pinMode(RCLK, OUTPUT); pinMode(SRCLK, OUTPUT); digitalWrite(SDI, 0); digitalWrite(RCLK, 0); digitalWrite(SRCLK, 0); } Configurer les trois broches ds, st_cp, sh_cp comme des sorties, et définir l'état initial à 0. .. code-block:: c digitalWrite(SDI, 0x80 & (dat << i)); Assigner les données dat à SDI(DS) bit par bit. Si dat=0x3f(0011 1111), quand i=2, 0x3f se décalera de 2 bits vers la gauche. 1111 1100 (0x3f << 2) & 1000 0000 (0x80) = 1000 0000, est vrai. .. code-block:: c digitalWrite(SRCLK, 1); La valeur initiale de SRCLK était à 0, et ici elle est mise à 1, ce qui génère une impulsion montante, puis déplace la donnée DS vers le registre à décalage. .. code-block:: c digitalWrite(RCLK, 1); La valeur initiale de RCLK était à 0, et ici elle est mise à 1, ce qui génère une impulsion montante, puis déplace les données du registre à décalage vers le registre de stockage. .. code-block:: c while(1){ for(i=0;i<16;i++){ printf("Print %1X on Segment\n", i); // %X means hex output hc595_shift(SegCode[i]); delay(500); } } Dans cette boucle for, nous utilisons \"%1X\" pour afficher i en tant que nombre hexadécimal. Appliquez i pour trouver le code de segment correspondant dans le tableau SegCode[], et utilisez hc595_shift() pour passer le code SegCode au registre à décalage du 74HC595. Pour les utilisateurs du langage Python ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Étape 2 : Accédez au dossier du code. .. raw:: html .. code-block:: cd ~/davinci-kit-for-raspberry-pi/python/ Étape 3 : Exécutez. .. raw:: html .. code-block:: sudo python3 1.1.4_7-Segment.py Après l'exécution du code, l'affichage 7 segments affichera 0-9, A-F. **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 ``davinci-kit-for-raspberry-pi/python``. .. raw:: html .. code-block:: python import RPi.GPIO as GPIO import time # Définir les broches SDI = 17 RCLK = 18 SRCLK = 27 # Définir un code de segment de 0 à F en Hexadécimal # Cathode commune 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) # Transférer les données au 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: # Transférer le code un par un depuis la liste segCode for code in segCode: hc595_shift(code) print ("segCode[%s]: 0x%02X"%(segCode.index(code), code)) # %02X means double digit HEX to print time.sleep(0.5) def destroy(): GPIO.cleanup() if __name__ == '__main__': setup() try: main() except KeyboardInterrupt: destroy() **Explication du Code** .. code-block:: python segCode = [0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71] Un tableau de codes de segments de 0 à F en Hexadécimal (cathode commune). .. 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) Configurer les trois broches ds, st_cp, sh_cp comme des sorties, et définir l'état initial à bas niveau. .. code-block:: python GPIO.output(SDI, 0x80 & (dat << bit)) Assigner les données dat à SDI(DS) bit par bit. Ici, si dat=0x3f (0011 1111), lorsque bit=2, 0x3f sera décalé de 2 bits vers la gauche. 1111 1100 (0x3f << 2) & 1000 0000 (0x80) = 1000 0000, ce qui est vrai. .. code-block:: python GPIO.output(SRCLK, GPIO.HIGH) La valeur initiale de SRCLK était à LOW, et ici elle est définie à HIGH, ce qui génère une impulsion montante, déplaçant ensuite la donnée DS vers le registre à décalage. .. code-block:: python GPIO.output(RCLK, GPIO.HIGH) La valeur initiale de RCLK était à LOW, et ici elle est définie à HIGH, ce qui génère une impulsion montante, puis transfère les données du registre à décalage vers le registre de stockage. .. note:: Le format hexadécimal des nombres de 0 à 15 est (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F) Image du phénomène ------------------------- .. image:: img/image74.jpeg