.. note:: Bonjour et bienvenue dans la communauté SunFounder Raspberry Pi & Arduino & ESP32 sur Facebook ! Plongez plus profondément dans l’univers 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 :** Obtenez un accès anticipé aux annonces de nouveaux produits et aux avant‑premières. - **Réductions spéciales :** Profitez de remises exclusives sur nos derniers produits. - **Promotions et concours festifs :** Participez à des concours et promotions de vacances. 👉 Prêt à explorer et créer avec nous ? Cliquez sur [|link_sf_facebook|] et rejoignez‑nous dès aujourd’hui ! .. _2.1.7_py_pi5_mcp3008: 2.1.7 Potentiomètre (MCP3008) ============================= .. note:: .. image:: ../img/mcp3008_and_adc0834.jpg :width: 25% :align: left Selon la version de votre kit, veuillez identifier si vous avez **ADC0834** ou **MCP3008** et suivre la section correspondante. Introduction ------------ La fonction ADC est utilisée pour convertir les signaux analogiques en valeurs numériques. Dans cette expérience, nous utilisons la puce ADC MCP3008 pour effectuer cette conversion. Un potentiomètre est utilisé pour générer une tension variable, qui change la grandeur physique. Le MCP3008 convertit ensuite cette tension analogique en une valeur numérique qui peut être lue et traitée par le Raspberry Pi. Composants requis ----------------- Dans ce projet, nous avons besoin des composants suivants : .. image:: ../python_pi5/img/list2_2.1.4_potentiometer.png Il est évidemment plus pratique d’acheter un kit complet, voici le lien : .. list-table:: :widths: 20 20 20 :header-rows: 1 * - Nom - ÉLÉMENTS 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 DU COMPOSANT - 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_led` - |link_led_buy| * - :ref:`cpn_potentiometer` - |link_potentiometer_buy| * - :ref:`cpn_mcp3008` - \- Schéma ------ .. list-table:: :widths: 30 30 30 30 :header-rows: 1 * - Nom T‑Board - Physique - WiringPi - BCM * - SPICE0 - pin24 - 10 - 8 * - SPIMOSI - pin19 - 12 - 10 * - SPIMISO - pin21 - 13 - 9 * - SPISCLK - pin23 - 14 - 11 * - GPIO22 - pin15 - 3 - 22 .. image:: ../python_pi5/img/schematic_2.1.7_potentiometer_mcp3008.png Procédure expérimentale ----------------------- **Étape 1 :** Construire le circuit. .. image:: ../python_pi5/img/july24_2.1.7_potentiometer_mcp3008.png .. note:: Placez la puce en suivant la position indiquée sur l’image. Remarquez que la rainure de la puce doit être à gauche lorsqu’elle est placée. **Étape 2 :** Configurer l’interface SPI et installer la bibliothèque ``spidev`` (voir :ref:`spi_configuration` pour des instructions détaillées). Si vous avez déjà effectué ces étapes, vous pouvez les ignorer. **Étape 3 :** Ouvrir le fichier de code. .. raw:: html .. code-block:: cd ~/raphael-kit/python-pi5 **Étape 4 :** Exécuter. .. raw:: html .. code-block:: sudo python3 2.1.7-2_Potentiometer_zero.py Après l’exécution du code, tournez le bouton du potentiomètre, l’intensité de la LED changera en conséquence. .. warning:: Si un message d’erreur ``RuntimeError: Cannot determine SOC peripheral base address`` apparaît, reportez‑vous à :ref:`faq_soc`. Code ---- .. note:: Vous pouvez **Modifier/Réinitialiser/Copier/Exécuter/Arrêter** le code ci‑dessous. Mais avant cela, vous devez aller dans le chemin du code source comme ``raphael-kit/python-pi5``. Après modification, vous pouvez exécuter directement le code pour voir l’effet. .. raw:: html .. code-block:: python #!/usr/bin/env python3 import spidev import time from gpiozero import PWMLED # Initialiser la LED PWM sur GPIO22 led = PWMLED(22) # Initialiser SPI spi = spidev.SpiDev() spi.open(0, 0) # Bus 0, CS0 (CE0) spi.max_speed_hz = 1000000 def read_adc(channel): """ Lire la valeur analogique depuis MCP3008 :param channel: canal ADC (0-7) :return: entier 10 bits (0-1023) """ if channel < 0 or channel > 7: return -1 adc = spi.xfer2([1, (8 + channel) << 4, 0]) value = ((adc[1] & 3) << 8) | adc[2] return value def MAP(x, in_min, in_max, out_min, out_max): """ Convertir une valeur d’une plage à une autre """ return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min try: while True: # Lire depuis le canal 0 du MCP3008 res = read_adc(0) print('res = %d' % res) # Convertir 0–1023 en 0–100 % R_val = MAP(res, 0, 1023, 0, 100) # Régler la luminosité de la LED led.value = R_val / 100.0 time.sleep(0.2) except KeyboardInterrupt: led.value = 0 # Éteindre la LED Explication du code ------------------- #. ``gpiozero`` pour le contrôle de la LED PWM, ``spidev`` pour la communication SPI avec le MCP3008 et ``time`` pour gérer les temporisations. .. code-block:: python import spidev import time from gpiozero import PWMLED #. Initialiser un objet PWMLED connecté à la broche GPIO 22 et configurer la communication SPI (Bus 0, CE0) avec MCP3008. .. code-block:: python led = PWMLED(22) spi = spidev.SpiDev() spi.open(0, 0) spi.max_speed_hz = 1000000 #. Définir une fonction ``read_adc`` pour communiquer avec le MCP3008 et lire les valeurs analogiques du canal spécifié (0–7). .. code-block:: python def read_adc(channel): if channel < 0 or channel > 7: return -1 adc = spi.xfer2([1, (8 + channel) << 4, 0]) return ((adc[1] & 3) << 8) | adc[2] #. Définir une fonction ``MAP`` pour convertir une plage de valeurs en une autre, pratique pour mapper les valeurs ADC aux niveaux de luminosité de la LED. .. code-block:: python def MAP(x, in_min, in_max, out_min, out_max): return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min #. Lire continuellement la valeur de l’ADC dans une boucle, convertir la valeur ADC 10 bits (0–1023) en un niveau de luminosité (0–100) pour la LED et ajuster la luminosité de la LED en conséquence. Attendre 0,2 s entre chaque lecture. .. code-block:: python try: while True: res = read_adc(0) print('res = %d' % res) R_val = MAP(res, 0, 1023, 0, 100) led.value = R_val / 100.0 time.sleep(0.2) except KeyboardInterrupt: led.value = 0 # Éteindre la LED