/*
* Calibration automatique d'un ESC et contrôle du moteur via potentiomètre
*
* Fonctionnalités :
* - Calibrage de l'ESC uniquement au tout premier démarrage via EEPROM
* - Envoie un signal PWM maximal (2000µs) pendant 3s, puis minimal (1000µs) pendant 3s
* - Marque dans l'EEPROM que le calibrage est effectué
* - Lecture d'un potentiomètre sur A0
* - Mappage de la valeur du potentiomètre en plage 1000-2000µs pour la consigne
* - Filtrage exponentiel (EMA) léger de la lecture pour la stabilité
* - Soft start / soft stop progressifs vers la consigne moteur
*
* Bibliothèques : Servo.h, EEPROM.h
*/
#include <Servo.h>
#include <EEPROM.h>
// Déclaration du Servo pour l'ESC
Servo esc;
const int escPin = 9; // Broche de commande de l'ESC (PWM)
const int potPin = A0; // Broche analogique pour le potentiomètre
const int eepromAddrCalib = 0; // Adresse EEPROM pour stocker le flag de calibrage
// Plage PWM (microsecondes) pour l'ESC
const int minPWM = 1000;
const int maxPWM = 2000;
// Paramètres de filtre EMA pour la lecture du potentiomètre
const float alpha = 0.1; // Facteur de lissage (0 = pas de mise à jour, 1 = pas de filtrage)
float filteredPotValue = 0.0;
// Pour le soft start / stop
int currentPWM = minPWM; // Valeur PWM actuelle envoyée à l'ESC
const int pwmStep = 5; // Pas de variation progressive (en microsecondes)
// Fonction setup : initialisation et calibrage au premier démarrage
void setup() {
// Attacher l'ESC au pin défini
esc.attach(escPin);
// Envoi initial au minimum (sécurité) et attente pour la reconnaissance de l'ESC
esc.writeMicroseconds(minPWM);
delay(2000);
// Vérification du flag de calibrage dans l'EEPROM
if (EEPROM.read(eepromAddrCalib) != 1) {
// -- Calibrage ESC au premier démarrage --
// Envoi du signal maximal pendant 3 secondes
esc.writeMicroseconds(maxPWM);
delay(3000);
// Envoi du signal minimal pendant 3 secondes
esc.writeMicroseconds(minPWM);
delay(3000);
// Marquer dans l'EEPROM que le calibrage est effectué
EEPROM.write(eepromAddrCalib, 1);
}
// Après calibrage (ou si déjà calibré), maintenir PWM minimal pour sécurité
esc.writeMicroseconds(minPWM);
delay(1000);
// Initialiser la valeur filtrée du potentiomètre
filteredPotValue = analogRead(potPin);
currentPWM = minPWM;
}
// Boucle principale : lecture pot, filtrage, mappage, soft start/stop
void loop() {
// Lecture brute du potentiomètre
int potValue = analogRead(potPin);
// Filtre exponentiel (EMA) pour lisser la lecture du potentiomètre
filteredPotValue = alpha * potValue + (1.0 - alpha) * filteredPotValue;
// Mappage de la valeur filtrée vers la plage PWM 1000-2000 µs
int targetPWM = map((int)filteredPotValue, 0, 1023, minPWM, maxPWM);
// Soft start : rampage progressif vers la consigne PWM
if (targetPWM > currentPWM) {
currentPWM += pwmStep;
if (currentPWM > targetPWM) {
currentPWM = targetPWM;
}
}
// Soft stop : descente progressive vers la consigne PWM
else if (targetPWM < currentPWM) {
currentPWM -= pwmStep;
if (currentPWM < targetPWM) {
currentPWM = targetPWM;
}
}
// Envoi du signal PWM (microsecondes) à l'ESC
esc.writeMicroseconds(currentPWM);
// Délai pour boucle stable (~50 Hz)
delay(20);
}