Ignorer et passer au contenu

Livraison offerte à partir de 50€ d'achats, livrée sous 48h !

Livraison à partir de seulement 2.50€ !

Contents Menu Expand Light mode Dark mode Auto light/dark mode

Mesurer une tension analogique avec l’ADC de la Pi Pico en MicroPython

(Mis à jour le 12/12/2022)

Certaines broches de la Raspberry Pi Pico sont dotées d’un ADC. Un ADC (Analog Digital Converter) est un convertisseur analogique vers numérique : il renvoie une valeur numérique proportionnelle à la tension mesurée.

Note

En français, un ADC est généralement appelé un CAN , pour Convertisseur Analogique Numérique. Pour éviter toute confusion, il est recommandé d’utiliser l’acronyme anglais ADC au lieu de CAN, car il existe également un bus CAN, un protocole de communication très répandu dans le monde automobile.

Caractéristiques de l’ADC de la Pi Pico

Les broches 26, 27 et 28 de la Raspberry Pi Pico sont des entrées analogiques qui peuvent mesurer des valeurs sur 16 bits, allant de 0 à 65535.

Note

Sur la carte uPesy RP2040 DevKit , il existe une entrée analogique supplémentaire sur la broche 29.

Astuce

Il existe une entrée analogique « cachée » dans le microcontrôleur RP2040 qui permet de mesurer directement la température de la puce. C’est un peu équivalent aux mesures de températures des CPU des ordinateurs. Il ne faut pas l’utiliser pour connaître la température de la pièce. Cette entrée correspond au canal ADC_4 .

Avertissement

Contrairement à l’Arduino, la tension d’entrée sur ces entrées analogiques ne doit pas dépasser 3.3V, car une tension plus élevée pourrait endommager l’ADC. Pour remédier à ce problème, ils existent des solutions pour limiter la tension d’entrée à 3.3V.

Lire une entrée analogique avec MicroPython

Pour mesurer la tension d’une entrée analogique, on utilise le sous-module ADC du module machine . On associe une broche à l’objet ADC .

from machine import Pin, ADC

# Pin definitions
adc_pin = Pin(26, mode=Pin.IN)
adc = ADC(adc_pin)

On peut également créer un objet ADC en spécifiant le numéro du canal analogique que l’on souhaite utiliser.

from machine import ADC
adc = ADC(0) # Select the ADC_0 ()

Une fois l’entrée analogique configurée en MicroPython, il suffit d’utiliser la fonction .read_u16() sur la Raspberry Pi Pico pour lire la valeur analogique.

from machine import Pin, ADC
adc = ADC(Pin(26, mode=Pin.IN))
print(adc.read_u16())

Il est nécessaire de réaliser un produit en croix pour convertir la valeur binaire de l’ADC en volts.

\[V_{volt} = \frac{3.3V}{65535} \times V_{bits}\]

Mesurer la température interne de la Raspberry Pi Pico

La Raspberry Pi Pico possède un capteur de température interne pour mesurer la température de la puce RP2040. Bien que pas très fiable pour avoir la température de la pièce, il permet de connaître la température de la puce (comme la température des CPU sur les ordinateurs). Ce capteur est directement relié à l’entrée ADC_4 de l’ADC.

capteur interne température pi pico via le can

Le capteur interne de température est positionné sur la dernière broche de l’ADC

Pour mesurer la température, il faut :

  • Récupérer la valeur analogique brute du capteur de température disponible sur le canal 4 de l’ADC.

  • Convertir cette valeur en tension

  • Utiliser une formule donnée dans la documentation du RP240 pour convertir cette tension en température (en °C).

from machine import ADC
import time

temp_sensor = ADC(4)

while True:
    adc_voltage = temp_sensor.read_u16() * 3.3 / 65535
    cpu_temp = 27 - (adc_voltage - 0.706)/0.001721 # Formula given in RP2040 Datasheet
    print(cpu_temp)
    time.sleep_ms(1_000)

Note

Vous pouvez constater le changement de température en mettant votre doigt sur la puce RP2040.

Sortie de la console REPL :

32.19402
32.19402
32.66216
31.72584
33.13027
33.59842
34.06656
34.06656
34.53474
34.06656

Mini-Projet : Contrôler l’intensité d’une LED via un potentiomètre

Nous allons utiliser à la fois le PWM, l’ADC et MicroPython afin de contrôler l’intensité d’une LED externe. Le circuit à monter sur la breadboard est le suivant :

Schéma de câblage Pico adc potentiomètre avec LED

Circuit électrique à réaliser

Schéma de câblage RP2040 adc potentiomètre avec LED

Circuit électrique à réaliser

Note

N’oubliez pas de mettre une résistance en série avec la LED (par exemple de 330Ω) pour éviter qu’elle ne soit endommagée.

Ce script Python permet de lire la position du potentiomètre via l’ADC de la Raspberry Pi Pico :

from machine import Pin, ADC
import time


# Create an ADC object linked to pin 26
adc = ADC(Pin(26, mode=Pin.IN))

while True:

    # Read ADC and convert to voltage
    val = adc.read_u16()
    val = val * (3.3 / 65535)
    print(round(val, 2), "V") # Keep only 2 digits

    # Wait a bit before taking another reading
    time.sleep_ms(100)

Ce dernier script permet de lire la position du potentiomètre et de faire varier la luminosité en conséquence.

from machine import Pin, ADC, PWM
import time

# Create a PWM object linked to pin 15
pwm_led = PWM(Pin(15,mode=Pin.OUT))
pwm_led.freq(1_000)

# Create an ADC object linked to pin 26
adc = ADC(Pin(26, mode=Pin.IN))

while True:

    val = adc.read_u16()
    pwm_led.duty_u16(val)
    time.sleep_ms(10)