Auteur Sujet: aiguillage et capteur fc 51  (Lu 7189 fois)

mario

  • Newbie
  • *
  • Messages: 7
    • Voir le profil
aiguillage et capteur fc 51
« le: février 02, 2024, 04:35:11 pm »
Bonjour
Je cherche à commander 1 servomoteur que j'ai installé sur un aiguillage avec le détecteur infra rouge FC 51. Est ce possible si oui quelqu'un aurait il  le programme et le plan de cablage. J'ai un arduino uno dispo.
Merci à la personne qui me répondra

bobyAndCo

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1081
  • HO avec DCC++
    • Voir le profil
Re : aiguillage et capteur fc 51
« Réponse #1 le: février 02, 2024, 05:49:21 pm »
Bonjour Mario,

Commander un servomoteur à partir de la détection d'un capteur IR est bien sûr possible. Mais selon moi, il faudra passer par un micro contrôleur (Arduino Uno, Nano, ESP01, ESP32...).

L'action se fait en 2 étapes :
1° - La détection. Le capteur IR envoie un signal sur l'une des pins lorsqu'il est activé.
2° - C'est la réception de ce signal par le programme qui déclenchera le mouvement du servo moteur.

Mais il faut prendre quelques précautions : Par exemple, au passage d'un train, le capteur va s'activer et se désactiver souvent par exemple entre les wagons. Il faut donc prévoir une temporisation.

L'aiguille reste t'elle dans sa position et reviendra donc à sa position initiale à la prochaine activation du capteur ou là aussi faut'il prévoir que l'aiguille revienne à sa position initiale après x secondes. Ou après le passage sur un autre capteur qui serait après l'aiguille ?

Voila quelques questions auxquelles il faut répondre pour étudier le programme qui est assez simple.

Est-ce comme cela que tu imaginais la chose ?

Christophe

mario

  • Newbie
  • *
  • Messages: 7
    • Voir le profil
Re : aiguillage et capteur fc 51
« Réponse #2 le: février 02, 2024, 10:15:37 pm »
Merci infiniment de prendre de votre temps pour essayer de m'aider. Vous avez bien analysé ce que je souhaiterai réaliser. Je voudrais que l'aiguillage revienne à sa position initiale aprés le passage du train. J'ai vu sur le site franzitrains qu'une personne utilisait un minuteur à relais de déclenchement QFRD21 avec un optocoupleur EL 817 C mais pas d'arduino pensez vous que ces éléments puissent convenir?
Cordialement
Mario
Pour info je suis nul en électronique mais intéréssé par arduino

bobyAndCo

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1081
  • HO avec DCC++
    • Voir le profil
Re : aiguillage et capteur fc 51
« Réponse #3 le: février 02, 2024, 10:31:39 pm »
Pour moi il est plus simple (plus souple) de choisir un Arduino qui pourra aussi assurer d'autres fonctions. Il est assez simple de détecter le signal infra rouge, de changer la valeur d'une variable d'état et commander le servo, de demander à l'Arduino d'inverser la valeur de la variable d'état au bout de x secondes et ce faisant, de commuter l'aiguille.

Fouillez un peu sur le site, c'est aussi cela le DIY, il y a pas mal d'exemples avec des capteurs (IR ou autres), temporisation, etc... Les exemples liés au PN sont certainement assez proche de ce que vous voulez faire.

Je n'ai pas beaucoup de temps actuellement mais je vous donnerai d'autres pistes et des matériels plus tard et d'autres vont certainement vous répondre.

Cherchez, posez-vos questions et l'on vous répondra.

Christophe

mario

  • Newbie
  • *
  • Messages: 7
    • Voir le profil
Re : aiguillage et capteur fc 51
« Réponse #4 le: février 03, 2024, 11:08:48 am »
Bonjour
Merci encore je vais continuer de "surfer" sur internet et quand vous le pourrez je suis preneur de vos infos.
Bonne journée





JPB

  • Newbie
  • *
  • Messages: 47
    • Voir le profil
Re : aiguillage et capteur fc 51
« Réponse #5 le: février 07, 2024, 08:29:32 am »
Bonjour,
J'ai réalisé ce schéma sur une petite déviation. J'ai installé une cellule infrarouge en amont sur la ligne qui déclenche le servo via une arduino nano.

La cellule est du type TCRL5000 placée en biais pour ne pas détecter les intervalles entre wagons. Le programme est celui du passage à niveau proposé sur la page de Locoduino et modifié/diminué pour utilisation d'un seul capteur, une tempo, un servo et une led de visu sur le TCO.
A savoir qu'avec un Nano, tu peux piloter plusieurs capteurs et/ou plusieurs servos.

Une idée du programme, celui-ci fonctionne. J'ai juste remplacé le bouton par le capteur TCRL5000 et ajusté le délai. Il est possible de rajouter un capteur après l'aiguille en le déclarant dans les lignes du programme.


#include <Servo.h>
 
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;
 
const int angleMin = 1250;
const int angleMax = 1750;
 
Servo monServo;
int vitesse = 0;
int angle = angleMin;
byte etatServo = SERVO_A_ANGLE_MIN;
 
const int pinBouton = 0; /* le bouton est connecte a  la broche A0 */
 
const boolean PRESSE = true;
const boolean RELACHE = false;
 
boolean etatBouton = RELACHE;
 
const byte AUCUN_EVENEMENT = 0;
const byte EVENEMENT_PRESSE = 1;
const byte EVENEMENT_RELACHE = 2;
 
/*
 * fonctions de gestion du poussoir
 */
boolean lirePoussoir()
{
    boolean resultat = RELACHE;
    if (analogRead(pinBouton) > 512) {
        resultat = PRESSE;
    }
    return resultat;
}
 
byte lireEvenement()
{
    byte evenement;
    boolean nouvelEtat = lirePoussoir();
    if (nouvelEtat == etatBouton)
        evenement = AUCUN_EVENEMENT;
    if (nouvelEtat == PRESSE && etatBouton == RELACHE)
        evenement = EVENEMENT_PRESSE;
    if (nouvelEtat == RELACHE && etatBouton == PRESSE)
        evenement = EVENEMENT_RELACHE;
    etatBouton = nouvelEtat;
    return evenement;
}
 
/*
 * La fonction setup() est executee 1 fois
 * au demarrage du programme
 */
void setup()
{
  monServo.attach(2);
}
 
/*
 * La fonction loop() est executee
 * repetitivement
 */
void loop()
{
    /* actualisation de l'angle du servo */
    monServo.writeMicroseconds(angle);
 
    angle = angle + vitesse;
 
    if (angle > angleMax) {
        angle = angleMax;
        vitesse = 0;
        etatServo = SERVO_A_ANGLE_MAX;
    }
    else if (angle < angleMin) {
        angle = angleMin;
        vitesse = 0;
        etatServo = SERVO_A_ANGLE_MIN;
    }
 
    /* 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:
                vitesse =  1;
                etatServo = SERVO_EN_MOUVEMENT_VERS_ANGLE_MAX;
                break;
            case SERVO_A_ANGLE_MAX:
            case SERVO_EN_MOUVEMENT_VERS_ANGLE_MAX:
                vitesse = -1;
                etatServo = SERVO_EN_MOUVEMENT_VERS_ANGLE_MIN;
                break;
        }
    }
 
    delay(3);
}
« Modifié: février 07, 2024, 10:40:14 am par JPB »