1/160 - Echelle N

Le Forum consacré à l'Echelle N
 
AccueilAccueil  PortailPortail  S'enregistrerS'enregistrer  Connexion  
JOYEUSES FÊTES DE FIN D'ANNÉE À TOUS !

Partagez | 
 

 Faire sa propre centrale DCC

Voir le sujet précédent Voir le sujet suivant Aller en bas 
Aller à la page : Précédent  1, 2, 3, ... 11, 12, 13  Suivant
AuteurMessage
SixtyFive
Membre
Membre


Masculin Age : 69
Localisation : 91340
Nombre de messages : 175
Date d'inscription : 21/12/2012

MessageSujet: Re: Faire sa propre centrale DCC    Jeu 17 Jan 2013 - 12:24

Bonjour à tous,

De retour après quelques jours de dépaysement, et comme promis, je démarre un DIY-DCC tuto sur la construction d'une centrale DCC simple mais efficace, à base de carte ARDUINO.

Ce DIY-DCC se fera en plusieurs épisodes car il s'accompagne d'une réalisation en parallèle qui sera en fait mon proto version 2.

Donc soyez patients, mais n'hésitez pas à poser des questions.

Pour commencer, quels ingrédients de base nous faut-il ?

1) Le Booster : pièce maitresse pour alimenter les rails en courant, après de multiples recherches, j'ai trouvé un module à base de LMD18200 aux environs de 10 €, par exemple ici :
http://myworld.ebay.fr/marcmart.usa/?_trksid=p4340.l2559



2) Le microcontroleur : le meilleur moyen de :
- ne pas être obligé de faire (faire) un circuit imprimé;
- avoir un circuit qui marche à coup sur;
- avoir une interface USB native, permettant d'échanger des données entre mon programme et mon Mac (ou PC);
- disposer d'une ENORME librairie de logiciels, dont tout ce qu'il faut pour le "temps réel", les interruptions, timers, de livres, de logiciels gratuits, etc..
- disposer d'un grand nombre de type de carte (voir la différence entre UNO et MEGA plus loin);
- ne nécessiter l'usage du fer à souder qu'au minimum, pour des petits travaux d'intégration;
- et donc de gagner un temps fou Very Happy
est de s'orienter vers ARDUINO
www.arduino.cc

Voici le plus simple, l'UNO (environ 20 € dans pas mal de boutiques en France)


Par contre l'UNO est limité en entrées/sortie (6 analogiques et 14 digitales), ce qui est vite rempli mais suffisant pour mon premier proto.
Le mieux est de démarrer tout de suite avec le MEGA (environ 40 €) qui dispose de 16 entrées/sortie analogiques et plus de 50 digitales. Il offre surtout 256K octets de mémoire flash pour de plus gros programmes.


Dans l'avenir proche, il sera encore mieux d'utiliser le tout nouveau DUE qui dispose d'un processeur ARM encore plus puissant et plus rapide. Mais pour le moment je n'ai pas de certitude sur les librairies temps réel.

3) l'interface "Homme-Machine"
Pour faire simple, j'ai choisi de commencer avec 2 trains circulant sur la même voie qu'il faudra diviser en cantons pour suivre le trafic, avec quelques aiguillage, quelques feux.
Il y aura 2 gares pour qu'un train puisse doubler l'autre et pouvoir s'arrêter indépendamment l'un de l'autre.
J'ai aussi voulu un mode automatique, non pas pour se priver du plaisir du pilotage, mais pour trouver du plaisir dans la programmation.

Il nous faut donc connecter 2 potentiomètres pour les vitesses, un interrupteur de direction, un interrupteur pour l'éclairage, un autre pour entrer/sortir du mode automatique et un autre pour arrêter les trains en gare et mettre le système au repos.

cela donne mon prototype N°1:


A suivre ...

En attendant vous pouvez installer l'environnement de développement gratuit d'ARDUINO
Revenir en haut Aller en bas
http://bultez.fr
SavignyExpress
Membre
Membre


Masculin Age : 53
Localisation : Savigny
Nombre de messages : 1533
Date d'inscription : 10/10/2010

MessageSujet: Re: Faire sa propre centrale DCC    Jeu 17 Jan 2013 - 12:54

SixtyFive a écrit:
Il nous faut donc connecter 2 potentiomètres pour les vitesses, un interrupteur de direction, un interrupteur pour l'éclairage, un autre pour entrer/sortir du mode automatique et un autre pour arrêter les trains en gare et mettre le système au repos.

Hello SixtyFive,

Il est possible d'économiser l'interrupteur de direction en considérant que les tensions fournies par le potentiomètres < que la moitié correspondent à un sens et celles > que la moitié correspondent à l'autre sens. Il faut prévoir une marge autour de la position médiane du potentiomètre pour le zéro. On retrouve ainsi l'ergonomie des transfos classiques.

Il y a pas mal de temps, ptitrain présentait une telle réalisation pour une alimentation analogique. Gretel (ainsi nommé parce que le projet se sert du registre ANSEL qui contrôle le convertisseur ADC du PIC).
Revenir en haut Aller en bas
http://savignyexpress.wordpress.com
Lohren
Membre
Membre


Masculin Age : 53
Localisation : Vitry Le Francois - Reims
Nombre de messages : 405
Date d'inscription : 09/12/2012

MessageSujet: Re: Faire sa propre centrale DCC    Jeu 17 Jan 2013 - 12:59

