12
16/01/2019 TP déductif Arduino - CAN et surveillance de charge d’une batterie LiPo 2 éléments MLK - ECST

TP déductif Arduino - Freestiddsin.free.fr/explorer/Cours-TD-TP/12b-TP... · Type : TP Déductif Objectif L’objectif final de ce TP est de proposer un modèle mathématique d’une

  • Upload
    others

  • View
    45

  • Download
    0

Embed Size (px)

Citation preview

Page 1: TP déductif Arduino - Freestiddsin.free.fr/explorer/Cours-TD-TP/12b-TP... · Type : TP Déductif Objectif L’objectif final de ce TP est de proposer un modèle mathématique d’une

16/01/2019

TP déductif Arduino

- CAN et surveillance de charge d’une batterie LiPo 2 éléments

MLK - ECST

Page 2: TP déductif Arduino - Freestiddsin.free.fr/explorer/Cours-TD-TP/12b-TP... · Type : TP Déductif Objectif L’objectif final de ce TP est de proposer un modèle mathématique d’une

TP déductif Arduino - CAN et surveillance de charge d’une batterie LiPo 2 éléments

TP déductif 1

Objectif ...................................................................................................................................... 2

Présentation du matériel .......................................................................................................... 2

Modélisation de la charge d’une batterie LiPo ......................................................................... 2

Mesure de la tension de batterie :............................................................................................. 4

Programme préliminaire : Test du Convertisseur Analogique Numérique ......................... 4

Illustration de la chaîne d’information ................................................................................. 5

Modélisation mathématique de la chaîne d’information ..................................................... 5

Calcul du pourcentage de charge ........................................................................................... 7

Affichage sur le LCD RGB ..................................................................................................... 8

Pour aller plus loin : CGRAM .............................................................................................. 10

Page 3: TP déductif Arduino - Freestiddsin.free.fr/explorer/Cours-TD-TP/12b-TP... · Type : TP Déductif Objectif L’objectif final de ce TP est de proposer un modèle mathématique d’une

TP déductif Arduino - CAN et surveillance de charge d’une batterie LiPo 2 éléments

2

TP déductif Arduino - CAN et surveillance de charge d’une batterie LiPo 2 éléments

Compétences spécifiques : Utilisation d’un modèle mathématiques avec un Arduino

Pré-requis : Structures fondamentales en langage Arduino

Type : TP Déductif

Objectif

L’objectif final de ce TP est de proposer un modèle mathématique d’une batterie LiPo et de l’utiliser pour

indiquer l’état de sa charge sur l’afficheur LCD d’un Arduino.

Présentation du matériel

Arduino UNO

Interface grove1

Potentiomètre et LCD RGB2 I2C3

Modélisation de la charge d’une batterie LiPo

Les batteries Lithium Polymère sont très utilisées dans le modélismes car elles ont

l’avantage d’avoir une très bonne densité massique : C’est la technologie qui offre la

meilleure capacité (en Ah) pour la masse (en kg) la plus faible.

Elle a cependant des inconvénients : Elle peut prendre feu en cas de mauvaise

utilisation et sa durée de vie est assez limitée ; Environ 2 ans même si elle n’est pas

utilisée. Aussi, son recyclage est difficile, couteux et souvent réalisé dans de

mauvaises conditions par des personnes vulnérables et surexploitées.

À titre de comparaison et pour information, il existe d’autres technologies de batteries :

Li-Ion sensiblement les mêmes avantages que les LiPo mais moins instables. C’est pour cela quelles

sont utilisées dans les Smartphones, etc.

NiMh meilleure densité volumique : celles qui occupe le moins de place (m3) pour une capacité (Ah)

donnée ; Utilisées dans les premières voitures électriques pour gagner de l’espace utile bien que la

tendance actuelle (en 2019) est d’utiliser des batteries lithium.

Plomb meilleure prix pour une même capacité. Très utilisée dans les systèmes statiques où le poids

n’est pas un inconvénient. Facilement recyclable.

Remarque : En théorie toutes les technologies sont recyclables…

Mais revenons à notre batterie LiPo…

Contrairement à ce que l’on pourrait imaginer, la charge d’une batterie n’est pas proportionnelle à sa tension :

