.. 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 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 exclusifs.
- **Réductions spéciales** : Profitez de réductions exclusives sur nos nouveaux produits.
- **Promotions festives et concours** : Participez à des concours et à des promotions spéciales pendant les fêtes.
👉 Prêt à explorer et créer avec nous ? Cliquez sur [|link_sf_facebook|] et rejoignez-nous dès aujourd'hui !
.. _2.2.1_c_mcp3008:
2.2.1 Photoresistor (MCP3008)
=============================
.. note::
.. image:: img/mcp3008_and_adc0834.jpg
:width: 25%
:align: left
Selon la version de votre kit, identifiez si vous avez **ADC0834** ou **MCP3008** et suivez la section correspondante.
Introduction
------------
La photorésistance est un composant couramment utilisé pour mesurer l’intensité lumineuse ambiante.
Elle aide le contrôleur à distinguer le jour et la nuit et à réaliser des fonctions de contrôle de la lumière, telles qu'une lampe de nuit.
Ce projet est très similaire à celui du potentiomètre : au lieu de changer la tension en fonction de la position, il le fait en fonction de la lumière.
Composants requis
-----------------
Dans ce projet, nous avons besoin des composants suivants.
.. image:: img/list2_2.2.1_photoresistor.png
Principe
--------
Une photorésistance ou cellule photoélectrique est une résistance variable commandée par la lumière.
Sa résistance diminue lorsque l’intensité lumineuse incidente augmente ; en d’autres termes, elle présente une photoconductivité.
Une photorésistance peut être utilisée dans des circuits détecteurs sensibles à la lumière, ainsi que dans des circuits de commutation activés par la lumière ou par l'obscurité.
.. image:: img/image196.png
:width: 200
:align: center
Schéma de câblage
-----------------
.. list-table::
:widths: 30 30 30 30
:header-rows: 1
* - Nom sur la carte T
- Broche physique
- WiringPi
- BCM
* - SPICE0
- pin24
- 10
- 8
* - SPIMOSI
- pin19
- 12
- 10
* - SPIMISO
- pin21
- 13
- 9
* - SPISCLK
- pin23
- 14
- 11
* - GPIO22
- pin15
- 3
- 22
.. image:: img/schematic_2.2.1_photoresistor_mcp3008.png
Procédure expérimentale
-----------------------
**Étape 1 :** Construire le circuit.
.. image:: img/july24_2.2.1_photoresistor_mcp3008.png
Pour les utilisateurs du langage C
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
**Étape 2 :** Aller dans le dossier du code.
.. raw:: html
.. code-block::
cd ~/davinci-kit-for-raspberry-pi/c/2.2.1-2/
**Étape 3 :** Compiler le code.
.. raw:: html
.. code-block::
gcc 2.2.1_Photoresistor.c -o photoresistor -lwiringPi -lm
**Étape 4 :** Exécuter le fichier compilé.
.. raw:: html
.. code-block::
./photoresistor
Lorsque le code s’exécute, la luminosité de la LED changera en fonction de l’intensité lumineuse détectée par la photorésistance.
.. note::
Si le programme ne fonctionne pas ou affiche l'erreur : « wiringPi.h: No such file or directory », reportez-vous à :ref:`install_wiringpi`.
**Code**
.. code-block:: c
#include
#include
#include
#include
#define SPI_CHANNEL 0 // Utiliser le canal SPI 0 (CE0)
#define SPI_SPEED 1000000 // Vitesse SPI 1 MHz
#define LedPin 3 // GPIO3 (WiringPi) pour le PWM de la LED
// Lecture de la valeur ADC depuis MCP3008, canal 0~7
int readMCP3008(int channel) {
if (channel < 0 || channel > 7) return -1;
unsigned char buffer[3];
buffer[0] = 1; // Bit de démarrage
buffer[1] = (8 + channel) << 4; // SGL/DIF = 1, D2-D0 = canal
buffer[2] = 0;
wiringPiSPIDataRW(SPI_CHANNEL, buffer, 3);
// Combiner le résultat
int result = ((buffer[1] & 3) << 8) | buffer[2];
return result;
}
int main(void) {
if (wiringPiSetup() == -1) {
printf("Échec de l'initialisation de wiringPi !\n");
return 1;
}
if (wiringPiSPISetup(SPI_CHANNEL, SPI_SPEED) == -1) {
printf("Échec de la configuration SPI !\n");
return 1;
}
softPwmCreate(LedPin, 0, 100); // Initialiser le PWM logiciel
while (1) {
int analogVal = readMCP3008(0); // Lecture depuis CH0
printf("Valeur ADC : %d\n", analogVal);
// Mise à l’échelle 10 bits (0–1023) vers plage PWM (0–100)
int pwmVal = analogVal * 100 / 1023;
softPwmWrite(LedPin, pwmVal);
delay(100);
}
return 0;
}
**Explication du code**
Le code est identique à celui de la section 2.1.4 Potentiomètre. Pour plus de détails, reportez-vous à :ref:`2.1.4_c_mcp3008`.
Pour les utilisateurs Python
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
**Étape 2 :** Configurer l’interface SPI et installer la bibliothèque ``spidev`` (voir :ref:`spi_configuration` pour plus de détails). Si vous l’avez déjà fait, passez cette étape.
**Étape 3 :** Aller dans le dossier du code.
.. raw:: html
.. code-block::
cd ~/davinci-kit-for-raspberry-pi/python
**Étape 4 :** Exécuter le fichier.
.. raw:: html
.. code-block::
sudo python3 2.2.1-2_photoresistor.py
Lorsque le code s’exécute, la luminosité de la LED changera en fonction de l’intensité lumineuse détectée par la photorésistance.
.. warning::
Si l’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.
Avant cela, placez-vous dans le dossier source ``davinci-kit-for-raspberry-pi/python``.
Après modification, exécutez-le directement pour voir le résultat.
.. raw:: html
.. code-block:: python
#!/usr/bin/env python3
import RPi.GPIO as GPIO
import spidev
import time
# GPIO pour la LED PWM
PWM_PIN = 22
# Configuration GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(PWM_PIN, GPIO.OUT)
# Initialisation PWM (fréquence = 1000 Hz)
pwm = GPIO.PWM(PWM_PIN, 1000)
pwm.start(0) # Démarrer avec un cycle de service de 0%
# Initialisation SPI (MCP3008 sur Bus 0, CE0)
spi = spidev.SpiDev()
spi.open(0, 0)
spi.max_speed_hz = 1000000 # 1 MHz
# Fonction de lecture ADC depuis MCP3008
def read_adc(channel):
"""
Lire une valeur analogique depuis MCP3008 (canal 0–7)
Retour : valeur 10 bits (0–1023)
"""
if channel < 0 or channel > 7:
return -1
r = spi.xfer2([1, (8 + channel) << 4, 0])
value = ((r[1] & 3) << 8) | r[2]
return value
# Boucle principale : lecture ADC et ajustement PWM
try:
while True:
analogVal = read_adc(0)
print(f"value = {analogVal}")
# Mise à l’échelle (0–1023) vers cycle de service (0–100)
duty_cycle = analogVal * 100 / 1023
pwm.ChangeDutyCycle(duty_cycle)
time.sleep(0.2)
except KeyboardInterrupt:
pass
finally:
pwm.stop()
GPIO.cleanup()
spi.close()
**Explication du code**
#. Importer les bibliothèques nécessaires :
- ``RPi.GPIO`` : contrôle des broches GPIO et génération du signal PWM.
- ``spidev`` : communication SPI avec le MCP3008.
- ``time`` : gestion des temporisations.
.. code-block:: python
#!/usr/bin/env python3
import RPi.GPIO as GPIO
import spidev
import time
#. Configurer la broche GPIO 22 comme sortie PWM en mode BCM et initialiser le PWM à 1000 Hz.
.. code-block:: python
# GPIO pin for PWM LED
PWM_PIN = 22
# Setup GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(PWM_PIN, GPIO.OUT)
# Initialize PWM (frequency = 1000Hz)
pwm = GPIO.PWM(PWM_PIN, 1000)
pwm.start(0) # Start with 0% duty cycle
#. Configurer l’interface SPI avec MCP3008 sur bus 0, CE0, vitesse 1 MHz.
.. code-block:: python
# Initialize SPI (MCP3008 on Bus 0, CE0)
spi = spidev.SpiDev()
spi.open(0, 0)
spi.max_speed_hz = 1000000 # 1 MHz
#. Définir la fonction ``read_adc(channel)`` pour lire une valeur analogique sur un canal MCP3008 et la retourner en entier 10 bits.
.. code-block:: python
# Function to read MCP3008 ADC value
def read_adc(channel):
"""
Read analog value from MCP3008 (channel 0–7)
Returns: 10-bit value (0–1023)
"""
if channel < 0 or channel > 7:
return -1
r = spi.xfer2([1, (8 + channel) << 4, 0])
value = ((r[1] & 3) << 8) | r[2]
return value
#. Boucle principale :
- Lire la valeur analogique sur le canal 0.
- Convertir la valeur en cycle de service pour PWM.
- Ajuster la luminosité de la LED avec ``pwm.ChangeDutyCycle()``.
- Répéter toutes les 0,2 s.
.. code-block:: python
# Main loop to read ADC and set PWM brightness
try:
while True:
analogVal = read_adc(0)
print(f"value = {analogVal}")
# Scale ADC value (0–1023) to duty cycle (0–100)
duty_cycle = analogVal * 100 / 1023
pwm.ChangeDutyCycle(duty_cycle)
time.sleep(0.2)
#. En cas d’interruption (Ctrl+C), arrêter correctement le PWM, nettoyer les GPIO et fermer l’interface SPI.
.. code-block:: python
except KeyboardInterrupt:
pass
finally:
pwm.stop()
GPIO.cleanup()
spi.close()