Le risque du "0 km/h" en position centrale, c'est surtout quand tu passes d'un train à un autre : Cela peut provoquer des situations de stress intéressantes (loco qui démarre a fond dans le mauvais sens, ou qui stoppe au mauvais endroit. Le genre de situations ou l'on a pas forcément le temps (ni la lucidité) de rechercher un point central Smile
Revenir en haut Aller en bas
SavignyExpress
Membre
Membre


Masculin Age : 53
Localisation : Savigny
Nombre de messages : 1533
Date d'inscription : 10/10/2010

MessageSujet: Re: Faire sa propre centrale DCC    Jeu 17 Jan 2013 - 13:28

Peut-être faut-il prévoir un potentiomètre par train, mais ce n'est possible qu'avec peu de trains tournant simultanément.
Revenir en haut Aller en bas
http://savignyexpress.wordpress.com
SixtyFive
Membre
Membre


Masculin Age : 69
Localisation : 91340
Nombre de messages : 175
Date d'inscription : 21/12/2012

MessageSujet: Re: Faire sa propre centrale DCC    Jeu 17 Jan 2013 - 14:26

Merci pour les remarques très pertinentes :

- certaines centrales (notamment celle de Bootentrain) ont des potentiomètres rotatifs avec l'arrêt au milieu. Mais il y a aussi des potentiomètres linéaires, plus jolis et aussi moins commode pour l'arrêt au milieu. J'en ai acheté 5 d'ailleurs !

- avoir un potentiomètre par train me semble plus clair et supprime tout risque de perturbation. Mais au delà de 5 (plus ou moins selon ses gouts), il semble préférable de faire un pilotage par PC. Pour le moment, ce n'est pas l'option choisie, on verra dans une version ultérieure !

J'ai acheté une station Marklin MS2 avec son alim 18 volts (c'est pas un peu trop pour du N, je n'ai pas trouvé de reglage de la tension... ?).
Le reglage de vitesse se fait par le gros bouton central et l'inversion par appui sur ce bouton, ce qui provoque un arrêt brutal du train qui ne redémarre pas ensuite.

Dans mon proto DIY-DCC lorsque qu'on change de direction avec l'inverseur, le soft envoie seulement une commande de changement de direction (avec la vitesse en mode 127 pas) et la loco fait le reste avec grâce en mettant en oeuvre son inertie : c'est beau à voir Laughing

voilà le genre de programme (du C ) pour faire ça, mais on y reviendra plus tard :


// ------------------- ASSEMBLE DCC MESSAGE -------------------
void assemble_dcc_msg() {
int i;
unsigned char data, xdata;

if (locoSpeed == 1) { // this would result in emergency stop
locoSpeed = 0;
}

// direction info first
if (dir) { // forward
data = 0x80;
} else {
data = 0;
}

data |= locoSpeed;

// add XOR byte
xdata = (msg[1].data[0] ^ msg[1].data[1]) ^ data;

noInterrupts(); // to avoid ISR call during modification
msg[1].data[2] = data;
msg[1].data[3] = xdata;
interrupts();

}

a suivre ...
Revenir en haut Aller en bas
http://bultez.fr
SixtyFive
Membre
Membre


Masculin Age : 69
Localisation : 91340
Nombre de messages : 175
Date d'inscription : 21/12/2012

MessageSujet: Re: Faire sa propre centrale DCC    Jeu 17 Jan 2013 - 14:32

et pour être plus complet, pendant qu'on y est, voici la lecture du potentiomètre de vitesse et de l'inter de direction et de l'inter de lumière :


// ------------------- Read Loco Speed -------------------
boolean read_locoSpeed() {
boolean changed = false;
// read the analog input into a variable:
// limit range to 0..127
locoSpeed = (127L * analogRead(AN_SPEED1))/1023;
if (locoSpeed != last_locoSpeed) {
changed = true;
last_locoSpeed = locoSpeed;
}
dir = digitalRead(dirPin1); // direction
if (dir != last_dir) {
changed = true;
last_dir = dir;
}
dir2 = digitalRead(dirPin2); // light
if (dir2 != last_dir2) {
changed = true;
last_dir2 = dir2;
}
return changed;
}
Revenir en haut Aller en bas
http://bultez.fr
cheftrainminiature
Membre
Membre


Masculin Age : 46
Localisation : Centre Alsace,bas-rhin
Nombre de messages : 4120
Date d'inscription : 04/02/2009

MessageSujet: Re: Faire sa propre centrale DCC    Jeu 17 Jan 2013 - 15:06

SixtyFive a écrit:
Merci pour les remarques très pertinentes :

- certaines centrales (notamment celle de Bootentrain) ont des potentiomètres rotatifs avec l'arrêt au milieu. Mais il y a aussi des potentiomètres linéaires, plus jolis et aussi moins commode pour l'arrêt au milieu. J'en ai acheté 5 d'ailleurs !

- avoir un potentiomètre par train me semble plus clair et supprime tout risque de perturbation. Mais au delà de 5 (plus ou moins selon ses gouts), il semble préférable de faire un pilotage par PC. Pour le moment, ce n'est pas l'option choisie, on verra dans une version ultérieure !

J'ai acheté une station Marklin MS2 avec son alim 18 volts (c'est pas un peu trop pour du N, je n'ai pas trouvé de reglage de la tension... ?).
Le reglage de vitesse se fait par le gros bouton central et l'inversion par appui sur ce bouton, ce qui provoque un arrêt brutal du train qui ne redémarre pas ensuite.

Dans mon proto DIY-DCC lorsque qu'on change de direction avec l'inverseur, le soft envoie seulement une commande de changement de direction (avec la vitesse en mode 127 pas) et la loco fait le reste avec grâce en mettant en oeuvre son inertie : c'est beau à voir Laughing

voilà le genre de programme (du C ) pour faire ça, mais on y reviendra plus tard :


// ------------------- ASSEMBLE DCC MESSAGE -------------------
void assemble_dcc_msg() {
int i;
unsigned char data, xdata;

if (locoSpeed == 1) { // this would result in emergency stop
locoSpeed = 0;
}

// direction info first
if (dir) { // forward
data = 0x80;
} else {
data = 0;
}

data |= locoSpeed;

// add XOR byte
xdata = (msg[1].data[0] ^ msg[1].data[1]) ^ data;

noInterrupts(); // to avoid ISR call during modification
msg[1].data[2] = data;
msg[1].data[3] = xdata;
interrupts();

}

a suivre ...
sur la MS 2 si tu te sers du bouton pour aller au point zéro vitesse tu auras aussi l'inertie y a que en appuyant dessus que elle s’arrête court
Revenir en haut Aller en bas
http://www.latelierduchef.eu/
TGV77340
Membre
Membre


Masculin Age : 77
Localisation : Pontault Combault 77340
Nombre de messages : 780
Date d'inscription : 28/10/2008

MessageSujet: Re: Faire sa propre centrale DCC    Jeu 17 Jan 2013 - 15:35

Pour mon Intellibox 2, je trouve aussi que 18Volts c'est le maxi autorisé

J'ai trouve sur "LE BON COIN" un transfo torique de 150 VA (Il y a de la réserve!) avec en sortie 12 14 17 et 24 volts

Transfo neuf à 20€ + 9€ de port

Le vendeur doit encore en avoir à vendre


Dernière édition par TGV77340 le Jeu 17 Jan 2013 - 15:55, édité 2 fois
Revenir en haut Aller en bas
http://caron.jeanmarie@orange.fr
Guillf
Membre
Membre


Masculin Age : 37
Localisation : Monts du Lyonnais
Nombre de messages : 1098
Date d'inscription : 29/07/2010

MessageSujet: Re: Faire sa propre centrale DCC    Jeu 17 Jan 2013 - 15:46

De mon côté, j'ai commandé un transfo 12V chez Conrad ; ça fonctionne très bien !
Revenir en haut Aller en bas
SixtyFive
Membre
Membre


Masculin Age : 69
Localisation : 91340
Nombre de messages : 175
Date d'inscription : 21/12/2012

MessageSujet: Re: Faire sa propre centrale DCC    Ven 18 Jan 2013 - 14:31

Merci : j'ai essayé mon alimentation 12 V sur le booster de la MS2 : ça marche très bien !

Revenir en haut Aller en bas
http://bultez.fr
SixtyFive
Membre
Membre


Masculin Age : 69
Localisation : 91340
Nombre de messages : 175
Date d'inscription : 21/12/2012

MessageSujet: Re: Faire sa propre centrale DCC    Ven 18 Jan 2013 - 15:41

Suite de la description de ma centrale DCC sur Arduino :

Cette réalisation est limitée au pilotage de 2 trains, soit en mode manuel avec 2 potentiomètres, soit en mode automatique avec des capteurs, l'un en amont d'une gare pour commencer un ralentissement et l'autre en gare pour s'arrêter. Un bouton permet de stopper le train définitivement ou de le laisser repartir tout seul après un temps d'arrêt en gare.

Je n'ai pas tout inventé (voir plus haut) car je suis parti d'un source logiciel qui ne marchait pas vraiment et j'ai reconstruit tout le projet avec la mise au point (il me reste encore la partie "capteurs" à finir).

Le nombre de ports digitaux et analogiques de l'Arduino UNO est suffisant pour ce projet d'initiation avec lequel on peut déjà s'amuser. Mais il ne permet pas d'aller beaucoup plus loin.

On verra plus tard comment tirer partie des Arduino plus puissants (MEGA et DUE) dont le nombre ports "explose" !


Voici le schéma de l'installation :



J'explique :

J'ai représenté ici une carte Arduino UNO (environ 20€) et un booster Marcmart (eBay, chine, environ 10€, port gratuit !), 2 potentiomètres P1 et P2 branchés sur les ports analogiques A0 et A1 pour les vitesses de 2 locos, 1 inter (ou inverseur) de direction (DIR) sur le port A4 (qui peut être aussi bien digital qu'analogique), un autre pour la lumière (LIGHT) sur le port A5, un pour la commutation auto/manuel (A/M) sur le port digital 2 et un autre pour l'arrêt/départ en gare (S/S) sur le port digital 3.

