.. note::
Bonjour et bienvenue dans la communauté SunFounder Raspberry Pi & Arduino & ESP32 sur Facebook ! Plongez plus profondément dans l’univers du Raspberry Pi, Arduino et ESP32 avec d’autres passionnés.
**Pourquoi nous rejoindre ?**
- **Assistance d’experts** : Résolvez les problèmes après-vente et surmontez les défis techniques avec l’aide de notre communauté et de notre équipe.
- **Apprendre & Partager** : Échangez des conseils et tutoriels pour développer vos compétences.
- **Aperçus exclusifs** : Profitez d’un accès anticipé aux annonces de nouveaux produits et à des avant-premières.
- **Réductions spéciales** : Bénéficiez de remises exclusives sur nos derniers produits.
- **Promotions festives et concours** : Participez à des concours et à des promotions spéciales.
👉 Prêt à explorer et créer avec nous ? Cliquez sur [|link_sf_facebook|] et rejoignez-nous dès aujourd’hui !
.. _2.1.4_py_pi5_mcp3008:
2.1.4 Potentiomètre (MCP3008)
=============================
.. note::
.. image:: ../img/mcp3008_and_adc0834.jpg
:width: 25%
:align: left
Selon la version de votre kit, identifiez si vous disposez d’un **ADC0834** ou d’un **MCP3008** et suivez la section correspondante.
Introduction
------------
La fonction ADC est utilisée pour convertir des 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, ce qui modifie la grandeur physique.
Le MCP3008 convertit ensuite cette tension analogique en une valeur numérique pouvant ê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
Schéma de câblage
-----------------
.. list-table::
:widths: 30 30 30 30
:header-rows: 1
* - Nom sur la 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édures expérimentales
-------------------------
**Étape 1 :** Construire le circuit.
.. image:: ../python_pi5/img/july24_2.1.7_potentiometer_mcp3008.png
.. note::
Veuillez placer la puce en vous référant à la position indiquée sur l’image.
Remarquez que l’encoche de la puce doit être orientée vers la 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 ~/davinci-kit-for-raspberry-pi/python-pi5
**Étape 4 :** Exécuter.
.. raw:: html
.. code-block::
sudo python3 2.1.4-2_Potentiometer_zero.py
Après 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, 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 vous rendre dans le chemin du code source, par exemple ``davinci-kit-for-raspberry-pi/python-pi5``. Après modification, vous pouvez exécuter le code directement 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 le 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 sur 10 bits (0-1023)
"""
if channel < 0 or channel > 7:
return -1
# Protocole MCP3008
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)
# Mapper 0–1023 à 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`` est utilisé pour contrôler la LED PWM, ``spidev`` pour la communication SPI avec le MCP3008, et ``time`` pour introduire des délais.
.. code-block:: python
#!/usr/bin/env python3
import spidev
import time
from gpiozero import PWMLED
#. Initialiser un objet PWMLED connecté à la broche GPIO22 et configurer la communication SPI (Bus 0, CE0) avec MCP3008.
.. code-block:: python
# Initialiser la LED PWM sur GPIO22
led = PWMLED(22)
# Initialiser le SPI
spi = spidev.SpiDev()
spi.open(0, 0) # Bus 0, CS0 (CE0)
spi.max_speed_hz = 1000000
#. Définir la 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):
"""
Lire la valeur analogique depuis MCP3008
:param channel: canal ADC (0-7)
:return: entier sur 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
#. Définir la fonction ``MAP`` pour convertir une plage de valeurs en une autre, utile pour mapper les valeurs ADC aux niveaux de luminosité appropriés 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 ADC dans une boucle, mapper la valeur sur 10 bits (0–1023) à un niveau de luminosité (0–100) pour la LED et ajuster sa luminosité en conséquence. Attendre 0,2 seconde entre chaque lecture.
.. code-block:: python
try:
while True:
# Lire depuis le canal 0 du MCP3008
res = read_adc(0)
print('res = %d' % res)
# Mapper 0–1023 à 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