Menu HTML / Javascript : Aperçu

Blog du réseau du Mesnil-sur-Jorg

mardi 29 novembre 2022
      Membre de Train d'enfer 95

La gestion des aiguillages par Arduino


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

 

CIMG9292.JPG

 

CIMG9294.JPG            CIMG9295.JPG

Un bouton (rouge) sélectionne le mode "Réglages" (bouton enfoncé) ou le mode "Gestion" (bouton relaché).

  • En mode "Réglages" une résistance variable défini les butées de déplacement droit et gauche.
  • En mode  "Gestion" un autre bouton (noir) commande les déplacements du servomoteur à gauche ou à droite.

Prochaine étape : 

  • préparer le code du programme pour gérer 8 aiguillages sur une seule carte (il faudra 4 cartes en tout).
  • mettre en mémoire les réglages pour chaque aiguillage.

 


Publié le : Dimanche 13 décembre 2020 @ 20:02:49
Envoyer cet article à un ami      Page spéciale pour impression
Article du Jour
Il n'y a pas encore d'article du jour.
Lettre d'information

Recevez par mail les nouveautés du site.

Chat Box
Activité du Site

Pages vues depuis 15/01/2020 : 267 806

  • Nb. de membres 7
  • Nb. d'articles 108
  • Nb. de forums 0
  • Nb. de sujets 44
  • Nb. de critiques 0

Top 5  Statistiques


Plus de contenu