Skip to content

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

Rôle d'un convertisseur analogique / numérique

Conversion analogique / numérique

Certaines broches de la 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 quasiment proportionnelle à la tension analogique présente en entrée d'une broche.

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

ADC de la Pi Pico

Les broches 26, 27 et 28 de la Raspberry Pi Pico sont des entrées analogiques qui peuvent accepter des tensions analogiques comprises entre 0V et 3.3V (les valeurs numériques associées allant alors de 0 à 65535).

La conversion analogique numérique prend quelques micro-secondes.

Capteur de température intégré

Il existe une entrée analogique « cachée » associé à un capteur de température dans le microcontrôleur RP2040 de la Pi Pico qui permet de mesurer la température du microcontrôleur.

Il ne faut pas l’utiliser pour connaître la température de la pièce. Cette entrée correspond au canal ADC_4.

Tension en entrée

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.

Lire une entrée analogique avec MicroPython

Lecture d'une entrée analogique

Pour mesurer la tension d’une entrée analogique, on utilise la fonction ADC du module machine.

1
2
3
4
5
from machine import Pin, ADC

adc_pin = Pin(26, mode=Pin.IN)

adc = ADC(adc_pin)

Remarque

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

1
2
3
from machine import ADC

adc = ADC(0)

Une fois l’entrée analogique configurée en MicroPython, il suffit d’utiliser la fonction .read_u16() de l'objet adc_pin sur la Raspberry Pi Pico pour lire la valeur numerique associé à la valeur de la tension d'entrée.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
from machine import Pin, ADC
import time

adc = ADC(Pin(26, mode=Pin.IN))

while True:
    valeur_numerique = adc.read_u16()

    print(valeur_numerique)

    time.sleep(1)

Exercice 5.1

Exécuter le programme précédent.

Application - Mesurer la température interne de la Raspberry Pi Pico

Mesure de temperature

Comme indiqué précédemment, la Pi Pico possède un capteur de température interne pour mesurer la température du microcontrôleur RP2040.

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 numérique image de la température.

  • Convertir cette valeur en tension.

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
from machine import ADC
import time

temp_sensor = ADC(4)

while True:
    valeur_numerique = temp_sensor.read_u16()

    tension = valeur_numerique * 3.3 / 65536

    temperature_µc = 27 - (adc_voltage - 0.706)/0.001721

    print(temperature_µc)

    time.sleep_ms(1_000)

Sortie de la console :

32.19402
32.66216
31.72584
33.13027
33.59842

Exercice 5.2

Exécuter le programme précédent.

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

Contrôle de l'intensité d'une LED externe

Nous allons utiliser à la fois le PWM, l’ADC et MicroPython afin de contrôler l’intensité d’une LED externe à l'aide d'un potentiomètre.

Le circuit à câbler est le suivant :

Image title

Attention

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 :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
from machine import Pin, ADC
import time

adc = ADC(Pin(26, mode=Pin.IN))

while True:
    valeur_numerique = adc.read_u16()

    tension = valeur_numerique * (3.3 / 65535)

    print(round(tension, 2), "V")

    time.sleep_ms(100)

Exercice 5.3

Exécuter le programme précédent.

Contrôle de l'intensité d'une LED externe

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

Exercice 5.4

Saisir le programme approprié.

Exécuter le programme précédent.

Montrer au professeur.