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.
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.
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 :
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)