Bonjour à tous,
Voila quelques années que je construis des trains de jardin à l'échelle 1/13.5ème (Gn15) pour mon fils mais aussi un peu pour moi je l'avoue
J'ai réalisé un circuit de 50m dans mon jardin et toute une serie de locos mais je bloque sur la prog Arduino..
J'ai bien avancé et progressé en code et compréhension de l'engin mais je suis bloqué à l'heure ou je vous tape ces lettres..
Je maîtrise le module RFID et sa programmation (lecture et envoi d'ordres) ainsi que le module L298 (accélération et sens moteur)
Le projet :
Un circuit de 50m linéaire avec un badge RFID à chaque extremité (butée fin de voie) et également 1 badge RFID en entrée ET sortie de gare (Gare 1 et Gare 2).
Sous ma loco j'ai un arduino nano, un bouton poussoir BP1, un lecteur RFID et également un module L298 pour gérer l’accélération progressive de la loco et le sens du moteur.
Mon objectif :
1 : La loco se met en marche avant (progressive) lorsque j'appui sur un bouton poussoir BP1.
2 : Si la loco badge sur une puce RFID Fin de voie 1 ou Fin de voie 2, la loco s'arrête progressivement pour repartir dans l'autre sens suivant une tempo définie.
3 : Si la loco passe sur un Badge Gare 1 ou Gare 2, la loco décélère, s'arrête, puis repart progressivement (dans le même sens) après une tempo définie.
4 : enfin, si je rappuis sur BP1, la loco s'arrête.
Matos :
Arduino nano
Bouton poussoir BP1
RFID RC522
Module L298N
Badge RFID Gare 1
Badge RFID Gare 2
Badge RFID Fin de voie 1
Badge RFID Fin de voie 2
:o Voila le bazard, J'arrive à faire quelques bout de code mais rien qui tienne le rail, j'y ai déjà passé une bonne vingtaine d'heure mais la... je vois pas d'issue possible avec mon niveau débutant..
Merci infiniment à toutes les personnes qui seraient de bon conseil et je vénérerai quiconque me proposerais un bout de code!
peyodu5656:
Bonjour à tous,
Voila quelques années que je construis des trains de jardin à l'échelle 1/13.5ème (Gn15) pour mon fils mais aussi un peu pour moi je l'avoue
....
Bonsoir
[HUM]
n'avoue jamais 8)
Tu semble déjà avoir des bonnes bases de travail
AMHA , c'est typique l'utilisation d'une machine à état
il y a sur le forum plusieurs bon connaisseurs/pratiquants du concept ..
Salut
J'imagine que tu connais le forum Locoduino?
Si tu ne sais pas coder, pars sur de bonnes bases.
Le lecteur RFID c'est pas super compliqué, tu arriveras à ce que tu veux avec un code très simple.
Structure ta pensée, ça se ressentira immédiatement quand tu coderas.
Il te faut une fonction DECELERATION, une autre ACCELERATION.
Ton programme cherche un badge RFID en continu.
Quand il en lit un:
Alors:
-si c'est le badge de départ, accélélérer
-si c'est l'entrée de gare, décélérer, puis pause, puis avancer lentement
-si c'est sortie de gare, tchoutchou, accélérer
-si c'est le badge de fin, décélérer, arrêt.
En fait ça peut être TRES SIMPLE et le mieux c'est de faire TRES SIMPLE ^^
J'adore l'idée des badges RFID pour ça, c'est parfait.
Question:
comment on fait 50m de chemin ferré dans son jardin??? tu as tout nivelé et tout?
On peut avoir des photos ???
J'y vois déjà plus claire et ce tuto est vraiment génial !
Merci Artouste (avoir une réponse d'un membre qui s'appel Artouste, c'est royal .. pour les non initiés, Artoust est aussi le noms d'un chemin de fer à voie étroite dans les Pyrénées.. )
Bref je vais potasser tout ça et même si j'ai du mal à me voir en haut de la montagne, on va y arriver !
Merci encore et voici quelques photos (pas les plus récentes je m'en excuse mais je n'ai pas pris de photo récemment avec les bâtiments.. pour bientôt
peyodu5656:
Bonjour,
Merci pour vos réponses très riches,
J'y vois déjà plus claire et ce tuto est vraiment génial !
Merci Artouste (avoir une réponse d'un membre qui s'appel Artouste, c'est royal .. pour les non initiés, Artoust est aussi le noms d'un chemin de fer à voie étroite dans les Pyrénées.. )
Bah dis-donc, c'est étonnant!
Quel boulot!
Et à entretenir ça doit pas être coton!
Je parlais de Locoduino pour trouver un projet similaire ou proche, histoire d'avoir un point de départ.
En général on veut tout faire soi-même, et c'est pour moi un but, mais partir d'un truc existant ça permet d'explorer les possibilités, d'avoir de quoi faire tourner un programme et une machine, ensuite on développe sa propre version. C'est plus encourageant que de partir de rien...
Si tu organises bien les idées, l’enchaînement des actions, il va être simple d'en discerner les fonctions, y'a plus qu'à broder entre deux.
Ca sera aussi intéressant (et nécessaire) de voir avec quel matériel tu bosses: driver moteur, capteurs de luminosité (pour allumer les phares dans le tunnel) etc
Merci pour vos réponses,
Oui quelques heures mais pas 100 quand même, J'ai 1 petite semaine de travail (5jours à 35hsemaine!) pour le terrassement, niveau, ballast, soudure et peinture des voies.
Pour les plantes et arbustes miniatures c'est que le début, je suis également en train de faire des bâtiments.
Kammo : oui tu as raison, mon objectif est bien d'arriver à me faire mon programme, j'ai cherché une base sur plusieurs forum, mais je ne sais pas quelle trame choisir, sur Locoduino ils sont tous sur du DCC automatisé par ordi, très peu tournent avec de l'automate embarqué, j'ai mis un post quand même au cas ou.. mais l'automate d'état et ton premier post m'aiguille plutôt bien,
je vais me faire un grafcet.
Pour l'entretien, un aller de débroussailleuse, un retour de souffleur, soit 5min 1fois par mois..
Oui c'est bien l'un de mes fils et le beau paysage est celui du Morbihan! (ce talus fait tout le tour de notre vieille maison de pierre..) quand j'en aurais fini avec ce code j'agrandi le circuit !
peyodu5656:
Merci pour vos réponses,
Oui quelques heures mais pas 100 quand même, J'ai 1 petite semaine de travail (5jours à 35hsemaine!) pour le terrassement, niveau, ballast, soudure et peinture des voies.
Pour les plantes et arbustes miniatures c'est que le début, je suis également en train de faire des bâtiments.
Kammo : oui tu as raison, mon objectif est bien d'arriver à me faire mon programme, j'ai cherché une base sur plusieurs forum, mais je ne sais pas quelle trame choisir, sur Locoduino ils sont tous sur du DCC automatisé par ordi, très peu tournent avec de l'automate embarqué, j'ai mis un post quand même au cas ou.. mais l'automate d'état et ton premier post m'aiguille plutôt bien,
je vais me faire un grafcet.
Pour l'entretien, un aller de débroussailleuse, un retour de souffleur, soit 5min 1fois par mois..
Oui c'est bien l'un de mes fils et le beau paysage est celui du Morbihan! (ce talus fait tout le tour de notre vieille maison de pierre..) quand j'en aurais fini avec ce code j'agrandi le circuit !
Honnêtement, ça a l'air simple, c'est de mon niveau, j'irais pas jongler avec des bibliothèques juste pour ça, ni me compliquer la vie...
QUESTION:
Comment commandes-tu ton moteur, avec un driver genre L293d?
Pour aller plus loin, il faut préciser ce que tu as en matériel, pour savoir comment le commander.
Tu parles de RFID, sais-tu t'en servir? Tu as un bout de code ou rien?
Bon,
Après quelques heures surement inutiles, j'ai fais ça :
vous en pensez quoi?
#include <SPI.h>
#include <RFID.h>
RFID RFID(10,9);
int UID[5]={};
int Gare1[5]={34,199,71,115,209}; // badge gare 1
int Gare2[5]={60,111,82,115,114}; //badge gare 2
int Fin1[5]={17,17,76,115,63}; //badge Fin de voie 1
int Fin2[5]={176,247,96,131,164}; //badge Fin de voie 2
//gestion du pont en H
int IN1 = 5; // commande pont en H "1"
int IN2 = 6; // commande pont en H "2"
int a; //rapport cyclique entre 0 et 255
void setup() {
Serial.begin(9600);
SPI.begin();
RFID.init();
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
digitalWrite(IN2, 0);
digitalWrite(IN1, 0);
a=0;
}
void loop()
{
ACCELERATION_SENS1();
if (RFID.isCard()) {
/* Lecture du tag */
if (RFID.readCardSerial())
{
/*Serial.print("L'UID est: ");*/
for(int i=0;i<=4;i++)
{
UID[i]=RFID.serNum[i];
/* Serial.print(UID[i],DEC);
Serial.print(".");*/
}
/*Serial.println("");*/
}
/* fin de Lecture du tag */
if (UID[0] == Gare1[0]
&& UID[1] == Gare1[1]
&& UID[2] == Gare1[2]
&& UID[3] == Gare1[3]
&& UID[4] == Gare1[4])
{
DECCELERATION_SENS1();
delay(60000);
ACCELERATION_SENS1();
}
if (UID[0] == Gare2[0]
&& UID[1] == Gare2[1]
&& UID[2] == Gare2[2]
&& UID[3] == Gare2[3]
&& UID[4] == Gare2[4])
{
DECCELERATION_SENS2();
delay(60000);
ACCELERATION_SENS2();
}
if (UID[0] == Fin1[0]
&& UID[1] == Fin1[1]
&& UID[2] == Fin1[2]
&& UID[3] == Fin1[3]
&& UID[4] == Fin1[4])
{
DECCELERATION_SENS2();
delay(60000);
ACCELERATION_SENS2();
}
if (UID[0] == Fin2[0]
&& UID[1] == Fin2[1]
&& UID[2] == Fin2[2]
&& UID[3] == Fin2[3]
&& UID[4] == Fin2[4])
{
DECCELERATION_SENS1();
delay(60000);
ACCELERATION_SENS1();
}
RFID.halt();
}
delay(100);
}
void ACCELERATION_SENS1()
{
analogWrite(IN1, a);
a = a + 1;
delay(20);
}
void DECCELERATION_SENS1()
{
analogWrite(IN1, a);
a = a - 1;
delay(20);
}
void ACCELERATION_SENS2()
{
analogWrite(IN2, a);
a = a + 1;
delay(20);
}
void DECCELERATION_SENS2()
{
analogWrite(IN2, a);
a = a - 1;
delay(20);
}
Bon j'ai un gros doute quand à la fonctionnalité surtout pour les uid des badges, je ne sais pas trop comme on les renseignes..
Et puis j'ai un autre soucis, selon le sens du train les badges gare sont en entrée ou en sortie.. du coup il faut ignorer celui de sortie..
Merci pour vos retour en tous les cas
QUESTION:
Comment commandes-tu ton moteur, avec un driver genre L293d?
Pour aller plus loin, il faut préciser ce que tu as en matériel, pour savoir comment le commander.
Tu parles de RFID, sais-tu t'en servir? Tu as un bout de code ou rien?
J'ai ça comme matos :
Matos :
Arduino nano
Bouton poussoir BP1 (si besoin)
RFID RC522
Module L298N
Badge RFID Gare 1
Badge RFID Gare 2
Badge RFID Fin de voie 1
Badge RFID Fin de voie 2
Pour le RFID je sais le faire fonctionner assez simplement du genre faire une action avec un uid donné.
Rien n'est vraiment inutile en programmation, et le temps n'est pas perdu : on apprend en avançant.
Je pense que la proposition de faire une machine à états est la plus simple pour toi, tu peux prendre la bibli de bricofoy si elle te convient.
A partir de ton graphe, tu dois définir tes états (lis de la doc pour savoir comment les identifier, par exemple ici), puis les transitions qui te permettent de changer d'état (ici la détection d'un badge ou la fin d'une temporisation), enfin les fonctions à exécuter lorsque tu es dans chaque état (accélération, décélération, sens 1 et 2, autres plus tard ?). Un bon tuto ici.
Quand tu auras fait tout ça, le reste sera un jeu d'enfant, pour peu que tu suives bien les directives de mise en oeuvre de la bibli que tu auras choisie.
Garde à l'esprit qu'un programme ne fait que ce que tu lui demandes, et qu'il le fait très vite. Par exemple, lorsque tu diminues ton l'argument du PWM (pour l'analogWrite), il faut vérifier que cet argument ne passe pas en dessous de zéro (en écrivant par exemple : a = max(0,a-1); ) et pareil lorsque tu l'augmentes (pas au delà de 255). Enfin, il est probable que ton programme exécutera souvent cette fonction, genre toutes les 20 ms. Dans ce cas, en 5 secondes le moteur passera de 255 à 0 : c'est peut-être trop rapide. Tu devras soit mettre une temporisation soit mettre un seuil de diminution pour conserver une vitesse minimale (ce qui se traduira par a = max(seuil,a-1); )
Dernier conseil, que tu as déjà appliqué : continue à écrire ton code comme une suite de fonctions les plus simples possibles. C'est l'idéal pour le faire évoluer. Si plus tard, tu veux ajouter des lumières allumées dans les tunnels ou d'autres choses, tu ajouteras des fonctions mais tu sais que tout celles que tu auras validées auparavant n'auront pas besoin d'être modifiées puis re-validées. Un bon tuto ici.
Et utilise des noms de variables explicites (a = pas bon), tu te remercieras de l'avoir fait si tu reviens sur ton code quelques mois après l'avoir écrit...
peyodu5656:
Et puis j'ai un autre soucis, selon le sens du train les badges gare sont en entrée ou en sortie.. du coup il faut ignorer celui de sortie..
Ce n'est pas un souci : lorsque tu lis les badges, en fonction du sens de déplacement du train (que tu es censé connaitre), il te suffit d'agir (changer d'état) uniquement si la badge lu correspond à une entrée en gare.
je vais regarder ça se soir, en attendant j'ai un peu modifié le grafcet car après le post de Kammo, je vois qu'il me faut aussi un sens pour la décélération..
j'inverse aussi le noms des fins pour plus de logique, et j'ai enlevé 3-4 fautes....
Je ne vois pas du tout l'intérêt d'employer une bibliothèque. Vraiment pas.
Les petits soucis comme le dépasse de 0-255, ça se résout d'un seul constrain()...
En voulant lui simplifier la vie, tu lui suggères d'utiliser une usine pour beurrer une tartine, pendant ce temps-là, il n'apprend pas à coder simplement...
Son programme peut être fait en une heure par un gugusse comme moi... Il est conscient qu'il a du boulot, mais ya rien de compliqué...
M'enfin...
Lorsque j'ai aidé ArduinoFree à faire le code pour son bateau, j'ai commencé comme je fais pour moi (c'est à dire coder avec les pieds), mais je me suis aperçu que le truc gagnait rapidement en complexité et je me suis lancé dans un machine à états très simple, et sans bibliothèque.
Mais je me dis que s'il débute en programmation (moi ça fait 30 ans que j'en fais) l'ami Peyo (un rapport avec les Schtroumpfs ?) risque de galérer sur des problèmes déjà résolus par d'autres. D'où la suggestion de la bibliothèque. Mais ce n'est qu'une suggestion...