Faire papoter deux Arduino entre elles

Bonsoir à tous !

J'espère que vous allez tous bien,

j'ai une question pour vous, comment faire discuter deux Arduino entre elles ?
Je m'explique, c'est un peu vague tel quel !
Imaginons que nous avons deux Arduino, je souhaite que l'une commande l'autre en fonction des informations qu'elle recoie par exemple.

Exemple: Arduino2 recoit l'ordre X, elle envoie donc l'information Z à Arduino1 qui elle va comparer cela avec d'autres paramètres. Puis Arduino1 va concevoir d'envoyer l'ordre Y à l'Arduino2, qui elle va en recevant l'ordre Y effectuer la tache H.

Voilà pour la petite histoire >< Cependant il faudrait pouvoir mettre en place plus d'Arduno type Arduino2 sous les ordres d'Arduino1.
Mon problème est comment faire transvaser ces/des informations entre elle ?
J'ai pensé à l'Ethernet mais trop encombrant en cable et coût si il y a 10 Arduino du type Arduino2...
Le Rx/Tx mélangé de toutes pourrait fonctionner ?

Merci d'avance de vos solutions à toutes et à tous !

Jean-Baptiste

Salut,

Il y a des émetteurs/recepteurs sans fil qui peuvent faire ça, faire une recherche sur "NRF24L01" par exemple, ça coute pas bien cher et ça s'achète par deux souvent, un pour chaque arduino. Moins de 10€ sur eBay par exemple.

Après faut voir la distance qui sépare les deux Arduino.

Si quelqu'un connait la distance que peut couvrir le NRF24L01 2.4Ghz ?

J'avais pensé au Rx/Tx, mais dans un dialogue, il faut que le Rx de l'une soit connecté au Tx de l'autre et inversement, ce qui fait que c'est pas possible (un ordre contenant une adresse, oui, mais il faut que toutes les autres cartes l'entendent pour savoir à qui ça s'adresse, dans ce cas, toutes les Rx doivent être reliées... Ca ne marche que si une seule est maître et toutes les autres esclave).

Reste le TWI (I2C), un data, un clk et un ground... ça marche. Et les petits modules RF genre xbee et toute la clique? c'est plus cher, mais...

EDIT : j'ai relu... si arduino1 est le seul maître, et que toutes les autres acceptent de la boucler tant qu'on leur demande rien, alors tu peux passer en Serial : tu envoies un premier octet d'adresse, tes données / ordres, un octet de fin d'ordre pourquoi pas et roule. Dans ce cas, le Tx de arduino1 est relié à tous les Rx des autres, et le Rx1 aux Tx des autres. Il faut juste qu'un esclave ne tente pas de causer si c'est pas son tour... Le maître cause et entend, mais chaque esclave ne peut entendre ce que raconte un autre esclave. Tu peux en même temps avoir une adresse neutre, qui fait que tous les esclaves écoutent l'ordre, créer une adresse de groupe (reconnue par deux esclaves par ex...) etc etc. A voir ensuite les longueurs de ligne, mais ça ne devrait pas poser de problème.

Pour revenir au Rx/Tx, on ne peut pas dans l'ordre on peut pas rajouter une partie, ce qui fait que toutes les arduino esclave vont le recevoir mais seulement une sait qu'elle doit réagir car c'est la partie qui lui correspond.

Je sais je m'explique mal mais c'est compliqué à expliquer =/

Sinon la soluce par wifi me plait beaucoup aussi ! Il y aura maximum 20mètres entres les Arduino...

A vous de me guider =)

Super_Cinci:
EDIT : j'ai relu... si arduino1 est le seul maître, et que toutes les autres acceptent de la boucler tant qu'on leur demande rien, alors tu peux passer en Serial : tu envoies un premier octet d'adresse, tes données / ordres, un octet de fin d'ordre pourquoi pas et roule. Dans ce cas, le Tx de arduino1 est relié à tous les Rx des autres, et le Rx1 aux Tx des autres. Il faut juste qu'un esclave ne tente pas de causer si c'est pas son tour... Le maître cause et entend, mais chaque esclave ne peut entendre ce que raconte un autre esclave. Tu peux en même temps avoir une adresse neutre, qui fait que tous les esclaves écoutent l'ordre, créer une adresse de groupe (reconnue par deux esclaves par ex...) etc etc. A voir ensuite les longueurs de ligne, mais ça ne devrait pas poser de problème.

