Une débutante dans le décor - Ep6 - Quelques automatismes (Arduino Nano)

Variante Tuto6 avec une carte opto isolée type DST-1R4P-N ou DST-1R8P-N

Le problème de Tuto5 et Tuto6 est lié à l’utilisation d’un capteur de tension DC 0-25V qui n’est pas opto-isolé. Le fait de brancher deux capteurs de tension sur deux Arduino sur la même alimentation perturbe la lecture des rails contacts … Je mentionne le problème ici : L'héritière d'Obourg - #1074 par Julaye

Comme j’ai besoin de lire plusieurs rails contacts pour mes différents automatismes, il me fallait trouver une solution élégante mais toujours plug & play.

Je l’ai trouvé avec la carte de référence DST-1R4P-N avec 4 entrées opto-isolées indépendantes (attention, il existe des cartes qui ont une masse commune pour les entrées, à éviter absolument). Elle existe aussi en référence DST-1R8P-N pour 8 entrées.

Le branchement est assez simple, les sorties de cette carte attaquent directement les entrées digitales de l’arduino configurées en pull-up.

Sur la photo sous Obourg, on voit à gauche les départs vers l’Arduino (O1 et O8 pour respectivement D3 - contact et D4 - traction) et à gauche les entrées en provenance du digital marklin (I8) et du rail contact (I1).

La led verte indique que la carte est sous-tension. Les leds rouge indiquent la présence d’un signal.

J’ai pris la carte en version 8 voies car j’ai un total de 5 fosses à gérer et Paparazzi … donc 6 rails contact et 1 traction → 7 entrées :slight_smile:

Bien évidemment, pour ce tutoriel, il faut reprendre le code qui permet de détecter la présence d’un véhicule sur D3 et de détecter la présence du courant de traction sur D4.

Le code est simplissime, il consiste à détecter l’apparition de 0 sur l’entrée (et donc d’un fil à la masse tout simplement …). Il faut filtrer simplement car le signal numérique provoque quelques 1 :slight_smile:

// Tuto06b
// Exemple pour le forum 3rails / Julie Dumortier / Licence GPL
// 
// extrait du programme Fosse v1.5
//   afficher l'état de la voie sur le rail contact : STOP, libre ou occupé
//    sortie D5 -> relais (LOW = voie libre, HIGH = voie occupée)
//    sortie D13 -> led interne (LOW = voie alimentée, HIGH = voie STOP) EXPERIMENTAL
//
// Retrouvez ce tutoriel sur le lien : https://forum.3rails.fr/t/une-debutante-dans-le-decor-ep6-quelques-automatismes-arduino-nano/18361
// version 14 mai 2021 : l'état de la voie est prise directement sur le signal
// version 17 mai 2021 : l'état de la voie est prise au travers d'une carte opto isolée type DST-1R8P-N ou DST-1R4P-N 

// défini la broche (pin) utilisée pour commander le relais : D5
int relaisPin = 5;

// défini la broche (pin) utilisée pour lire le rail de contact : D3
int Pin_etatRail = 3;

// défini la broche (pin) utilisée pour lire le signal de traction : D4
int Pin_etatTraction = 4;

// on va filtrer le signal pendant 64 ms pour décider que le signal est présent
int msFiltre = 64;

// variable pour considérer que le signal est absent (haute-impédance)
int nbFiltre = 56;

// EtatVoie
// retourne l'état de la voie
//  voie_Occupee la voie est occupée
//  voie_Libre   la voie est libre
//  voie_STOP    la voie est en STOP (CSx ou MSII)

#define voie_Occupee  0
#define voie_Libre    1
#define voie_STOP     99

int EtatVoie()
{
  int n = msFiltre;
  
  int vr = 0;
  int vt = 0;
  int cr = 0;
  int ct = 0;
 
  // tant que le signal est bas on continue
  while (n>0) {
    // lit les deux entrées : rail contact et rail normal
    vr = digitalRead(Pin_etatRail);
    vt = digitalRead(Pin_etatTraction);

    Serial.print(vr);
    Serial.print(vt);
    Serial.print(' ');

    if (vt==1) {
      ct = ct + 1;
    }
    if (vr==1) {
      cr = cr + 1;
    }

    // attends 1 ms
    delay(1);

    n = n - 1;
  }

  if (ct > nbFiltre) {
    Serial.println("voie_STOP");
    return voie_STOP;
  }
  if (cr > nbFiltre) {
    Serial.println("voie_Libre");
    return voie_Libre;
  }
  Serial.println("voie_Occupee");
  return voie_Occupee;
} 

// code executé une seule fois au démarrage du module (ou après un reset)
void setup() {

  // programme la sortie digitale D3 en sortie
  // le In du relais est connecté à cette sortie D3
  pinMode(relaisPin, OUTPUT);

  pinMode(Pin_etatRail,INPUT_PULLUP);
  pinMode(Pin_etatTraction,INPUT_PULLUP);
  
  // Led 13 interne : rouge si STOP détecté, éteinte sinon
  pinMode(LED_BUILTIN, OUTPUT);

  // ouvre le port série (console de l'outil) avec la vitesse 57600 bauds
  // attention que le paramètre sur la console soit bien 57600 !
  Serial.begin(57600);

  // relais COMMON - NC (led verte allumée)
  digitalWrite(relaisPin,LOW);
}

// code executé en permanence (une boucle)
void loop() {

  int etat;

  etat = EtatVoie();

  switch (etat) {
    case voie_Libre:
      // relais COMMON - NC (led verte allumée)
      digitalWrite(relaisPin,LOW);
      
      // led 13 éteinte - voie alimentée
      digitalWrite(LED_BUILTIN,LOW);
      
      Serial.println("Voie libre");
      break;

    case voie_Occupee:
      // relais COMMON - NO (led verte eteinte)
      digitalWrite(relaisPin,HIGH);

      // led 13 éteinte - voie alimentée
      digitalWrite(LED_BUILTIN,HIGH);
      delay(25);
      digitalWrite(LED_BUILTIN,LOW);
      
      Serial.println("Voie occupée");
      break;

    case voie_STOP:
      // relais COMMON - NO (led verte eteinte)
     digitalWrite(relaisPin,HIGH);

      // led 13 allumée - voie STOP
      digitalWrite(LED_BUILTIN,HIGH);
      
      Serial.println("Voie STOP");
      break;

    default:
      Serial.print("Voie état inconnu = ");
      Serial.println(etat);
      break;
  }

  delay(1000);
  Serial.println("");

}

En exercice, je vous laisse reprendre Tuto7 qui n’est que Tuto6 avec un afficheur :slight_smile:

Par contre je vais placer dans l’épisode 4 la nouvelle version hardware et logiciel pour gérer les automatismes des fosses d’inspection et je vais en profiter pour vous partager la version multi-fosses qui utilise la POO (programmation orientée objet).

Merci de votre attention,

2 « J'aime »