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.1.7 Potentiomètre (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 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, qui modifie une 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 :

../_images/list2_2.1.4_potentiometer.png

Il est bien sûr 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 à partir des 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

Potentiomètre

ACHETER

MCP3008

-

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.1.7_potentiometer_mcp3008.png

Procédure expérimentale

Étape 1 : Construire le circuit.

../_images/july24_2.1.7_potentiometer_mcp3008.png

Note

Placez la puce en vous référant à la position correspondante représentée sur l’image. Remarquez que les encoches de la puce doivent être sur la gauche lorsqu’elle est installée.

É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 : Ouvrir le fichier de code.

cd ~/raphael-kit/python

Étape 4 : Exécuter le programme.

sudo python3 2.1.7-2_Potentiometer.py

Une fois le programme exécuté, tournez le bouton du potentiomètre : l’intensité de la LED changera en conséquence.

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 spidev
import time
import RPi.GPIO as GPIO

# Broche GPIO pour la sortie PWM
PWM_PIN = 22

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

# Initialiser le PWM sur GPIO22 à 1000 Hz
pwm = GPIO.PWM(PWM_PIN, 1000)
pwm.start(0)  # Démarre avec un rapport cyclique de 0 %

# Initialiser le SPI
spi = spidev.SpiDev()
spi.open(0, 0)  # Bus 0, CE0
spi.max_speed_hz = 1000000

def read_adc(channel):
    """
    Lire la valeur analogique depuis le 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 la valeur analogique du canal 0
        res = read_adc(0)
        print('res = %d' % res)

        # Convertir en rapport cyclique de 0 à 100 %
        duty_cycle = MAP(res, 0, 1023, 0, 100)

        # Mettre à jour le rapport cyclique du PWM
        pwm.ChangeDutyCycle(duty_cycle)

        time.sleep(0.2)

except KeyboardInterrupt:
    pass

finally:
    pwm.stop()
    GPIO.cleanup()
    spi.close()

Explication du code

  1. RPi.GPIO est utilisé pour générer des signaux PWM afin de contrôler une LED. spidev est utilisé pour la communication SPI avec le MCP3008. time est utilisé pour insérer des temporisations dans la boucle.

    #!/usr/bin/env python3
    
    import spidev
    import time
    import RPi.GPIO as GPIO
    
  2. Configurer la broche GPIO 22 pour la sortie PWM via RPi.GPIO. Configurer la communication SPI avec le MCP3008 (Bus 0, CE0) à 1 MHz.

    PWM_PIN = 22
    
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(PWM_PIN, GPIO.OUT)
    
    pwm = GPIO.PWM(PWM_PIN, 1000)  # fréquence 1 kHz
    pwm.start(0)  # démarrage avec 0 %
    
    spi = spidev.SpiDev()
    spi.open(0, 0)
    spi.max_speed_hz = 1000000
    
  3. Cette fonction lit les données analogiques du MCP3008 sur le canal spécifié (0 – 7) via le protocole SPI. Le résultat est un entier 10 bits allant de 0 à 1023.

    def read_adc(channel):
        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
    
  4. Cette fonction mappe une valeur d’une plage numérique à une autre. Elle est utilisée pour convertir la valeur ADC en un rapport cyclique PWM.

    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
    
  5. Dans la boucle principale, le programme lit en continu les données analogiques du canal 0 du MCP3008, les mappe à une plage de PWM (0 – 100 %) et ajuste la luminosité de la LED en conséquence. La boucle se met à jour toutes les 0,2 s. En cas d’interruption (Ctrl+C), le programme arrête le signal PWM et libère la configuration GPIO.

    try:
        while True:
            res = read_adc(0)
            print('res = %d' % res)
    
            duty_cycle = MAP(res, 0, 1023, 0, 100)
            pwm.ChangeDutyCycle(duty_cycle)
    
            time.sleep(0.2)
    
    except KeyboardInterrupt:
        pass
    
    finally:
        pwm.stop()
        GPIO.cleanup()
        spi.close()