Auteur Sujet: Bus CAN DIY compatible JMRI  (Lu 2357 fois)

nopxor

  • Full Member
  • ***
  • Messages: 192
    • Voir le profil
Bus CAN DIY compatible JMRI
« le: septembre 17, 2024, 12:56:15 pm »
J'ai expérimenté un bus CAN à base de nœuds constitués d' ESP32 depuis JMRI.

J'ai utilisé simplement les exemples de la librairie OpenMRNLite.

J' ai d'abord fabriqué avec un ESP32, un module FTDI232 et un module WCMCU-230 une passerelle CAN-USB pour communiquer avec JMRI. J'ai utilisé le programme exemple ESP32SerialBridge qui emploie le format "Grid Connect".

J'ai ensuite rajouté un nœud WIFI-CAN avec un ESP32 et un module WCMCU-230. Il fonctionne avec le programme exemple ESP32IOBoard. C'est un nœud qui comporte 8 entrées et 8 sorties. Pour le test, je n'ai utilisé qu'un bouton poussoir avec une résistance pullup.

J'ai enfin rajouté au bus CAN un autre ESP32 avec toujours un driver WCMCU-230 dont j'ai viré la résistance de terminaison de 120 ohms. Il fonctionne lui aussi avec le programme exemple ESP32IOBoard, mais compilé cette fois sans l'option WIFI. Toujours doté de 8 entrées et 8 sorties. Je n'ai connecté qu'une led (avec sa résistance) en sortie.

Le but de la manip, vous l' aurez compris, étant d'allumer la led du nœud CAN2 en appuyant sur le bouton du nœud CAN1. Et surtout le faire depuis une configuration confortable de haut niveau dans JMRI. Adios la programmation Molinaro bas niveau bit à bit et ses sombres masques et filtres.

JMRI reconnaît tous les nœuds du bus CAN dans une arborescence où ils sont nommés en clair en plus de leur identifiant unique (hexadécimal).
Il suffit ensuite par copier-coller d'associer l'événement (event) appui sur input 1 du CAN1 à l'event output 1 sur ON du CAN2.

On ne peut plus simple.
Le tout en DIY open source normé.

Yes you CAN.  :)
Cqfd
 

bobyAndCo

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1061
  • HO avec DCC++
    • Voir le profil
Re : Bus CAN DIY compatible JMRI
« Réponse #1 le: septembre 17, 2024, 08:38:35 pm »
Bonjour Eric,

Content que tu ais pu tester le CAN avec succès et que tu sois aussi enthousiaste. J’espère que tu nous feras quelques démos.

Ce que tu que tu qualifies toi-même de programmation de haut niveau ne permet pas toujours de réaliser se que l’on veut faire exactement. Par exemple si l’on a des contraintes de vitesse, la programmation de haut niveau peut freiner les performances recherchées.

Je ne crois pas qu’il faille mettre dos à dos les deux (haut et bas niveau) et surtout pas le pauvre Pierre Molinaro qui n’y est pour rien. Sa bibliothèque correspond à certains types de besoins. D’autant que l’exemple des filtres que tu prends n’est vraiment pas quelque chose de compliqué quand on cherche à comprendre.

C’est pour ce genre de choses que je proposais d’approfondir le sujet. Le bas niveau permet de faire du sur mesure, de la dentelle en quelque sorte.

Mais l’essentiel étant d’apporter un éclairage le plus utile possible pour tout ceux que cela intéresse. Alors merci !

Christophe

nopxor

  • Full Member
  • ***
  • Messages: 192
    • Voir le profil
Re : Bus CAN DIY compatible JMRI
« Réponse #2 le: septembre 18, 2024, 03:38:52 pm »
Ci-joint le tuto 1 sur 2 pour reproduire l'expérimentation.

D'abord les connections:

   * passerelle CAN-USB :

ESP32            FTDI232

pin RX 16        pin TX

pin TX 17        pin RX

3V3                VCC

GND              GND

