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 |

Calcul de la charge 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
  • de la charge de la batterie calculée

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

Pour la discussion de la mesure de la tension de la batterie 12V, voir : Mesure simple tension batterie au plomb

On pourrait penser intuitivement que le niveau de charge d'une batterie au plomb est proportionnellement lié à la tension à ses bornes. Grosso modo, 0V pour 0% de charge et 12V pour 100% de charge... En fait il n'en n'est rien !!

Le niveau de charge est effectivement relié à la tension aux bornes mais pour une variation de tension de 1 à 2V au plus... Cette tension varie de plus en fonction de l'utilisation qui est faîte de la batterie. Commençons par la mesure de la charge d'une batterie au plomb à vide (c'est à dire avec rien branché dessus...)

Voici la courbe de charge typique d'une batterie :

La courbe de charge peut être considérée avec une bonne approximation comme linéaire entre 90% de charge et 20% de charge.

Pour le calibrage de la droite , je retiens 12,8V / 90% de charge et 12,2V / 20% de charge... (volontairement au-dessus de la courbe réelle pour avoir une charge réelle qui soit en réalité un peu suprérieure à la charge calculée, ce qui donne plus de sécurité en pratique... avoir une charge calculée à 80% alors qu'en réalité elle est de 85%, c'est mieux...)

  • pour les parties de la courbe qui sont AU-DESSUS de la droite utilisée, la charge calculée sera majorée par rapport à la réalité
  • pour les parties de la courbe qui sont AU-DESSOUS de la droite utilisée, la charge calculée sera minorée par rapport à la réalité (préférable en pratique)

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 et la charge calculée s'affichent 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_mV=0.0; // Variable tension batterie calculée
float tension_batterie_V=0.0; // Variable tension batterie calculée

long charge_batterie=0; // Variable charge batterie 

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_mV=mesuref+tension_regulateur;
tension_batterie_V=tension_batterie_mV/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_V,3); // float avec 2 décimales
lcd.print (" V "); // unité et espace de propreté

//---------- charge batterie ---------
charge_batterie=map(long(tension_batterie_mV),12200 ,12800 , 20, 90); // rééchelonne entre valeur tension 20% et 90%


lcd.setCursor(0,3) ; // positionne le curseur à l'endroit voulu (colonne, ligne) (1ère=0 !) 
lcd.print ("Charge ="); 

if (charge_batterie<=20)
{
  lcd.print ("< 20"); // long
}
else if (charge_batterie>=90)
{
  lcd.print ("> 90"); // long
}
else
{
  lcd.print (charge_batterie); // long  
}

lcd.print (" % "); // 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 ---