Mesurer une tension (CAN)

Principe

La mesure d’une tension par un microcontrôleur est réalisée en interne par un convertisseur analogique-numérique.

Ce type de conversion est importante en sciences physique. Elle permet par exemple d’obtenir la mesure d’une grandeur physique provenant d’un capteur.

Arduino UNO dispose de 6 entrées analogiques disponibles sur les broches A0 à A5. Par défaut, la tension en entrée doit-être comprise entre 0 V et 5 V (Vref). Le résultat de la conversion donne un nombre sur 10 bits compris entre 0 et 1023. La résolution analogique (quantum) est donc :

\[{q=\dfrac{5}{1023} \approx 4,89\,mV}\]

Avertissement

Le tension appliquée sur les entrées analogiques doivent être strictement comprise entre 0 V et 5 V sous peine de détruire le microcontrôleur.

Montage

Un potentiomètre monté en pont diviseur de tension est branché entre la masse (GND) et la tension d’alimentation (5V). Ce potentiomètre délivre donc une tension réglable en 0 V et 5 V sur l’entrée A0.

Montage potentiométrique

Programme en langage Arduino (C/C++)

Le programme suivant lit la tension sur l’entrée A0 et affiche sa valeur dans le moniteur série du logiciel Arduino.

/*
 * Lecture de l'entrée analogique A0 sur le port série.
 */

int N;           // Entier lu sur A0 compris entre 0 et 1023 (10bits)
float tension;   // La tension calculée à partir de N

void setup() {
  Serial.begin(9600);   // Paramétrage port série
}

void loop() {
  N = analogRead(A0);                    // Lecture valeur sur A0
  tension = N*5.0/1023;                  // Calcul de la tension
  Serial.print("Valeur lue sur A0 = ");
  Serial.println(N);                     // Affichage valeur sur A0
  Serial.print("Tension = ");
  Serial.println(tension);               // Affichage de la tension
  delay(1000);                           // temporisation de 1 s
}
  • La fonction analogRead(A0) retourne un entier sur 10 bits compris entre 0 (pour 0V) et 1023 (pour 5V).
  • L’expression N*5.0/1023 calcule la valeur de la tension en volt.

Programme en langage Python (pilotage Nanpy)

from nanpy import ArduinoApi, SerialManager
from time import sleep                       # Importation fonction sleep()

port = SerialManager(device='COM6')          # Sélection du port série à modifier
uno = ArduinoApi(connection=port)            # Déclaration de la carte Arduino Uno


for i in range(10):
   N = uno.analogRead(0)              # Lecture la tension numérique sur A0
   print("N = ", N)                   # Affichage
   U = N*5/1023                       # Calcul de la tension en volt
   print("U = ", round(U, 3), " V")   # Affichage
   sleep(1)                           # Temporisation d'une seconde

uno.connection.close()                 # Deconnexion de Arduino
port.close()                           # Fermeture du port série

Applications

  • Interface avec un circuit comportant un capteur.
  • Un potentiomètre est un capteur de position.

Aller plus loin : contrôler l’intensité lumineuse d’une LED

En combinant le programme précédant avec celui sur la génération d’une tension PWM, il est possible de régler à l’aide d’un potentiomètre l’intensité lumineuse d’une LED.

Montage

Programme en langage Arduino (C/C++)

#define pinLED 11

int N;       // Valeur lue sur A0 de 0 à 1023
int duty;    // Rapport cyclique de 0 à 255

void setup() {
}

void loop() {
  N = analogRead(A0);       // Conversion analogique-numérique sur A0
  duty = N/4;               // Calcul du rapport cyclique
  analogWrite(pinLED, duty); // Génération de la tension PWM
  delay(30);                // Attendre 30 ms
}

Note

Pour convertir un entier sur 10 bits en un entier sur 8 bits, il suffit de la division entière par 4 !

Programme en langage Python (pilotage Nanpy)

from nanpy import ArduinoApi, SerialManager

port = SerialManager(device='COM6')          # Sélection du port série à modifier
uno = ArduinoApi(connection=port)            # Déclaration de la carte Arduino Uno

pinLed = 11

while True:
    N = uno.analogRead(0)              # Lecture la tension numérique sur A0
    duty = N//4                        # Division entière par 4
    uno.analogWrite(pinLed, duty)      # Tension PWM sur la LED