0V ne correspond pas à 0% car la tension de batterie ne tombe jamais à 0V sauf si elle est détruite. De plus, une

batterie de tension 7,4V nominale offre à pleine charge une tension de 8,4V.

Voici le profile de charge d’une batterie LiPo 2 éléments, soit de tension 7,4V nominale :

Tension Batterie (V) 6,00 6,60 7,20 7,30 7,40 7,50 7,58 7,66 7,74 7,84 7,94 8,20 8,40

Pourcentage de charge (%) 0 5 10 12 20 30 40 50 60 70 80 90 100

Page 4: TP déductif Arduino - Freestiddsin.free.fr/explorer/Cours-TD-TP/12b-TP... · Type : TP Déductif Objectif L’objectif final de ce TP est de proposer un modèle mathématique d’une

TP déductif Arduino - CAN et surveillance de charge d’une batterie LiPo 2 éléments

TP déductif 3

Compléter le graphique représentant la charge de la batterie en % en fonction de sa tension :

Remarquez que pour une meilleure lisibilité, l’axe des abscisses ne commence pas à 0V mais à 6V.

Les tableurs comme Excel peuvent donner l’équation d’une courbe mais le résultat n’est pas toujours

concluant :

Quelle est la courbe qui se rapproche le plus de la réalité ?

___________________________________________________________________________

Quels sont les inconvénients de ce modèle mathématique pour sa précision pour la résolution avec un

Arduino ?

___________________________________________________________________________

___________________________________________________________________________

___________________________________________________________________________

Page 5: TP déductif Arduino - Freestiddsin.free.fr/explorer/Cours-TD-TP/12b-TP... · Type : TP Déductif Objectif L’objectif final de ce TP est de proposer un modèle mathématique d’une

TP déductif Arduino - CAN et surveillance de charge d’une batterie LiPo 2 éléments

4

Pour s’affranchir de ces problèmes, nous modéliserons la charge de la batterie sur trois intervalles. Vous

pouvez remarquez que, dans ces intervalles, les caractéristiques sont linéaires de la forme : y = a . x + b

