|
| | TCO du réseau SavignyExpress | |
| |
| Auteur | Message |
|---|
SavignyExpress Membre


Nombre de messages: 669 Age: 49 Localisation: Savigny Date d'inscription: 10/10/2010
 | Sujet: TCO du réseau SavignyExpress Sam 11 Déc 2010, 12:59 | |
| Bonjour à tous, Voici quelques images de mon TCO: 
- À gauche: la commande des aiguillages et des alimentations de la gare.
- À droite: 4 régulateurs traction pour: la voie à crémaillère, la zone de manoeuvre, la boucle extérieure, la boucle intérieure.
- En haut: la commande va-et-vient pour la voie à crémaillère, repris de: http://www.ptitrain-forum.com/viewtopic.php?f=6&t=26
Les 2 TJDs et aiguillages de la gare sont couplés à l'alimentation des voies de gare. Les aiguillages de la zone manoeuvre sont commandés par une matrice de diodes.  Les circuits de commande:
- sur la platine de gauche, un microcontrôleur Attiny2313 et les relais (petits boîtiers bleus) de commande des aiguillages,
- sur la platine de droite, les relais de distribution des alimentations en gare et zone de manoeuvre.
 Les 4 régulateurs traction, achetés sur Internet. À votre disposition pour de plus amples informations |
|  | | romilly Membre


Nombre de messages: 2404 Age: 65 Localisation: Romilly-sur-seine - Aube Date d'inscription: 18/11/2009
 | Sujet: Re: TCO du réseau SavignyExpress Sam 11 Déc 2010, 13:52 | |
| la partie câblage des réseaux m'impressionnent toujours.
en tout cas travail propre et soigné.. Je prends de note..
|
|  | | Gabydemarseille Membre


Nombre de messages: 5714 Age: 62 Localisation: Marseille Date d'inscription: 17/07/2008
 | Sujet: Re: TCO du réseau SavignyExpress Sam 11 Déc 2010, 14:18 | |
| Bonjour C'est du super travail j'admire  |
|  | | CleoN Membre

Nombre de messages: 311 Age: 56 Localisation: 33 Date d'inscription: 26/11/2010
 | Sujet: Re: TCO du réseau SavignyExpress Sam 11 Déc 2010, 17:13 | |
| Bravo, travail très propre.
Peux tu nous dire les fonctions réalisées avec le micro-contrôleur?
Amicalement
|
|  | | ekta95 Membre


Nombre de messages: 304 Age: 66 Localisation: Argenteuil Date d'inscription: 06/10/2009
 | |  | | cenick Membre


Nombre de messages: 401 Age: 45 Localisation: Suisse (Valais) Date d'inscription: 20/02/2009
 | Sujet: Re: TCO du réseau SavignyExpress Lun 13 Déc 2010, 16:24 | |
| bravo,travail de pro....... sympa ces régulateurs...... |
|  | | SavignyExpress Membre


Nombre de messages: 669 Age: 49 Localisation: Savigny Date d'inscription: 10/10/2010
 | Sujet: Re: TCO du réseau SavignyExpress Lun 13 Déc 2010, 19:17 | |
| | CleoN a écrit: | | Peux tu nous dire les fonctions réalisées avec le micro-contrôleur? |
Mon réseau comporte 3 régulateurs de traction indépendants représentés dans les schémas ci-après par les couleurs rouge, bleue et jaune. Les régulateurs rouge et bleu alimentent les circuits intérieur et extérieurs. Le régulateur jaune peut alimenter la zone de manoeuvre.
Le microcontrôleur gère l'alimentation des voies de gare (1, 2 et 3), des zones d'isolation à gauche et à droite des voies 1 et 2; ainsi que les TJD1 & 2 et AIG1 & 2.
Le système peut prendre 6 états différents.
| État | Description |  | État initial au démarrage du microcontrôleur. |  | L'alimentation rouge est sur la voie 1. |  | L'alimentation bleue est sur la voie 2, l'alimentation jaune est sur la zone de manoeuvre. On voit que la zone manoeuvre est isolée du reste du réseau pour éviter les collisions. Les trains arrivant du circuit intérieur sont bloqués à l'entrée en gare. |  | La même chose, mais cette fois l'alimentation bleue est sur la voie 1. |  | Tandis que la zone de manoeuvre est toujours alimentée par le régulateur jaune, la voie 2 est alimentée par le régulateur rouge. |  | La voie 1 peut aussi être alimentée par le régulateur rouge. |
À noter que ce système ne détecte pas les trains, ses entrées sont les boutons poussoir du TCO, ses sorties des relais et des LEDs sur le TCO.
Les boutons poussoirs rouge, bleue et jaune sur le TCO permettent de choisir l'alimentation des voies 1, 2 et 3. TDJ1 & 2, AIG1 & 2 sont commandés en conséquence. Pour éviter de tirer trop de courant de l'alimentation accessoire, le microcontrôleur commande d'abord les TDJ, puis les AIG.
Les LEDs rouge, bleue et jaune représentent les états ci-dessus.
Le développement du programme du microcontrôleur se fait sous Linux: il est écrit en C, compilé avec avr-gcc et téléchargé dans le microcontrôleur avec avrdude.
Les autres aiguillages sont commandés par les boutons poussoir blanc. Les LEDs vertes indiquent la position des aiguillages en tirant parti des contacts de fin de course.
L'alimentation des voies de garage est simplement contrôlée via les aiguillages (fonction "stop" activée en enlevant les contacts entre rails et coeur, cf. doc. Minitrix).
Dernière édition par SavignyExpress le Jeu 12 Mai 2011, 11:29, édité 2 fois |
|  | | danber Membre

Nombre de messages: 69 Age: 69 Localisation: aurillac Date d'inscription: 25/10/2009
 | Sujet: Re: TCO du réseau SavignyExpress Mer 15 Déc 2010, 17:36 | |
| pas mal ce TCO, cela donne des idées. merci et bravo |
|  | | SavignyExpress Membre


Nombre de messages: 669 Age: 49 Localisation: Savigny Date d'inscription: 10/10/2010
 | Sujet: Re: TCO du réseau SavignyExpress Ven 08 Juil 2011, 11:40 | |
| Voici le code source du programme qui gère mon TCO. Les conventions de noms sont les suivantes:
- 1, 2, 3: numéros des voies en partant de la gare.
- A, B: alimentations traction du circuit intérieur et du circuit extérieur. En rouge, respectivement bleu sur le TCO. Couleurs correspodant aussi aux boutons poussoir.
- C: alimentation traction de la zone marchandise, peut être commutée avec l'alimentation B. En jaune sur la description des états du TCO. Couleur correspondant aussi au bouton poussoir.
- B_A1, B_A2, etc: pressions sur le poussoir A1, A2, etc. Le bouton A1 alimente la voie 1 avec le circuit A (rouge) et ainsi de suite.
- Les états sont nommés: AXB, XAB, AXC, etc. Il s'agit des états possibles des 3 voies de gare:
- AXB: voie 1 alimentée par A, voie 2 non alimentée, voie 3 alimentée par B.
- XAB: voie 1 non alimentée, voie 2 alimentée par A, voie 3 alimentée par B.
- AXC: voie 1 alimentée par A, voie 2 non alimentée, voie 3 alimentée par C.
La commande des aiguillages se fait par la fonction CommanderTdjAig dont le but est de commander séparément les TJDs et aiguillages de la gare, ce qui évite de tirer trop de courant de l'alimentation. Il y a aussi quelques fonctions qui ne servent qu'à simuler le programme en le faisant tourner sur PC: GetTexteEvt, GetTexteEtat, GetTexteAiguillage, AfficherEtat,
| Code: | // // Maquette.c // // Programme de contrôle de la maquette "Savigny Express". // // 2009.09.11 MHP Création. // 2009.10.06 MHP Simplificatin de la machine d'états. // 2009.10.10 MHP Début des tests avec les E/S de l'AVR. // 2009.10.14 MHP Commande momentanée des aiguillages. // 2009.11.04 MHP Debug amélioré de la commande des aiguillages. // 2009.11.08 MHP Ajout de la commande du bit bSela12, oubli ! // 2010.02.11 MHP Correction des reactions a l'evenement C3. // // Directives de compilation: PC ou AVR. //
#ifdef AVR #include <inttypes.h> #include <avr/io.h>
#define F_CPU 1000000UL #include <util/delay.h>
// Période en ms. #define PERIODE 50
// Boutons poussoirs. #define BOUTONS PINB #define B_A1 _BV(PD6) #define B_A2 _BV(PB0) #define B_B1 _BV(PB1) #define B_B2 _BV(PB2) #define B_B3 _BV(PB3) #define B_C3 _BV(PB4) #define P_A1 (!(PIND & B_A1)) #define P_A2 (!(PINB & B_A2)) #define P_B1 (!(PINB & B_B1)) #define P_B2 (!(PINB & B_B2)) #define P_B3 (!(PINB & B_B3)) #define P_C3 (!(PINB & B_C3))
// Sorties. #define SetTJD_D (PORTD |= _BV(PD0)) #define ClrTJD_D (PORTD &= ~_BV(PD0)) #define SetTJD_N (PORTD |= _BV(PD1)) #define ClrTJD_N (PORTD &= ~_BV(PD1))
#define SetAIG_D (PORTA |= _BV(PA1)) #define ClrAIG_D (PORTA &= ~_BV(PA1)) #define SetAIG_N (PORTA |= _BV(PA0)) #define ClrAIG_N (PORTA &= ~_BV(PA0))
#define SetSelAB (PORTD |= _BV(PD2)) #define ClrSelAB (PORTD &= ~_BV(PD2)) #define SetSel12 (PORTD |= _BV(PD3)) #define ClrSel12 (PORTD &= ~_BV(PD3)) #define SetSel3 (PORTD |= _BV(PD4)) #define ClrSel3 (PORTD &= ~_BV(PD4)) #define SetSela12 (PORTD |= _BV(PD5)) #define ClrSela12 (PORTD &= ~_BV(PD5))
// Configuration des ports #define CONFIG_DDRA (_BV(PA0)|_BV(PA1))
#define CONFIG_DDRB ~(B_A2|B_B1|B_B2|B_B3|B_C3); #define CONFIG_PULLUPB (B_A2|B_B1|B_B2|B_B3|B_C3);
#define CONFIG_DDRD ~(B_A1) #define CONFIG_PULLUPD B_A1 #endif
#ifdef PC #include <stdio.h> #endif
#define NB_PERIODES 4
// Etats: nommés à partir de l'état // des voies de gares 1, 2 et 3. enum tEtat {AXB, XAB, AXC, XAC, BXC, XBC}; enum tEtat eEtat;
// Evénements: nommés à partir de la source à connecter à chaque voie. enum tEvt {A1, B1, A2, B2, B3, C3};
// Commandes des relais. short bSelAB; short bSel12; short bSel3; short bSela12;
// Positions et commandes des aiguillages. enum tPosition {NORMAL, DEVIE}; enum tPosition ePosJonctions; enum tPosition ePosAiguillages;
enum tCommandeAig {IDLE, TJD, AIG} eCommandeAig; short nNbPeriodes;
// Pour compter les tests en mode PC. #ifdef PC int nTest; #endif
char *GetTexteEvt(enum tEvt xEvt) { #ifdef PC switch(xEvt) { case A1: return("A1"); case B1: return("B1"); case A2: return("A2"); case B2: return("B2"); case B3: return("B3"); case C3: return("C3"); } // switch #endif } // GetTexteEvt
char *GetTexteEtat(enum tEtat xEtat, short xVoie) { #ifdef PC switch(xEtat) { case AXB: if(xVoie == 1) return("A"); if(xVoie == 2) return("X"); if(xVoie == 3) return("B");
case XAB: if(xVoie == 1) return("X"); if(xVoie == 2) return("A"); if(xVoie == 3) return("B"); case AXC: if(xVoie == 1) return("A"); if(xVoie == 2) return("X"); if(xVoie == 3) return("C");
case XAC: if(xVoie == 1) return("X"); if(xVoie == 2) return("A"); if(xVoie == 3) return("C");
case BXC: if(xVoie == 1) return("B"); if(xVoie == 2) return("X"); if(xVoie == 3) return("C");
case XBC: if(xVoie == 1) return("X"); if(xVoie == 2) return("B"); if(xVoie == 3) return("C"); } // switch #endif } // GetTexteEtat
char *GetTexteAiguillage(enum tPosition xPos) { #ifdef PC switch (xPos) { case NORMAL: return("N"); case DEVIE: return("D"); } // switch #endif } // GetTexteAiguillage
void AfficherEtat(void) { #ifdef PC #define V1 GetTexteEtat(eEtat, 1) #define V2 GetTexteEtat(eEtat, 2) #define V3 GetTexteEtat(eEtat, 3) #define J (bSelAB ? "B" : "A") #define A (bSela12 ? "X" : "B") #define P2 (bSelAB ? "X" : "A") #define P3 (bSel3 ? "X" : "B") #define PJ GetTexteAiguillage(ePosJonctions) #define PA GetTexteAiguillage(ePosAiguillages) #define FA (bSelAB ? "R" : "V") #define FB (bSela12 ? "R" : "V")
printf(" /------%s------\\ \n", V1); printf("%s----%s--%s%s-------%s------%s%s--%s--%s\n", FA, P2, J, PJ, V2, PJ, J, P2, FA); printf("%s------%s%s%s-------%s-------%s%s%s---%s\n", FB, A, PA, P3, V3, P3, PA, A, FB); #if 0 printf("Rel selAB: %d : %s\n", bSelAB, (bSelAB ? "B" : "A")); printf("Rel sel12: %d : %s\n", bSel12, (bSel12 ? "1" : "2")); printf("Rel sel3: %d : %s\n", bSel3, (bSel3 ? "X" : "B")); printf("Rel sela12: %d : %s\n", bSela12, (bSela12 ? "X" : "B")); #endif printf("\n"); #endif } // AfficherEtat
void CommanderTjdAig(void) { #if 0 printf ("CommanderTjdAig, periodes: %d\n", nNbPeriodes); #endif
switch (eCommandeAig) { case TJD: if (nNbPeriodes == 0) { #ifdef AVR ClrTJD_D; ClrTJD_N; ClrAIG_D; ClrAIG_N; (ePosJonctions == DEVIE ? SetTJD_D : SetTJD_N); #endif
#ifdef PC (ePosJonctions == DEVIE ? printf("\tTJD DEV\n") : printf("\tTJD NOR\n")); #endif } else if (nNbPeriodes == (NB_PERIODES / 2)) { #ifdef AVR ClrTJD_D; ClrTJD_N; (ePosAiguillages == DEVIE ? SetAIG_D : SetAIG_N); #endif
#ifdef PC printf("\tTJD --\n"); (ePosAiguillages == DEVIE ? printf("\tAIG DEV\n") : printf("\tAIG NOR\n")); #endif
eCommandeAig = AIG; } // if nNbPeriodes++; break;
case AIG: if (nNbPeriodes == NB_PERIODES) { #ifdef AVR ClrTJD_D; ClrTJD_N; ClrAIG_D; ClrAIG_N; #endif
eCommandeAig = IDLE;
#ifdef PC printf("\tAIG --\n"); #endif
nNbPeriodes = 0; } else nNbPeriodes++; break;
case IDLE: break; } // switch } // CommanderTjdAig
void DefinirSorties(void) { switch(eEtat) { case AXB: bSelAB = 0; bSel12 = 1; bSela12 = 0; bSel3 = 0; ePosJonctions = DEVIE; ePosAiguillages = NORMAL; break;
case XAB: bSelAB = 0; bSel12 = 0; bSela12 = 0; bSel3 = 0; ePosJonctions = NORMAL; ePosAiguillages = NORMAL; break;
case AXC: bSelAB = 0; bSel12 = 1; bSela12 = 1; bSel3 = 1; ePosJonctions = DEVIE; ePosAiguillages = NORMAL; break;
case XAC: bSelAB = 0; bSel12 = 0; bSela12 = 1; bSel3 = 1; ePosJonctions = NORMAL; ePosAiguillages = NORMAL; break;
case BXC: bSelAB = 1; bSel12 = 1; bSela12 = 0; bSel3 = 1; ePosJonctions = NORMAL; ePosAiguillages = DEVIE; break;
case XBC: bSelAB = 1; bSel12 = 0; bSela12 = 0; bSel3 = 1; ePosJonctions = DEVIE; ePosAiguillages = DEVIE; break; } // switch
#ifdef AVR (bSelAB ? SetSelAB : ClrSelAB); (bSel12 ? SetSel12 : ClrSel12); (bSel3 ? SetSel3 : ClrSel3); (bSela12 ? SetSela12 : ClrSela12); #endif eCommandeAig = TJD; } // DefinirSorties
void SimulerTimeouts(void) { #ifdef PC int nNbTimeouts;
// On simule quelques timeouts for(nNbTimeouts = 0; nNbTimeouts < 8; nNbTimeouts++) CommanderTjdAig(); #endif } // SimulerTimeouts
void TraiterEtat(enum tEvt xEvt) { enum tEtat eProchEtat;
#ifdef PC printf("%02d: Evénement: %s\n", ++nTest, GetTexteEvt(xEvt)); #endif
switch(eEtat) { case AXB: if (xEvt == A1) eProchEtat = AXB; if (xEvt == B1) eProchEtat = BXC; if (xEvt == A2) eProchEtat = XAB; if (xEvt == B2) eProchEtat = XBC; if (xEvt == B3) eProchEtat = AXB; if (xEvt == C3) eProchEtat = AXC; break; case XAB: if (xEvt == A1) eProchEtat = AXB; if (xEvt == B1) eProchEtat = BXC; if (xEvt == A2) eProchEtat = XAB; if (xEvt == B2) eProchEtat = XBC; if (xEvt == B3) eProchEtat = XAB; if (xEvt == C3) eProchEtat = XAC; break;
case AXC: if (xEvt == A1) eProchEtat = AXC; if (xEvt == B1) eProchEtat = BXC; if (xEvt == A2) eProchEtat = XAC; if (xEvt == B2) eProchEtat = XBC; if (xEvt == B3) eProchEtat = AXB; if (xEvt == C3) eProchEtat = AXC; break;
case XAC: if (xEvt == A1) eProchEtat = AXC; if (xEvt == B1) eProchEtat = BXC; if (xEvt == A2) eProchEtat = XAC; if (xEvt == B2) eProchEtat = XBC; if (xEvt == B3) eProchEtat = XAB; if (xEvt == C3) eProchEtat = XAC; break;
case BXC: if (xEvt == A1) eProchEtat = AXC; if (xEvt == B1) eProchEtat = BXC; if (xEvt == A2) eProchEtat = XAC; if (xEvt == B2) eProchEtat = XBC; if (xEvt == B3) eProchEtat = AXB; if (xEvt == C3) eProchEtat = BXC; break;
case XBC: if (xEvt == A1) eProchEtat = AXC; if (xEvt == B1) eProchEtat = BXC; if (xEvt == A2) eProchEtat = XAC; if (xEvt == B2) eProchEtat = XBC; if (xEvt == B3) eProchEtat = XAB; if (xEvt == C3) eProchEtat = XBC; break;
default: break; } // switch
// Ne changer les sorties que si l'état a changé. if (eProchEtat != eEtat) { eEtat = eProchEtat; DefinirSorties(); } // if
AfficherEtat(); SimulerTimeouts(); } // TraiterEtat
void main(void) { eEtat = XAB; eCommandeAig = IDLE; nNbPeriodes = 0; DefinirSorties();
#ifdef AVR // Entrées à droite du chip avec pull-ups. // Sorties à gauche du chip. DDRA = CONFIG_DDRA; DDRB = CONFIG_DDRB; PORTB = CONFIG_PULLUPB; DDRD = CONFIG_DDRD; PORTD = CONFIG_PULLUPD;
while (1) { if (P_A1) TraiterEtat(A1); if (P_A2) TraiterEtat(A2); if (P_B1) TraiterEtat(B1); if (P_B2) TraiterEtat(B2); if (P_B3) TraiterEtat(B3); if (P_C3) TraiterEtat(C3);
CommanderTjdAig(); _delay_ms(PERIODE); } // while #endif
#ifdef PC nTest = 0; printf("*** Etat initial ***\n"); AfficherEtat(); SimulerTimeouts();
TraiterEtat(C3); TraiterEtat(A1); TraiterEtat(B1); TraiterEtat(B2); TraiterEtat(B3); TraiterEtat(A1); TraiterEtat(B1); TraiterEtat(B3); TraiterEtat(B2); TraiterEtat(A1); TraiterEtat(A2); TraiterEtat(B3); TraiterEtat(B1); TraiterEtat(A2); TraiterEtat(B3); TraiterEtat(A1); TraiterEtat(C3); TraiterEtat(B3); TraiterEtat(A2); TraiterEtat(C3); TraiterEtat(B1); TraiterEtat(B3); #endif } // main
|
|
|  | | Teldarius Membre


Nombre de messages: 3576 Age: 44 Localisation: Province de Namur[Bel] Date d'inscription: 25/01/2011
 | Sujet: Re: TCO du réseau SavignyExpress Ven 08 Juil 2011, 12:12 | |
| Très beau travail tant au niveau informatique que du TCO en lui-même. |
|  | | ptitrainrouge Membre


Nombre de messages: 1941 Age: 47 Localisation: le havre Date d'inscription: 18/04/2010
 | Sujet: Re: TCO du réseau SavignyExpress Ven 08 Juil 2011, 20:02 | |
| c'est super impressionnant tout cela c'est du travail de pro ptitrainrouge |
|  | | Jack84 Membre


Nombre de messages: 1843 Age: 67 Localisation: Vaucluse Date d'inscription: 25/07/2008
 | Sujet: Re: TCO du réseau SavignyExpress Sam 09 Juil 2011, 09:11 | |
| BRAVO, c'est du cablâge comme j'aime. Et ton tableau est très chouette. |
|  | | Décau45 Membre


Nombre de messages: 125 Age: 60 Localisation: Nord Loiret, 45 Date d'inscription: 18/01/2009
 | Sujet: Re: TCO du réseau SavignyExpress Mer 04 Jan 2012, 21:50 | |
| Bonjour,
je n'avais pas encore vu. Quelle belle réalisation, et des explications très claires.
Félicitations. |
|  | | SavignyExpress Membre


Nombre de messages: 669 Age: 49 Localisation: Savigny Date d'inscription: 10/10/2010
 | Sujet: Re: TCO du réseau SavignyExpress Sam 07 Jan 2012, 15:54 | |
| Merci à tous les membres pour leurs compliments !
Tous mes meilleurs voeux pour l'année 2012. |
|  | | Yoko Membre

Nombre de messages: 199 Age: 32 Localisation: La Tourlandry, 49120 Date d'inscription: 07/12/2011
 | Sujet: Re: TCO du réseau SavignyExpress Sam 07 Jan 2012, 22:17 | |
| Jolie travail, la partie électronique est bien réalisé. Je ne sait pas qu'elle est ton métier ... mais ta prog du µP en C est bien sympas. Dire que je recule pour m'y remettre, alors que j'ai tout à y gagner ... |
|  | | | | TCO du réseau SavignyExpress | |
|
Sujets similaires |  |
|
| | Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |