Mesurer la tension sur la broche VIN d'une carte Arduino / Genuino

Simple mais efficace

Image d'entête

par skywodd | | Licence (voir pied de page)

Catégories : Tutoriels Arduino | Mots clefs : Arduino Genuino Analog


Dans ce tutoriel, nous allons voir comment mesurer la tension d'alimentation VIN d'une carte Arduino / Genuino. À la fin de cet article, vous serez capable de déterminer un niveau de batterie faible ou un défaut d'alimentation avant qu'il ne devienne problématique.

Sommaire

Bonjour à toutes et à tous !

Dans mon précédent article, nous avons vu comment mesurer la tension d'alimentation du microcontrôleur d'une carte Arduino / Genuino. Nous allons à présent voir comment mesurer la tension sur le broche VIN d'une carte Arduino / Genuino.

On a pu voir dans mon précédent article que connaitre la tension d'alimentation du microcontrôleur permet de faire des mesures analogiques précises, mais ne permet pas de savoir si l'alimentation de la carte est fiable. On va donc aujourd'hui mettre à profit ces connaissances pour concevoir un système permettant de mesurer la tension d'alimentation de la carte au niveau de la broche VIN, ou de la prise d'alimentation jack pour les cartes en disposant d'une.

La théorie

Schéma pont diviseur par 4

Schéma du pont diviseur

Le circuit pour mesurer la tension sur la broche VIN est très simple. Il s'agit d'un simple pont diviseur de tension.

J'avais expliqué en détail ce type de circuit dans mon article sur la mesure de tensions analogiques. Je vous invite donc à lire (ou relire) cet article avant de continuer la lecture de celui-ci ;)

Dans le pont diviseur ci-dessus, j'utilise des résistances de différentes valeurs pour former un pont diviseur par 4 (soit Vsortie = 0.25 * Ventrée) : R1 = 3300 ohms (3.3K ohms) et R2 = 1100 ohms (1.1K ohms).

Si on s'amuse à faire le calcul du pont diviseur avec Vin = 20v (soit 18v maximum admissible, avec 10% marge "au cas où"), on obtient : Vs = 20 * (1100 / (3300 + 1100)) = 20 * (1100 / 4400) = 20 * 0.25 = 5.0 volts.

Une carte Arduino classique s'alimente avec une tension idéalement de 9 volts, ou de 12 volts tout au plus. Avec un pont diviseur par 4 et une carte Arduino classique (fonctionnant en 5 volts), on peut mesurer des tensions en VIN de 20 volts maximum (en théorie, en pratique on ne dépassera pas 18 volts pour garder une marge de sécurité). Grâce à circuit très simple, il est possible de mesurer la tension d'alimentation de la carte en provenance d'une alimentation secteur, d'une batterie ou même d'un panneau solaire.

Attention aux batteries de voitures

J'ai de nombreuses fois eu des retours de lecteurs qui ne comprennent pas pourquoi leurs montages chauffés au point d'être brulant. À chaque fois, le montage était alimenté par une batterie 12 volts de voiture, directement ou via une prise allume-cigare.

Soyez vigilant ! Les batteries de voiture génèrent des tensions bien supérieures à 12 volts. Il n'est pas rare pour une batterie de voiture d'atteindre des tensions de 15 volts, voir parfois plus, en fonction du modèle de voiture et de batterie.

Illustration des tensions acceptables en entrée d'une carte Arduino classique

A 25€ la carte Arduino, ça fait un peu cher le presse papier ou l'allume bbq, soyez prudent

Une carte Arduino classique peut être alimentée sans danger avec une alimentation de 9 volts sur la broche VIN. Le maximum pratique est de 12 volts et le minimum de 7 volts. Au-dessus de 12 volts, la carte va chauffer fortement, puis se détériorer. En dessous de 7 volts, la carte ne va pas fonctionner correctement.

PS Le circuit ci-dessus consomme environ 2mA avec une alimentation de 9 volts, 3mA avec une alimentation de 12 volts. Si vous avez besoin d'un circuit basse consommation, vous pouvez multiplier les valeurs des résistances par deux pour diminuer d'autant la consommation électrique. La somme des deux résistances doit rester aux alentours de 10K ohms pour ne pas avoir de problème avec la conversion analogique numérique.

Le montage

Photographie du matériel nécessaire à la réalisation du montage de mesure de la tension VIN

Matériel nécessaire

Pour réaliser ce montage, il va nous falloir :

  • Une carte Arduino UNO (et son câble USB),

  • Une résistance de 3.3K ohms – code couleur orange / orange / rouge,

  • Une résistance de 1.1K ohms – code couleur marron / marron / rouge,

  • Une plaque d'essai et des fils pour câbler notre montage.

Vue prototypage du montage de mesure de la tension VIN

Vue prototypage du montage

Vue schématique du montage de mesure de la tension VIN

Vue schématique du montage

Pour câbler le montage, il suffit de relier la résistance de 3.3K ohms entre la broche VIN de la carte Arduino et la broche A0 de cette même carte.

Photographie du montage de mesure de la tension VIN

Le montage fini

Ensuite, on termine le circuit en reliant la résistance de 1.1K ohms entre la broche A0 de la carte Arduino et la masse (broche GND).

Le code

Le code n'est rien de plus qu'une lecture analogique avec analogRead() et un peu de mathématique (un simple produit en croix) pour faire la conversion en volts.

Le code utilise la fonction présentée dans mon précédent article pour mesurer la référence interne de la carte Arduino. C'est cette tension de référence qui sert au produit en croix pour plus de précision.

PS Pour une précision optimale, il est possible de modifier le coefficient du pont diviseur dans le code. Ainsi, si vous avez un ohmmètre, vous pourrez mesurer la résistance réelle du pont diviseur et déterminer son coefficient effectif.

Le code avec commentaires :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
/**
 * Code Arduino permettant de mesurer la tension d'alimentation de la carte en VIN.
 */

/* Le numéro de broche analogique pour la mesure de la tension en VIN */ 
const byte BROCHE_CAPTEUR_VIN = A0;

/* Coefficient diviseur du pont de résistance */
const float COEFF_PONT_DIVISEUR_VIN = 4.0;


/* Fonction setup() */
void setup() {
 
  /* Initialisation du port série */
  Serial.begin(115200); 
  Serial.println(F("VIN-O-Meter"));
}

/** Mesure la référence interne à 1.1 volts */
unsigned int analogReadReference(void) {
  
  /* Elimine toutes charges résiduelles */
#if defined(__AVR_ATmega328P__)
  ADMUX = 0x4F;
#elif defined(__AVR_ATmega2560__)
  ADCSRB &= ~(1 << MUX5);
  ADMUX = 0x5F;
#elif defined(__AVR_ATmega32U4__)
  ADCSRB &= ~(1 << MUX5);
  ADMUX = 0x5F;
#endif
  delayMicroseconds(5);
  
  /* Sélectionne la référence interne à 1.1 volts comme point de mesure, avec comme limite haute VCC */
#if defined(__AVR_ATmega328P__)
  ADMUX = 0x4E;
#elif defined(__AVR_ATmega2560__)
  ADCSRB &= ~(1 << MUX5);
  ADMUX = 0x5E;
#elif defined(__AVR_ATmega32U4__)
  ADCSRB &= ~(1 << MUX5);
  ADMUX = 0x5E;
#endif
  delayMicroseconds(200);

  /* Active le convertisseur analogique -> numérique */
  ADCSRA |= (1 << ADEN);
  
  /* Lance une conversion analogique -> numérique */
  ADCSRA |= (1 << ADSC);
  
  /* Attend la fin de la conversion */
  while(ADCSRA & (1 << ADSC));
  
  /* Récupère le résultat de la conversion */
  return ADCL | (ADCH << 8);
}

/* Fonction loop() */
void loop() {
  
  /* Mesure la tension en VIN et la référence interne à 1.1 volts */
  unsigned int raw_vin = analogRead(BROCHE_CAPTEUR_VIN);
  unsigned int raw_ref = analogReadReference();
  
  /* Calcul de la tension réel avec un produit en croix */
  float real_vin = ((raw_vin * 1.1) / raw_ref) * COEFF_PONT_DIVISEUR_VIN;
 
  /* Affichage */
  Serial.println(real_vin, 3);
  delay(1000);
}

L'extrait de code ci-dessus est disponible en téléchargement sur cette page (le lien de téléchargement en .zip contient le projet Arduino prêt à l'emploi).

Ne pas utiliser analogReference() / AREF avec ce code !

Pour fonctionner, le code ci-dessus (et ci-dessous) a besoin de configurer la référence de tension à GND puis à VCC. Si une tension est injectée sur la broche AREF, il y a aura création d'un court-circuit. Si vous utilisez la broche AREF, n'utilisez pas ce code.

Le résultat

Voici ce que donne le code ci-dessus sur une carte Arduino UNO alimentée via un adapteur secteur 12 volts :

1
2
3
4
5
6
7
8
9
VIN-O-Meter
11.010
11.029
11.010
10.971
11.010
11.029
11.010
10.990

Mon multimètre mesure une tension de 11.17 volts sur la broche VIN. On est donc très près de la valeur réelle.

N.B. Il y a toujours entre 0.6 volt et 1 volt de différence entre la tension de la batterie et celle sur la broche VIN. Cela est dû à la présence d'une diode de protection en série avec la prise jack des cartes Arduino. C'est tout à fait normal.

Conclusion

Ce tutoriel est désormais terminé.

Si ce tutoriel vous a plu, n'hésitez pas à le commenter sur le forum, à le diffuser sur les réseaux sociaux et à soutenir le site si cela vous fait plaisir.