J'utilise la bibliothèque Servo intégrée.
Comme il y a beaucoup d'aiguilles (ce n'est pas mon réseau), j'ai créé des objets intégrant le servo, les 2 leds qui affichent sa position et l'inter de commande. Comme cela va au delà du sujet, j'ai mis cette classe à la fin.
Mais revenons à nos moutons !
J'ai essayé d'attacher l'objet servo à sa pin après l'initialisation de sa position :
void InitServo() {
objetServo.writeMicroseconds(posInitiatle); // position initiale
objetServo.attach(pinServo);
}
Mais n'étant pas sur place, je vous donnerai les résultats à mon retour.
Pour ceux que cela interesse, voici la classe complète
class CommandeAiguille {
Servo objetServo;
Bounce objetInter;
byte etatAutomate; // 0 fixe, 1 bouge
int etatInter; // O directe, 1 dévié
int taillePlage; // pas utilisé pour le moment
int posMin; // position droite
int posMax; // position déviée
int posCourante; // posotion courante
int delta; // saut de position = pas
int pinServo;
int pinInter;
int pinLedDirecte;
int pinLedDeviee;
unsigned long tempo; // pour l'automate
public:
CommandeAiguille() { // constructeur
etatAutomate = 0;
}
void SetpinServo(int p) { // définir la pin Servo
pinServo = p;
}
void SetpinInter(int p) { // définir la pin Inter
pinInter = p;
}
void SetpinLedDirecte(int p) { // définir la pin led
pinLedDirecte = p;
}
void SetpinLedDeviee(int p) { // définir la pin led
pinLedDeviee = p;
}
void SetPosMinMax (int pm, int PM) { //définir les butées
posMin = pm;
posMax = PM;
}
void InitCommandeAiguille() { // initialisations
pinMode(pinInter,INPUT_PULLUP);
pinMode(pinLedDirecte,OUTPUT);
pinMode(pinLedDeviee,OUTPUT);
objetInter.attach(pinInter);
objetInter.interval(50);
etatInter = digitalRead(pinInter);
digitalWrite(pinLedDirecte, !etatInter);
digitalWrite(pinLedDeviee, etatInter);
if (etatInter) posCourante = posMin; else posCourante = posMax;
objetServo.writeMicroseconds(posCourante); // position initiale en fonction de l'inter
objetServo.attach(pinServo); // attaches the servo on servo_pin to the servo object
}
void InterUpdate() { // test de l'inter
if (objetInter.update( )) { // 1 si changement sinon 0
objetServo.attach(pinServo);
etatInter = objetInter.read();
digitalWrite(pinLedDirecte, !etatInter);
digitalWrite(pinLedDeviee, etatInter);
//objetServo.attach(pinServo);
if (etatInter==HIGH) {
delta = -5; // position passe à droite
} else {
delta = +5; // position passe à devié
}
etatAutomate = 1; // en mouvement
tempo = millis();
}
}
void ServoUpdate() { // mouvement du servo
if (etatAutomate == 1) {
if ((tempo+pas) < millis()) { // fin du pas de tempo
posCourante = posCourante + delta;
objetServo.writeMicroseconds(posCourante);
if ((posCourante <= posMin) || (posCourante >= posMax)) { // arret
etatAutomate = 0;
//objetServo.detach();
} else {
tempo = millis();
}
}
}
}
}; // fin de la classe CommandeAiguille