Auteur Sujet: DCC++ Connecter à la BaseStation un contrôleur par liaison série directe (RX-TX)  (Lu 401 fois)

JCG

  • Newbie
  • *
  • Messages: 6
    • Voir le profil
Bonjour à tous,
Toutes mes excuses si le sujet a déjà été abordé, mais je ne l'ai pas trouvé.
DCC++ est une magnifique réalisation qui se pilote facilement depuis un PC en mode console ou par programme en envoyant sur le port série/USB des commandes simples de type <t 1 3 50 1> ou <f 3 147>.

Je souhaiterais élaborer ces trames par un second Arduino utilisé comme Contrôleur, en le branchant directement sur celui qui gère la Base Station.
La Base Station est prévue pour être pilotée soit via le port USB de l'Arduino soit via un shield Ethernet, mais il y a probablement moyen de se brancher directement (par RX-TX ou avec SoftwareSerial).

Je n'ai pas trouvé comment faire.
Merci d'avance si quelqu'un a la solution.

Tony04

  • Sr. Member
  • ****
  • Messages: 263
    • Voir le profil
Bonjour JCG (???),

oui bien sûr que cela est faisable, j'utilise cette solution dans la souris/centrale http://locoduino.org/spip.php?article237 de la façon suivante:
// dans définition des variables
char cmdBlue[MAX_COMMAND_LENGTH + 1]; // message reçu par voie série

// Dans le loop
//----------------------------------------------
// test si trame arrive par série 1 (Bluetooth)
//----------------------------------------------
while (Serial1.available()>0) {    // Tant que données série arrivent
char c = Serial1.read();
//Serial.print(c);                 // pour débuguer
if (c == '<') {                     // début de la trame
cmdBlue[0] = 0;
}
else if (c == '>') {              // fin de la trame
TextCommand::parse(cmdBlue); // on envoie traiter la trame
}
else if (strlen(cmdBlue) < MAX_COMMAND_LENGTH) { // s'il reste de la place dans le tableau
sprintf(cmdBlue, "%s%c", cmdBlue, c); // continuer jusqu'au >
}
}


Cordialement
Antoine

JCG

  • Newbie
  • *
  • Messages: 6
    • Voir le profil
Bonjour Antoine,

Merci pour cette réponse (dans la version actuelle de DCCpp le module TextCommand est remplacé par SerialCommand, c'est donc cette fonction que j'ai tenté d'utiliser).

Avec le morceau de programme, on envoie directement à SerialCommand::parse() les trames reçues par Serial1 à la place de celles arrivant à BaseStation par la console ou l'Ethernet et décodées par SerialCommand::process : c'est exactement ce que je souhaite faire.

J'ai donc complété DCCpp_Uno, mais la BaseStation ne réagit pas.
En ajoutant Serial.print(cmdBlue); avant SerialCommand::parse(cmdBlue); j'ai vérifié sur la console que les instructions que j'envoyais par Serial1 (par exemple <1> <t 1 3 50 1> ou <f 3 147>) étaient correctement reçues et transmises sans les < et > à SerialCommand::parse. Pourtant rien ne se passe.
En revanche, via SerialCommand::process() les commandes directes sur la console série continuent à bien marcher.
Je ne vois pas pourquoi celles traitées directement par SerialCommand::parse ne fonctionnent pas.

Une idée sur ce qui m'échappe ?
Merci d'avance

Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1859
  • 100% Arduino et N
    • Voir le profil

Je souhaiterais élaborer ces trames par un second Arduino utilisé comme Contrôleur, en le branchant directement sur celui qui gère la Base Station.
La Base Station est prévue pour être pilotée soit via le port USB de l'Arduino soit via un shield Ethernet, mais il y a probablement moyen de se brancher directement (par RX-TX ou avec SoftwareSerial).

Je n'ai pas trouvé comment faire.
Merci d'avance si quelqu'un a la solution.
Le mieux est de mettre les Arduino en communication I2C, pour garder le port serie pour le debugging.

Je l’ai fait, ça marche et je donnerai le truc un jour prochain.

Restez chez vous !

Tony04

  • Sr. Member
  • ****
  • Messages: 263
    • Voir le profil
Bonjour (prénom),

Merci pour cette réponse (dans la version actuelle de DCCpp le module TextCommand est remplacé par SerialCommand, c'est donc cette fonction que j'ai tenté d'utiliser).

je viens de télécharger la dernière version de DCCpp sur le GIT Locoduino et retrouve bien le même TextCommand::parse que je t'ai cité, où as-tu trouvé le SerialCommand ?

Cordialement
Antoine   

JCG

  • Newbie
  • *
  • Messages: 6
    • Voir le profil
Bonjour,

Désolé pour mon erreur. Ce sont les versions de DCCpp avec TextCommand qui sont plus récentes que celles avec SerialCommand.
J'avais utilisé https://git.framasoft.org/locoduino.org/Biblio-DCC/tree/InterfaceDCC
alors que la page de Locoduino conseille https://github.com/Locoduino/DCCpp/blob/master/DCCpp.zip
et comme le second ne fait que réhabiller le premier, je ne me suis pas aperçu de la confusion en lisant les explications.

Je vais donc installer la bibliothèque DCCpp-master.zip et reprendre mes essais.

JCG

  • Newbie
  • *
  • Messages: 6
    • Voir le profil
Bonsoir,
Heureusement que j'avais utilisé au départ le programme DCC_Uno.ino de la BaseStation DCC++ de Gregg E. Berman car sans rien avoir à faire il fonctionne sans problème tant avec des commandes directes que via un programme en Processing.

En revanche, je n'arrive pas à faire fonctionner la variante DCCpp-Master.zip conseillée par LOCODUINO.
Contrairement au programme de Gregg où l'on retrouve les modules sous forme d'onglets quand on lance DCCpp_Uno.ino je n'ai pas trouvé comment le lancer pour avoir les onglets et pour le compiler j'ai finalement du recopier tous les modules dans un même folder.
Les explications n'étant pas très claires, j'ai essayé déjà de voir quel était le programme maître et j'ai choisi SerialDCC.ino en pensant pouvoir au moins taper les commandes à la console. En général rien ne se passe et dans le meilleur des cas la loco avance à peine avec les feux qui rougeoient juste comme si l'alimentation tombait en panne (à tel point que j'ai vérifié les tensions et en désespoir de cause rechargé la version BaseStation pour vérifier que tout fonctionnait à nouveau bien).
J'en déduis qu'il y a des choix ou manipulations à faire dans les différents modules avant de lancer la compilation.
Merci d'avance de me dire quel est le minimum à faire pour que cela fonctionne.

Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1859
  • 100% Arduino et N
    • Voir le profil
Bonsoir JCG,

pourquoi ne commenceriez-vous pas à étudier l'article sur la bibliothèque DCCpp http://www.locoduino.org/spip.php?article228 ?
Et une documentation complète se trouve dans le dossier de la bibliothèque, sous-dossier "Extras", puis "Doc"
Restez chez vous !

Thierry

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 530
    • Voir le profil
Pour 'spoiler' un peu la lecture de cet article conseillé par Dominique, il faut comprendre comme point de départ que DCCpp n'est pas un programme Arduino, c'est une bibliothèque. Le but a été de transformer DCC++ pour le faire passer d'un sketch Arduino complexe à un bibliothèque paramétrable depuis le fichier ino.
Donc une fois installé comme bibliothèque via le 'gestionnaire de bibliothèques' de l'IDE (tapez DCCpp en haut à droite...), il suffit de prendre l'un de ses exemples, comme SerialDCC effectivement, de vérifier que les bonnes habilitations ont été faites dans DCCpp.h (les #define USE_TEXTCOMMAND par exemple), de régler les broches à piloter dans le fichier ino et de compiler. Mais tout ça est expliqué en détail dans l'article et plus grossièrement dans la doc en anglais.

JCG

  • Newbie
  • *
  • Messages: 6
    • Voir le profil
Bonjour,

Mon problème venait du fait que j'envoyais un espace entre le "<" et la lettre de fonction. Comme DCCpp ne traite que le premier caractère suivant le "<", sans chercher le suivant, il ne se passait rien.

Une fois l'espace enlevé, tout va bien en utilisant telle quelle la BaseStation de Gregg ou, avec la bibliothèque de Thierry, à condition de ne pas oublier certaines des modifications à faire dans DCCpp.h (pour répondre à Dominique, j'avais bien évidemment potassé avec beaucoup d'intérêt les articles de Thierry mais fait quelques oublis).

Merci pour vos conseils et la réactivité du forum Locoduino.
Cela m'a permis avec deux Arduino Nano de faire une centrale pour cinq locos indépendantes disposant chacune d'une commande avec bouton de réglage de vitesse et trois boutons de fonctions, ce qui suffit pour l'instant à mes besoins.