View  Edit  Attributes  History  Attach  Print  Search

ACCUEIL | ARDUINO > S'INSTALLER > DEBUTER > APPROFONDIR | PROCESSING | MECATRONIQUE | MATERIEL | OUTILS | TESTS | Plus...|
Python > Shell > ATELIERS Python + Qt > PyQt apps > PyQt+Arduino | Mes Robots | RepRap | Mes lib'Arduino | Mes shields Arduino | Mes distros | Les Mini-PC |
ATELIERS ARDUINO| VIDEOS | COMPRENDRE | REFERENCES | CODER | TECHNIQUE | GNU/LINUX | LIENS | Rien à voir |

Mesure simple de la tension d'une batterie 12V

ARDUINO - PROJETS - BATTERIE
Par X. HINAULT - Créé le 12/03/2010

Présentation

Ce programme mesure la tension d'une batterie au plomb 12V. Le programme réalise l'affichage en continu sur un écran LCD 4 x 20 :

  • de la valeur brute de la mesure
  • de la tension mesurée
  • de la tension calculée de la batterie

Ce programme utilise les fonctionnalités suivantes :

  • un afficheur LCD alphanumérique 4x20 en mode 4 bits
  • la conversion analogique numérique 10bits sur les voies analogiques analog 0,

Le montage utilise un régulateur -9V de type 7909 : Datasheet du régulateur 7909

Discussion technique

Le problème principal pour la mesure de la tension aux bornes d'une batterie 12V (en fait entre 11V et 13V) est la mesure d'une tension supérieure à 5V, à l'aide d'une carte Arduino qui peut mesurer une tension entre 0V et 5V. La tension de référence extérieure utilisable doit être inférieure à 5 V.

La première solution qui vient à l'esprit est celle d'un pont diviseur 1/3 - 2/3 à l'aide de 3 résistances de valeur identiques. Cette solution pose plusieurs problèmes :

  • les résistances doivent être d'une précision suffisante (1%)
  • le problème principal est plutôt le fait que l'on perde la pleine échelle de la sensibilité disponible avec l'Arduino. Or il est important de pouvoir utiliser une précision maximale pour le calcul de charge de la batterie, la fluctuation de 20% à 90% de l'état de la charge se traduisant par une fluctuation en tension de l'ordre du volt (ce qui déjà correspond qu'à 1/5ème de la pleine échelle mais suffit pour une évaluation de la charge en %). Avec un pont diviseur, on réduit la variation de tension sur 1à2V à 1à2V/3=0.33 à 0,66V... et on perd autant en précision

L'idéal serait pouvoir abaisser la tension aux bornes de la batterie d'une tension fixe et parfaitement stable afin de garder la pleine échelle de la variation tout en étant dans la plage de mesure de l'Arduino (càd entre 0 et 5V). La seconde solution qui vient alors à l'esprit est d'utiliser un régulateur, mais négatif. Avec un régulateur 9V négatif, on retranchera 9V précisément aux bornes de la batterie ce qui donnera une tension aux alentours de 3V, soit dans la plage de mesure de l'Arduino.

Matériel Nécessaire

L'espace de développement Arduino

  • ... pour éditer, compiler le programme et programmer la carte Arduino.

Le matériel suivant pour réaliser le montage associé

  • une plaque d'essai pour montage sans soudures,
  • des straps,
  • un régulateur négatif 9V (modèle 7909)
  • les condensateurs associés à savoir 2 x 2,2µF et 1 x 1µF

Instructions de montage

  • Connecter sur la broche 6 la broche RS du LCD
  • Connecter sur la broche 7 la broche E du LCD
  • Connecter sur la broche 8 la broche D4 du LCD
  • Connecter sur la broche 9 la broche D5 du LCD
  • Connecter sur la broche 10 la broche D6 du LCD
  • Connecter sur la broche 11 la broche D7 du LCD
  • Broche Analog 0 (=broche 14) en entrée Analogique
  • le régulateur 7909 comme indiqué sur le schéma ci-dessous. Pour mémoire, le brochage de 7909

Le schéma théorique du montage


Le schéma théorique du montage

Mise en oeuvre du programme

Préparation du montage et programmation de la carte Arduino :

  • Commencer par réaliser le montage indiqué sur plaque d'expérimentation
  • Ensuite, programmer la carte Arduino avec ce programme (en bas de page) selon la procédure habituelle

Fonctionnement

  • La tension brute, en Volt et de la batterie s'affiche en permanence.

Le programme complet en langage Arduino :

A copier/coller directement dans l'éditeur Arduino


// --- Programme Arduino ---
// par X. HINAULT - Le 12/03/2010
// www.mon-club-elec.fr 

// --- Que fait ce programme ? ---
/* mesure la tension d'une batterie au plomb 12V. 
Affichage de la valeur de la mesure continue sur un écran LCD 
La tension de la Batterie est abaissé à l'aide d'un régulateur -9V (7909)
*/

// --- Fonctionnalités utilisées ---
// Utilise un afficheur LCD alphanumérique4x20 en mode 4 bits 
// Utilise la conversion analogique numérique 10bits sur les voies analogiques  analog 0, 

// --- Circuit à réaliser ---

// Connecter  sur la broche 6 la broche RS du LCD
// Connecter  sur la broche 7 la broche E du LCD
// Connecter  sur la broche 8 la broche D4 du LCD
// Connecter  sur la broche 9 la broche D5 du LCD
// Connecter  sur la broche 10 la broche D6 du LCD
// Connecter  sur la broche 11 la broche D7 du LCD
// Broche Analog 0 (=broche 14) en entrée Analogique 

//**************** Entête déclarative *******
// A ce niveau sont déclarées les librairies, les constantes, les variables...

// --- Inclusion des librairies utilisées ---

#include <LiquidCrystal.h> // Inclusion de la librairie pour afficheur LCD 

// --- Déclaration des constantes ---

// --- constantes des broches ---

const int RS=6; //declaration constante de broche 
const int E=7; //declaration constante de broche 
const int D4=8; //declaration constante de broche 
const int D5=9; //declaration constante de broche 
const int D6=10; //declaration constante de broche 
const int D7=11; //declaration constante de broche 

const int Voie_0=0; //declaration constante de broche analogique

// --- Déclaration des variables globales ---
int mesure_brute=0;// Variable pour acquisition résultat brut de conversion analogique numérique
float mesuref=0.0;// Variable pour calcul résultat décimal de conversion analogique numérique

float tension=0.0; // Variable tension mesurée
float tension_batterie=0.0; // Variable tension batterie calculée
float tension_regulateur=9070.0; // Variable tension réelle aux bornes du régulateur -9V (en mV)

// --- Déclaration des objets utiles pour les fonctionnalités utilisées ---

LiquidCrystal lcd(RS, E, D4, D5, D6, D7);// Création d'un objet LiquidCrystal = initialisation LCD en mode 4 bits 


//**************** FONCTION SETUP = Code d'initialisation *****
// La fonction setup() est exécutée en premier et 1 seule fois, au démarrage du programme

void setup()   { // debut de la fonction setup()

// --- ici instructions à exécuter au démarrage --- 

lcd.begin(20,4); // Initialise le LCD avec 20 colonnes x 4 lignes 

delay(10); // pause rapide pour laisser temps initialisation

// Test du LCD

lcd.print("LCD OK") ; // affiche la chaîne texte - message de test
delay(2000); // pause de 2 secondes

lcd.clear(); // // efface écran et met le curseur en haut à gauche
delay(10); // pour laisser temps effacer écran


// ------- Broches en sortie -------  


// ------- Broches en entrée -------  


// ------- Activation du rappel au + interne des broches en entrée si nécessaire -------  


} // fin de la fonction setup()
// ********************************************************************************

//*************** FONCTION LOOP = Boucle sans fin = coeur du programme *************
// la fonction loop() s'exécute sans fin en boucle aussi longtemps que l'Arduino est sous tension

void loop(){ // debut de la fonction loop()

// --- ici instructions à exécuter par le programme principal --- 

//-------- mesure brute --------
mesure_brute=analogRead(Voie_0);

lcd.setCursor(0,0) ; // positionne le curseur à l'endroit voulu (colonne, ligne) (1ère=0 !) 
lcd.print ("Valeur brute ="); 
lcd.print (mesure_brute); 
lcd.print (" "); // espace de propreté

//---------- tension mesurée ---------
mesuref=float(mesure_brute)*5000.0/1024.0;
tension=mesuref/1000.0; // en Volts

lcd.setCursor(0,1) ; // positionne le curseur à l'endroit voulu (colonne, ligne) (1ère=0 !) 
lcd.print ("Tension ="); 
lcd.print (tension,3); // float avec 2 décimales 
lcd.print (" V "); // unité et espace de propreté

//---------- tension batterie ---------
tension_batterie=mesuref+tension_regulateur;
tension_batterie=tension_batterie/1000.0; // en Volts

lcd.setCursor(0,2) ; // positionne le curseur à l'endroit voulu (colonne, ligne) (1ère=0 !) 
lcd.print ("Batterie ="); 
lcd.print (tension_batterie,3); // float avec 2 décimales
lcd.print (" V "); // unité et espace de propreté


} // fin de la fonction loop() - le programme recommence au début de la fonction loop sans fin
// ********************************************************************************

//*************** Autres Fonctions du programme *************

// --- Fin programme ---