==== Moniteur de batterie ====
L'objectif de cette expérience est de réaliser le moniteur de charge de batterie qui sera embarqué dans le drone.
Toutes les manipulations et code réalisé peuvent aussi servir dans d'autres projets utilisant une batterie LIPO et un Arduino.
=== Principe ===
Afin de ne pas endommager le drone ou la batterie il est primordial de garder un oeil sur la décharge de la batterie afin de pouvoir le poser avant que les moteurs se coupent tout seuls. Pour cela il existe plusieurs solutions. La plus simple est d'utiliser un moniteur de batterie électronique (http://www.radio-modele-47.com/PBSCProduct.asp?ItmID=3531385&AccID=19626&PGFLngID=0&gclid=COaY2oHlhLwCFUTJtAodTTMAiw). Mais il faut les acheter et ce n'est pas toujours facile de voir les diodes si on est loin du drone. Nous avons donc choisi de faire notre propre moniteur de batterie.
Tout d'abord il faut savoir que plus une batterie est déchargée, plus la tension qu'elle délivre est faible. Par exemple, pour la LIPO 3S (11.1v) que nous utilisons, la tension varie entre 9v(0%) et 12.6v(100%). Il nous suffit donc de connaître la tension reçue par l'Arduino pour connaître la charge restante.
=== Procédure ===
Nous n'avions pas encore reçu notre LIPO lors des tests, nous avons donc utilisé un générateur de tension disponible au lab pour simuler la décharge. De plus cela nous permet de faire des tests beaucoup plus rapidement.
Nous utilisons une des entrées analogiques de l'Arduino comme Voltmètre. Elle accepte une tension comprise entre 0 V et 5 V et on souhaite mesurer une tension comprise entre 9 et 12 V, il est donc nécessaire de rajouter un diviseur de tension entre la batterie et l'entrée de l'Arduino.
{{:wiki:projets:godhelium:diviseur_de_tension.jpg?300|}}
On souhaite un rapport de 3 entre les deux tensions (en pratique 3.2 avec les résistantes disponibles) : soit Udev la tension délivrée par la batterie et Ul la tension lue : on veut Ul = Udev/3.
Avec un diviseur de tension on a : Ul = Udev*R2/(R1+R2) on prend R1 = 2R2.
{{:wiki:projets:godhelium:2014-01-17_14.54.54.jpg?500|}}
La valeur lue est donc Ul. On la convertit en Udev = 3.2*Ul puis en pourcentage de batterie.
{{:wiki:projets:godhelium:chargebatterie.png?500|}}
=== Code ===
Exemple de code Arduino :
#define VCC_PIN 2
void setup() {
Serial.begin(9600);
}
void loop() {
float vcc = analogRead(VCC_PIN) / 1023. * 5.;
float pcent = max(0.0, ((vcc*3.2)-9.0)*33.33);
//Serial.print(vcc);
//Serial.print("->");
Serial.println(pcent);
delay(1000);
}
=== Amélioration ===
Le calcul de la charge de la batterie devant être exécuté rapidement, nous avons choisi d'envoyer directement la valeur de la variable vcc à notre centrale de contrôle, qui fera le traitement.
package fr.heliumteam.flightcontrol.tools;
public class BatteryTool {
public static final float[] voltages = new float[] {0, 9, 9.9f, 10.8f, 11.1f, 11.25f, 11.37f, 11.49f, 11.61f, 11.76f, 11.91f, 12.3f, 12.6f, 12.6f};
public static final float[] pcent = new float[] {0, 0, 5, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 100};
private static int getIndex(float voltage) {
for (int i=1 ; i
Ce code est chargé de la conversion de la tension en pourcentage de charge. Les valeurs sont obtenues à partir du tableau donné plus haut. Bien sûr, avant d'appeler la fonction getPercent(), nous devons multiplier notre tension par 3.2, valeur donnée par le calcul (R1+R2)/R1 avec R1 = 1.5 Ω et R2 = 3.2 Ω.
Tout cela nous donne un résultat plutôt satisfaisant mais nous avons remarqué que la tension oscillait beaucoup à cause de la lecture analogique. Nous avons donc rajouté le filtre passe bas suivant :
batterie *= 3.2f; // Diviseur de tension
batterie = MathHelper.lerp(batterie, previousVCC, 0.5f); // Low pass filter
previousVCC = batterie;