Note

Bonjour, bienvenue dans la communauté SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts sur Facebook ! Approfondissez vos connaissances sur 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.

  • Réductions spéciales : Profitez de réductions exclusives sur nos tout derniers produits.

  • Promotions et cadeaux festifs : Participez à des concours et promotions spéciales pendant les fêtes.

👉 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, 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.

../_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 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

Potentiomètre

ACHETER

MCP3008

-

Schéma de câblage

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édures expérimentales

Étape 1 : Construisez le circuit.

../_images/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 la rainure de la puce doit être orientée vers la gauche lors de son placement.

Étape 2 : Ouvrez le fichier du code.

cd ~/raphael-kit/c/2.1.7-2/

Étape 3 : Compilez le code.

gcc 2.1.7_Potentiometer.c -lwiringPi

Étape 4 : Exécutez.

sudo ./a.out

Après exécution du code, tournez le bouton du potentiomètre, l’intensité de la LED changera en conséquence.

Note

Si cela ne fonctionne pas après exécution ou s’il y a un message d’erreur : « wiringPi.h : No such file or directory », veuillez vous référer à Installer et vérifier WiringPi.

Code

#include <wiringPi.h>
#include <wiringPiSPI.h>
#include <stdio.h>
#include <softPwm.h>

#define SPI_CHANNEL 0  // CE0
#define SPI_SPEED   1000000  // 1MHz
#define LedPin      3

int readADC(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;            // Mode simple, canal
    buffer[2] = 0;

    wiringPiSPIDataRW(SPI_CHANNEL, buffer, 3);

    int value = ((buffer[1] & 3) << 8) | buffer[2];
    return value;
}

int main(void) {
    if (wiringPiSetup() == -1) {
        printf("Initialisation WiringPi échouée !\n");
        return 1;
    }

    if (wiringPiSPISetup(SPI_CHANNEL, SPI_SPEED) == -1) {
        printf("Configuration SPI échouée !\n");
        return 1;
    }

    softPwmCreate(LedPin, 0, 100);

    while (1) {
        int analogVal = readADC(0);  // CH0
        printf("Valeur ADC : %d\n", analogVal);

        int pwmVal = analogVal * 100 / 1023;  // Normalisation 0–100
        softPwmWrite(LedPin, pwmVal);

        delay(100);
    }

    return 0;
}

Explication du code

#define SPI_CHANNEL 0  // CE0
#define SPI_SPEED   1000000  // 1MHz
#define LedPin      3

Définit le canal SPI sur CE0 (chip enable 0), la vitesse SPI sur 1 MHz, et assigne la broche GPIO3 à la LED.

int readADC(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;            // Mode simple, canal
    buffer[2] = 0;

    wiringPiSPIDataRW(SPI_CHANNEL, buffer, 3);

    int value = ((buffer[1] & 3) << 8) | buffer[2];
    return value;
}

Cette fonction lit les données analogiques depuis le MCP3008.

  • Elle vérifie d’abord si le numéro du canal est valide (0 à 7).

  • Elle initialise un tableau de 3 octets, où : * buffer[0] = 1 : Bit de démarrage pour la communication MCP3008. * buffer[1] = (8 + channel) << 4 : Construit l’octet de configuration pour le mode simple et sélectionne le canal souhaité. * buffer[2] = 0 : Octet de réception pour le résultat.

  • wiringPiSPIDataRW envoie et reçoit des données via le canal SPI.

  • La valeur retournée est extraite des deux derniers octets par opérations binaires afin d’obtenir un résultat ADC 10 bits.

int main(void) {
    if (wiringPiSetup() == -1) {
        printf("Initialisation WiringPi échouée !\n");
        return 1;
    }

    if (wiringPiSPISetup(SPI_CHANNEL, SPI_SPEED) == -1) {
        printf("Configuration SPI échouée !\n");
        return 1;
    }

    softPwmCreate(LedPin, 0, 100);

    while (1) {
        int analogVal = readADC(0);  // CH0
        printf("Valeur ADC : %d\n", analogVal);

        int pwmVal = analogVal * 100 / 1023;  // Normalisation 0–100
        softPwmWrite(LedPin, pwmVal);

        delay(100);
    }

    return 0;
}

Dans la fonction principale :

  • wiringPiSetup() initialise la bibliothèque WiringPi.

  • wiringPiSPISetup() initialise la communication SPI sur le canal 0 à 1 MHz.

  • softPwmCreate() configure le PWM logiciel sur GPIO3 avec un cycle initial de 0 et une plage de 0–100.

Le programme entre dans une boucle infinie où :

  • Il lit la valeur ADC du canal 0 (connecté à un potentiomètre).

  • Affiche la valeur ADC dans le terminal.

  • Convertit la valeur ADC 10 bits en un cycle de service PWM compris entre 0 et 100.

  • Écrit la valeur PWM dans la LED, de sorte que la luminosité reflète la position du potentiomètre.

delay(100) effectue une pause de 100 millisecondes avant le prochain cycle lecture/écriture.