jumper du FTDI232 sur 3V3


ESP32            WCMCU-230

pin 4               CRX

pin 5               CTX

3V3                 3V3

GND                 GND

                      CAN H

                      CAN L

installer la librairie OpenMRNLite

Compiler et téléverser le programme exemple ESP32SerialBridge.ino

-------------------------------------------------------------------

   * nœud CAN1 (WIFI-CAN) :

ESP32            WCMCU-230

pin 4                CRX

pin 5                CTX

3V3                  3V3

GND                  GND

                       CAN H

                       CAN L


ESP32            bouton poussoir

pin 32            avec résistance pullup 10k


Compiler et téléverser le programme ESP32IOBoard.ino

au préalable définir le réseau WIFI avec son mot de passe  ligne 117 et 120

-----------------------------------------------------------------

   * nœud CAN2 (CAN) :

ESP32            WCMCU-230

pin 4                CRX

pin 5                CTX

3V3                  3V3

GND                  GND

                    CAN H

                    CAN L

il faut virer (dessouder de préférence) la résistance CMS R2 de terminaison de bus de 120 ohm sur ce module WCMCU-230
il y a déja les 2 résistances nécessaires au CAN sur les 2 autres drivers CAN

ESP32            diode LED

pin 15            avec résistance environ 560 ohm reliée à GND


Compiler et téléverser le programme ESP32IOBoard.ino

au préalable commenter la ligne 57 en:   // #define USE_WIFI

ligne 100 il faut un identifiant de node qui soit différent de CAN1: remplacer à la fin la lettre a par b par exemple

-------------------------------------------------------------------------

relier ensemble les 3 CAN H

relier ensemble les 3 CAN L

vérifier bien les connections



Alimenter les 3 ESP32 et connecter la prise USB du FTDI232        si rien ne fume, on continue ; )

Il faudra noter le port COM du FTDI232, c'est lui qui est connecté au PC JMRI

aller dans le gestionnaire de périphériques pour l'identifier (dans Windows 10: touche WIN + x)

------------------------------------------------------------------------

Lancer JMRI,  aller dans menu Modifier -> Préférences

clic sur onglet + (ajouter nouvelle connexion)

Fabricant système -> choisir:  OpenLCB

Connexion système -> choisir:  CAN via GridConnect adapter

renseigner le port série COM du FTDI232

cocher  Réglages connexion supplémentaires

choisir débit en bauds :  115.200bps

enregistrer et relancer JMRI



Si tout va bien, il y a un nouvel onglet OpenLCB dans le menu JMRI




nopxor

  • Full Member
  • ***
  • Messages: 192
    • Voir le profil
Re : Bus CAN DIY compatible JMRI
« Réponse #3 le: septembre 18, 2024, 05:09:39 pm »
La suite du tuto : 2 sur 2

menu OpenLCB -> Configurer noeud



La fenètre Network Tree affiche les noeuds du réseau CAN avec leur identifiants en hexadécimal
Il y a bien 2 Arduino IO boards et 1 Arduino Serial Bridge de listés
Il y a aussi un noeud pour JMRI

05.01.01.01.18.2A - Arduino IO Board est le CAN1
05.01.01.01.18.2B - Arduino IO Board est le CAN2

cliquer sur le noeud CAN1
puis cliquer sur Open Configuration dialog

cela ouvre la fenêtre de dialogue du CAN1
cliquer sur Segment:Settings
on voit d'abord les 8 onglets des outputs du CAN1



descendre dans la fenêtre jusqu'au 8 inputs
le bouton est connecté (pin32) sur input1
l'appui correspond au niveau LOW cela produit l'event 05.01.01.01.18.2A.00.11
le relachement correspond au niveau HIGH cela produit l'event 05.01.01.01.18.2A.00.10



