Un capteur analogique délivre une tension continue proportionnelle à la grandeur mesurée. Sur le Pico, on lit cette tension via le convertisseur analogique-numérique (ADC) intégré, par la classe ADC du module [[micropython-modules|machine]]. Capteurs typiques : potentiomètre (rotation), LDR (luminosité), LM35 / TMP36 (température), capteur de force FSR. Cette fiche couvre la lecture ADC, la conversion et les pièges des signaux analogiques.

À quoi ça sert ?

Beaucoup de phénomènes se mesurent par une tension : luminosité, température, position d’un curseur, force. Le capteur convertit le phénomène en tension 0–3,3 V, le Pico la transforme en entier sur lequel on calcule. Le geste à maîtriser est moins la lecture (une ligne) que la conversion correcte entre l’entier brut et la grandeur physique.

Procédure pas à pas

Quatre étapes : connaître son ADC, câbler, lire, convertir.

1. Connaître l’ADC du Pico

Le Pico a un ADC 12 bits, mais MicroPython expose read_u16() qui ramène la lecture sur 16 bits (0–65535) pour l’uniformité entre cartes. La référence est fixe à 3,3 V (pas de référence réglable comme sur Arduino).

CarteRésolution réelleread_u16()Pleine échelle
Pico / Pico 212 bits0 – 65535 (mis à l’échelle)3,3 V
ESP3212 bits0 – 655353,3 V (atténuation réglable)

Les entrées analogiques sont GP26, GP27, GP28. Un canal interne (ADC(4)) mesure la température de la puce.

2. Câbler un potentiomètre

Potentiomètre 10 kΩ : une extrême → 3,3 V, l’autre → GND, curseur (milieu) → GP26. Le potentiomètre forme un pont diviseur variant de 0 V à 3,3 V.

Montage : potentiomètre 10 kΩ sur un Pico — extrémités vers 3,3 V et GND, curseur vers GP26 (ADC0)|600

3. Lecture brute

from machine import ADC, Pin
from time import sleep
 
pot = ADC(Pin(26))      # ou ADC(26) ; entrée analogique sur GP26
 
while True:
    print(pot.read_u16())   # 0 à 65535 (12 bits ramenés sur 16)
    sleep(0.1)              # ~10 lectures par seconde

Tournez le potentiomètre : 0 à 65535, environ 32768 à mi-course.

4. Convertir en grandeur physique

Potentiomètre comme consigne 0–100 % :

pourcentage = pot.read_u16() * 100 / 65535     # règle de trois : 65535 → 100 %

Tension :

tension = pot.read_u16() * 3.3 / 65535     # brut -> volts (réf. 3,3 V, pleine échelle 65535)

Température de la puce (canal interne, formule de la datasheet RP2040) :

from machine import ADC
capteur = ADC(4)                                 # canal interne (CORE_TEMP)
def temperature_c():
    v = capteur.read_u16() * 3.3 / 65535         # tension du capteur interne
    return 27 - (v - 0.706) / 0.001721           # loi RP2040 : 0,706 V à 27 °C, -1,721 mV/°C

Comment lire ce code. La conversion se fait en deux temps : la valeur brute (read_u16(), 0–65535) redevient d’abord une tension (on divise par la pleine échelle 65535 et on multiplie par la référence 3,3 V), puis cette tension devient une grandeur physique selon la loi du capteur (ici la formule du capteur interne). Tout l’art est de diviser par la bonne pleine échelle (65535, pas 4095, read_u16() mettant déjà la lecture 12 bits à l’échelle) et d’appliquer la bonne loi : c’est le geste à refaire pour chaque capteur.

Exemple — Potentiomètre comme variateur de seuil

Lire un potentiomètre (GP26) comme seuil, une LDR (GP27) comme mesure, allumer une LED quand la lumière passe sous le seuil.

from machine import ADC, Pin
from time import sleep
 
pot     = ADC(Pin(26))           # potentiomètre = seuil réglable
lumiere = ADC(Pin(27))           # LDR = mesure de luminosité
led     = Pin(15, Pin.OUT)
 
while True:
    seuil = pot.read_u16()                       # 0 à 65535
    mesure = lumiere.read_u16()
    led.value(1 if mesure < seuil else 0)        # LED si la lumière passe sous le seuil
    print("Seuil :", seuil, " Lumiere :", mesure)
    sleep(0.05)

La sortie au REPL (et le traceur de Thonny) permet de visualiser seuil et mesure pour calibrer, puis figer le seuil en constante.

Pièges

Confondre l’ADC et Pin.value(). pot.read_u16() renvoie 0–65535. Lire la même broche en numérique donnerait 0 ou 1 — perte d’information massive.

Broche non-ADC. Seules GP26 / GP27 / GP28 sont des entrées analogiques sur le Pico. (Sur ESP32, ADC2 est indisponible quand le Wi-Fi tourne — piège classique.)

Croire à une référence réglable. Sur le Pico la référence est fixe (3,3 V). On convertit toujours par rapport à 3,3 V. Une alimentation 3,3 V bruitée biaise toutes les mesures — découpler proprement.

Bruit sur les mesures. Une lecture brute a quelques LSB de bruit. Sur un capteur précis, ça compte : moyenner sur 10–20 mesures (suréchantillonnage), ou filtre RC matériel (voir filtrer des mesures).

Tension d’entrée hors plage. Appliquer > 3,3 V sur une entrée ADC abîme la puce (Pico non tolérant 5 V). Vérifier la plage de sortie du capteur dans sa datasheet (lire une datasheet).

Câbles trop longs sans masse. Un câble de plus de 30–50 cm mal référencé devient une antenne 50 Hz : la mesure oscille sans rien faire. Raccourcir, ramener GND, ou blinder.

Cas particulier — Capteurs 5 V

Un capteur qui sort 0–5 V dépasse la plage du Pico (3,3 V). Solutions : pont diviseur sur la sortie du capteur (perte de résolution), ou carte/capteur 3,3 V natif. Voir niveaux de tension.

Raccrochage projet

  • Étape 2 de la phase de preuve de concept — chaque capteur analogique se valide en lecture brute + conversion, idéalement comparée à un étalon (thermomètre, luxmètre, multimètre).
  • Étape 1 de la phase d’intégration et tests — requalification : plage utile, résolution effective, bruit résiduel.

L’étalonnage transforme un capteur « qui sort un nombre » en instrument de mesure, sans quoi tout asservissement aval est calibré sur du sable.

Voir aussi