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

Tiens une autre question :slight_smile:

J’ai à l’écran “put your set up code here, to run once”
et en dessous "put your main code here, to run repeatedly:

Je les ai ou ces codes ? Ou c’est moi qui les invente ?

Bonjour Claude,

Sans Arduino difficile de faire grand chose.

Oui les commentaires indiquent les endroits où tu dois placer ton code run once et run repeatedly.

Je te propose d’organiser un webinar pour t’aider à mettre en œuvre tout ça ! Et nous pourrons élargir les participants pour en faire profiter les membres du forum intéressés.

Je reviens vers toi en MP.

@+

Merci de ta réponse, je voulais juste m’assurer que sans l’Arduino, on ne peut rien faire, je vais patienter jusqu’à la livraison.

Bonjour Julie,

Merci pour tes tutos très intéressants.
J’ai planché sur le tuto5 et j’ai quelques problèmes.
J’ai une installation identique, avec une arduino MEGA

J’ai fait les connexon comme démontré dans ton schéma, mais une LED à la place du relais

Quand j’affiche les valeurs, j’ai seulement des valeurs 16, 17 qui remontent,

même quand le secteur est occupé.

Sur ton schéma, le fin B est raccordé au GND et le fil O au VCC du module. Est-ce correcte?
Je ne sais pas trop où aller chercher, pourrais-tu m’aiguiller?, merci d’avance.
Meilleures salutations.
P.-A

Bonjour Pierre-André,

Un courageux qui se lance aussi ! c’est top :smiley:

B (Bahn) sur VCC et Rail contact bleu sur GND de la carte analogique (et non pas le O).

Aussi, je ne vois pas bien le montage que tu as fait en amont de la carte analogique (sur le bornier qui vient de la voie). Comment est branchée cette led jaune ?

Edit +1H : j’ai vérifié Tuto05, worksforme, donc on va trouver la différence :slight_smile:

Ajoute une ligne dans setup() :

pinMode(anaPin,INPUT_PULLUP);

Possible qu’il y ai une différence entre le Nano et le Mega à ce niveau là ? Je ne vois que ça car l’entrée contact en l’air, la lecture analogique doit envoyer 0 (PULLUP), sinon elle renvoie une valeur qui fluctue (tension et des trains digitaux de shunt correspondant aux trames DCC/MM2 et cie).

Donc tes valeurs 16 et 17 sont vraiment suspectes. Tu devrais avoir 0 ou 500 à 800 :slight_smile: ! (sur une échelle de 0 à 1023).

Par acquis, j’ai changé la carte analogique et le Nano, ça continue à marcher chez moi grrr : valeur 0 en l’absence de wagon sur le rail, une valeur qui fluctue fortement sinon.

j’ai ajouté le pinMode.
j’ai une valeur de 357, et qui augmente à chaque tour, que la voie soit libre ou occupée.
Je n’ai pas de valeur 0 si “Libre”
j’ai pris le B directement à la sortie de l’alimentation = résultat idem
je sèche.
J’ai débranché le rail de contact et le B = j’ai toujours mes valeurs qui augmentent
J’ai débrancher module => arduino = les valeurs augmentent toujours
donc je suppose que c’est dans code qu’il se passe qq chose ou le MEGA. je vais programmé un UNO pour voir.

Ou l’entrée analogique ? Bizarre

Essaye sur une autre pin ?

Ayant ni Mega ni Uno je ne sais pas trop comment t’aider. Normalement il ne devait pas y avoir de différence !

Et le programme est simplissime

J’ai essayé avec un UNO, idem
Je vais chercher, merci pour ton aide.

sur les autres PIN idem

au début je pensais faire avec un relais, mais je vais chercher pour passé directement vers l’arduino avec un module.

Si tu branches directement les sorties de la digibox : O sur GND et B sur VCC du module analogique ?

Si la voie est STOP il devrait y avoir 0 et si la voie est RUN, tu devrais voir passer des grosses valeurs (500-700) avec quelques valeurs très basses (shunts du signal numérique).

Si ça ne marche pas, alors je ne comprends pas. Une défaillance du module analogique ? (j’imagine que tu as déjà essayé avec l’autre à côté).

Hello,
Après avoir tout contrôlé, j’avais un faux contact dans mes voies de tests.
J’ai changé les voies et refait mon installation, du coup tout fonctionne correctement avec tout les arduinos (nano, uno, mega). Je vais pouvoir faire des essais sur ma maquette
Merci pour ton aide.
Encore une petite question: La diode 1N4001,est-elle indispensable sur le secteur isolé?
Les risques de retour de courant pourrait venir d’où?
Salutations.

Bonsoir,

Ouf ! Je ne comprenais plus rien :smiley: !

C’est préférable oui pour certaines locomotives.

Lire la réponse de Sylvain :

Bonne soirée,

Merci pour vos réponses, bonne journée

Bonjour @Julaye . Avoir mixé digital et arduino est vraiment top et offre de super opportunités.
Question : le fil bleu vient de O (en fait, c’est soit O, soit en l’air si pas d’essieu). Le fil rouge est B. Ensuite sur le module, bleu va sur VCC et rouge sur GND. Mais la référence Märklin est bien O. Donc la connexion devrait être l’inverse ĺbleu sur GND et rouge sur VCC). Pourquoi avoir connecté comme tu l’as fait ?
D’autre part, quand il n’y a pas d’essieu, bleu n’a pas de valeur. Comment est on sûr de la valeur en sortie du module ?
Merci pour tes tutoriaux ! Je suis plus informatique qu’électronique pur, et du coup tu mais la relation :+1:

Hello,

En refaisant les montages hier, notamment pour l’épisode 9 avec le Paparazzi, je me suis aperçue de mon erreur. En fait ça marchait de façon assez aléatoire.

Ton message a croisé mes corrections :smiley: ! J’y travaille depuis ce matin pour corriger les erreurs.

Je te confirme : B(ahn) sur le VCC et Fil bleu contact sur le GND.

Il fallait aussi mettre l’entrée analogique en mode PULLUP pour que ça fonctionne bien.

J’ai repris les schémas et programmes, modifié l’ensemble du fil de discussion et re-testé l’ensemble des tutoriels, sur ma plateforme de test sur mon bureau ET sur le dépôt d’Obourg.

L’entrée Analogique a un mode PULLUP.

Bonne journée et encore merci pour ton oeil acéré !

1 « J'aime »

Deux paires d’yeux valent toujours mieux qu’une :slight_smile: Content d’avoir pu aider, modestement, vue ton niveau de maîtrise du sujet

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 »

ce bandit de chat à dit que c’était bon ! :smile_cat: