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 [Ici] et rejoignez‑nous dès aujourd’hui !

2.2.1 Photo‑résistance (MCP3008)

Note

../_images/mcp3008_and_adc0834.jpg

Selon la version de votre kit, veuillez identifier si vous avez ADC0834 ou MCP3008 et suivre la section correspondante.

Introduction

La photo‑résistance est un composant couramment utilisé pour détecter 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, comme les lampes de nuit. Ce projet est très similaire au potentiomètre, la différence étant que la variation de tension provient ici de la lumière.

Composants requis

Dans ce projet, nous avons besoin des composants suivants :

../_images/list2_2.2.1_photoresistor.png

Il est évidemment plus pratique d’acheter un kit complet, voici le lien :

Nom

ÉLÉMENTS DANS CE KIT

LIEN

Kit Raphael

337

Raphael Kit

Vous pouvez également les acheter séparément via les liens ci‑dessous :

INTRODUCTION DU COMPOSANT

LIEN D’ACHAT

Carte d’extension GPIO

ACHETER

Plaque d’expérimentation (Breadboard)

ACHETER

Fils de Liaison

ACHETER

Résistance

ACHETER

LED

ACHETER

MCP3008

-

Photoresistor

ACHETER

Schéma

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

../_images/schematic_2.2.1_photoresistor_mcp3008.png

Procédure expérimentale

Étape 1 : Construire le circuit.

../_images/july24_2.2.1_photoresistor_mcp3008.png

Étape 2 : Configurer l’interface SPI et installer la bibliothèque spidev (voir Configuration SPI pour les instructions détaillées). Si vous avez déjà effectué ces étapes, vous pouvez les ignorer.

Étape 3 : Aller dans le dossier du code.

cd ~/raphael-kit/python

Étape 4 : Exécuter le fichier.

sudo python3 2.2.1-2_photoresistor.py

Lorsque le programme s’exécute, la luminosité de la LED change en fonction de l’intensité lumineuse détectée par la photo‑résistance.

Avertissement

Si un message d’erreur RuntimeError: Cannot determine SOC peripheral base address apparaît, reportez‑vous à Si « gpiozero » ne fonctionne pas..

Code

Note

Vous pouvez Modifier/Réinitialiser/Copier/Exécuter/Arrêter le code ci‑dessous. Mais avant cela, vous devez vous placer dans le chemin du code source comme raphael-kit/python. Après modification, vous pouvez exécuter directement le programme pour voir l’effet.

#!/usr/bin/env python3

import RPi.GPIO as GPIO
import spidev
import time

# Broche GPIO pour la LED PWM
PWM_PIN = 22

# Configuration GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(PWM_PIN, GPIO.OUT)

# Initialiser la PWM (fréquence = 1000Hz)
pwm = GPIO.PWM(PWM_PIN, 1000)
pwm.start(0)  # Démarrer avec un cycle de service de 0%

# Initialiser SPI (MCP3008 sur Bus 0, CE0)
spi = spidev.SpiDev()
spi.open(0, 0)
spi.max_speed_hz = 1000000  # 1 MHz

# Fonction de lecture de la valeur ADC du MCP3008
def read_adc(channel):
    """
    Lit la valeur analogique depuis MCP3008 (canal 0–7)
    Retourne : valeur sur 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 pour lire l’ADC et régler la luminosité PWM
try:
    while True:
        analogVal = read_adc(0)
        print(f"value = {analogVal}")

        # Conversion de la valeur ADC (0–1023) en cycle PWM (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

  1. Importer les bibliothèques nécessaires :

    • RPi.GPIO pour contrôler les broches GPIO et générer le signal PWM.

    • spidev pour communiquer avec l’ADC MCP3008 via SPI.

    • time pour gérer les temporisations.

    #!/usr/bin/env python3
    
    import RPi.GPIO as GPIO
    import spidev
    import time
    
  2. Configurer la broche GPIO 22 en sortie PWM en mode BCM, initialiser la PWM à 1000 Hz avec un cycle initial de 0 %.

    PWM_PIN = 22
    
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(PWM_PIN, GPIO.OUT)
    
    pwm = GPIO.PWM(PWM_PIN, 1000)
    pwm.start(0)
    
  3. Configurer l’interface SPI pour communiquer avec le MCP3008 sur le bus 0 et CE0, avec une vitesse de 1 MHz.

    spi = spidev.SpiDev()
    spi.open(0, 0)
    spi.max_speed_hz = 1000000
    
  4. Définir la fonction read_adc(channel) pour lire une valeur analogique sur le MCP3008. Elle envoie trois octets au circuit et recompose une valeur de 10 bits (0–1023).

    def read_adc(channel):
        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
    
  5. Boucle principale : - Lit l’entrée analogique sur le canal 0 du MCP3008. - Convertit la valeur en cycle PWM (0–100 %). - Ajuste la luminosité de la LED avec pwm.ChangeDutyCycle(). - Répète toutes les 0,2 s.

    try:
        while True:
            analogVal = read_adc(0)
            print(f"value = {analogVal}")
    
            duty_cycle = analogVal * 100 / 1023
            pwm.ChangeDutyCycle(duty_cycle)
            time.sleep(0.2)
    
  6. En cas d’interruption (Ctrl+C), la PWM et les GPIO sont arrêtés proprement et l’interface SPI est fermée.

    except KeyboardInterrupt:
        pass
    
    finally:
        pwm.stop()
        GPIO.cleanup()
        spi.close()