La décision a été prise de créer sous Arduino mon propre système de commande des aiguillages mûs par des servoMoteurs. Sauf que je ne connais pas le système Arduino .... encore un truc à apprendre ... à 71 balais ca devient difficile. Heureusement que j'ai quelques connaissances en langage C.
Pour faire mon apprentissage je vais m'appuyer sur cette réalisation toute faite ManÅ“uvre des aiguilles avec des servo-moteurs mais je ne vais pas me contenter de faire un copié/collé. Ce n'est pas drôle ... tant pis si cela me prend du temps ....
Voici mes premiers essais.
#include
/* MAJ du 122/12/2020 16:35 */
Servo ServoTest;
int SensMouvement;
int angle;
const int angleMin = 1250;
const int LimiteAngleMin = 1100;
const int angleMax = 1750;
const int LimiteAngleMax = 1900;
const int PointMilieu = 1500;
const int PauseMouvement = 5;
/* pour réglages par potentiomètre */
int valeurLecture = PointMilieu;
/* Fin */
/* pour commande des aiguillages par bouton poussoir */
const byte SERVO_A_ANGLE_MIN = 0;
const byte SERVO_A_ANGLE_MAX = 1;
const byte SERVO_EN_MOUVEMENT_VERS_ANGLE_MAX = 2;
const byte SERVO_EN_MOUVEMENT_VERS_ANGLE_MIN = 3;
byte etatServo = SERVO_A_ANGLE_MIN;
const boolean PRESSE = true;
const boolean RELACHE = false;
boolean etatPoussoirsAiguillages = RELACHE;
const byte AUCUN_EVENEMENT = 0;
const byte EVENEMENT_PRESSE = 1;
const byte EVENEMENT_RELACHE = 2;
/* Fin */
/*
* fonctions de gestion du poussoir
*/
boolean lirePoussoirsAiguillages()
{
boolean resultat = RELACHE;
if (analogRead(1) > 512) { // les boutons sont connectés à la broche A1
resultat = PRESSE;
}
return resultat;
}
byte lireEvenement()
{
byte evenement;
boolean nouvelEtatPoussoirsAiguillages = lirePoussoirsAiguillages();
if (nouvelEtatPoussoirsAiguillages == etatPoussoirsAiguillages)
evenement = AUCUN_EVENEMENT;
if (nouvelEtatPoussoirsAiguillages == PRESSE && etatPoussoirsAiguillages == RELACHE)
evenement = EVENEMENT_PRESSE;
if (nouvelEtatPoussoirsAiguillages == RELACHE && etatPoussoirsAiguillages == PRESSE)
evenement = EVENEMENT_RELACHE;
etatPoussoirsAiguillages = nouvelEtatPoussoirsAiguillages;
return evenement;
}
/*
* La fonction setup() est exécutée 1 fois
* au démarrage du programme
*/
void setup()
{
ServoTest.attach(2); /* le servo est connecté à la broche 2 */
ServoTest.write(90);
Serial.begin(9600); // connection au moniteur serie de l'ordinateur
/* setup va et vient *
angle = PointMilieu;
SensMouvement = 1;
* Fin setup va et vient */
/* setup réglage par potentiomètre */
/* Fin */
/* setup commande par bouton poussoir */
SensMouvement = 0;
angle = angleMin;
etatServo = SERVO_A_ANGLE_MIN;
/* Fin */
}
/*
* La fonction loop() est exécutée
* répétitivement
*/
void loop()
{
if (analogRead(0) > 512) { // le bouton MODE est connecté à la broche A0
// on passe en mode "réglage" des butées mini et maxi des servos
Serial.println("Mode réglage butées");
valeurLecture = analogRead(2); // Lecture de la résistance variable sur le pin A2 => valeurs de 0 à 1023)
valeurLecture = map(valeurLecture, 0, 1023, 0, 2500); // conversion en microsecondes
if (valeurLecture > LimiteAngleMax) { // on reste dans les limites
valeurLecture = LimiteAngleMax;
} else if (valeurLecture < LimiteAngleMin) {
valeurLecture = LimiteAngleMin;
}
ServoTest.writeMicroseconds(valeurLecture); // positionne le servomoteur
delay(PauseMouvement); // repos
Serial.println(valeurLecture);
} else {
// on passe en mode "commande"
Serial.println("Mode commande aiguillages");
/* Loop commande par bouton poussoir */
/* actualisation de l'angle du servo */
ServoTest.writeMicroseconds(angle);
angle = angle + SensMouvement;
if (angle > angleMax) {
angle = angleMax;
SensMouvement = 0;
etatServo = SERVO_A_ANGLE_MAX;
} else if (angle < angleMin) {
angle = angleMin;
SensMouvement = 0;
etatServo = SERVO_A_ANGLE_MIN;
} // fin if (angle > angleMax)
/* lecture de la commande de l'utilisateur */
byte evenement = lireEvenement();
if (evenement == EVENEMENT_PRESSE) {
switch (etatServo) {
case SERVO_A_ANGLE_MIN:
case SERVO_EN_MOUVEMENT_VERS_ANGLE_MIN:
SensMouvement = 1;
etatServo = SERVO_EN_MOUVEMENT_VERS_ANGLE_MAX;
break;
case SERVO_A_ANGLE_MAX:
case SERVO_EN_MOUVEMENT_VERS_ANGLE_MAX:
SensMouvement = -1;
etatServo = SERVO_EN_MOUVEMENT_VERS_ANGLE_MIN;
break;
} // fin if (evenement == EVENEMENT_PRESSE)
} // fin switch (etatServo)
/* Fin */
} // fin if (analogRead(0) > 512)
/* ************************************************** */
/* Loop va et vient */
/* calcule le nouvel angle *
angle = angle + SensMouvement;
if (angle > angleMax) { // le nouvel angle dépasse le maximum on le recale au maximum et on inverse la SensMouvement
angle = angleMax;
SensMouvement = -1;
}
else if (angle < angleMin) { // le nouvel angle dépasse le minimum on le recale au minimum et on inverse la SensMouvement
angle = angleMin;
SensMouvement = 1;
}
delay(PauseMouvement);
* Fin */
} // fin loop
Un bouton (rouge) sélectionne le mode "Réglages" (bouton enfoncé) ou le mode "Gestion" (bouton relaché).
Prochaine étape :
Pages vues depuis 15/01/2020 : 670 006