Étape 5: écrire. Code de INO
Arduino doit recevoir la commande de vitesse et faire parvenir le niveau actuel de la batterie.
Changement de R1 et R2 avec vos valeurs de résistances, j’ai utilisé un multimètre pour trouver les valeurs exactes de la mine. Tension de la batterie est calculée avec 9 V alimentation régulée par un LM7806, donc nous avons environ 3 V « marge » avant la tension atteint le seuil de 6 V et la sortie de LM7806 commence à décroître.
const float R1 = 26600.0; const float R2 = 26600.0; const float VBATT = 3; const int refreshRate = 10000; int south = 1; int batteryTimeout = 0;
Dans configuration de brochage Arduino, assurez-vous que le batteryPin est un type analogique.
int batteryPin = 0; int enableCheckPin = 7; int enableMotorPin = 3; int in1Pin = 2; int in2Pin = 4;
Lors de l’installation, Arduino attendra que DB est activée.
void setup() { pinMode(batteryPin, INPUT); pinMode(tempPin, INPUT); pinMode(enableCheckPin, OUTPUT); pinMode(in1Pin, OUTPUT); pinMode(in2Pin, OUTPUT); pinMode(enableMotorPin, OUTPUT); Serial.begin(9600); while (!Serial); delay(1000); Serial.println("-------ARDUINO-------"); }
Ici il y a un base voltmètre pour la mesure de niveau de batterie, si la charge est supérieur à 100 %, cela signifie que la batterie est débranchée (j’ai ajouté un autre 5 % pour la prévention du bruit erreur). Dans mon cas, la mesure est prise chaque ms 10000 (10 s), mais vous pouvez évidemment le modifier. Dans le cas contraire, la vitesse de DC peut être modifiée en mode « temps réel ».
void loop() { if (batteryTimeout == 0) { batteryTimeout = refreshRate; digitalWrite(enableCheckPin, HIGH); delay(500); float Vout = (analogRead(batteryPin) * 5.0) / 1024.0; digitalWrite(enableCheckPin, LOW); float Vin = Vout / (R2 / (R1 + R2)); int charge = (Vin * 100) / VBATT; Serial.print("Current charge: 0"); if (charge > 105) { Serial.println(" - "); } else { Serial.print(charge); Serial.println("%"); } } digitalWrite(in1Pin, !south); digitalWrite(in2Pin, south); if (Serial.available()) { int speed = Serial.parseInt(); if (speed >= 0 && speed <= 255) { analogWrite(enableMotorPin, speed); Serial.print("New speed set: 00"); Serial.println(speed); } } batteryTimeout--; delay(1); }
Ce code doit être optimisé, c’est juste un croquis de base pour commencer les essais en plein air.