Il faut associer ces 2 events à la sortie 1 du CAN2
Pour cela on retourne dans la fenêtre Network Tree pour cliquer sur le noeud CAN2
cela ouvre la fenêtre de dialogue du CAN2
cliquer sur Segment:Settings
on va à l'onglet output1. C'est sur cette sortie qu'est connectée la led (pin15)
par copy / paste des events:
on associe  l'event 05.01.01.01.18.2A.00.10 du CAN1 à l'event output on du CAN2
et on associe l'event 05.01.01.01.18.2A.00.11 du CAN1 à l'event output off du CAN2

Les events passent en orange lorsqu'ils sont modifiés il faut appuyer sur write pour valider



L'appui (low) sur le bouton éteint bien la Led
Le relachement (HIGH) l'allume

Si on ouvre le moniteur de trafic on voit bien les events déclenchés par l'appui sur le bouton



nopxor

  • Full Member
  • ***
  • Messages: 192
    • Voir le profil

CATPLUS

  • Sr. Member
  • ****
  • Messages: 431
    • Voir le profil
Re : Bus CAN DIY compatible JMRI
« Réponse #5 le: septembre 18, 2024, 06:31:09 pm »
Bonsoir

Merci Eric pour ce tuto, plus qu'à tester
Best Regards

nopxor

  • Full Member
  • ***
  • Messages: 192
    • Voir le profil
Re : Bus CAN DIY compatible JMRI
« Réponse #6 le: septembre 18, 2024, 07:22:04 pm »
Bonsoir Marcel,
Cela fait beaucoup de boulot pour allumer une led  :) mais cela offre des perspectives intéressantes.
Rien qu'avec la passerelle CAN-USB, on économise plus de 70€.
Si j' ai du courage je dessinerai un pcb pour un câblage propre.

fcot2002

  • Full Member
  • ***
  • Messages: 117
    • Voir le profil
Re : Bus CAN DIY compatible JMRI
« Réponse #7 le: septembre 20, 2024, 11:07:33 am »
Salut Eric  ;)

Comme je dis souvent JMRI c'est la vie  8) 8) 8)

nopxor

  • Full Member
  • ***
  • Messages: 192
    • Voir le profil
Re : Bus CAN DIY compatible JMRI
« Réponse #8 le: septembre 20, 2024, 11:49:49 am »
Salut François,

C'est vrai, JMRI m'impressionne vraiment par sa puissance.
Il se révèle un gestionnaire hors pair pour configurer un réseau CAN.
Au début on est impressionné par toutes ces fenêtres de configuration, mais à l'usage c'est vraiment génial.
Chapeau bas à tous ses dévellopeurs.  :)

nopxor

  • Full Member
  • ***
  • Messages: 192
    • Voir le profil
Re : Bus CAN DIY compatible JMRI
« Réponse #9 le: octobre 04, 2024, 07:04:50 pm »
Histoire toujours d'expérimenter le bus CAN OpenLCB (LCC) j'ai ajouté un quatrième noeud au bus.

Cette fois j'ai utilisé un arduino UNO avec un module-driver MCP2515.

Le cablage a été fait conformément au tutoriel de Jean-Luc:
https://www.locoduino.org/spip.php?article268
sauf que la pin INT est reliée à la pin 3 du UNO (pas à la pin 2)

J'ai utilisé la librairie OpenLCB_Single_Thread
https://github.com/openlcb/OpenLCB_Single_Thread/tree/master

J'ai compilé l'exemple OlcbBasicNode qui configure 2 entrées et 2 sorties
J'ai connecté un bouton et une Led au UNO

Et j'ai relié l'ensemble au bus CAN (H avec H et L avec L)

J'ai lancé JMRI, mais le noeud UNO n'est pas apparu dans la fenêtre Network tree.  :(

Soupçonnant un problème sur le module MCP2515, j'ai téléversé le programme loopback de Jean-Luc dans le UNO.
Le programme m'affiche une erreur code 0x1 dans le moniteur.
Manifestement le module MCP2515 est HS.

J'ai donc repris un autre module MCP2515 que j'ai préalablement testé avec loopback.
test OK, messages reçus.

J'ai donc rechargé OlcbBasicNode  dans le UNO.
Et là bingo! le noeud apparait bien dans JMRI.  :)

J'ai pu tester l'effet du bouton et de la Led du UNO sur le bus CAN. tout est OK.  8)
Simplement si on change l'affectation d'une sortie à un autre event (bouton),
il faut faire un reset sur la carte pour que cela prenne effet.

Il est donc possible de mettre sur un même bus CAN des transceivers 3V3 (module WCMCU-230)
et des transceivers 5V (module MCP2515) sans problèmes.

L'inconvénient du module MCP2515 est qu'il consomme 5 pins de sortie sur le UNO,
ce qui laisse moins d'entrées/sorties disponibles.

Il semble aussi que le MCP2515 soit plutôt "outdated" et qu'on lui préfère le MCP2518.
https://groups.io/g/layoutcommandcontrol/message/9513

bobyAndCo

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1061
  • HO avec DCC++
    • Voir le profil
Re : Bus CAN DIY compatible JMRI
« Réponse #10 le: octobre 05, 2024, 10:31:59 am »
Bonjour Eric,

Je trouve très intéressant que tu relates tes expériences du CAN qui je pense rassureront ceux qui hésitent ou qui rencontrent des difficultés.

Tout d'abord, il est vrai qu'il faut commencer à chercher les causes de non fonctionnement dans les équipements "pas chers". Ils sont parfois défectueux ! Parfois c'est même la série entière. J'ai acheté une fois un lot de 10, aucun ne fonctionnait et je me suis aperçu que c'était le PCB lui-même qui comportait une erreur ( le H à la place du L) !!!

Le grand classique dans le non fonctionnement est souvent aussi l'erreur sur le débit. Ne pas chercher à faire du 1 Mbps avec les modules Niren 8 Mhz qui ne pourront jamais fonctionner à plus de 500 Kbps. De la même manière, dans un programme, l'un des modules est paramètré sur un débit donné et l'autre module sur un autre débit !!!

Tu as raison d'aborder l'utilisation de l'option loopback mode, c'est bien sûr par là qu'il faut commencer. 

settings.mRequestedMode = ACAN2515Settings::LoopBackMode ; // Select loopback mode
Et pour être absolument certain que la partie hard est correcte, c'est surtout d'avoir réussi à faire fonctionner deux modules entre eux, l'un en réception, l'autre en émission. A partir de là on dispose d'une base certaine pour ajouter et tester d'autres modules. Perso, j'ai deux UNO avec shield SEEED que je réserve à cela. Ils ne servent à rien d'autre, je ne change jamais le programme. Et quand je rencontre un problème, je ressort ces deux modules pour les insérer dans l'ensemble et m'aider à trouver où est le problème.

Un autre intérêt de cette façon de faire : Si un module CAN fonctionne en émission mais aucun sur le bus en réception, avec la biblio de Pierre Molinaro, l'émetteur va se mettre en carafe après avoir envoyé 17 message infructueux. Et donc, si l'on n'y prend pas garde, la source que l'on croyait bonne ne l'est plus et l'on a beau chercher côté réception, on n'aura jamais rien ! Par contre, si deux modules échangent normalement, il y aura toujours des trames à circuler sur le bus pendant que l'on recherche le problème.

Je recommande surtout d'être très organisé pour les diagnostics. Il faut par exemple toujours partir des programmes d'exemple de Pierre Molinaro, éventuellement modifier le programme pour en reserver un à l'émission et l'autre à la réception. (réserver deux modules comme je le disais ci-dessus). Parfois on cherche un problème de hard alors que c'est notre programme qui est faux. Cette manière de faire nous aide à déceler le problème.

Enfin, concernant le 2518 dont tu parles, il me semble que c'est un CAN FD donc non compatible avec la CAN 2.0 que l'on utilise généralement car il est aussi très avantageux économiquement.

Il serait très intéressant que d'autres puisse faire part de leurs pratiques, astuces et façon de faire pour aider et rassurer tout ceux qui souhaite avancer dans cette voie.