De 6,00V à 7,30V soit [6,00 ; 7,30[

pourcentage = 8,3333 x tensionBatterie - 50

De 7,30V à 7,94V soit [7,30 ; 7,94[

pourcentage = 111,06 x tensionBatterie - 800,88

De 7,94V à 8,40V soit [7,94 ; 8,40[

pourcentage = 43,233 x tensionBatterie - 263,65

Mesure de la tension de batterie :

Le Arduino UNO utilise un microcontrôleur ATMEL. Il possède, comme les microcontrôleurs PIC, un

microprocesseur et d’autres fonctions intégrées dans un même boîtier : EPROM, RAM, CAN, etc.

Le CAN (Convertisseur Analogique Numérique) 10 bits de l’Arduino Uno permet de convertir une tension

électrique (Analogique) pouvant varier de 0 à 5V en un nombre binaire (Numérique) compris entre

0b0000000000 et 0b1111111111 soit en base décimale de 0 à 1023. Il y a donc 210 combinaisons possibles.

On dit qu’il a une résolution de 5 / 210 ≈ 4,9 mV également appelé quantum du convertisseur.

Programme préliminaire : Test du Convertisseur Analogique Numérique

Câbler un potentiomètre sur la carte

Arduino conformément au code ci-

contre. Lisez et comprenez le

programme ainsi que les

commentaires. Taper et tester ce

dernier (testCAN.ino) sur la carte en

faisant varier le potentiomètre et en

observant les résultats sur le moniteur

série.

Commentez les résultats obtenus ?

__________________________

__________________________

__________________________

Rappelez quel intervalle de tension est applicable à l’entrée du convertisseur ?

___________________________________________________________________________

Rappelez quel intervalle de tension est fourni par un batterie LiPo ?

___________________________________________________________________________

Remarquez qu’il y a donc un problème de compatibilité électrique entre la tension de la batterie 8,4V qui est

trop grande devant la tension d’entrée maximale 5V du convertisseur. Il va donc falloir adapter cette tension

de batterie à l’aide d’un diviseur de tension. On réalise cette fonction avec à l’aide de deux résistances dont le

dimensionnement n’est pas l’objet de ce TP. Nous allons juste nous intéresser à son coefficient k.

// Test du CNA 10 bits #define analogPin 3 // potentiomètre connecté // sur l’entrée analogique pin 3 unsigned int valeurBrute = 0; // variable pour stocker // le résultat de la conversion void setup() { Serial.begin(9600); // Configuration de la vitesse de transfert } void loop() { valeurBrute = analogRead(analogPin); // Conversion analogique // vers Numérique Serial.println(valeurBrute); // Affichage du résultat // numérique sur le moniteur }

Page 6: TP déductif Arduino - Freestiddsin.free.fr/explorer/Cours-TD-TP/12b-TP... · Type : TP Déductif Objectif L’objectif final de ce TP est de proposer un modèle mathématique d’une

TP déductif Arduino - CAN et surveillance de charge d’une batterie LiPo 2 éléments

TP déductif 5

Illustration de la chaîne d’information

x k / q

Modélisation mathématique de la chaîne d’information Calculer le coefficient k du diviseur de tension qui permet de passer de la tension de batterie de 8,4V à la

tension d’entrée du convertisseur de 5V : Il faut donc que 8,4 x k = 5

k = _________________________________________________________________________

Rappeler le quantum q du convertisseur 10 bits qui permet d’obtenir le nombre 1023 lorsque sa tension

d’entrée est de 5V : Il faut donc que 5 / q = 1023

q = _________________________________________________________________________

De cette chaîne d’information, on peut retrouver l’expression mathématique du nombre en sortie du

convertisseur que l’on appellera valeurBrute dans le programme :

valeurBrute = tensionBatterie x k / q

On en déduit l’expression de la tension de batterie que l’on devra afficher avec le programme Arduino à partir

de la valeur brute donnée par le convertisseur :

tensionBatterie = valeurBrute x q / k

Pour des raisons pratiques, nous allons "simuler" la tension de batterie avec le potentiomètre grove à l’entrée

de la carte Arduino. Ainsi, nous n’aurons à câbler ni le diviseur de tension, ni la batterie. Le coefficient k du

diviseur demeure utilisé dans le programme pour afficher la valeur que nous aurions obtenue si la batterie

était réellement câblée. En outre, il est difficile d’observer les variations d’une tension de batterie sans y passer

des heures à attendre qu’elle se charge ou se décharge.

Lisez et comprenez le programme ci-dessus ainsi que les commentaires. Taper et tester le croquis (mesureTensionBatterie.ino) sur la carte en faisant varier le potentiomètre et en observant les résultats sur le moniteur série.

Remarquez qu’il faut utiliser le point et non la virgule pour les nombres décimaux (float). C’est une erreur difficilement décelable car l’IDE Arduino ne la détectera pas forcément puisqu’elle n’est pas une erreur de syntaxe proprement dite.

// Mesure de la tension de batterie

#define analogPin 3 // Potentiomètre connecté sur l’entrée analogique broche 3

unsigned int valeurBrute = 0; // Variable résultat de la conversion analogique numérique

float tensionBatterie = 0; // Variable tension de batterie

const float VmaxCAN = 5.0; // Constante tension Max d’entrée convertisseur

const float q = VmaxCAN / 1023; // Constante quantum du convertisseur

const float k = VmaxCAN / 8.4; // Constante coefficient du diviseur de tension

void setup()

{

Serial.begin(9600); // Configuration vitesse de transfert du moniteur série

}

void loop()

{

valeurBrute = analogRead(analogPin); // Lancement de la conversion analogique Numérique

tensionBatterie = (valeurBrute * q) / k; // Calcul de la tension de batterie

Serial.println("--------------------"); // Affichage des résultats

Serial.print("valeurBrute = ");

Serial.println(valeurBrute); // Affichage du résultat de la conversion sur le moniteur

Serial.print("q = ");

Serial.println(q, 10); // Affiche la valeur du quantum avec 10 chiffres après la virgule

Serial.print("k = ");

Serial.println(k, 10); // Affiche la valeur de k avec 10 chiffres après la virgule

Serial.print("tensionBatterie = ");

Serial.println(tensionBatterie, 10); // Affichage de la tension batterie avec 10 chiffres après la virgule

delay(1000);

}

Page 7: TP déductif Arduino - Freestiddsin.free.fr/explorer/Cours-TD-TP/12b-TP... · Type : TP Déductif Objectif L’objectif final de ce TP est de proposer un modèle mathématique d’une

TP déductif Arduino - CAN et surveillance de charge d’une batterie LiPo 2 éléments

6

En utilisant votre programme, complétez les résultats ci-dessous :

valeurBrute 0 128 256 384 512 640 768 896 1023

tensionBatterie

Quelle est l’allure de la caractéristique du convertisseur ?

___________________________________________________________________________

Dans la suite du TP, le programme ci-dessus sera implanté dans une fonction dont le prototype est le suivant :

void mesureTensionBatterie(void) ;

Cette fonction ne prend et ne rend pas de paramètres car les variables ont été déclarées de façon globale.

// Mesure de la tension de batterie

#define analogPin 3 // Potentiomètre sur l’entrée analogique broche 3

unsigned int valeurBrute = 0; // Variable résultat de la conversion analogique

numérique

float tensionBatterie = 0; // Variable tension de batterie

const float VmaxCAN = 5.0; // Constante tension Max d’entrée convertisseur

const float q = VmaxCAN / 1023; // Constante quantum du convertisseur

const float k = VmaxCAN / 8.4; // Constante coefficient du diviseur de tension

void setup()

{

Serial.begin(9600); // Vitesse de transfert du moniteur serie

}

void loop()

{

mesureTensionBatterie(); // Appel de la nouvelle fonction mesureTensionBatterie

delay(1000);

}

void mesureTensionBatterie(void) // Nouvelle fonction mesureTensionBatterie

{

valeurBrute = analogRead(analogPin); // Lancement de la conversion analogique Numérique

tensionBatterie = (valeurBrute * q) / k; // Calcul de la tension de batterie

Serial.println("--------------------"); // Affichage des résultats

Serial.print("valeurBrute = ");

Serial.println(valeurBrute); // Résultat de la conversion sur le moniteur série

Serial.print("q = ");

Serial.println(q, 10); // Affiche du quantum avec 10 chiffres après la virgule

Serial.print("k = ");

Serial.println(k, 10); // Affiche de k avec 10 chiffres après la virgule

Serial.print("tensionBatterie = ");

Serial.println(tensionBatterie, 10); // Affichage de la tension batterie sur le moniteur

}

Page 8: TP déductif Arduino - Freestiddsin.free.fr/explorer/Cours-TD-TP/12b-TP... · Type : TP Déductif Objectif L’objectif final de ce TP est de proposer un modèle mathématique d’une

TP déductif Arduino - CAN et surveillance de charge d’une batterie LiPo 2 éléments

TP déductif 7

Modifiez le programme et vérifiez qu’il se comporte de la même façon que précédemment.

La fonction mesureTensionBatterie( ) peut être placée dans un autre onglet de l’interface IDE Aduino.

Coupez et collez la fonction dans un nouvel onglet de l’interface IDE Arduino que vous nommerez

mesureTensionBatterie. Téléversez et vérifiez le même comportement que précédemment.

Calcul du pourcentage de charge Pour le calcul du pourcentage de charge, nous allons utiliser les fonctions mathématiques définies

précédemment :

De 6,00V à 7,30V soit [6,00 ; 7,30[

pourcentage = 8,3333 x tensionBatterie - 50

De 7,30V à 7,94V soit [7,30 ; 7,94[

pourcentage = 111,06 x tensionBatterie - 800,88

De 7,94V à 8,40V soit [7,94 ; 8,40[

pourcentage = 43,233 x tensionBatterie - 263,65

Nous allons donc utiliser l’algorithme suivant pour déterminer le pourcentage de charge :

Si tensionBatterie ≤ 6 alors pourcentage = 0 ;

Sinon Si tensionBatterie < 7,3 alors pourcentage = 8,3333 x tensionBatterie - 50 ;

Sinon Si tensionBatterie < 7,94 alors pourcentage = 111,06 x tensionBatterie - 800,88 ;

Sinon Si tensionBatterie < 8,40 alors pourcentage = 43,233 x tensionBatterie - 263,65 ;

Sinon pourcentage = 100 ;

Cet algorithme sera réalisé par la fonction void calculPourcentage(void) qui ne prendra ni ne rendra de

paramètre (void). Le résultat du calcul du pourcentage sera stocké dans une variable globale poucentage de

type float. Cette fonction sera créée dans un nouvel onglet de l’interface IDE Arduino nommé

calculPourcentage et appelée dans la fonction loop.

Complétez et vérifiez le comportement de votre programme sur le moniteur série.

Remarquez que les chaînes de caractères "Alternative 1" à "Alternative 5" permettent de vérifier si le calcul

s’effectue bien avec la bonne formule ; dans le bon test.

void calculPourcentage(void)

{

if (tensionBatterie<6)

{

pourcentage=0;

Serial.println("Alternative 1");

}

else if (tensionBatterie<7.3)

{

pourcentage = (8.3333 * tensionBatterie) - 50;

Serial.println("Alternative 2");

}

else if ( ) / à compléter

{

pourcentage = ; / à compléter

Serial.println("Alternative 3");

}

else if ( ) / à compléter

{

pourcentage = ; / à compléter

Serial.println("Alternative 4");

}

else

{

pourcentage = ; / à compléter

Serial.println("Alternative 5");

}

Serial.print("pourcentage = ");

Serial.print(pourcentage); // Affiche avec 2 chiffres après la virgule par défaut

Serial.println(" %");

}

Page 9: TP déductif Arduino - Freestiddsin.free.fr/explorer/Cours-TD-TP/12b-TP... · Type : TP Déductif Objectif L’objectif final de ce TP est de proposer un modèle mathématique d’une

TP déductif Arduino - CAN et surveillance de charge d’une batterie LiPo 2 éléments

8

Affichage sur le LCD RGB En plus d’afficher le pourcentage de charge, nous allons faire varier la couleur de l’écran du vert au rouge, en

passant par le orange, à mesure que la batterie se décharge et inversement.

La fonction qui permet de changer la couleur de l’écran est lcd.setRGB(rouge,vert,bleu). Les trois paramètres,

codés sur un octet, représentent les composantes RVB. On peut donc, en théorie, réaliser l’ensemble du spectre

du noir au blanc.

Pour notre gestion de charge batterie, nous

laisserons la composante bleue à 0 et nous ferons

varier respectivement les composantes rouge et

verte de 255 à 0 et de 0 à 255 au fur et à mesure

que la batterie se charge.

On remarque donc sur le graphique ci-contre que

les courbes obtenues sont de type linéaire :

y = a . x + b

avec a le coefficient directeur a = ∆y / ∆x

et b l’ordonnée à l’origine

On peut donc en déduire les équations des composantes bleue et verte en fonction de la charge de la batterie :

Bleu = 0

Vert = ((255 - 0) / (100 - 0)) * pourcentage + 0

Vert = 2,55 * pourcentage

Trouver l’équation de la composante Rouge en détaillant votre calcul :

Rouge = __________________________________________________________________

Rouge = __________________________________________________________________

Pour que l’afficheur LCD fonctionne, il faut ajouter les bibliothèques de fonctions relatives à l’afficheur LCD.

L’affichage sera réalisé par la fonction void affichage(void) qui ne prendra ni ne rendra de paramètre (void).

Les résultats du calcul des composantes seront stockés dans trois variables globales rouge, vert, bleu. Cette

fonction sera créée dans un nouvel onglet nommé affichage et appelée dans la fonction loop.

Complétez l’onglet principal :

// Onglet principal

// CAN et Batterie LiPo

#include <Wire.h>

#include "rgb_lcd.h"

rgb_lcd lcd ;

#define analogPin 3 // Potentiomètre connecté sur l’entrée analogique broche 3

unsigned int valeurBrute = 0; // Variable résultat de la conversion analogique numérique

float tensionBatterie = 0; // Variable tension de batterie

const float VmaxCAN = 5.0; // Constante tension Max d’entrée convertisseur

const float q = VmaxCAN / 1023; // Constante quantum du convertisseur

const float k = VmaxCAN / 8.4; // Constante coefficient du diviseur de tension

float pourcentage = 0; // Variable pourcentage de charge batterie de 0.0 à 100.0

unsigned char rouge = 0 ; // Variable composante rouge de 0 à 255

unsigned char vert = 0 ; // Variable composante verte de 0 à 255

unsigned char bleu = 0 ; // Variable composante bleue de 0 à 255

void setup()

{

Serial.begin(9600); // Configuration vitesse de transfert du moniteur série

lcd.begin(16, 2); // Initialisation du LCD 2 lignes de 16 caractères

}

void loop()

{

mesureTensionBatterie();

calculPourcentage();

affichage();

delay(100);

}

Page 10: TP déductif Arduino - Freestiddsin.free.fr/explorer/Cours-TD-TP/12b-TP... · Type : TP Déductif Objectif L’objectif final de ce TP est de proposer un modèle mathématique d’une

TP déductif Arduino - CAN et surveillance de charge d’une batterie LiPo 2 éléments

TP déductif 9

Complétez l’onglet affichage :

Remarquez les espaces après les unités "V " et "% ". Ils permettent d’effacer les éventuelles restes

d’affichages précédents.

Remarquez également que si le moniteur série n’est plus nécessaire alors les lignes qui y font référence

peuvent être mises en // commentaire dans l’ensemble du programme.

Câblez un LCD sur l’un des connecteurs I2C. Testez votre programme : Observez les valeurs affichées sur le

LCD ainsi que les variations de la couleur de l’écran en fonction de la charge de la batterie.

On souhaite améliorer cette fonction de façon à obtenir le format d’affichage suivant, en faisant apparaître des

0 non significatif :

TT EE NN SS II OO NN :: 00 00 88 .. 33 44 VV

CC HH AA RR GG EE :: 00 99 66 .. 99 11 %%

Nous allons donc utiliser l’algorithme suivant pour déterminer le pourcentage de charge :

Si valeur < 10 alors afficher "00" ;

Sinon SI valeur < 100 alors afficher "0" ;

afficher valeur ;

Complétez l’onglet affichage :

Complétez l’onglet affichageAvec0 :

// Onglet affichage

void affichage(void)

{

bleu = 0;

vert = 2.55 * pourcentage;

rouge = ; // à compléter

lcd.setRGB(rouge, vert, bleu) ;

lcd.setCursor(0, 0);

lcd.print(tensionBatterie);

lcd.print("V ");

lcd.setCursor(0, 1);

lcd.print(pourcentage);

lcd.print("% ");

}

// Onglet affichage

void affichage(void)

{

bleu = 0;

vert = 2.55 * pourcentage;

rouge = -2.55 * pourcentage + 255;

lcd.setRGB(rouge, vert, bleu) ;

lcd.setCursor(0, 0);

lcd.print("Tension: ");

affichageAvec0(tensionBatterie);

lcd.print("V");

lcd.setCursor(0, 1);

lcd.print("Charge : ");

affichageAvec0(pourcentage);

lcd.print("%");

}

// Onglet affichageAvec0

void affichageAvec0(float valeur)

{

if(valeur<10)

{

lcd.print("00");

}

else if(valeur<100)

{

lcd.print("0");

}

lcd.print(valeur);

}

Page 11: TP déductif Arduino - Freestiddsin.free.fr/explorer/Cours-TD-TP/12b-TP... · Type : TP Déductif Objectif L’objectif final de ce TP est de proposer un modèle mathématique d’une

TP déductif Arduino - CAN et surveillance de charge d’une batterie LiPo 2 éléments

10

Pour aller plus loin : CGRAM On remarque qu’il y a un espace non exploité sur la ligne du bas de l’écran. On va en profiter pour afficher

graphiquement l’état de la batterie. Pour ce faire, on va utiliser 6 des 8 caractères programmables de

l’afficheur LCD qui correspondent aux codes '0' à '7' de la CGRAM (Character Generator RAM) :

TT EE NN SS II OO NN :: 00 00 77 .. 66 00 VV

CC HH AA RR GG EE :: 00 44 33 .. 11 88 %%

Les 6 pictogrammes à générer sont les suivants : ils seront nommés batterie0 à batterie5 et stockés

respectivement dans les caractères '0' à '5' de la CGRAM.

Pour générer un caractère, il faut utiliser la fonction prédéfinie

lcd.createChar(0,batterie0) où le paramètre 0 est la position du

caractère dans la CGRAM et le paramètre batterie0 est un tableau de

8 octets qui représentent les pixels de notre pictogramme. Voici ci-

contre la syntaxe Arduino du tableau batterie0.

Remarquez que 0b représente la base binaire, que chaque '1'

correspond à un pixel noir et chaque '0' correspond à un pixel blanc.

La création des pictogrammes personnalisés sera effectuée par la fonction void caracteres(void) dans un

nouvel onglet caractere. Cette fonction sera appelée dans la fonction setup.

Dans l’interface Arduino, complétez la fonction setup de l’onglet principal :

Créez l’onglet caractere conformément à l’exemple ci-dessous :

byte batterie0[8] = {

0b01110,

0b11111,

0b10001,

0b10001,

0b10001,

0b10001,

0b10001,

0b11111

};

batterie0

batterie1

batterie2

batterie3

batterie4

batterie5

void setup()

{

Serial.begin(9600); // Configuration vitesse de transfert du moniteur série

lcd.begin(16, 2); // Initialisation du LCD 2 lignes de 16 caractères

caractere(); // Appel de la fonction qui génère les caractères

}

// Onglet caractere

byte batterie0[8] = { // Création d’un tableau de 8 octets nommé batterie0

0b01110, // caractère représentant une batterie vide

0b11111,

0b10001,

0b10001,

0b10001,

0b10001,

0b10001,

0b11111

};

// A Compléter pour chaque caractère batterie1 à batterie5

void caractere(void)

{

lcd.createChar(0, batterie0); // Écriture en CGRAM du caractère représentant une batterie vide

}

Page 12: TP déductif Arduino - Freestiddsin.free.fr/explorer/Cours-TD-TP/12b-TP... · Type : TP Déductif Objectif L’objectif final de ce TP est de proposer un modèle mathématique d’une

TP déductif Arduino - CAN et surveillance de charge d’une batterie LiPo 2 éléments

TP déductif 11

Maintenant que chaque nouveaux pictogrammes sont stockés en CGRAM, il ne reste plus qu’à demander

leur affichage par intervalle du pourcentage de la batterie conformément à l’algorithme ci-dessous :

Positionner le curseur de l’afficheur à gauche de la deuxième ligne ;

Si pourcentage < 10 alors afficher le pictogramme batterie0 ;

Sinon Si pourcentage < 30 alors afficher le pictogramme batterie1 ;

Sinon Si pourcentage < 50 alors afficher le pictogramme batterie2 ;

Sinon Si pourcentage < 70 alors afficher le pictogramme batterie3 ;

Sinon Si pourcentage < 90 alors afficher le pictogramme batterie4 ;

Sinon afficher le pictogramme batterie5 ;

Pour afficher un caractère personnalisé, il faut utiliser la commande lcd.write (et non lcd.print).

Complétez l’onglet affichage :

Remarquez que la valeur 0 pose une ambigüité de type lors de l’écriture du caractère batterie vide. Il faut donc

forcer le type octet non signé avec la syntaxe suivante : lcd.write((unsigned char)0);

Testez votre programme. En fonction du pourcentage de charge de la batterie, observez :

Les valeurs affichées sur le LCD ;

Les variations de la couleur de l’écran ;

Les changement du pictogramme de la batterie.

Faire constater le fonctionnement par votre professeur.

// Onglet affichage

void affichage(void)

{

bleu = 0;

vert = 2.55 * pourcentage;

rouge = -2.55 * pourcentage + 255;

lcd.setRGB(rouge, vert, bleu) ;

lcd.setCursor(0, 0);

lcd.print("Tension: ");

affichageAvec0(tensionBatterie);

lcd.print("V");

lcd.setCursor(1, 1); // à rajouter

lcd.print("Charge: "); // à rajouter

affichageAvec0(pourcentage);

lcd.print("%");

// Complétez avec le code ci-dessous

lcd.setCursor(0, 1); // Position du pictogramme batterie en bas à gauche du LCD

if(pourcentage<10)

{

lcd.write((unsigned char)0); // Affichage du pictogramme batterie0 : Batterie vide

}

else if(pourcentage<30)

{

lcd.write(1);

}

else if(pourcentage<50)

{

lcd.write(2);

}

else if(pourcentage<70)

{

lcd.write(3);

}

else if(pourcentage<90)

{

lcd.write(4);

}

else

{

lcd.write(5); // Affichage du pictogramme batterie5 : Batterie pleine

}

}