Arduino - alimentation analogique pour train unique

Toutes les discussions sur l'Arduino !

Modérateur : MOD

doddyfab
Messages : 22
Enregistré le : mer. 26 févr. 2014, 11:50

Arduino - alimentation analogique pour train unique

Message par doddyfab » ven. 28 févr. 2014, 15:19

Bonjour à tous,

Tout d'abord je vous félicite pour ce forum qui m'a permis de débuter avec Arduino :siffle:
J'ai un projet personnel de train miniature et celui-ci comportera qu'une seule boucle allongée et un seul train tournant en boucle. Il y a un tunnel et une gare en facade.
J'aurais voulu savoir si il était possible de gérer un arrêt aléatoire en gare (tous les x tours, car le faire s'arreter à chaque fois n'a que peu d'interet, le tour ne durant que 20/30 sec) avec ralentissement et démarrage progressif (un canton sur la longueur de la gare en gros) avec un arduino. J'ai fait pas mal de recherches mais je n'ai rien trouvé de probant (souvent problème de charge car plusieurs locomotives).
Ici je cherche à gérer cette zone pour 1 locomotive sur le circuit. Je pensais à une détection ILS ou infrarouge en entrée de gare.
Si d'aventure vous avez quelques schémas de faisabilité avec un arduino (surement avec transistors et relais) ca serait super. Si nécessaire, je peux faire un descriptif plus complet du projet.
PS : le projet se fait à l'échelle N.

Merci d'avance de m'avoir lu.

Fabien

Avatar du membre
Arduino
Prolixe
Messages : 1700
Enregistré le : mer. 25 sept. 2013, 17:14

Re: Arduino - alimentation analogique pour train unique

Message par Arduino » ven. 28 févr. 2014, 18:04

Bonjour doddyfab,

Arduino est tout à fait bien placé pour réaliser un automatisme de ce genre, et le faire en rajoutant un côté aléatoire dans sa réalisation.

Tout d'abord, il faut un signal qui permette à Arduino de savoir que le train arrive ; ce peut être un ILS ou bien une cellule ou encore une pédale de voie. Ce signal génère une variable nombre_de_tours_faits.

Arduino devra également avoir le contrôle de la portion de voie sur laquelle le train ralentira ou accélèrera. Tu peux utiliser une sortie PWM mais, bien entendu, ce signal est trop faible pour un moteur donc il faudra l'amplifier. Pour cela, il faut connaitre la consommation de ton moteur afin de choisir le transistor adéquat.

Pour le côté aléatoire, il existe une fonction random qui peut générer un nombre aléatoire (en fait pseudo-aléatoire mais on ne voit pas la différence) compris entre un mini et un maxi. Par exemple, tu décides que ton train fera entre 3 et 7 tours avant de s'arrêter ! Ceci génère donc une variable nombre_de_tours_a_faire.

Le programme compare alors nombre_de_tours_faits avec nombre_de_tours_a_faire et quand ils sont égaux, fait évoluer le signal PWM pour arriver à arrêter le train progressivement (il faudra effectuer un réglage de cette fonction pour que le train s'arrête là où tu veux).

Un autre appel de la fonction random peut aussi fixer aléatoirement le délai de l'arrêt en gare. Après, le train redémarre ... et ça recommence.

L'avantage de ce système est que tu peux changer les constantes pour que le train s'arrête plus ou moins longtemps, qu'il fasse plus ou moins de boucles, bref, tout un tas de choses qu'on a du mal à obtenir avec l'électronique câblée.

Bon, je te laisse un peu imaginer comment réaliser tout cela en espérant que ces quelques considérations te permettront d'avancer dans ton projet, sinon on reste à ta disposition. :wink:

Avatar du membre
jlb
Fécond
Messages : 694
Enregistré le : jeu. 04 oct. 2012, 16:38
Echelle pratiquée : N
Prénom : Jean-Luc
Site Internet : http://modelleisenbahn.triskell.org

Re: Arduino - alimentation analogique pour train unique

Message par jlb » sam. 01 mars 2014, 08:18

Bonjour doddyfab,

As tu moyen de dissimuler dans le décor un détecteur de présence IR comme celui-ci : http://www.pololu.com/product/1132 ?

doddyfab
Messages : 22
Enregistré le : mer. 26 févr. 2014, 11:50

Re: Arduino - alimentation analogique pour train unique

Message par doddyfab » dim. 02 mars 2014, 21:39

Bonjour,

Merci des premiers éléments de réponse. J'ai fait un montage à base de transistor 2N3055 et cela fonctionne bien avec une ampoule de voiture. Faut que je teste avec le train maintenant.
@jlb, je peux éventuellement mettre ce détecteur sur mon décor en le dissimulant dans une guérite d'entrée de gare par exemple. Est-ce que cela améliore vraiment la détection par rapport à un ILS ?

@arduino, je vais commencer à écrire le programme et faire quelques tests. Je devrais m'en sortir car le code n'est pas un pb pour moi.

Merci à vous 2

Fabien

Avatar du membre
jlb
Fécond
Messages : 694
Enregistré le : jeu. 04 oct. 2012, 16:38
Echelle pratiquée : N
Prénom : Jean-Luc
Site Internet : http://modelleisenbahn.triskell.org

Re: Arduino - alimentation analogique pour train unique

Message par jlb » dim. 02 mars 2014, 21:57

doddyfab a écrit :@jlb, je peux éventuellement mettre ce détecteur sur mon décor en le dissimulant dans une guérite d'entrée de gare par exemple. Est-ce que cela améliore vraiment la détection par rapport à un ILS ?
Sans doute pas mais ça évite de mettre des aimants sous tout le matériel.

doddyfab
Messages : 22
Enregistré le : mer. 26 févr. 2014, 11:50

Re: Arduino - alimentation analogique pour train unique

Message par doddyfab » lun. 03 mars 2014, 10:24

En fait, c'est une pour un projet sur une seule voie avec une seule loco donc pour ce projet là l'ILS me parait adapté. Après il est vrai que sur un réseau plus grand ce genre de détection me parait plus fiable.
Je suis en train de cogiter pour la réalisation d'un réseau à la maison et je me dit qu'Arduino pourrait répondre à toute cette gestion de canton via des detecteurs IR, je n'ai pas envie d'investir dans du DCC quand je vois le prix des centrales et ce que je veux faire ...

Pour mon projet initial, j'ai écrit le bout de code et je vais le tester ce soir. Je pense faire la détection ILS via une interruption sur la pin 2, en mode FALLING (à priori plus fiable que RISING car l'état bas est "sur"). Est-ce que j'ai besoin de faire du débouce si mon train ne passe que toutes les 30 sec devant l'ILS ?

Merci
Fabien

Avatar du membre
jlb
Fécond
Messages : 694
Enregistré le : jeu. 04 oct. 2012, 16:38
Echelle pratiquée : N
Prénom : Jean-Luc
Site Internet : http://modelleisenbahn.triskell.org

Re: Arduino - alimentation analogique pour train unique

Message par jlb » lun. 03 mars 2014, 11:16

Oui, un ILS rebondit

En prenant une datasheet au hasard : http://www.produktinfo.conrad.com/daten ... _60_VA.pdf

On voit que le temps max de rebond est de 500µs

Tout va dépendre de la durée de ton programme d'interruption et aussi de la manière dont le logiciel de la bibliothèque Arduino acquitte les interruptions. Si sa durée est inférieure à la durée du rebond de l'ILS, plusieurs interruptions seront reçues.

Donc soit tu mets un circuit RC pour filtrer l'ILS. En regardant la datasheet de l'ATMega328, je n'ai pas l'impression qu'il y ait des contraintes de temps de montée ou de temps de descente sur les entrées interruption externe. Soit tu gères logiciellement en mesurant la durées entre 2 exécutions de la routine d'IT pour éliminer les fausses signalisations.

doddyfab
Messages : 22
Enregistré le : mer. 26 févr. 2014, 11:50

Re: Arduino - alimentation analogique pour train unique

Message par doddyfab » lun. 03 mars 2014, 13:49

Ca confirme ce que j'ai pu voir à droite à gauche donc.
Du coup, en me basant sur certains code, je compte le détecter comme cela .
A tester pour voir si les 50 ms sont pas un peu courtes.

Code : Tout sélectionner

volatile long lastRiseTime = 0; 
volatile int nb_tours_fait = 0;		
void setup()
{
	attachInterrupt(0, trigger_ILS_gare_falling, FALLING);   
	attachInterrupt(0, trigger_ILS_gare_rising, RISING);
}

void trigger_ILS_gare_falling()
{
	if ((millis() - lastRiseTime) > 50) nb_tours_fait++;	
}

void trigger_ILS_gare_rising()
{
	lastRiseTime = millis();
}
Je fais les tests ce soir et vous tiens au courant.
Question subsidiaire :
Je pensais utiliser ce bout de code pour l'acceleration du trian, est-ce une bonne idée de monter linéairement dans ue boucle for ?

Code : Tout sélectionner

// acceleration de départ
    for (int i=0; i < 256 ; i++){
		analogWrite(sortieTrain, i);
		delay(20);
    }

Avatar du membre
jlb
Fécond
Messages : 694
Enregistré le : jeu. 04 oct. 2012, 16:38
Echelle pratiquée : N
Prénom : Jean-Luc
Site Internet : http://modelleisenbahn.triskell.org

Re: Arduino - alimentation analogique pour train unique

Message par jlb » lun. 03 mars 2014, 14:04

doddyfab a écrit :A tester pour voir si les 50 ms sont pas un peu courtes.
Un train qui roulerait à 100 à l'échelle parcoure environ 18cm/s. Donc en 50ms ça fait environ 9mm de parcouru. Etant donné la taille d'un ILS, tu es dans l'ordre de grandeur. 50ms est donc un peu long.

Code : Tout sélectionner

volatile long lastRiseTime = 0; 
volatile int nb_tours_fait = 0;		
void setup()
{
	attachInterrupt(0, trigger_ILS_gare_falling, FALLING);   
	attachInterrupt(0, trigger_ILS_gare_rising, RISING);
}

void trigger_ILS_gare_falling()
{
	if ((millis() - lastRiseTime) > 50) nb_tours_fait++;	
}

void trigger_ILS_gare_rising()
{
	lastRiseTime = millis();
}
Mais le problème principal est que tu ne filtres pas au mieux. Tu mesures le temps entre la dernière montée et la descente la plus récente. Il vaudrait mieux mesurer le temps entre la première montée et la dernière descente.
Question subsidiaire :
Je pensais utiliser ce bout de code pour l'acceleration du trian, est-ce une bonne idée de monter linéairement dans ue boucle for ?

Code : Tout sélectionner

// acceleration de départ
    for (int i=0; i < 256 ; i++){
		analogWrite(sortieTrain, i);
		delay(20);
    }
Comme tu n'as pas à faire d'autre chose, c'est valable.

Tu attaques quoi avec un analogWrite ?

Avatar du membre
Pierre59
Papotier
Messages : 147
Enregistré le : dim. 07 mars 2010, 09:17
Echelle pratiquée : HO
Club : Lille Modélisme
Localisation : Villeneuve d'Ascq (59650)
Âge : 76

Re: Arduino - alimentation analogique pour train unique

Message par Pierre59 » lun. 03 mars 2014, 14:15

doddyfab a écrit :

Code : Tout sélectionner

volatile long lastRiseTime = 0; 
volatile int nb_tours_fait = 0;		
void setup()
{
	attachInterrupt(0, trigger_ILS_gare_falling, FALLING);   
	attachInterrupt(0, trigger_ILS_gare_rising, RISING);
}

void trigger_ILS_gare_falling()
{
	if ((millis() - lastRiseTime) > 50) nb_tours_fait++;	
}

void trigger_ILS_gare_rising()
{
	lastRiseTime = millis();
Bonjour

Il faut choisir entre FALLING et RISING, un seul cas possible.
Le deuxième attachInterrupt( ) supprime le premier.

Pierre

doddyfab
Messages : 22
Enregistré le : mer. 26 févr. 2014, 11:50

Re: Arduino - alimentation analogique pour train unique

Message par doddyfab » lun. 03 mars 2014, 15:28

jlb a écrit : Tu attaques quoi avec un analogWrite ?
En fait j'attaque sur la pin 3 un transistor 2N3055 sur sa base, avec sa sortie collecteur vers le rail et l'emetteur au GND. Le +12V va à l'autre rail. J'ai testé avec une ampoule voiture et ca varie sans pb !

J'ai vu aussi qu'il fallait mieux pour un ILS faire un FALLING que RISING car l'état bas est + stable.
Du coup un code comme ca devrait mieux passer :

Code : Tout sélectionner

volatile unsigned long last_ils_time = 0;
int debounce = 50; 	

void trigger_ILS_gare_falling()
{
	ils_time = millis();
	if (ils_time - last_ils_time > debounce)
	{
		nb_tours_fait++;
		last_ils_time = ils_time;
	}
	 	
}

doddyfab
Messages : 22
Enregistré le : mer. 26 févr. 2014, 11:50

Re: Arduino - alimentation analogique pour train unique

Message par doddyfab » lun. 03 mars 2014, 15:45

le schéma que j'utilise ci joint (réalisé via ce site en ligne !)

Edit : dsl le lien que je met ne fonctionne pas sur serv img ...
Fichiers joints
arduino_train.png

Avatar du membre
jlb
Fécond
Messages : 694
Enregistré le : jeu. 04 oct. 2012, 16:38
Echelle pratiquée : N
Prénom : Jean-Luc
Site Internet : http://modelleisenbahn.triskell.org

Re: Arduino - alimentation analogique pour train unique

Message par jlb » lun. 03 mars 2014, 18:17

Ok donc tu utilises ce transistor en hacheur.

J'attire ton attention sur deux choses.

Par défaut les PWM sur l'Arduino sont à une fréquence de 500Hz. Le hachage basse fréquence peut présenter un danger pour les petits moteurs. Voir http://modelleisenbahn.triskell.org/spip.php?article44 et http://modelleisenbahn.triskell.org/spip.php?article45

Il faudrait donc augmenter le fréquence de la PWM à disons plus de 16kHz. Voir http://arduino.cc/en/Tutorial/SecretsOfArduinoPWM

Mais j'ai bien peur que ce vénérable 2N3055 ait du mal à suivre la cadence. L'idéal serait un MOSFET.

doddyfab
Messages : 22
Enregistré le : mer. 26 févr. 2014, 11:50

Re: Arduino - alimentation analogique pour train unique

Message par doddyfab » lun. 03 mars 2014, 21:08

Bonsoir JLB,

Merci pour toutes ces précisions, j'ai appris pas mal en lisant tes pages et du coup ca fait réfléchir :siffle:

Entre temps, alors que je testais mon programme, mon arduino qui n'en nétait pas un (et oui un simili arduino acheté sur eaby, pas fais gaffe et donc pas un officiel) s'est mis à ne pas répondre pour transférer le code et donc il ne répond toujours pas ...

Du coup je me demande au vu de tout ca si pour mon projet je ne mettrais pas un module electronique autonome.
Je vais étudier ca pour utiliser un mosfet et voir ce que ca donne (le schéma serait il le meme ?)

Vu que je risque de ne pas avoir d'"arduino" pendant un moment (j'ai mailé la boutique ebay pour un retour), je vais me pencher sur le coté électronique.
Merci en tout cas de ton temps passé.

Fabien

Avatar du membre
jlb
Fécond
Messages : 694
Enregistré le : jeu. 04 oct. 2012, 16:38
Echelle pratiquée : N
Prénom : Jean-Luc
Site Internet : http://modelleisenbahn.triskell.org

Re: Arduino - alimentation analogique pour train unique

Message par jlb » lun. 03 mars 2014, 22:15

doddyfab a écrit :Entre temps, alors que je testais mon programme, mon arduino qui n'en nétait pas un (et oui un simili arduino acheté sur eaby, pas fais gaffe et donc pas un officiel) s'est mis à ne pas répondre pour transférer le code et donc il ne répond toujours pas ...
Y compris après un reboot du PC ?
Je vais étudier ca pour utiliser un mosfet et voir ce que ca donne (le schéma serait il le meme ?)
Oui excepté qu'il ne faut pas laisser flotter la grille quand l'Arduino n'a pas encore programmé sa broche de commande en sortie et la tirer à la masse via une résistance de 10k. Et la grille étant isolée, il n'y a pas de résistance à mettre entre l'Arduino et la grille.

Tu trouveras un exemple sur ce produit de Sparkfun : https://www.sparkfun.com/products/10618

Note que le NMOS utilisé a une diode transil (2 zener tête bêche) sur la grille ce qui permet de ne pas griller le MOS par l'électricité statique. Pas mal.

Répondre