Merci encore.

Christophe
 
« Modifié: octobre 05, 2024, 11:03:54 am par bobyAndCo »

nopxor

  • Full Member
  • ***
  • Messages: 192
    • Voir le profil
Re : Bus CAN DIY compatible JMRI
« Réponse #11 le: octobre 17, 2024, 01:25:43 pm »
J' ai rajouté un cinquième nœud à mon bus CAN.
Je voulais expérimenter une carte pilotant des servos-moteurs.

La librairie OpenLCB_Single_Thread comprend plusieurs exemples de programmes pour de telles cartes.

Il y a le programme AVR-8servo qui utilise un module PWM PCA9685 pour piloter 8 servos.

N'ayant pas un tel module sous la main, j'ai plutôt utilisé le programme exemple AVR2ServoNIO.
Celui-ci implémente :
- 2 servos à 3 positions configurables.
- N entrées / sorties configurables.
N = 8 dans le programme.

J' ai téléchargé ce programme dans un Arduino UNO auquel j'ai adjoint un module CAN MCP2515.

Le cablage a été fait conformément au tutoriel de Jean-Luc:
https://www.locoduino.org/spip.php?article268
sauf que la pin INT est reliée à la pin 3 du UNO (pas à la pin 2)

J'ai d'abord testé le module CAN avec le programme loopback de Jean-Luc: résultat erreur 0x20. Encore un module neuf Hors Service...
Heureusement, j' en avais plusieurs d'avance et le suivant, lui, était bon.
Ces modules CAN chinois ne sont pas chers mais pas de bonne qualité.

J' ai connecté un servo en pin A4, un bouton poussoir en pin4 (avec sa résistance de 10k ohm en pullup)
et une led en pin5 (avec sa résistance de 560 ohm) à l' Arduino UNO.
Et j'ai relié le module MCP2515 au bus CAN (H avec H et L avec L).

J' ai donc sur le bus:
- 1 ESP32 passerelle CAN-USB pour JMRI
- 1 ESP32 (8 entrées 8 sorties) CAN1
- 1 ESP32 (8 entrées 8 sorties) CAN2
- 1 UNO (2 entrées 2 sorties) CAN3
- 1 UNO (2 servos 8 entrées / sorties) CAN4

CAN-USB et CAN1 comportent la résistance terminaison de 120 ohm nécessaire au bon fonctionnement du bus CAN.

Tous ces nœuds apparaissent bien dans  la fenêtre Network tree de JMRI.

La configuration du nouveau CAN4 se fait aisément.

Il y a 3 events pour chacune des 3 positions réglables (en degrés ) des servos-moteurs.
Il suffit d'associer l'event position 2 à 90° (par exemple) à l'event appui d'un bouton poussoir d'un autre nœud pour faire bouger le servo-moteur.

Il est bien sûr possible d'associer les mouvements du servos-moteur à un aiguillage.
Et de contrôler cet aiguillage par un clic de souris depuis l'écran de panel-pro de JMRI.

Il y a un choix multiple pour l'option entrée ou sortie de CAN4.
Ce choix s'effectue par menu déroulant. 3 options pour une sortie: solid, pulse ou flashing.
C'est pratique en effet de choisir directement depuis JMRI si une broche est une entrée ou une sortie.
J'ai donc défini la pin4 comme entrée et la pin5 en sortie.

C'est vraiment un plaisir de configurer un bus CAN et ses events associés aux entrées/sorties par simple clics et copier-coller.

J'ose pas penser à la programmation CAN bas niveau que représente 46 entrées/sorties et leur interactions sur 4 noeuds...
Il faut un certain courage (et une solide organisation) pour apréhender la programmation en dur d'un bus CAN non normé.

Par contre j'ai atteint les limites du "cablage fils volants" avec cables DuPont et breadBoard.
Sur mon bureau, c'est la jungle façon spaghetti... mais cela fonctionne   ;)