Le choix des ports est, bien entendu, libre selon ses besoins.

Le booster est piloté directement par l'Arduino, DIR sur le port digital 4 (c'est le signal DCC généré par l'Arduino), PWM sur le port digital 5 (c'est la validation du signal), BRAKE n'est pas utilisé (il suffit de bloquer PWM), et 2 entrées analogiques A2 et A3 reçoivent les senseurs de courant (C/S) et de température (T/S) pour protéger le montage. On verra que ces derniers signaux nécessitent de souder 2 fils au dos du booster car il ne sont pas disponibles sur le bornier à vis.

L'alimentation 12 V est appliquée au booster et à l'Arduino qui a sont propre régulateur de tension (on peut le relier à Vin ou au jack). OUT1 et OUT2 du booster sont reliés aux rails.

3 Leds permettent de savoir :
- rouge si le courant du booster a dépassé une certaine limite, surveillée par le logiciel et provoquant l'arrêt du circuit.
- jaune pour le mode manuel ou automatique
- vert pour le mode start ou stop (arrêt définitif en gare)

4 entrées digitales sont connectées à 4 capteurs de passage des trains :
- PK1 = parking en gare du train 1
- PK2 = parking en gare du train2
- S1 = arrivée prochaine en gare 1 (ralentissement progressif du train)
- S2 = arrivée prochaine en gare 2 (ralentissement progressif du train)

Je n'ai pas encore réalisé ces capteurs...
j'espère pouvoir réaliser un lecteur de code barre sous chaque loco, ce qui me semble ce qu'il y a de plus élégant.

Les fils à souder sous le booster sont représentés ici :



Et voici l'ensemble des ingrédients :



Pour simplifier la réalisation, j'ai monté une petite carte à pastilles qui regroupe les connexions et les résistances. Cette carte s'enfiche dans les connecteurs de l'Arduino :




Ceux qui sont riches pourront aussi utiliser la carte Proto d'Arduino (5€ !!!).

Voilà pour le volet matériel qui, en gros, coûte entre 50 et 60€ (moins si on a déjà quelques composants en stock)

J'avoue que ce n'est pas très compétitif par rapport à une MS2 "pas chère" comme on en trouve facilement sur les boutiques eBay allemandes (comment font-ils pour obtenir de tels prix ?), mais, pour moi en tout cas, c'est une belle occasion de comprendre comment ça marche car :

- les documents de la norme NMRA ne sont pas très faciles à comprendre (j'ai trouvé plus simple chez des modélistes français)
- hormis les décodeurs de locos qui sont indispensables, je ne suis pas convaincu qu'il faille mettre des décodeurs "partout" notamment pour piloter les accessoires et récupérer des signaux d'état : le microcontrolleur et un peu de soft permettent de faire autant, sinon mieux, pour moins cher (je l'espère mais je n'ai pas encore abordé ce point).
- c'est un formidable degré de liberté par rapport aux centrales toutes faites auxquelles il faut s'adapter. Mais évidemment, ces dernières en font plus...
- pour les débutants et ceux dont le budget est serré, c'est intéressant !
- cela n'interdit pas le pilotage par PC avec un logiciel de la collection JMRI, à condition d'ajouter l'interface PC
- on peut même envisager le pilotage par SmartPhone à condition d'ajouter une connexion TCP/IP, ce qui n'est pas difficile avec Arduino:



La prochaine fois, je vous communiquerai le logiciel quand j'aurai trouvé comment joindre un fichier (zip) dans ce forum...


Bon courage.
Revenir en haut Aller en bas
http://bultez.fr
SixtyFive
Membre
Membre


Masculin Age : 69
Localisation : 91340
Nombre de messages : 175
Date d'inscription : 21/12/2012

MessageSujet: Re: Faire sa propre centrale DCC    Ven 18 Jan 2013 - 16:07

L'appli iPhone ci-dessus s'appelle "onedotfive";

Il y a aussi iThrottle, WiThrottle, etc..
Revenir en haut Aller en bas
http://bultez.fr
SavignyExpress
Membre
Membre


Masculin Age : 53
Localisation : Savigny
Nombre de messages : 1533
Date d'inscription : 10/10/2010

MessageSujet: Re: Faire sa propre centrale DCC    Ven 18 Jan 2013 - 17:57

Hello SixtyFive,

Magnifique travail, toutes mes félicitations !!!

Deux questions me viennentt en lisant ton extrait de programme en C.

  • Qu'est-ce qui est envoyé en DCC lorsqu'il n'y a pas de données à envoyer aux locos ?
  • Est-ce que l'on doit répéter périodiquement les mêmes ordres ou y-a-t-il un mode où il n'y a que des transitions sans données ?


Bien qu'étant en analogique, ces questions m'interpellent !

Bonne fin de semaine.
Revenir en haut Aller en bas
http://savignyexpress.wordpress.com
patrick
Membre
Membre


Masculin Age : 47
Localisation : ici
Nombre de messages : 2781
Date d'inscription : 18/01/2008

MessageSujet: Re: Faire sa propre centrale DCC    Ven 18 Jan 2013 - 18:13

Très bel exposé et bon résumé de ce projet.

SixtyFive a écrit:
- hormis les décodeurs de locos qui sont indispensables, je ne suis pas convaincu qu'il faille mettre des décodeurs "partout" notamment pour piloter les accessoires et récupérer des signaux d'état : le microcontrolleur et un peu de soft permettent de faire autant, sinon mieux, pour moins cher (je l'espère mais je n'ai pas encore abordé ce point).
Je voulais ajouter une petite note sur ce point: si tu désires commander uniquement des LEDs ou de petits servo moteurs, il n'est pas nécessaire en effet d'avoir un décodeur spécifique. La faible consommation requise et le 5V fournit par les sorties de l'Arduino sont suffisants. Cependant il faut faire attention aux limites de chaque port: 20mA sous 5V, avec un total de 200mA (je crois).

Par contre, dès que tu veux utiliser des tensions et des courants plus importants (12V et 100, 200, 300mA...), tu auras besoin d'un module de couplage du genre de ton booster (ou un petit montage similaire de quelques composants) pour chaque port. Même pour quelques dollars, cela revient assez cher voire équivalent à un décodeur de fonction.

Ceci-dit, c'est un environnement de travail très intéressant et passionnant! J'adore...


Revenir en haut Aller en bas
SixtyFive
Membre
Membre


Masculin Age : 69
Localisation : 91340
Nombre de messages : 175
Date d'inscription : 21/12/2012

MessageSujet: Re: Faire sa propre centrale DCC    Ven 18 Jan 2013 - 18:16

SavignyExpress a écrit:
Hello SixtyFive,

Magnifique travail, toutes mes félicitations !!!

Deux questions me viennentt en lisant ton extrait de programme en C.

  • Qu'est-ce qui est envoyé en DCC lorsqu'il n'y a pas de données à envoyer aux locos ?
  • Est-ce que l'on doit répéter périodiquement les mêmes ordres ou y-a-t-il un mode où il n'y a que des transitions sans données ?


Bien qu'étant en analogique, ces questions m'interpellent !

Bonne fin de semaine.

Bonjour,

C'est simple, mon programme envoie de façon cyclique la série de 5 trames DCC suivante, décrite dans un record :

#define MAXMSG 5

struct Message msg[MAXMSG] = {
{ { 0xFF, 0, 0xFF, 0, 0, 0, 0}, 3}, // idle msg
{ { locoAdr, 0x3F, 0, 0, 0, 0, 0}, 4}, // Advanced operation instruction with 128 speed steps and direction (b7) in next byte
{ { locoAdr2, 0x3F, 0, 0, 0, 0, 0}, 4}, // Advanced operation instruction with 128 speed steps and direction (b7) in next byte
{ { locoAdr, 0x80, 0, 0, 0, 0, 0}, 3}, // Function group one instruction : 0x80 means light off
{ { locoAdr2, 0x90, 0, 0, 0, 0, 0}, 3} // Function group one instruction : 0x90 means light on
}; // loco msg must be filled later with speed and XOR data byte


Dans mon exemple, au début il n'y a que ces 5 messages, mais il est facile d'en ajouter d'autres.

L'envoi de ces trames DCC est fait automatiquement par une routine d'interruption Timer1.

La manipulation des octets des trames est fait par le programme principal (look), en désactivant les interruptions, juste le temps d'écrire les octets à modifier.

Je n'ai pas encore calculé le nombre de messages DCC maxi qu'il est possible d'envoyer, mais c'est beaucoup plus que 5 !!!

Ce programme est simple et facile à comprendre. Je l'ai choisi pour cela.
Il y a beaucoup plus compliqué et aussi plus général dans un autre exemple qui implémente toute la bibliothèque DCC/NMRA ici :
https://github.com/Railstars/CmdrArduino

Je vais poster le source complet

Revenir en haut Aller en bas
http://bultez.fr
SixtyFive
Membre
Membre


Masculin Age : 69
Localisation : 91340
Nombre de messages : 175
Date d'inscription : 21/12/2012

MessageSujet: Re: Faire sa propre centrale DCC    Ven 18 Jan 2013 - 18:26

Voici maintenant le logiciel Arduino.
Pour installer ce logiciel, il faut disposer de l'environnement de développement ARDUINO, copier/coller le source ci-dessous dans un nouveau projet, puis vérifier (compiler) et charger dans la mémoire Flash d'un ATMega328 (UNO).

Le compilateur affiche 7164 bytes.
Il reste de la place, même dans un ATMega328 !

Ce programme n'est pas du tout (ou peu) optimisé, afin de rester "lisible"

C'est dommage, on perd les indentations dans ce forum.
Si vous voulez une version plus copiable (j'ai testé le copié/collé dans Arduino et ça marche), j'ai ouvert un blog avec une copie des articles rassemblés là :
http://sixtyfive.sosblog.fr/index.htm


-------------- LOGICIEL ARDUINO -------------
#define VERSION "@SixtyFive V0.2r1 26/12/2012"

/*
Arduino DCC automatic train controller
From SixtyFive, 19 December 2012 12h16

This program sends pulses 0v-5v on DCC_PIN that needs to be amplified by a booster.
Works well with LMD18200 Booster

Some parts of the program are originaly from Burns and Michael Blank and are released under GNU license

This program can control 2 trains with:
- 2 pots for speed of each train
- 1 switch for forward/backward direction (both trains)
- 1 switch for light on/off
- 1 switch for Start/Stop
- 1 switch for Manual/Auto

This program is free software; you can redistribute it and/or modify it under the terms of the
GNU General Public License as published by the Free Software Foundation;
either version 3 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
*/

//Define Arduino pins
/*
0 serial
1 serial
2 Manual/Auto switch
3 Start/Stop switch
4 DCC signal (DIR pin of LMD18200)
5 DCC PWM (PWM pin of LMD18200)
6 Park 1 - Station 1
7 Park 2 - Station 2
8 Sensor 1 - Pre station 1
9 Sensor 2 - Pre station 2
10
11 LED Rouge
12 LED Jaune
13 LED Verte

Analog
0 pot throttle 1
1 pot throttle 2
2 Current sense from LMD18200
3 Thermal sense from LMD18200
4 Direction 1 (forward/backward)
5 Direction 2

*/

// Arduino Pins
#define OVER_LED 11 // on if current too high
#define MAN_LED 12 // on in manual mode, off if auto
#define START_LED 13 // on when start, off when stop

#define MAN_SW 2 // MAN/AUTO Switch Down=True, Up=False
#define START_SW 3 // Start switch Down=True, Up=False
#define SENSOR1 8 // Pre station sensor1
#define SENSOR2 9 // Pre station sensor2
#define PARK1 6 // Park sensor 1
#define PARK2 7 //Park sensor 2

#define DCC_PIN 4 // Arduino pin for DCC out
// this pin is connected to "DIRECTION" of LMD18200
#define DCC_PWM 5 // must be HIGH for signal out
// connected to "PWM in" of LMD18200

#define AN_SPEED1 A0 // analog reading for Speed Poti
#define AN_SPEED2 A1 // analog reading for Speed Poti
#define CURRENT_PIN A2 // Current sense from lmd18200
#define THERM_PIN A3 // thermal warning PIN //never used
#define dirPin1 A4 // direction forward/backward of trains Down=True, Up=False
#define dirPin2 A5 // direction On/Off of accessory (light) Down=On, Up=Off


//Timer frequency is 2MHz for ( /8 prescale from 16MHz )
#define TIMER_SHORT 0x8D // 58usec pulse length
#define TIMER_LONG 0x1B // 116usec pulse length


// ------------------- definitions for state machine -------------------
#define PREAMBLE 0
#define SEPERATOR 1
#define SENDBYTE 2

// ------------------- globals -------------------
unsigned char last_timer=TIMER_SHORT; // store last timer value

unsigned char flag=0; // used for short or long pulse
unsigned char every_second_isr = 0; // pulse up or down

unsigned char state= PREAMBLE;
unsigned char preamble_count = 16;
unsigned char outbyte = 0;
unsigned char cbit = 0x80;

boolean firststart = true; //
int maxcurrent = 0; //
int meancurrent = 0;
int current; // read from analog CURRENT_PIN
int overcurrent = 160; //ABOUT 1 A
boolean currentprotection = true; // stop the main loop if it become false
int hertz = 10;
int wait = 1000/hertz;

boolean _debug = false; // allow debugging with Serial communications

//variables for speed messure
int timespeed = 0;

// ------------------- variables for loco 1 -------------------
int locoSpeed=0;
int dir = 1;
int last_locoSpeed=0;
int last_dir;
int locoAdr=3; // this is the (fixed) address of the loco
int runtime = 0;
int stoptime = 0;
boolean stopping = false;
int locomaxspeed = 40;
int loco1parkspeed = 30;
boolean parked1 = false;
int laptime1 = 30*hertz;

// ------------------- variables for loco 2 -------------------
int STATIONTIME = hertz*10; // 100ms loop 5s = 50
int runtime2 = 0;
int stoptime2 = 0;
int locoSpeed2 = 0;
int dir2 = 1;
int last_locoSpeed2=0;
int func14 = 0;
int last_dir2;
int locoAdr2 = 1; // this is the (fixed) address of the loco
boolean stopping2 = false;
int loco2maxspeed = 120;
int loco2parkspeed = 100;
boolean parked2 = false;
int laptime2 = 30*hertz;

// ------------------- buffer for command -------------------
struct Message {
unsigned char data[7];
unsigned char len;
} ;

#define MAXMSG 5

struct Message msg[MAXMSG] = {
{ { 0xFF, 0, 0xFF, 0, 0, 0, 0}, 3}, // idle msg
{ { locoAdr, 0x3F, 0, 0, 0, 0, 0}, 4}, // Advanced operation instruction with 128 speed steps and direction (b7) in next byte
{ { locoAdr2, 0x3F, 0, 0, 0, 0, 0}, 4}, // Advanced operation instruction with 128 speed steps and direction (b7) in next byte
{ { locoAdr, 0x80, 0, 0, 0, 0, 0}, 3}, // Function group one instruction : 0x80 means light off
{ { locoAdr2, 0x90, 0, 0, 0, 0, 0}, 3} // Function group one instruction : 0x90 means light on
}; // loco msg must be filled later with speed and XOR data byte

int msgIndex=0;
int byteIndex=0;


// ------------------- Setup Timer2. -------------------
//Configures the 8-Bit Timer2 to generate an interrupt at the specified frequency.
//Returns the time load value which must be loaded into TCNT2 inside your ISR routine.
void SetupTimer2(){

//Timer2 Settings: Timer Prescaler /8, mode 0
//Timmer clock = 16MHz/8 = 2MHz oder 0,5usec
TCCR2A = 0;
TCCR2B = 0<<CS22 | 1<<CS21 | 0<<CS20;

//Timer2 Overflow Interrupt Enable
TIMSK2 = 1<<TOIE2;

//load the timer for its first cycle
TCNT2=TIMER_SHORT;
}

// ------------------- Timer2 overflow interrupt vector handler -------------------
ISR(TIMER2_OVF_vect) {
//Capture the current timer value TCTN2. This is how much error we have
//due to interrupt latency and the work in this function
//Reload the timer and correct for latency.
// for more info, see http://www.uchobby.com/index.php/2007/11/24/arduino-interrupts/
unsigned char latency;

// for every second interupt just toggle signal
if (every_second_isr) {
digitalWrite(DCC_PIN,1);
every_second_isr = 0;

// set timer to last value
latency=TCNT2;
TCNT2=latency+last_timer;

} else { // != every second interrupt, advance bit or state
digitalWrite(DCC_PIN,0);
every_second_isr = 1;

switch(state) {
case PREAMBLE:
flag=1; // short pulse
preamble_count--;
if (preamble_count == 0) { // advance to next state
state = SEPERATOR;
// get next message
msgIndex++;
if (msgIndex >= MAXMSG) { msgIndex = 0; }
byteIndex = 0; //start msg with byte 0
}
break;
case SEPERATOR:
flag=0; // long pulse
// then advance to next state
state = SENDBYTE;
// goto next byte ...
cbit = 0x80; // send this bit next time first
outbyte = msg[msgIndex].data[byteIndex];
break;
case SENDBYTE:
if (outbyte & cbit) {
flag = 1; // send short pulse
} else {
flag = 0; // send long pulse
}
cbit = cbit >> 1;
if (cbit == 0) { // last bit sent, is there a next byte?
byteIndex++;
if (byteIndex >= msg[msgIndex].len) {
// this was already the XOR byte then advance to preamble
state = PREAMBLE;
preamble_count = 16;
} else {
// send separtor and advance to next byte
state = SEPERATOR ;
}
}
break;
}

if (flag) { // if data==1 then short pulse
latency=TCNT2;
TCNT2=latency+TIMER_SHORT;
last_timer=TIMER_SHORT;
} else { // long pulse
latency=TCNT2;
TCNT2=latency+TIMER_LONG;
last_timer=TIMER_LONG;
}
}
}

// ------------------- SETUP -------------------
void setup(void) {
Serial.begin(9600);
//Set the pins for DCC to "output".
pinMode(DCC_PIN,OUTPUT); // this is for the DCC Signal

pinMode(DCC_PWM,OUTPUT); // will be kept high when power on rail is on, PWM pin
digitalWrite(DCC_PWM,LOW); // booster (LMD18200) disabled

// set LED pins to "output"
pinMode(START_LED,OUTPUT);
pinMode(MAN_LED,OUTPUT);
pinMode(OVER_LED,OUTPUT); // this is for the DCC Signal

pinMode(THERM_PIN, INPUT);
digitalWrite(THERM_PIN,1); //enable pull up

pinMode(MAN_SW,INPUT);
digitalWrite(MAN_SW,1); //enable pull up

pinMode(START_SW,INPUT);
digitalWrite(START_SW,1); //enable pull up

pinMode(dirPin1, INPUT);
digitalWrite(dirPin1, 1); //enable pull-up resistor !!

pinMode(dirPin2, INPUT);
digitalWrite(dirPin2, 1); //enable pull-up resistor !!

pinMode(SENSOR2, INPUT);
digitalWrite(SENSOR2, 1); //enable pull-up resistor

pinMode(SENSOR1, INPUT);
digitalWrite(SENSOR1, 1); //enable pull-up resistor

pinMode(PARK1, INPUT);
digitalWrite(PARK1, 1); //enable pull-up resistor

pinMode(PARK2, INPUT);
digitalWrite(PARK2, 1); //enable pull-up resistor

// AN_SPEED1, AN_SPEED2, CURRENT_PIN are INPUT by default and don't need to be initialized

//assemble first DCC messages
read_locoSpeed();
assemble_dcc_msg();
assemble_dcc_msg2();
assemble_dcc_msglight();
assemble_dcc_msg2light();
Serial.println(VERSION);
//Start the timer
SetupTimer2();
digitalWrite(OVER_LED,LOW);
}

// ------------------- LOOP -------------------
void loop(void) {

if (currentprotection) { //do nothing if not - reset is necessary to restart
meancurrent = 0;
for (int i=0; i<wait; i++) { // wait = 200
current = analogRead(CURRENT_PIN);
if (current > maxcurrent) {
maxcurrent=current;
}
meancurrent = meancurrent+current;
}
current = meancurrent/wait;
if (_debug) {
Serial.print(" Current:");
Serial.print(current);
Serial.print(" max current:");
Serial.println(maxcurrent);
}
if (current > overcurrent) {
digitalWrite(DCC_PWM,LOW); // stop booster
digitalWrite(OVER_LED,HIGH);
currentprotection = false;
}
delay(1); // why ?

//speed messure
timespeed++;
if (!digitalRead(SENSOR2) ) {
if (timespeed > hertz*4) {
int fart = (806*hertz)/timespeed;
if (_debug) {
Serial.print(" Speed: ");
Serial.print(fart);
Serial.print(" km/h ");
}
timespeed = 0;
}
}

if ( digitalRead(START_SW) && parked1 && parked2 ) {
//if START button is off and all trains are at the parking area, stop booster
digitalWrite(DCC_PWM,LOW);
}
else if ( digitalRead(START_SW) ) {
if (_debug) {
Serial.print("Start OFF " );
}
digitalWrite(START_LED,LOW);

//if switch is in OFF state
if (!digitalRead(PARK1) || parked1) {
locoSpeed = 1;
assemble_dcc_msg();
parked1= true;
}
else {
locoSpeed = loco1parkspeed;
assemble_dcc_msg();
}
if (!digitalRead(PARK2) || parked2) {
locoSpeed2 = 1;
assemble_dcc_msg2();
parked2= true;
}
else {
locoSpeed2 = loco2parkspeed;
assemble_dcc_msg2();
}
if (_debug) {
Serial.print("Stopping :" );
Serial.print(locoSpeed);
Serial.print(" :" );
Serial.print(locoSpeed2);
}
}
else { // START switch is in ON state
if (_debug) {
Serial.print("Start ON " );
}
digitalWrite(START_LED,HIGH);
digitalWrite(DCC_PWM,HIGH); // enable Booster
parked1= false;
parked2= false;
if ( digitalRead(MAN_SW) ) { // switch is manual
if (man_loco1()) {
// some reading changed -> make new dcc message
assemble_dcc_msg();
assemble_dcc_msglight();
}
if (man_loco2()) {
// some reading changed -> make new dcc message
assemble_dcc_msg2();
assemble_dcc_msg2light();
}
digitalWrite(MAN_LED,LOW);
if (_debug) {
Serial.print(" Manual :" );
Serial.print(locoSpeed);
Serial.print(" :" );
Serial.print(locoSpeed2);
Serial.print(" dir:");
Serial.print(dir);
Serial.print(" light:");
Serial.print(msg[3].data[1], BIN);
}

if (Serial.available()) {
switch (Serial.read()) {
case '#':
_debug = !_debug;
break;
default:
break;
}
}
}
else { // switch is auto
if (auto_loco2()) {
// some reading changed -> make new dcc message
assemble_dcc_msg2();
}
if (auto_loco1()) {
// some reading changed -> make new dcc message
assemble_dcc_msg();
}
digitalWrite(MAN_LED,HIGH);
if (_debug) {
Serial.print(" Auto :" );
Serial.print(locoSpeed);
Serial.print(" :" );
Serial.print(locoSpeed2);
}
}
}
}
}

// ------------------- Read Loco Speed -------------------
boolean read_locoSpeed() {
boolean changed = false;
// read the analog input into a variable:
// limit range to 0..127
locoSpeed = (127L * analogRead(AN_SPEED1))/1023;
if (locoSpeed != last_locoSpeed) {
changed = true;
last_locoSpeed = locoSpeed;
}
dir = digitalRead(dirPin1); // direction
if (dir != last_dir) {
changed = true;
last_dir = dir;
}
dir2 = digitalRead(dirPin2); // light
if (dir2 != last_dir2) {
changed = true;
last_dir2 = dir2;
}
return changed;
}

// ------------------- AUTO LOCO1 -------------------
boolean auto_loco1() {
boolean changed = false;
// read the analog input into a variable:

// limit range to 0..127
//locoSpeed = (127L * analogRead(AN_SPEED1))/1023;
if (!digitalRead(SENSOR1)) { // pre-station
if (runtime >= laptime1) { // 30 Hertz = 300
stopping = true;
}
}
if (stopping) {
locoSpeed--;
locoSpeed--;
}
else {
locoSpeed++;
runtime++;
}
if (locoSpeed >=locomaxspeed) {
locoSpeed = locomaxspeed;
}
if (locoSpeed <=0) {
locoSpeed = 0;
stoptime++;
}
if (stoptime >= STATIONTIME) {
stopping = false;
stoptime = 0;
runtime = 0;
}
if (locoSpeed == 1) { // this would result in emergency stop
locoSpeed = 2;
}
if (locoSpeed != last_locoSpeed) {
changed = true;
last_locoSpeed = locoSpeed;
}

return changed;
}

// ------------------- AUTO LOCO2 -------------------
boolean auto_loco2() {
boolean changed = false;
// read the analog input into a variable:

// limit range to 0..127
//locoSpeed = (127L * analogRead(AN_SPEED2))/1023;
if (!digitalRead(SENSOR2)) {
if (runtime2 >= laptime2) {
stopping2 = true;
}
}
if (stopping2) {
//locoSpeed2--;
locoSpeed2--;
if (locoSpeed2 == 1) {
locoSpeed2 = 0;
}
}
else {
locoSpeed2++;
runtime2++;
}
if (locoSpeed2 >=loco2maxspeed) {
locoSpeed2 = loco2maxspeed;
}
if (locoSpeed2 <=0) {
locoSpeed2 = 0;
stoptime2++;
}
if (stoptime2 >= STATIONTIME) {
stopping2 = false;
stoptime2 = 0;
runtime2 = 0;
}
if (locoSpeed2 == 1) { // this would result in emergency stop
locoSpeed2 = 2;
}
if (locoSpeed2 != last_locoSpeed2) {
changed = true;
last_locoSpeed2 = locoSpeed2;
}

return changed;
}

// ------------------- MANUAL LOCO1 -------------------
boolean man_loco1() {
boolean changed = false;
// read the analog input into a variable:

// limit range to 0..127
locoSpeed = (127L * analogRead(AN_SPEED1))/1023;
if (locoSpeed == 1) { // this would result in emergency stop
locoSpeed = 0;
}
if (locoSpeed != last_locoSpeed) {
changed = true;
last_locoSpeed = locoSpeed;
}

dir = digitalRead(dirPin1); //direction

if (dir != last_dir) {
changed = true;
last_dir = dir;
}

dir2 = digitalRead(dirPin2);

if (dir2 != last_dir2) { //light
changed = true;
last_dir2 = dir2;
}

return changed;
}

// ------------------- MANUAL LOCO2 -------------------
boolean man_loco2() {
boolean changed = false;
// read the analog input into a variable:

// limit range to 0..127
locoSpeed2 = (127L * analogRead(AN_SPEED2))/1023;
if (locoSpeed2 == 1) { // this would result in emergency stop
locoSpeed2 = 0;
}
if (locoSpeed2 != last_locoSpeed2) {
changed = true;
last_locoSpeed2 = locoSpeed2;
}

dir = digitalRead(dirPin1);

if (dir != last_dir) { // direction
changed = true;
last_dir = dir;
}

dir2 = digitalRead(dirPin2);

if (dir2 != last_dir2) { // light
changed = true;
last_dir2 = dir2;
}

return changed;
}

// ------------------- ASSEMBLE DCC MESSAGE -------------------
void assemble_dcc_msg() {
int i;
unsigned char data, xdata;

if (locoSpeed == 1) { // this would result in emergency stop
locoSpeed = 0;
}

// direction info first
if (dir) { // forward
data = 0x80;
} else {
data = 0;
}

data |= locoSpeed;

// add XOR byte
xdata = (msg[1].data[0] ^ msg[1].data[1]) ^ data;

noInterrupts(); // make sure that only "matching" parts of the message are used in ISR
msg[1].data[2] = data;
msg[1].data[3] = xdata;
interrupts();

}

// ------------------- ASSEMBLE DCC MESSAGE2 -------------------
void assemble_dcc_msg2() {
int i;
unsigned char data, xdata;

if (locoSpeed2 == 1) { // this would result in emergency stop
locoSpeed2 = 0;
}

// direction info first
if (dir) { // forward
data = 0x80;
} else {
data = 0;
}

data |= locoSpeed2;

// add XOR byte
xdata = (msg[2].data[0] ^ msg[2].data[1]) ^ data;

noInterrupts(); // make sure that only "matching" parts of the message are used in ISR
msg[2].data[2] = data;
msg[2].data[3] = xdata;
interrupts();

}

// ------------------- ASSEMBLE DCC MESSAGELIGHT -------------------
void assemble_dcc_msglight() {
int i;
unsigned char data, xdata;

if (dir2) {
data = 0x90;
} else {
data = 0x80;
}

// add XOR byte
xdata = (msg[3].data[0]) ^ data;

noInterrupts(); // make sure that only "matching" parts of the message are used in ISR
msg[3].data[1] = data;
msg[3].data[2] = xdata;
interrupts();

}

// ------------------- ASSEMBLE DCC MESSAGE2LIGHT -------------------
void assemble_dcc_msg2light() {
int i;
unsigned char data, xdata;

if (dir2) {
data = 0x90;
} else {
data = 0x80;
}

// add XOR byte
xdata = (msg[4].data[0]) ^ data;

noInterrupts(); // make sure that only "matching" parts of the message are used in ISR
msg[4].data[1] = data;
msg[4].data[2] = xdata;
interrupts();

}
---------------- fin du logiciel -----------------
Revenir en haut Aller en bas
http://bultez.fr
Wapata
Membre
Membre


Masculin Age : 30
Localisation : Loire Atlantique
Nombre de messages : 248
Date d'inscription : 30/12/2012

MessageSujet: Re: Faire sa propre centrale DCC    Sam 19 Jan 2013 - 10:39

SixtyFive a écrit:

j'espère pouvoir réaliser un lecteur de code barre sous chaque loco, ce qui me semble ce qu'il y a de plus élégant.

Si je puis me permettre, toi qui tâte en code, je ne peut que tu conseiller le RFID.
Un lecteur, de multiples antennes lues les unes après les autres (code) = prix dérisoire
Une puce RFID "grain de riz" comme celle que l'on met dans les animaux = fiabilité de lecture au top
Et bien sur, un tas d’accessoires sont déjà prévus pour l'arduino.

A titre perso, quand j'aurais décidé de me remettre dans le code, j'envisage cette solution pour calculer les temps de roulement de chaque loco et wagon (et donc gérer la maintenance).
Revenir en haut Aller en bas
https://plus.google.com/photos/112749379031194679527/albums/5845
SixtyFive
Membre
Membre


Masculin Age : 69
Localisation : 91340
Nombre de messages : 175
Date d'inscription : 21/12/2012

MessageSujet: Re: Faire sa propre centrale DCC    Sam 19 Jan 2013 - 12:33

Merci

"Une puce RFID "grain de riz" comme celle que l'on met dans les animaux = fiabilité de lecture au top
Et bien sur, un tas d’accessoires sont déjà prévus pour l'arduino."

Où trouve-t-on ces RFID miniatures ? et le lecteur Arduino ?
Revenir en haut Aller en bas
http://bultez.fr
Wapata
Membre
Membre


Masculin Age : 30
Localisation : Loire Atlantique
Nombre de messages : 248
Date d'inscription : 30/12/2012

MessageSujet: Re: Faire sa propre centrale DCC    Sam 19 Jan 2013 - 20:53

Les puces RFID, quelque soit leur format ou leur fréquence => ebay.
Le lecteur, plusieurs choix, soit un truc déjà tout fait qu'on détourne de sa fonction première => ebay
Soit un truc spécial Arduino alors ça:
https://www.sparkfun.com/products/8709?
Attention, celui la à l'antenne intégrée au décodeur, mais tu as tout le reste du site pour chercher un produit avec antenne détachée.

Ce genre de produit à l'avantage de décoder l'RFID et de l'envoyer via un port série. Mais si tu veux tout faire de zéro, je suppose qu'il doit y avoir des librairies pour ça sur Arduino, mais il faut aimer embobiner du fil...
Revenir en haut Aller en bas
https://plus.google.com/photos/112749379031194679527/albums/5845
SixtyFive
Membre
Membre


Masculin Age : 69
Localisation : 91340
Nombre de messages : 175
Date d'inscription : 21/12/2012

MessageSujet: Re: Faire sa propre centrale DCC    Dim 20 Jan 2013 - 0:20

OK
Mais la bobine à placer sur la loco n'est pas très petite apparemment :

http://www.realsnailmail.net

En effet les exemples d'intégration existent et c'est simple.

Un reader ID12 c'est quand même 30€ (portée de plus de 10 cm = risque de "voir" la voie d'à coté !) et le tag 4 à 5 € chez Sparfun.

J'essayerai quand même
Revenir en haut Aller en bas
http://bultez.fr
Wapata
Membre
Membre


Masculin Age : 30
Localisation : Loire Atlantique
Nombre de messages : 248
Date d'inscription : 30/12/2012

MessageSujet: Re: Faire sa propre centrale DCC    Dim 20 Jan 2013 - 11:48

Le tag format pastille à la forme d'une pastille forcément. Et je ne prendrais pas de photos du tag grain de riz car je l'ai perdu (...ouais, il est vraiment petit).
Mais voila l'échelle!

(apparemment un doigt de bricoleur vue les coupures)

Par contre, tu peux avoir un lecteur avec plusieurs antennes, il faut "faire tourner" les antennes (mais c'est toi l'électronicien, moi je ne suis qu'électricien) A-B-C-D-etc puis à chaque fois lire l'info. L'adresse plus l'info = la position précise du matériel.

La portée RFID est directement proportionnelle à la taille de l'antenne du lecteur ET de la puce (et c'est radio, donc tout est une histoire de proportion autour de la fréquence choisie). La portée des grains de riz doit être de deux centimètres avec un lecteur mural standard.
Après, "voir" la voie d'à côté est facile à éviter, il suffit de décaler les lecteurs. Ou de faire une cage de faraday autour de l'antenne du lecteur.
Notons enfin que les puces sont "alimentées" par l'antenne du lecteur. Donc si elles ne sont pas "face" au champs électromagnétique, elle ne sont pas alimentées, et donc pas lues.

As tu trouvé des exemples avec multiples antennes (j'avais stoppé mes recherches y a quelques années) ?
Revenir en haut Aller en bas
https://plus.google.com/photos/112749379031194679527/albums/5845
SixtyFive
Membre
Membre


Masculin Age : 69
Localisation : 91340
Nombre de messages : 175
Date d'inscription : 21/12/2012

MessageSujet: Re: Faire sa propre centrale DCC    Dim 20 Jan 2013 - 23:44

J'ai regardé les produits ID12 (30$) et Glass Capsule (10$). Ca a l'air vraiment simple à mettre en oeuvre et je ne pense pas qu'on ait besoin de plusieurs antennes.
C'est facile à utiliser avec un Arduino :
http://playground.arduino.cc/Code/ID12

L'ID12 doit suffire (distance de détection 5 cm). On peut le planquer dans le décor (un bâtiment par exemple) et la capsule doit pouvoir se loger dans la loco (quoiqu'il n'y a pas beaucoup de place en N).

Reste à voir si la prise d'énergie et le moteur de la loco ne perturbe pas le RFID

En gros c'est très élégant (mieux qu'un code barre). Mais c'est encore cher.

Je vais en commander dès que j'aurais d'autres produits à commander chez Sparkfun, pour limiter les couts du transport.

C'est amusant de savoir que cette technologie est utilisée par la SNCF pour les trains grandeurs !
A+
Revenir en haut Aller en bas
http://bultez.fr
Wapata
Membre
Membre


Masculin Age : 30
Localisation : Loire Atlantique
Nombre de messages : 248
Date d'inscription : 30/12/2012

MessageSujet: Re: Faire sa propre centrale DCC    Lun 21 Jan 2013 - 10:23

Je parlais de plusieurs antennes car tu parlais de plusieurs points de détection.
Pour la place... Tu peux encore en gagner en ouvrant la capsule mais bon...
Ou peindre la capsule, puis lui mettre des bras et paf, t'as un mécano.
Par contre je suis étonné des prix, j'avais eu la mienne à bien moins cher. Ca doit dépendre des moments.
Note bien que la fréquence du tag doit être la même que celle du lecteur hein ?

Cette technologie est beaucoup utilisée dans des endroits où on a besoin de lectures fiables (moins d'1% d’erreurs) mais aussi là où l’environnement est... particulier (trains couverts de crasse, camions couverts de boue, cartes couvertes de portefeuille).
Même sur les autoroutes, le télépéage est RFID. Par contre, ce dernier est "actif", il y a une pile dans le boitier récepteur (car la distance est grande).
Revenir en haut Aller en bas
https://plus.google.com/photos/112749379031194679527/albums/5845
StrongSpirit
Membre
Membre


Masculin Age : 51
Nombre de messages : 1039
Date d'inscription : 19/12/2007

MessageSujet: Re: Faire sa propre centrale DCC    Lun 21 Jan 2013 - 11:12

Bonjour

Si le tag est dans la loco, ne craignez-vous pas que les perturbations electromagnétiques (champ tournant du moteur, haute fréquences du aux passages balais/collecteurs, voir pire si décodeur = PWM donc courant haché) nuisent à la lecture du tag ?

Revenir en haut Aller en bas
Wapata
Membre
Membre


Masculin Age : 30
Localisation : Loire Atlantique
Nombre de messages : 248
Date d'inscription : 30/12/2012

MessageSujet: Re: Faire sa propre centrale DCC    Lun 21 Jan 2013 - 11:41

Non.
Ou alors pas de bol, c'est haché en 125kHz.
C'est un champs électromagnétique d'une fréquence bien précise, et les moteurs d’aujourd’hui sont assez blindés, ils ne polluent pas leur atmosphère magnétique (blindage) ou électrique (hachage).
Je vais essayer de retrouver du matériel pour tester.
Revenir en haut Aller en bas
https://plus.google.com/photos/112749379031194679527/albums/5845
 
Faire sa propre centrale DCC
Voir le sujet précédent Voir le sujet suivant Revenir en haut 
Page 2 sur 13Aller à la page : Précédent  1, 2, 3, ... 11, 12, 13  Suivant
 Sujets similaires
-
» Faire son propre Café-Tricot
» [Aide]Comment faire sa propre bootanimation?
» Faire sa propre rom wm6.5 (WWE)
» peut-on faire nos propre dies ?
» Faire ses propre décalques

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
1/160 - Echelle N :: Exploitation :: Le numérique-
Sauter vers: