Partage
  • Partager sur Facebook
  • Partager sur Twitter

Faire communiquer plusieurs arduinos entre eux

Sujet résolu
23 novembre 2016 à 21:18:16

Bonjour,

je viens ici afin de vous poser une petite question.

J'ai plusieurs arduino qui auront exactement le même programme et qui devront tous réagir de la même manière en fonction de ce qu'on leurs demandent de faire.
J'ai donc un autre arduino qui leurs donnera les ordres (un peu comme le maitre-esclave).

Mais pour que 2 arduinos communiquent ensemble, ce n'est pas un soucis, on connecte le Tx du premier arduino au Rx du second arduino, et inversément.
Mais pour faire en sorte que tous les arduinos "esclaves" recoivent l'ordre d'un seul et même arduino "maitre", je ne sais pas exactement comment faire etant donné qu'il n'y a pas 40 rx et tx!

Je me suis donc demandé si le schéma suivant était possible (ps: j'ai oublié de raccorder les masses ensemble, mais l'idée reste la même ;) )

Voilà, qu'en pensez vous? est-ce la bonne solution?
Etant donné que c'est du parallèle, je me demandais quand même si étant donné la division du signal il pouvait y avoir une perte d'infos?

Et sinon, si ce n'est pas bon, existe-t-il une autre solution?

Merci de m'avoir lu,

cordialement,

RageAgain

  • Partager sur Facebook
  • Partager sur Twitter
23 novembre 2016 à 22:17:15

Tu peux très bien connecter le TX d'un arduino (le maitre) sur le RX de plusieurs autres arduino (les esclaves).

Ainsi, tout ce que le maitre va envoyer sera reçu en même temps par tous les esclaves.

Il faut néanmoins faire attention aux effets capacitif des fils et des pins d'entrée des processeurs, ce qui limite le nombre maximal de connexions.

Dans ton cas, si il n'y a que 3 esclaves avec des fils pas trop long, tu ne devrais pas avoir de problèmes.

Si jamais tu rencontres des problèmes, tu peux baisser la vitesse de communication afin de laisser plus de temps au signal pour contrer l'effet capacitif de la connexion.

----------

En revanche, pour ce qui est d'envoyer des informations dans le sens inverse, cela va être beaucoup plus compliqué...

En effet, si tu connectes tous les TX des esclaves sur le RX du maitre, tu peux te retrouver un joli conflit et des risques des court-circuits.

Cela reste néanmoins possible en étant très prudent sur le développement du programme en faisant en sorte que tous les arduinos esclave sauf un passent la pin TX en INPUT et non en mode Serial.

Ainsi, le seul arduino esclave qui aura sa pin TX en mode Serial pourra envoyer des informations au maitre.

Si tous les esclaves passent la pin TX en mode Serial les uns après les autres, alors tout se passera bien mais si jamais 2 esclaves passent la pin TX en mode Serial en même temps, ce sera un court-circuit...

----------

Une autre solution sera d'utiliser un bus plus adapté ;)

En effet, un bus Serial est destiné à connecter 2 périphériques entre eux alors que les bus SPI ou I2C sont prévu pour connecter un maitre à un ou plusieurs esclaves.

-
Edité par lorrio 23 novembre 2016 à 22:19:01

  • Partager sur Facebook
  • Partager sur Twitter
23 novembre 2016 à 22:38:07

Salut lorrio,

pour commencer merci beaucoup pour ta réponse si complète et si rapide!

Je ne compte pas faire envoyer des infos depuis "l'esclave" vers le "maitre" car chaque "esclave" sera pré-programmé afin qu'il n'ait qu'à recevoir un certain ordre et en fonction de cela, il exécute les lignes de code demandés! ;)

Cependant, que veux-tu dire par les effets capacitifs des fils et des connexions? car en réalité, j'aimerai qu'il soit possible de faire communiquer un maitre avec une dizaine d'esclaves et à une vitesse très rapide.
Car il faut que lorsque l'ordre est lancé, pratiquement instantanément, les "esclaves réagissent :/
Et la distance de fils entre chaque "esclaves" et le "maitre" sera environ de 2-3m.

Le problème, c'est que j'avoue qu'avais déjà regardé les systèmes de bus SPI ou I2C mais je trouve peu d'infos en rapport avec l'arduino, le code, etc...ce qui fait que je ne sais pas exactement comment faire transiter des informations avec ça. Cela fonctionne de la même façon? Ou existe-t-il des librairies?

Cordialement,
RageAgain

Edit: J'ai parlé trop vite, effectivement, en recherchant "bus ic2 arduino" on trouve assez facilement" cependant, je me pose toujours la question la difficulté de programmation et si la doc se trouve facilement ou si c'est malgré tout la même chose que la transmission de données actuelle de arduino.

-
Edité par RageAgain 23 novembre 2016 à 22:51:23

  • Partager sur Facebook
  • Partager sur Twitter
23 novembre 2016 à 22:56:33

Aucun composant n'est parfait, il y a toujours de petits défaut par-ci par là.

Dans le cas d'un pin d'un composant, on parle généralement d'effet capacitif et de courant de fuite.

C'est à dire que même en INPUT, une pin va consommer un tout petit peu de courant (d'où le courant de fuite) et aussi se comporter comme un tout petit condensateur (d’où l'effet capacitif).

Il en va de même pour les câbles qui ne se comportent pas comme des conducteurs parfait mais comme des résistances et condensateurs de très faible valeur.

Dans ton cas, la résistance du câble et l'effet capacitif peut-être problématique car il retarde l'établissement du signal.

Plus l'établissement du signal est retardé, plus tu auras de chance d'avoir des erreurs de communication avec un débit élevé.

C'est un peu comme pour les boxes internet :

  • Si tu as la chance d'être proche du DSLAM, tu auras un très bon débit
  • Si tu es loin du DSLAM, la box internet est s'adapte en réduisant le débit de façon à ne pas avoir trop d'erreur de communication

----------

Pour ce qui est de SPI ou I2C, tu auras les mêmes problèmes.

Si tu n'as besoin d'un débit que dans un seul sens (maitre=>esclave), autant rester sur du Serial.

Le plus simple serait de faire le test et voir si cela fonctionne correctement ou non avec le débit que tu voudrais avoir.

Si tu as trop d'erreur, il est possible d'améliorer la chose en utilisant des drivers de ligne.

Mais sur ton image, on voit que tu as des arduinos Yun alors pourquoi ne pas les relier par Ethernet ?

En effet, une liaison ethernet offre un débit bien plus important (100 Mb/s contre seulement 9.6 kb/s pour un Serial à 9600) sur des distances énorme (100 mètres maxi).

-
Edité par lorrio 23 novembre 2016 à 23:00:43

  • Partager sur Facebook
  • Partager sur Twitter
23 novembre 2016 à 23:07:24

Ah oui je comprends ce que tu veux dire!

Mais ce genre de problèmes ou de retards ne se ressentira que lorsqu'on travaille avec une transmission de données constantes à un débit élevé, si j'ai bien compris?

Donc dans mon cas, cela ne devrait pas poser de problème ? Étant donné que l'ordre donné aux esclaves se fera manuellement, donc un débit vraiment faible de transmission!

C'était ma dernière question! :D En tout cas, un tout grand merci à toi déjà!

Cordialement,
RageAgain

  • Partager sur Facebook
  • Partager sur Twitter
24 novembre 2016 à 9:48:06

Il ne faut pas confondre vitesse de transmission et débit de transmission.

Si tu transmet en permanence, le débit ne sera pas le même que si tu transmet un truc toutes les 10 secondes.

Ce qui pose problème avec l'effet capacitif, c'est de vouloir transmettre rapidement (donc vitesse élevée).

Que tu transmettes en permanence ou que tu transmettes une fois toutes les 10 secondes, le problème se posera.

La solution consiste donc à réduire la vitesse de transmission que tu choisis avec Serial.begin

Et bien évidement, avec une vitesse plus faible, le débit maximum sera bien évidement plus faible.

  • Partager sur Facebook
  • Partager sur Twitter
24 novembre 2016 à 22:24:38

Ah oui ok je pige! 

Arf donc je sens que je vais me retrouver face à ce problème..il faudra alors juste trouver là vitesse pas trop rapide et pas trop lente non plus!

En tout cas un grand merci à toi lorrio j'ai beaucoup appris la! :o 

Je met le sujet en résolu ta répondu à tout ce dont j'avais besoin :D 

encore merci!

Cordialement,

RageAgain 

  • Partager sur Facebook
  • Partager sur Twitter
13 juillet 2017 à 10:35:37

Bonjour,

j'ai le même genre de questions, je me permets donc d'up ce sujet plutôt que d'en ouvrir un nouveau.

Je donc faire communiquer 1 Arduino maître avec plusieurs Arduino esclaves.

Donc si j'ai bien compris, pas de soucis pour le branchement, je fais des jonctions en T entre mon Master et mes X Slaves.

Là où j'aurai éventuellement un problème, c'est sur le nombre et les distances.

J'aurai 1 Master, 7 Slaves et la distance pourra aller de 1 mètre à plus de 8 mètres en deux Arduinos.

Par contre, je n'ai besoin d'échange de données rapide. Il s'agit juste de changer 1 ou 2 variables sur les Slaves, qui seront ensuite utilisés environ 5 minutes plus tard !!!

Encore merci pour votre aide à tous.

  • Partager sur Facebook
  • Partager sur Twitter
13 juillet 2017 à 13:44:35

Si la communication est unidirectionnelle (le maitre envoie une donnée à l'esclave), alors tu peux utiliser une communication Serial avec un faible débit, c'est ce qu'il y aura de plus simple et de plus économique.

Si la communication est bidirectionelle, tu peux essayer un bus I2C, toujours à faible débit en mettant des résistances de pull up sur le maitre et chaque esclave.

  • Partager sur Facebook
  • Partager sur Twitter
13 juillet 2017 à 17:27:39

Unidirectionnelle, donc parfait !!!

Merci !

  • Partager sur Facebook
  • Partager sur Twitter
5 décembre 2021 à 15:15:14

Bonjour tout le monde , 

je voulais vous demander une methode de communiquer deux arduino a distance maitre esclave d'un seul signal logique Unidirectionnelle 

  • Partager sur Facebook
  • Partager sur Twitter
6 décembre 2021 à 10:39:27

Bonjour,

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter
Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL