Commande d'une butte de triage par TCO ou en automatique

Répondre
Avatar du membre
likikiFrance
Site Admin
Site Admin
Messages : 6830
Enregistré le : 27 févr. 2021, 16:11
Prénom : Christian
LOCALISATION : Ile de France
Centres d'intérêts : Le train miniature (H0 3R), l'impression 3D
Echelle pratiquée : H0
Âge : 57
Pays :
France (fr)
France
avr. 2021 22 18:34

Commande d'une butte de triage par TCO ou en automatique

Message par likikiFrance

Bonjour à tous,
Je vous présente ma réalisation avec un Arduino MEGA 2560 R3.
Afin que vous puisiez bien comprendre mon cheminement, voici des extraits du documentus que j'ai réalisé afin d'aboutir à une bonne réalisation.
Tout d'abord voici le TCO avec toutes les données :
Image
Un petit tableau est nécessaire pour comprendre le codage que j'ai utilisé :
Image
Afin de commander tout ce petit monde, il fallait savoir qui commande quoi. J'ai donc fait ce tableau :
Image
Pour comprendre la commande d'un aiguillage triple j'ai aussi effectué le test en réel et voici le résultat. Cela permet de comprendre aussi le tableau précédent.
Image
Pour réaliser la programmation, mais aussi le câblage de la carte Arduino j'ai défini avant de commencer, les "pattes" de l'Arduino qui allait être en "entrées", en "sorties" :
Image
Voici comment j'ai décider de câbler les entrées, les sorties :
Image
Image
L'étape suivante a été de commencer la programmation pas à pas (avec l'aide de Guillaume), mais aussi de commencer la réalisation des annexes nécessaires au câblage de l'Arduino.
D’où cartes entrées, sorties etc
1- Carte entrées BP inter et sorties LEDS, le projet en dessin,
Image
Puis la réalité
Image
2- Sorties pour commander le dételeur et le feu : utilisation d'une carte relais KEYES
Image
3- Sorties pour commander les aiguillages : Grâce à l'aide de Christian, le chef Arduino (auteur des articles dans LR), j'ai choisi d'utiliser des amplificateurs UNL 2803.
Voici le principe,
Image
puis la réalisation sur circuit imprimé en bande
Image

J'ai mené la programmation par étape (commande du TCO led chenillard, puis commandes des aiguillages, enfin commande du dételeur) tout cela en commande manuelle. cela m'a permis d'appréhender la programmation d'une façon assez ordonnée.
Ensuite, la partie plus difficile a été de programmer la partie automatique. Le train recule lentement et le dételage se fait "tout seul", l'envoi sur les 5 voies de triage étant aléatoire. Je n'ai pas voulu aller plus loin dans le tri !!!

Voici le programme que j'ai réalisé. Il peut surement être optimisé mais cela fonctionne comme je le souhaitais.

Code : Tout sélectionner

/* PRG Butte de triage en cde manuelle et en automatique 
Pierre GRAFTIEAUX Décembre 2013 */

/* Déclaration des toutes les variables */
// d'abord toutes les LEDS
const int lvg1 = 32;  //led lvg2 en broche 32
const int lvt1 = 33;  //led lvt1 en broche 33
const int lvg2 = 34;  //led lvg2 en broche 34
const int lvt5g2 = 35;  //led lvt5g2 en broche 35
const int ldet = 36;  //led ldet en broche 36
const int lvt234 = 37;  //led ldet en broche 37
const int lvt2 = 38;  //led lvt2 en broche 38
const int lvt3 = 39;  //led lvt3 en broche 39
const int lvt4 = 40;  //led lvt4 en broche 40
const int lvt5 = 41;  //led lvt5 en broche 38
const int lclig = 20; // led clignotante en broche 20
const int feu = 17; // feu de signalisation vert/rouge en automatique

//Ensuite les récepteurs à alimenter
const int det = 21;  // dételeur en broche 21
const int a31de = 42;  //Aiguillage A31 dévié en broche 42
const int a31dr = 43;  //Aiguillage A31 droit en broche 43
const int a32de = 44;  //Aiguillage A31 dévié en broche 44
const int a32dr = 45;  //Aiguillage A31 droit en broche 45
const int a33de = 46;  //Aiguillage A31 dévié en broche 46
const int a33dr = 47;  //Aiguillage A31 droit en broche 47
const int a34de = 48;  //Aiguillage A31 dévié en broche 48
const int a34dr = 49;  //Aiguillage A31 droit en broche 49
const int a35de = 50;  //Aiguillage A31 dévié en broche 50
const int a35dr = 51;  //Aiguillage A31 droit en broche 51
const int a36de = 52;  //Aiguillage A31 dévié en broche 52
const int a36dr = 53;  //Aiguillage A31 droit en broche 53

// puis tous les boutons poussoirs
const int bvg1 = 22;  // BP bvg1 en broche 22
const int bvt1 = 23;  // BP bvt1 en broche 23
const int bvt2 = 24;  // BP bvt2 en broche 24
const int bvt3 = 25;  // BP bvt3 en broche 25
const int bvt4 = 26;  // BP bvt4 en broche 26
const int bvt5 = 27;  // BP bvt5 en broche 25
const int bvg2 = 28;  // BP bvg2 en broche 28
const int bdet = 29;  // BP bdet en broche 29
const int aqml = 30;  // commutateur AQML en broche 30
const int cdet1 = 31;  // capteur dételage1 en broche 31
const int cdet2 = 19;  // capteur dételage2 en broche 19
const int cdet3 = 18; // capteur wagon trié

// enfin les variables internes nécessaires à la gestion des variables
boolean b1;  // état de bvg1
boolean b2;  // état de bvt1
boolean b3;  // état de bvt2
boolean b4; // état de bvt3
boolean b5; // état de bvt4
boolean b6; // état de bvt5
boolean b7; // état de bvg2
boolean b8; // état de bdet
boolean b9; // état de aqml b9 = 0 en aq
boolean b10; // état du capteur dételage cdet1
boolean b11; // état du capteur dételage cdet2
boolean b12; // état du capteur cdet3 wagon trié 
byte broche; // n° broche d'un aiguillage
byte mbp; // mémoire du bP actionné

unsigned long temps; // variable temps pour le clignotement
boolean i; // pour impulsion aiguillage 
boolean j; // pour impulsion aiguillage
boolean k; // pour impulsion aiguillage
boolean l; // pour impulsion aiguillage
boolean m; // pour impulsion aiguillage
boolean n; // pour impulsion aiguillage
boolean o; // pour impulsion aiguillage
boolean p; // pour impulsion aiguillage
boolean r; // pour génération nbre aléatoire
boolean s; // pour séquence déeleur une fois en automatqiue
boolean vtri; // variable pour nb aléatoire entre 1 et 5

/* configuration des entrées et sorties */
void setup()
{
// définition des sorties LEDS
pinMode(lvg1, OUTPUT);
pinMode(lvt1, OUTPUT);
pinMode(lvg2, OUTPUT);
pinMode(lvt5g2, OUTPUT);
pinMode(ldet, OUTPUT);
pinMode(lvt234, OUTPUT);
pinMode(lvt2, OUTPUT);
pinMode(lvt3, OUTPUT);
pinMode(lvt4, OUTPUT);
pinMode(lvt5, OUTPUT);
pinMode(lclig, OUTPUT);
pinMode(feu, OUTPUT);
// Définition des sorties actionneurs dételeur aiguillages
pinMode(det, OUTPUT);
pinMode(a31de, OUTPUT); 
pinMode(a31dr, OUTPUT);
pinMode(a32de, OUTPUT); 
pinMode(a32dr, OUTPUT);
pinMode(a33de, OUTPUT);
pinMode(a33dr, OUTPUT);
pinMode(a34de, OUTPUT);
pinMode(a34dr, OUTPUT);
pinMode(a35de, OUTPUT);
pinMode(a35dr, OUTPUT);
pinMode(a36de, OUTPUT);
pinMode(a36dr, OUTPUT);
// définition des entrées
pinMode(bvg1, INPUT);
pinMode(bvt1, INPUT);
pinMode(bvt2, INPUT);
pinMode(bvt3, INPUT);
pinMode(bvt4, INPUT);
pinMode(bvt5, INPUT);
pinMode(bvg2, INPUT);
pinMode(bdet, INPUT);
pinMode(aqml, INPUT);
pinMode(cdet1, INPUT);
pinMode(cdet2, INPUT);
pinMode(cdet3, INPUT);

//Toutes les leds seront éteintes au départ ou lors d'un reset
led0();
b1=b2=b3=b4=b5=b6=b7=b8=b9=b10=b11=1;
b12=1;
r=s=0;
// cde pour pouvoir avoir une génération aléatoire avec random
randomSeed(analogRead(0)); // lit la "valeur" de l'entre analogique 0 non utilisée

}
/* début du programme */
void loop()
{
// cde aiguillages et leds en "manuel"
b9 = digitalRead(aqml);
if(b9 == 1)
{
//test action des BP et mise en mémoire dans mbp
b1 = digitalRead(bvg1);
b2 = digitalRead(bvt1);
b3 = digitalRead(bvt2);
b4 = digitalRead(bvt3);
b5 = digitalRead(bvt4);
b6 = digitalRead(bvt5);
b7 = digitalRead(bvg2);
b8 = digitalRead(bdet);
b10 = digitalRead(cdet1);
b11 = digitalRead(cdet2);
// mise en mémoire de l'action sur les bp dans, la mémoire mbp
if(b1 == 0)
{mbp = 1;}
if(b2 == 0)
{mbp = 2;}
if(b3 == 0)
{mbp = 3;}
if(b4 == 0)
{mbp = 4;}
if(b5 == 0)
{mbp = 5;}
if(b6 == 0)
{mbp = 6;}
if(b7 == 0)
{mbp = 7;}

// cde des aiguillages par impulsion durée réglée dans la fonction cde_aig(broche)
if(mbp == 1 && j<1) // cde aiguillage a31dr
  {
  raz_var(); // remet à 0 toutes les variables utilisées pour faire impulsion
  j++; // incrémente j pour ne faire qu'une impulsion sur l'aiguillage
  cde_aig(43); 
 }
// cde aiguillage a31de puis a32de puis a33dr
if(mbp == 2 && i<1) 
 {
  raz_var(); 
 i++; 
 cde_aig(42);
  cde_aig(44);
  cde_aig(47); 
 }
// cde aiguillage a31de puis a32dr puis a33dr puis a34de puis a35dr
if(mbp == 3 && k<1) 
 {
  raz_var();
  k++;
  cde_aig(42);
  cde_aig(45);
  cde_aig(47);
  cde_aig(48);
  cde_aig(51); 
 }
// cde aiguillage a31de puis a32dr puis a33dr puis a34dr puis a35dr
if(mbp == 4 && l<1) 
 {
  raz_var();
  l++;
  cde_aig(42);
  cde_aig(45);
  cde_aig(47);
  cde_aig(49);
  cde_aig(51);
  }
 // cde aiguillage a31de puis a32dr puis a33dr puis a34dr puis a35de
if(mbp == 5 && m<1)
  {
  raz_var();
  m++;
  cde_aig(42);
  cde_aig(45);
  cde_aig(47);
  cde_aig(49);
  cde_aig(50);
  }
 // cde aiguillage a31de puis a32dr puis a33de puis a36de
 if(mbp == 6 && o<1) 
 {
  raz_var();
  o++;
  cde_aig(42);
  cde_aig(45);
  cde_aig(46);
  cde_aig(52);
  }
// cde aiguillage a31de puis a32dr puis a33de puis a36dr
 if(mbp == 7 && p<1) 
 {
  raz_var();
  p++;
  cde_aig(42);
  cde_aig(45);
  cde_aig(46);
  cde_aig(53);
  }
// cde dételeur en manuel
 if(b8 == 0) 
{digitalWrite(21, 1);}
  else
  {digitalWrite(21, 0);}
  
// cde de la led clignotante pour indiquer que l'on peu dételer
 if(b10 == 1 && b11 == 0)
{digitalWrite(20,1);}
else
{digitalWrite(20,0);}
  
switch(mbp)
{
case 1:  // action à faire lors de l'appui sur bvg1
led0();
    if((millis() - temps) > 250)
  {digitalWrite(lvg1, 1);}
     if((millis() - temps) > 500)
    {temps = millis();}
break;

case 2:  // action à faire lors de l'appui sur bvt1
led0();
    if((millis() - temps) > 250)
  {digitalWrite(ldet, 1);}
     if((millis() - temps) > 500)
  {digitalWrite(lvt1, 1);}
     if((millis() - temps) > 750)
    {temps = millis();}
break;

case 3: //action à faire lors de l'appui sur bvt2
 led0();
    if((millis() - temps) > 250)
  {digitalWrite(ldet, 1);}
     if((millis() - temps) > 500)
  {digitalWrite(lvt234, 1);}
     if((millis() - temps) > 750)
  {digitalWrite(lvt2, 1);}
    if((millis() - temps) > 1000)
  {temps = millis();}
break;

case 4:  // action à faire lors de l'appui sur bvt3
led0();
    if((millis() - temps) > 250)
  {digitalWrite(ldet, 1);}
     if((millis() - temps) > 500)
  {digitalWrite(lvt234, 1);}
     if((millis() - temps) > 750)
  {digitalWrite(lvt3, 1);}
    if((millis() - temps) > 1000)
  {temps = millis();}
break;

case 5:  // action à faire lors de l'appui sur bvt4
led0();
    if((millis() - temps) > 250)
  {digitalWrite(ldet, 1);}
     if((millis() - temps) > 500)
  {digitalWrite(lvt234, 1);}
     if((millis() - temps) > 750)
  {digitalWrite(lvt4, 1);}
    if((millis() - temps) > 1000)
  {temps = millis();}
break;

case 6:  // action à faire lors de l'appui sur bvt5
led0();
    if((millis() - temps) > 250)
  {digitalWrite(ldet, 1);}
     if((millis() - temps) > 500)
  {digitalWrite(lvt5g2, 1);}
     if((millis() - temps) > 750)
  {digitalWrite(lvt5, 1);}
    if((millis() - temps) > 1000)
  {temps = millis();}
break;

case 7:  // action à faire lors de l'appui sur bvg2
  led0(); // appel fonction éteindre toutes les leds
    if((millis() - temps) > 250)
  {digitalWrite(ldet, 1);}
    if((millis() - temps) > 500)
  {digitalWrite(lvt5g2, 1);}
     if((millis() - temps) > 750)
  {digitalWrite(lvg2, 1);}
    if((millis() - temps) > 1000)
  {temps = millis();}
break;
}
}

// cde en automatique
if(b9 == 0)
{
b10 = digitalRead(cdet1);
b11 = digitalRead(cdet2);
b12 = digitalRead(cdet3);
// génère un nombre entre 1 et 5 pour définir l'une des voies de tri
if (b10 == 0 && r<1)
{
  r++;
  vtri = random(1,6);
  cde_aig(42); // met l'aiguillage A31 dévié vers tri
}
if(b12 == 0)
{r=s=0;}

// cde aiguillage a32de puis a33dr
if (vtri == 1 && b10 == 0 && i<1)
  {
  raz_var(); 
 i++; 
 cde_aig(44);
  cde_aig(47); 
 }
// cde aiguillage a32dr puis a33dr puis a34de puis a35dr
if(vtri == 2 && b10 == 0 && k<1) 
 {
  raz_var();
  k++;
  cde_aig(45);
  cde_aig(47);
  cde_aig(48);
  cde_aig(51); 
 }
// cde aiguillage a32dr puis a33dr puis a34dr puis a35dr
if(vtri == 3 && b10 == 0 && l<1) 
 {
  raz_var();
  l++;
  cde_aig(45);
  cde_aig(47);
  cde_aig(49);
  cde_aig(51);
  }
 // cde aiguillage a32dr puis a33dr puis a34dr puis a35de
if(vtri == 4 && b10 == 0 && m<1)
  {
  raz_var();
  m++;
  cde_aig(45);
  cde_aig(47);
  cde_aig(49);
  cde_aig(50);
  }
 // cde aiguillage a32dr puis a33de puis a36de
 if(vtri == 5 && b10 == 0 && o<1) 
 {
  raz_var();
  o++;
  cde_aig(45);
  cde_aig(46);
  cde_aig(52);
  }

// cde du dételeur
if(b10 == 1 && b11 == 0 && s<1)
{
  s++; 
 {digitalWrite(21, 1);}
  delay(500);
  {digitalWrite(21, 0);} 
 delay(200);
  {digitalWrite(21, 1);}
  delay(500);
  {digitalWrite(21, 0);} 
}

// cde du feu au vert
if (s == 1)
{
  digitalWrite(feu, 1);}
  else
  {digitalWrite(feu, 0);}

switch(vtri)
{
case 1:  // action à faire comme lors de l'appui sur bvt1
led0();
    if((millis() - temps) > 250)
  {digitalWrite(ldet, 1);}
     if((millis() - temps) > 500)
  {digitalWrite(lvt1, 1);}
     if((millis() - temps) > 750)
    {temps = millis();}
break;

case 2: //action à faire comme lors de l'appui sur bvt2
 led0();
    if((millis() - temps) > 250)
  {digitalWrite(ldet, 1);}
     if((millis() - temps) > 500)
  {digitalWrite(lvt234, 1);}
     if((millis() - temps) > 750)
  {digitalWrite(lvt2, 1);}
    if((millis() - temps) > 1000)
  {temps = millis();}
break;

case 3:  // action à faire comme lors de l'appui sur bvt3
led0();
    if((millis() - temps) > 250)
  {digitalWrite(ldet, 1);}
     if((millis() - temps) > 500)
  {digitalWrite(lvt234, 1);}
     if((millis() - temps) > 750)
  {digitalWrite(lvt3, 1);}
    if((millis() - temps) > 1000)
  {temps = millis();}
break;

case 4:  // action à faire comme lors de l'appui sur bvt4
led0();
    if((millis() - temps) > 250)
  {digitalWrite(ldet, 1);}
     if((millis() - temps) > 500)
  {digitalWrite(lvt234, 1);}
     if((millis() - temps) > 750)
  {digitalWrite(lvt4, 1);}
    if((millis() - temps) > 1000)
  {temps = millis();}
break;

case 5:  // action à faire comme lors de l'appui sur bvt5
led0();
    if((millis() - temps) > 250)
  {digitalWrite(ldet, 1);}
     if((millis() - temps) > 500)
  {digitalWrite(lvt5g2, 1);}
     if((millis() - temps) > 750)
  {digitalWrite(lvt5, 1);}
    if((millis() - temps) > 1000)
  {temps = millis();}
break;

} 
}
}

// création des fonctions
void led0() // fonction eteindre toutes les leds
{
digitalWrite(lvg1, 0);
digitalWrite(lvt1, 0);
digitalWrite(lvg2, 0);
digitalWrite(lvt5g2, 0);
digitalWrite(ldet, 0);
digitalWrite(lvt234, 0);
digitalWrite(lvt2, 0);
digitalWrite(lvt3, 0);
digitalWrite(lvt4, 0);
digitalWrite(lvt5, 0);
}
void cde_aig(int broche) // cde d'aiguillage par le code broche
{
digitalWrite(broche, 1);
delay(200);
digitalWrite(broche, 0);
 
}
void raz_var() // raz des variables pour cde aiguillage impulsion
{
  i=j=k=l=m=n=o=p=0;
}
Pour finir et afin de bien comprendre, le fonctionnement que j'ai souhaité voici une petite vidéo qui j'espère sera explicite.


https://vimeo.com/81891793







Vous pouvez me poser toutes vos questions et j'espère pouvoir y répondre.
J'ai réalisé un document complet de cette réalisation. Ce document est à votre disposition, il suffit de me contacter.

Pierre G
PS : Une fois que vous aurez regarder la vidéo projet Arduino, je vous invite à regarder ce qu'il est possible de faire avec une machine de découpe de carton (contruction feu carton P1 et construction feu carton P2).

Auteur : Peter41
:kingmoi:

ImageImageImage


Les dates des bourses d'échange mis a jour ==> ICI <==
Avatar du membre
herwatFrance
2000 posts et +
2000 posts et +
Messages : 4888
Enregistré le : 11 mars 2021, 16:14
Prénom : Hervé
LOCALISATION : Creuse
Centres d'intérêts : Modélisme ferroviaire
Impression 3D
Arduino
Echelle pratiquée : H0
Âge : 76
Pays :
France (fr)
France
avr. 2021 22 18:58

Re: Commande d'une butte de triage par TCO ou en automatique

Message par herwatFrance

EXTRA ! :bienv:
Avatar du membre
Georges de VilletteChine
2000 posts et +
2000 posts et +
Messages : 5442
Enregistré le : 09 mars 2021, 19:23
Prénom : Georges
LOCALISATION : Villette d'Anthon
Centres d'intérêts : J'ai participé au début de Mini World Lyon .
J'aime l'électronique , la mini mécanique .
Passionné par les nouvelles technologies , imprimantes 3D , Laser , CNC .
Echelle pratiquée : Aucune
Âge : 74
Pays :
Chine (cn)
Chine
avr. 2021 22 20:22

Re: Commande d'une butte de triage par TCO ou en automatique

Message par Georges de VilletteChine

Vraiment super !!!! Et la vidéo concrétise le sujet !!! :cooooool:
Le travail est bien une maladie !!!
Puisqu'il y a une médecine du travail !!! Coluche .
Avatar du membre
herwatFrance
2000 posts et +
2000 posts et +
Messages : 4888
Enregistré le : 11 mars 2021, 16:14
Prénom : Hervé
LOCALISATION : Creuse
Centres d'intérêts : Modélisme ferroviaire
Impression 3D
Arduino
Echelle pratiquée : H0
Âge : 76
Pays :
France (fr)
France
avr. 2021 23 10:04

Re: Commande d'une butte de triage par TCO ou en automatique

Message par herwatFrance

Je regrette juste la distribution aléatoire , ça fait fait un peu flipper . . .
Mais bon, il suffirait de modifier un peu le programme .
Répondre