.. 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 relevez les défis techniques avec l’aide de notre communauté et de notre équipe.
- **Apprendre & 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 à des avant-premières.
- **Réductions spéciales** : Profitez 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.2.1_py_pi5_mcp3008:
2.2.1 Photoresistance (MCP3008)
===============================
.. note::
.. image:: ../img/mcp3008_and_adc0834.jpg
:width: 25%
:align: left
Selon la version de votre kit, identifiez si vous avez un **ADC0834** ou un **MCP3008** et suivez la section correspondante.
Introduction
------------
La photoresistance est un composant couramment utilisé pour mesurer l’intensité lumineuse ambiante.
Elle aide le contrôleur à distinguer le jour de la nuit et à réaliser des fonctions de contrôle de lumière, comme une lampe de nuit.
Ce projet est très similaire à celui du potentiomètre : au lieu de mesurer une variation de tension causée par un réglage manuel,
il mesure la variation de tension causée par la lumière.
Composants requis
-----------------
Dans ce projet, nous avons besoin des composants suivants :
.. image:: ../python_pi5/img/list2_2.2.1_photoresistor.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.2.1_photoresistor_mcp3008.png
Procédures expérimentales
-------------------------
**Étape 1 :** Construire le circuit.
.. image:: ../python_pi5/img/july24_2.2.1_photoresistor_mcp3008.png
**É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 :** Accéder au dossier du code.
.. raw:: html
.. code-block::
cd ~/davinci-kit-for-raspberry-pi/python-pi5
**Étape 4 :** Exécuter le fichier.
.. raw:: html
.. code-block::
sudo python3 2.2.1-2_Photoresistor_zero.py
Lorsque le code est en cours d’exécution, la luminosité de la LED changera en fonction de l’intensité lumineuse détectée par la photoresistance.
.. warning::
Si un message d’erreur apparaît : ``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 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 le résultat.
.. raw:: html
.. code-block:: python
#!/usr/bin/env python3
import spidev
import time
from gpiozero import PWMLED
# Initialiser une LED PWM sur la broche GPIO 22
led = PWMLED(22)
# Initialiser la communication SPI (Bus 0, CE0 -> GPIO8)
spi = spidev.SpiDev()
spi.open(0, 0) # Bus 0, CS0
spi.max_speed_hz = 1000000 # 1 MHz
# Fonction pour lire depuis un canal MCP3008 (0–7)
def read_adc(channel):
"""
Lire une valeur analogique depuis MCP3008 (0–1023)
"""
if channel < 0 or channel > 7:
return -1
# Protocole MCP3008 : bit de démarrage, mode single-ended, canal (3 bits), remplissage
r = spi.xfer2([1, (8 + channel) << 4, 0])
value = ((r[1] & 3) << 8) | r[2]
return value
# Fonction pour mapper une valeur d’un intervalle à un autre
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
# Boucle principale : lire la valeur ADC et contrôler la luminosité de la LED
def loop():
while True:
# Lire la valeur analogique depuis le canal 0 du MCP3008
analogVal = read_adc(0)
print('value = %d' % analogVal)
# Mapper 0–1023 vers la plage PWM 0.0–1.0
led.value = analogVal / 1023.0
# Attendre 0,2 seconde
time.sleep(0.2)
# Lancer la boucle principale et gérer KeyboardInterrupt pour un arrêt propre
try:
loop()
except KeyboardInterrupt:
led.value = 0 # Éteindre la LED avant de quitter
**Explication du code**
#. Cette partie importe la classe ``PWMLED`` de la bibliothèque ``gpiozero`` pour contrôler une LED en PWM,
``spidev`` pour la communication SPI avec le MCP3008, et ``time`` pour introduire des pauses.
.. code-block:: python
#!/usr/bin/env python3
import spidev
import time
from gpiozero import PWMLED
#. Initialise une LED PWM connectée à la broche GPIO 22 et configure l’interface SPI pour le MCP3008 (Bus 0, CE0).
La vitesse d’horloge SPI est réglée à 1 MHz.
.. code-block:: python
# Initialiser une LED PWM sur la broche GPIO 22
led = PWMLED(22)
# Initialiser la communication SPI (Bus 0, CE0 -> GPIO8)
spi = spidev.SpiDev()
spi.open(0, 0) # Bus 0, CS0
spi.max_speed_hz = 1000000 # 1 MHz
#. Définit une fonction pour lire depuis un canal spécifique du MCP3008.
Elle envoie une commande sur 3 octets via SPI et récupère une valeur sur 10 bits (0–1023).
.. code-block:: python
# Fonction pour lire depuis un canal MCP3008 (0–7)
def read_adc(channel):
"""
Lire une valeur analogique depuis MCP3008 (0–1023)
"""
if channel < 0 or channel > 7:
return -1
# Protocole MCP3008 : bit de démarrage, mode single-ended, canal (3 bits), remplissage
r = spi.xfer2([1, (8 + channel) << 4, 0])
value = ((r[1] & 3) << 8) | r[2]
return value
#. Définit une fonction utilitaire ``MAP()`` qui convertit une valeur d’un intervalle à un autre,
utile pour transformer une valeur ADC brute en valeur PWM.
.. code-block:: python
# Fonction pour mapper une valeur d’un intervalle à un autre
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
#. Met en place une boucle qui lit continuellement la valeur analogique depuis le canal 0 du MCP3008,
la convertit en luminosité PWM (0.0–1.0) et l’applique à la LED.
La boucle attend 0,2 seconde entre chaque lecture.
.. code-block:: python
# Boucle principale : lire la valeur ADC et contrôler la luminosité de la LED
def loop():
while True:
# Lire la valeur analogique depuis le canal 0 du MCP3008
analogVal = read_adc(0)
print('value = %d' % analogVal)
# Mapper 0–1023 vers la plage PWM 0.0–1.0
led.value = analogVal / 1023.0
# Attendre 0,2 seconde
time.sleep(0.2)
#. Exécute la boucle et gère l’interruption ``KeyboardInterrupt``.
Lorsque l’utilisateur interrompt le programme (Ctrl+C), la LED est éteinte avant la sortie.
.. code-block:: python
# Lancer la boucle principale et gérer KeyboardInterrupt pour un arrêt propre
try:
loop()
except KeyboardInterrupt:
# Éteindre la LED avant de quitter
led.value = 0