Faire communiquer 2 arduinos entre eux sur 2 fils

arduino2arduino

Pour faire communiquer 2 arduinos entre eux, plusieurs solutions sont possibles: avec des shields (ethernet, bluetooth, wifi) ou avec des circuits externes (comme des nRF2401) par exemple. Ces solutions sont souvent couteuses et bloquent des E/S.

Voici une solution qui permet de faire dialoguer 2 arduinos entre eux, quels que soient leurs types (uno / leonardo, micro, mini etc ..) en utilisant les E/S analogiques. Cette solution permet de conserver les E/S digitales pour d’autres utilisations, ainsi que les E/S D0 et D1 qui peuvent servir à de la communication série.

Apres moultes recherches, je suis tombé sur une librairie : EasyTransferI2C qui permet d’envoyer / recevoir sur plusieurs arduinos (et non pas seulement sur 2 !) des informations avec une vérification du transfert. (la librairie s’assure que si l’on envoie 1 d’un côté, l’autre côté reçoit bien 1)

Pré requis

Il vous faut la libraire wire, ainsi que EasyTransfert bien sur.
Pour archive, je l’heberge sur mon serveur : Librairie EasyTransferI2C

Elle est également accessible sur github : https://github.com/madsci1016/Arduino-EasyTransfer 

Mise en oeuvre

Pour commencer, on déclare la variable EasyTransfert

ainsi qu’une structure qui va nous servir à échanger plusieurs informations

Ici, on se contente donc d’échanger 2 valeurs de type INT, mais vous pouvez tres bien prendre des types différents.

On démarre une communication en s’identifiant comme étant l’appareil numéro 4 (qui n’a rien à voir avec le fait que l’on utilise A4 et A5) :

Et on définit :

  • que l’on va échanger à l’aide de la structure echange (sachant que ce n’est pas obligatoire)
  • que lorsque l’on recoit quelque chose, on appelera automatiquement la fonction receiveEvent. Cette méthode agira alors comme une sorte d’interruption.
    Notez que l’on peut simplement boucler dans le loop au lieu de passer par ce mécanisme.

Dans le loop, on regarde si l’on reçoit quelque chose :

On peut également envoyer quelque chose à l’appareil qui s’est identifié comme étant le numéro 3.

Et donc l’autre arduino doit s’identifier comme numéro 3 et doivent partager la même structure d’échange :

 

Pour aller plus loin

On peut surcharger la structure d’échange en décidant d’envoyer directement des données :

Bien entendu, il faudra gérer ce cas sur le deuxième arduino :

 

Nous avons vu ici uniquement les événements de réceptions. C’est à dire que l’arduino 3 envoie des informations de sa propre initiative à l’arduino 4 et vice versa. Il est possible de faire en sorte que l’arduino 4 demande des informations à l’arduino 3. Pour cela, on pourra passer par

dans le setup de l’arduino 3 qui devra alors disposer d’une fonction requestEvent pour répondre aux questions de l’arduino 4.

4 réponses à “Faire communiquer 2 arduinos entre eux sur 2 fils

  1. Bonjour,

    je souhaiterais obtenir plus d’information sur ce tuto.

    En effet, j’essaie de faire communiquer deux esp8266, un qui relève une T° et l’autre qui la recoit ouvre ou ferme un relais.

    mon matériel est le suivant :
    – arduino + esp8266 + lm35 pour la relève de T°
    – arduino + esp8266 + relais pour allumage radiateur

    Je peine à créer le code…

    Peut on échanger à ce sujet.

    merci d’avance

    1. Bonjour Sylvain,

      Quelle version d’ESP8266 utilises tu ?
      Pourquoi utiliser un arduino alors qu’à priori un ESP8266 suffirait à lui seul?

    1. Bonjour nexen,

      La distance maxi est fonction du support que tu va utiliser. Si tu utilise du RJ45 blindé par ex, tu n’auras pas de difficultés a atteindre plusieurs dizaines de mètres, voire sans doute plus.
      Pour la quantité, c’est pareil, si tu code un système permettant de relayer un message d’un arduino à un autre, c’est potentiellement illimité.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *