LOCODUINO

Discussions Générales => Présentez vous ! => Discussion démarrée par: locodarres12 le octobre 21, 2017, 10:21:10 am

Titre: Bonjour bonjour !!
Posté par: locodarres12 le octobre 21, 2017, 10:21:10 am
Bonjour à tous, je m'appelle Aurélien. :)
Depuis 2 ans que j'ai découvert Arduino j'ai déjà réalisé quelques projets Arduino (gérer une plaque tournante HO et un Aiguillage triple en 5 Pouces)
Mon père et moi sommes des passionnés de Modélisme Ferroviaire et nous avons un projet : gérer un réseau avec Arduino
Et la grande question c'est au sujet du Bus CAN !! Est-Il Possible d’attribuer un microcontrôleur par canton et par la suite de les faire dialoguer ?? ou est ce qu'il vaut mieux gérer les appareils d'un coté puis les cantons de l'autre et les feux encore ailleurs ??

Merci d'avance pour vos réponses. ;)

Aurélien DARRES.
Titre: Re : Bonjour bonjour !!
Posté par: Dominique le octobre 21, 2017, 03:42:25 pm
Bonjour Aurélien, et bienvenue sur Locoduino  ;D

Les deux sont possibles et c'est une question de choix personnel.

Cela dépend aussi de la taille du réseau, combien il y a de canton, d'appareils de feux, etc..

Je reconnais qu'en ce moment on voit de plus en plus de systèmes de gestion canton par canton, ce qui semble bien alléchant et doit être exploré.

Cela dépend aussi du mode analogique ou digital, ce dernier incitant quand même à la centralisation puisqu'il faut connaître l'adresse des locos et les piloter : je vois mal une centrale DCC dans chaque canton  :o.

Mais le bus CAN convient très bien dans les deux cas surtout grâce à sa grande immunité aux parasites. Selon l'architecture, ce ne serait pas du tout les mêmes types de messages, mais peu importe, le CAN  le supporterait.

Par contre dans un système modulaire par canton, il faudrait imaginer tous les messages possibles dès le départ et le jour où il faut faire une modification, il faudrait reprogrammer tous les Arduino, à moins de trouver un système de mise à jour en réseau (j'y pense mais n'ai pas encore trouvé).

Personnellement je suis en digital et j'ai fait le choix de la centralisation ce qui me permet d'ajouter des fonctions quand je suis prêt ( par exemple je n'ai pas encore fait le contrôleur des signaux mais le réseau fonctionne et je fais évoluer chaque module indépendamment des autres).

On peut en discuter ici, c'est même fait pour ça.

Cordialement
Dominique
Titre: Re : Re : Bonjour bonjour !!
Posté par: Jean-Luc le octobre 22, 2017, 09:28:03 am
Par contre dans un système modulaire par canton, il faudrait imaginer tous les messages possibles dès le départ et le jour où il faut faire une modification, il faudrait reprogrammer tous les Arduino, à moins de trouver un système de mise à jour en réseau (j'y pense mais n'ai pas encore trouvé).

Oui. Ça ne me semble pas insurmontable. Il faudrait modifier le boot loader pour y inclure un jeu de fonction de flashage via le CAN. La flash des AVR est divisée en deux zones, le bootloader et l’application (voir page 277 et suivante de la datasheet). Le bootloader flashe la zone applicative avec ce qui lui est envoyé par la ligne série. Comme on ne peut pas flasher de manière aisée la zone applicative à partir d’un programme s’exécutant dans cette même zone, il faut que le code de flashage soit dans le bootloader. On peut discuter de ça sur un fil dédié.
Titre: Re : Bonjour bonjour !!
Posté par: Jean-Luc le octobre 22, 2017, 09:28:52 am
Et bienvenue à Aurélien  ;)
Titre: Re : Bonjour bonjour !!
Posté par: locodarres12 le octobre 22, 2017, 11:19:21 am
Bonjour, merci beaucoup pour vos réponses messieurs !!

En ce qui concerne le réseau pour faire un essai du bus CAN c'est une simple boucle avec voie d'évitement et un butoir, il y a une aiguille simple d'un côté de l'évitement et une TJD de l'autre et enfin 3 carré. Ce serai de l'analogique.

J'ai lus les articles sur le bus CAN et ça m'a beaucoup éclairé sur son fonctionnement !!Il y a quand même plusieurs choses que je n'ai pas vraiment compris...

lorsqu'un message est envoyé et qu'il est sauvegardé dans la mémoire du destinataire pour libérer le MCP, comment doit-on le traiter par la suite dans le microcontrôleur qui est le destinataire du message ??

pourquoi doit-on initialiser 2 masques dans le MCP2515 ?? et la syntaxe de définition des masques j'ai pas compris la partie entre parenthèses...

Cordialement.
Aurélien.
Titre: Re : Bonjour bonjour !!
Posté par: Dominique le octobre 22, 2017, 12:10:19 pm
Citer
- Lorsqu'un message est envoyé et qu'il est sauvegardé dans la mémoire du destinataire pour libérer le MCP, comment doit-on le traiter par la suite dans le microcontrôleur qui est le destinataire du message ??
- Pourquoi doit-on initialiser 2 masques dans le MCP2515 ?? et la syntaxe de définition des masques j'ai pas compris la partie entre parenthèses...

La réponse est dans l'article http://www.locoduino.org/spip.php?article148 (http://www.locoduino.org/spip.php?article148), mais je l'ai peut-être mal expliquée :

Le MCP2515 récupère automatiquement les messages et ne conserve que ceux qui sont filtrés (s'il y a des filtres et des masques) mais sa mémoire interne n'est pas très grande. Il dispose de 2 buffers RXB0 et RXB1 plus un 3ème pour un message en cours de réception. Il est donc très important de programmer les filtres et les masques pour éviter de stocker des messages qui ne concernent pas l'Arduino associé.

Cela signifie qu'il faut préalablement définir tous les messages susceptibles d'être échangés dans le système et se fixer un principe à respecter. Dans mon cas, j'ai utilisé l'Identifiant pour définir les types de messages, ce qui permet un traitement simple par un switch.

Mais comme ces buffers ne sont qu'au nombre de 2, seuls 2 messages seront stockés. Si l'Arduino est occupé à autre chose, il risque de perdre des messages. C'est pour cela que j'ai mis dans le programme une fonction de récupération systématique des messages reçus dans une mémoire tampon circulaire qui peut en contenir beaucoup plus : CAN_Recup();

Citer
Cette fonction CAN_recup() se charge de lire tous les messages reçus par le MCP2515 et les sauvegarder dans une mémoire tampon circulaire. Notre programme aura alors le loisir d’exploiter ces messages au rythme de son choix.

C'est une vielle habitude de programmation en télécom dont j'ai voulu faire bénéficier nos lecteurs  ;D. On n'est pas obligé, évidemment mais alors on prend le risque de perdre des messages. Sur mon réseau jusqu'à présent je n'en perd pas.

Pour comprendre en détail le fonctionnement du MCP2515, le mieux est de consulter sa fiche produit ici : http://ww1.microchip.com/downloads/en/DeviceDoc/21801e.pdf (http://ww1.microchip.com/downloads/en/DeviceDoc/21801e.pdf)
Titre: Re : Bonjour bonjour !!
Posté par: locodarres12 le février 11, 2018, 02:24:55 pm
Merci beaucoup pour tous ces précieux détails !! Pardon pour mon retard !!

J'ai bien saisi comment cela fonctionne cependant je n'arrive pas a déterminer la syntaxe que je dois utiliser pour, par exemple, faire allumer ou éteindre une LED connectée a un Arduino UNO en appuyant sur un bouton connecté à un autre Arduino UNO... Mon but, par la suite, étant de faire circuler des messages tels que "canton C6 libre" ou "pos_app_1035 : C1 -> C2"etc etc...

Merci.
Titre: Re : Bonjour bonjour !!
Posté par: Dominique le février 11, 2018, 07:21:29 pm
Quand on appuie sur le bouton de l'Arduino 1 pour allumer la led de l'Arduino 2, l'Arduino 1 doit envoyer un message CAN par exemple ID=0x10 et data = 01 (un seul octet = true). L'Arduino 2 reçoit ce message, compare l'ID à 0x10 et, si oui, allume ou éteint la led en fonction de la valeur de l'octet de donnée (00 = éteint et 01 = allumé, par exemple).

Je vous conseille de lire et tester les exemples "send" et "receive" de la bibliothèque CAN_MCP2515, ainsi que l'exemple "button" dans la catégorie "digital" des exemples de base de l'IDE Arduino.

N'oubliez jamais que c'est en consultant et en essayant les exemples que vous apprendrez le mieux et le plus vite.