Oui oui oui ouiiiiiiiiiiiiiiiiii !!! ><

C'est exactement ça !!! Donc c'est possible ?

t'as pas vu mon édit (ah ben si, tu l'as vu...),

Les sorties Tx sont à collecteur ouvert, donc tu peux les mettre en parallèle (en vérifiant que les résistances de pull-up ne deviennent pas trop nombreuses : si c'est 4.7K par exemple, avec 10 arduinos, tu arrives à 470 ohms, ce qui commence à faire hard. Tu divises la valeur de la résistance par le nombre de connectés)

Le mode adresse : un premier octet d'adressage, celui qui a cette adresse écoute la suite, pas les autres qui feront un flush quand la transmission sera terminée), puis le ou les ordres, question etc etc et on finit par un code "fin de transmission" pour remettre tout le monde en mode W&S...
si l'adresse est 0x00, alors tout le monde écoute l'ordre (genre reset général).
si l'adresse est 0x02, alors l'arduino 2 écoute l'ordre,
si l'adresse est 0xF0, alors les arduinos du groupe 0 écoutent l'ordre,
si l'adresse est 0xF1, alors les arduinos du groupe 1 écoutent l'ordre...

Ca te laisse pas mal de libertés, à tester sur de grandes distances, quitte à mettre un ampli de ligne de temps en temps en étudiant le sens des données sur le fil...

EDIT : pense à prévoir de déconnecter les Rx/Tx si tu dois faire une MAJ du soft sur une de tes cartes, car ça risque de mettre le bazar chez les autres, voire de t'empêcher de faire ta MAJ

Ok super =)

Si les résistances de pull-up deviennes trop nombreuses je rajoute une résistance ? =)

Merci encore, l'idée est comprise !

Mais je vais avoir besoin de votre aide pour mettre tout cela en route...

Rien que pour l'adresse et la réception des ordres.

Sinon un petit schéma avec les arduino et les/la résistance si nécessaire ? =)

Merci encore !

Ca, c'est le principe de connexion entre tes cartes, avec des flèches qui indiquent le sens des infos. Arduino1 en maître, les autres en esclave.

Ne rajoute pas de résistances, mais des amplis, pourquoi pas des optos, peut-être ce qu'il y a de plus simple :

C'est pas optimal, mais ça marche. Je pense qu'il existe des amplis de ligne, mais j'en ai pas sous la main...

Pour la suite, il faut que tu prennes papier crayon et que tu définisses un protocole de transmission (un langage) afin que chaque arduino s'y retrouve.

Hello,

Pour mettre plusieurs ATmega sur le même bus série, tu as des options qui facilitent les choses, notamment l'adressage.
Je ne m'en suis jamais servi, mais tu devrais jeter un oeil à la section 22.8 Multi-processor Communication Mode dans la documentation d'Atmel !
(Lien)

Bonsoir à tous,
merci à tous tout d'abord pour votre aide =)

J'ai un peu travaillé le sujet aujourd'hui, il me semble que passer par ces petits modules de transmissions NRF24L01 reste le plus simple !
Ai-je tord ?

Celui-ci conviendrai ? http://cgi.ebay.fr/NRF24L01-Wireless-Transceiver-Module-2-4GHz-Arduino-x1-/320771905186?pt=UK_BOI_Electrical_Components_Supplies_ET&hash=item4aaf7ed6a2#ht_849wt_1157

Merci encore à tous

NB Est-ce possible de mettre sur une arduino Mega l'ethernet Shiel, avec le module de transmission, plus un ecran lcd type 2*16, tout en gardant des entrées analogiques disponibles ?

Bonjour,

Pour faire communiquer plusieurs arduino il y a énormement de solutions :
Filaire :

  • UART (aka serial) -> un maitre et n esclaves,
  • SPI -> un bus commun et un "chip enable" pour chaque esclaves,
  • I2C -> bus 2fils trés commun, trés simple à mettre en oeuvre avec la librairie Wire (que ce soit en esclave ou en maitre),
  • RS485 -> équivalent du rs-232 pour les ordinateurs mais en tension différentielle (= fils beaucoup plus long sans interférences),
  • Ethernet -> sans commentaires.

Sans fils :

  • nRF24L01 -> portance relativement courte (<100m sur terrain dégagé, <10m si il y a un obstacle), trés simple d'utilisation avec arduino,
  • wifi -> tout dépend de la shield wifi, certaine sont trés puissante d'autre moyenne,
  • zigBee -> les version pro en 60mW peuvent porté sur +1Km, les version "normal" sur une 100aine de mètres, utilisation trés commune pour faire des "nodes" arduino,
  • bluetooth -> portée assez limité, cout relativement élevé mais l'avantage d'étre un standard (téléphone, certain ordi, shield arduino, ...),
  • module "transceiver" 433MHz -> trés low-cost (<6€) porté de 50m environ, demande un encodage logiciel (manchester avec virtualwire par exemple),
  • Infrarouge -> porté trés courte mais relativement simple à mettre en place.

arduimat:
Si quelqu'un connait la distance que peut couvrir le NRF24L01 2.4Ghz ?

Sa va de 10m avec le nRF24l01, à 100m avec un nRF24l01+ et une antenne cms, avec une antenne externe sa peut porté sur 1km max (valeur en terrain dégagé, au moindre obstacle il faut diviser la distance par 2).

NB Est-ce possible de mettre sur une arduino Mega l'ethernet Shiel, avec le module de transmission, plus un ecran lcd type 2*16, tout en gardant des entrées analogiques disponibles ?

Sans aucun probléme, pour connecter un lcd il faut en gros 7 broche digitale, la mega en possède 54.

PS: pas de liens ebay, ne donne pas du taff en plus à Jean-Francois, le titre du produit et le nom du vendeur suffit :wink:

Il serait donc possible de faire discuter plusieurs cartes avec le module nRF24L01 toutes sur le même canal ? =)

merci encore !!

Quelque soit le protocole, c'est quasiment toujours possible : il suffit de gérer un système d'adressage. Plus concrètement ça peut consister à envoyer une adresse avant le message, et le récepteur réagira ou non suivant que l'adresse soit la sienne ou pas. Après il faut gérer les éventuels conflits : par exemple si deux émetteurs émettent en simulatané, comment le récepteur va gérer les deux messages ...

ok super merci

Bonjour,

un post de ce jour sur Hackaday évoque la solution I2C

Simple et efficace

Lionel

Snootlab:
un post de ce jour sur Hackaday évoque la solution I2C
Rod's Electronics Projects: Extremely simple I/O port expansion using two arduinos and I2C

Oui mais de l'I2C sur 20m max est ce que cela va marcher (pertes, interférences, résistance du cable, ...) ?
J'ai l'impréssion que le sans-fil intéresse plus Jean & Jean-Baptiste (je me trompe peut être) ?

Pour le coté "software" c'est trés trés simple d'utiliser de l'i2c avec une carte arduino :

coté maitre Wire.begin() et coté esclave Wire.begin(adresse) et une interruption Wire.onRequest(fonction).

Hmmm, j'ai loupé l'info des 20m, c'était une contrainte ?
effectivement, sans répéteur non, l'I²C ne fonctionnera pas sur 20m

Edit 09/11/11 - 15:23: ai oublié de signer...

Lionel

comme le dit Skywodd, les plus 20m risque d'être présent, c'est pourquoi la solution sans fil me parait la plus abordable. =)
Mais toutes vos proposions m’intéressent (NB Snootlab) ! Elles ne peuvent que consolider mon dossier de projet !

Benvenuto:
Hello,

Pour mettre plusieurs ATmega sur le même bus série, tu as des options qui facilitent les choses, notamment l'adressage.
Je ne m'en suis jamais servi, mais tu devrais jeter un oeil à la section 22.8 Multi-processor Communication Mode dans la documentation d'Atmel !
(Lien)

Je suis intéressé par cette solution, par contre très peux de renseignement niveau soft ou hard (en parallèle ?) trouvé sur le net à part la doc d'Atmel.
Je vois à peux près (globalement :grin:) le fonctionnement, comment configuré le registre pour le mode, savoir s'il s'agit d'un adressage (registre d'adresse ou l'inclure dans les "données" ?) ou "message" avec adresse sélectionné (écouteur), mais rien concernant la transaction esclave->maître (token ring ?) ?
Enfin ça manque un peux de détails et d'exemple, surtout que je ne maitrise pas les registres, c'est un peux confus ?
Pour la distance le rs-485 à l'air adapté d'après ce que j'ai vu, enfin moi ça serait genre max 5cm +-.