Communication entre deux Arduino

Dans ce tutoriel, nous allons apprendre :

communication entre deux arduino

Le tutoriel fournit le code Arduino pour deux cas :

Préparation du matériel

2×Arduino UNO R4 WiFi
2×USB Cable Type-C
1×(Recommended) Screw Terminal Block Shield for Arduino Uno
1×(Optional) Transparent Acrylic Enclosure For Arduino Uno

Alternatively if using Ethernet:

2×Arduino Uno
2×USB 2.0 cable type A/B
2×Arduino Ethernet Shield 2
2×Ethernet Cable
1×(Recommended) Screw Terminal Block Shield for Arduino Uno
1×(Optional) Transparent Acrylic Enclosure For Arduino Uno

Or you can buy the following sensor kits:

1×DIYables Sensor Kit (30 sensors/displays)
1×DIYables Sensor Kit (18 sensors/displays)
Divulgation : Certains des liens fournis dans cette section sont des liens affiliés Amazon. Nous pouvons recevoir une commission pour tout achat effectué via ces liens, sans coût supplémentaire pour vous. Nous vous remercions de votre soutien.

Communication entre deux Arduino - Vue d'ensemble

Considérons un cas spécifique : l'Arduino #1 communique avec l'Arduino #2. Il existe de nombreuses méthodes pour permettre la communication entre deux Arduino. Nous pouvons en choisir une en fonction de la portée de la communication. Le tableau ci-dessous montre certaines méthodes et leur portée de communication.

Methods Range
I2C very short
SPI very short
UART (TTL) very short
UART (RS-232/485/422) short
Bluetooth short
LoRa long
Ethernet/WiFi unlimited(*)

※ NOTE THAT:

(*):

  • Si deux Arduino sont connectés à Internet, la portée de communication est illimitée.
  • Si deux Arduino ne sont pas connectés à Internet, mais qu'ils sont connectés au même réseau LAN, ils peuvent toujours communiquer entre eux. La portée de communication est limitée au réseau LAN.

Parmi les méthodes ci-dessus, ce tutoriel utilise Ethernet/WiFi pour permettre la communication entre deux Arduino car cela permet à deux Arduino de communiquer sur une distance illimitée.

Communication entre deux Arduino via Ethernet/WiFi

Deux Arduino peuvent communiquer l'un avec l'autre via Ethernet/WiFi si :

  • Deux Arduino dans le même réseau LAN, la connectivité Internet n'est PAS nécessaire
  • Deux Arduino dans des réseaux LAN différents, la connectivité Internet est nécessaire

Peu importe que deux Arduino se connectent entre eux au sein d'un réseau LAN local ou via Internet, il existe deux types de communication :

Dans le cas d'une communication directe, dans la plupart des cas, un Arduino joue le rôle de client TCP, l'autre celui de serveur TCP.

Dans le cas de la communication via un serveur centralisé, dans la plupart des cas, les deux Arduino jouent le rôle de client TCP.

Selon l'application, nous devons choisir un protocole d'application pour la communication entre deux Arduino. Voici quelques-uns des protocoles d'application que nous pouvons utiliser :

  • Protocole auto-défini sur TCP brut (directement)
  • Modbus TCP (directement)
  • HTTP (directement)
  • Telnet (directement)
  • SSH (directement)
  • MQTT (via un serveur centralisé)

※ NOTE THAT:

Peu importe si :

  • Les deux Arduino utilisent Ethernet
  • Les deux Arduino utilisent le WiFi
  • Un Arduino utilise Ethernet, l'autre utilise le WiFi

Le protocole UDP dépasse le cadre de ce tutoriel.

Exemple d'application

Réalisons l'application suivante : Un bouton/interrupteur connecté à l'Arduino #1 contrôle une LED connectée à l'Arduino #2 via Ethernet/WiFi.

communication entre deux Arduino

Ce tutoriel utilise deux Arduino Ethernet Shield 2. Vous pouvez utiliser un autre WiFi Shield ou Ethernet Shield à la place. Si vous utilisez un autre shield, il suffit de modifier légèrement le code.

Comme mentionné ci-dessus, il existe certains protocoles d'application que nous pouvons utiliser. Dans cet exemple, pour simplifier, nous définirons un protocole par nous-même (un protocole auto-défini).

Protocole auto-défini

Définissons un protocole simple :

  • Une connexion TCP est établie entre l'Arduino #1 et l'Arduino #2
  • Arduino #1 :
    • Agit en tant que client TCP, initie activement une demande de connexion TCP à l'Arduino #2
    • Lorsque l'interrupteur est mis en position ON, l'Arduino #1 envoie un octet (commande) avec la valeur 1 à l'Arduino #2.
    • Lorsque l'interrupteur est mis en position OFF, l'Arduino #1 envoie un octet (commande) avec la valeur 0 à l'Arduino #2.
  • Arduino #2 :
    • Agit en tant que serveur TCP, écoute les demandes de connexion TCP de l'Arduino #1
    • Si l'octet reçu est 1, allumez la LED
    • Si l'octet reçu est 0, éteignez la LED

    Schéma de câblage

    deux boutons d'interrupteur à LED Arduino

    ※ NOTE THAT:

    vous devez ajouter une résistance pour la LED si celle-ci n'a pas de résistance intégrée. Vous pouvez en savoir plus dans les tutoriels Arduino - LED et Arduino - Button.

Communication entre deux Arduino via WiFi

Code Arduino pour Arduino Uno R4 WiFi #1

/* * Ce code Arduino a été développé par newbiely.fr * Ce code Arduino est mis à disposition du public sans aucune restriction. * Pour des instructions complètes et des schémas de câblage, veuillez visiter: * https://newbiely.fr/tutorials/arduino/communication-between-two-arduino */ // ARDUINO #1: TCP CLIENT + A BUTTON/SWITCH #include <ezButton.h> #include <WiFiS3.h> const char ssid[] = "YOUR_WIFI_SSID"; // change your network SSID (name) const char pass[] = "YOUR_WIFI_PASSWORD"; // change your network password (use for WPA, or use as key for WEP) const int BUTTON_PIN = 7; const int serverPort = 4080; ezButton button(BUTTON_PIN); // create ezButton that attach to pin 7; IPAddress serverAddress(192, 168, 0, 180); WiFiClient TCPclient; int status = WL_IDLE_STATUS; void setup() { Serial.begin(9600); button.setDebounceTime(50); // set debounce time to 50 milliseconds Serial.println("ARDUINO #1: TCP CLIENT + A BUTTON/SWITCH"); // check for the WiFi module: if (WiFi.status() == WL_NO_MODULE) { Serial.println("Communication with WiFi module failed!"); // don't continue while (true) ; } String fv = WiFi.firmwareVersion(); if (fv < WIFI_FIRMWARE_LATEST_VERSION) { Serial.println("Please upgrade the firmware"); } // attempt to connect to WiFi network: while (status != WL_CONNECTED) { Serial.print("Attempting to connect to SSID: "); Serial.println(ssid); // Connect to WPA/WPA2 network. Change this line if using open or WEP network: status = WiFi.begin(ssid, pass); // wait 10 seconds for connection: delay(10000); } // print your board's IP address: Serial.print("IP Address: "); Serial.println(WiFi.localIP()); // connect to TCP server (Arduino #2) if (TCPclient.connect(serverAddress, serverPort)) Serial.println("Connected to TCP server"); else Serial.println("Failed to connect to TCP server"); } void loop() { button.loop(); // MUST call the loop() function first if (!TCPclient.connected()) { Serial.println("Connection is disconnected"); TCPclient.stop(); // reconnect to TCP server (Arduino #2) if (TCPclient.connect(serverAddress, serverPort)) Serial.println("Reconnected to TCP server"); else Serial.println("Failed to reconnect to TCP server"); } if (button.isPressed()) { TCPclient.write('1'); TCPclient.flush(); Serial.println("- The button is pressed, sent command: 1"); } if (button.isReleased()) { TCPclient.write('0'); TCPclient.flush(); Serial.println("- The button is released, sent command: 0"); } }

Code Arduino pour Arduino Uno R4 WiFi #2

/* * Ce code Arduino a été développé par newbiely.fr * Ce code Arduino est mis à disposition du public sans aucune restriction. * Pour des instructions complètes et des schémas de câblage, veuillez visiter: * https://newbiely.fr/tutorials/arduino/communication-between-two-arduino */ // ARDUINO #2: TCP SERVER + AN LED #include <WiFiS3.h> const char ssid[] = "YOUR_WIFI_SSID"; // change your network SSID (name) const char pass[] = "YOUR_WIFI_PASSWORD"; // change your network password (use for WPA, or use as key for WEP) const int LED_PIN = 7; const int serverPort = 4080; WiFiServer TCPserver(serverPort); int status = WL_IDLE_STATUS; void setup() { Serial.begin(9600); pinMode(LED_PIN, OUTPUT); Serial.println("ARDUINO #2: TCP SERVER + AN LED"); // check for the WiFi module: if (WiFi.status() == WL_NO_MODULE) { Serial.println("Communication with WiFi module failed!"); // don't continue while (true) ; } String fv = WiFi.firmwareVersion(); if (fv < WIFI_FIRMWARE_LATEST_VERSION) { Serial.println("Please upgrade the firmware"); } // attempt to connect to WiFi network: while (status != WL_CONNECTED) { Serial.print("Attempting to connect to SSID: "); Serial.println(ssid); // Connect to WPA/WPA2 network. Change this line if using open or WEP network: status = WiFi.begin(ssid, pass); // wait 10 seconds for connection: delay(10000); } // Print your local IP address: Serial.print("TCP Server IP address: "); Serial.println(WiFi.localIP()); Serial.println("-> Please update the serverAddress in Arduino #1 code"); // Listening for a TCP client (from Arduino #1) TCPserver.begin(); } void loop() { // Wait for a TCP client from Arduino #1: WiFiClient client = TCPserver.available(); if (client) { // Read the command from the TCP client: char command = client.read(); if (command == '1') { Serial.print("- Received command: "); Serial.println(command); digitalWrite(LED_PIN, HIGH); // Turn LED on } else if (command == '0') { Serial.print("- Received command: "); Serial.println(command); digitalWrite(LED_PIN, LOW); // Turn LED off } } }

Communication entre deux Arduino via Ethernet

Code Arduino pour Arduino Ethernet #1

/* * Ce code Arduino a été développé par newbiely.fr * Ce code Arduino est mis à disposition du public sans aucune restriction. * Pour des instructions complètes et des schémas de câblage, veuillez visiter: * https://newbiely.fr/tutorials/arduino/communication-between-two-arduino */ // ARDUINO #1: TCP CLIENT + A BUTTON/SWITCH #include <ezButton.h> #include <SPI.h> #include <Ethernet.h> const int BUTTON_PIN = 7; const int serverPort = 4080; ezButton button(BUTTON_PIN); // create ezButton that attach to pin 7; byte mac[] = {0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x03}; IPAddress serverAddress(192, 168, 0, 180); EthernetClient TCPclient; void setup() { Serial.begin(9600); button.setDebounceTime(50); // set debounce time to 50 milliseconds Serial.println("ARDUINO #1: TCP CLIENT + A BUTTON/SWITCH"); // Initialize Ethernet Shield: if (Ethernet.begin(mac) == 0) Serial.println("Failed to configure Ethernet using DHCP"); // connect to TCP server (Arduino #2) if (TCPclient.connect(serverAddress, serverPort)) Serial.println("Connected to TCP server"); else Serial.println("Failed to connect to TCP server"); } void loop() { button.loop(); // MUST call the loop() function first if (!TCPclient.connected()) { Serial.println("Connection is disconnected"); TCPclient.stop(); // reconnect to TCP server (Arduino #2) if (TCPclient.connect(serverAddress, serverPort)) Serial.println("Reconnected to TCP server"); else Serial.println("Failed to reconnect to TCP server"); } if (button.isPressed()) { TCPclient.write('1'); TCPclient.flush(); Serial.println("- The button is pressed, sent command: 1"); } if (button.isReleased()) { TCPclient.write('0'); TCPclient.flush(); Serial.println("- The button is released, sent command: 0"); } }

Code Arduino pour Arduino Ethernet #2

/* * Ce code Arduino a été développé par newbiely.fr * Ce code Arduino est mis à disposition du public sans aucune restriction. * Pour des instructions complètes et des schémas de câblage, veuillez visiter: * https://newbiely.fr/tutorials/arduino/communication-between-two-arduino */ // ARDUINO #2: TCP SERVER + AN LED #include <SPI.h> #include <Ethernet.h> const int LED_PIN = 7; const int serverPort = 4080; byte mac[] = {0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02}; EthernetServer TCPserver(serverPort); void setup() { Serial.begin(9600); pinMode(LED_PIN, OUTPUT); Serial.println("ARDUINO #2: TCP SERVER + AN LED"); // Initialize Ethernet Shield: if (Ethernet.begin(mac) == 0) Serial.println("Failed to configure Ethernet using DHCP"); // Print your local IP address: Serial.print("TCP Server IP address: "); Serial.println(Ethernet.localIP()); Serial.println("-> Please update the serverAddress in Arduino #1 code"); // Listening for a TCP client (from Arduino #1) TCPserver.begin(); } void loop() { // Wait for a TCP client from Arduino #1: EthernetClient client = TCPserver.available(); if (client) { // Read the command from the TCP client: char command = client.read(); if (command == '1') { Serial.print("- Received command: "); Serial.println(command); digitalWrite(LED_PIN, HIGH); // Turn LED on } else if (command == '0') { Serial.print("- Received command: "); Serial.println(command); digitalWrite(LED_PIN, LOW); // Turn LED off } Ethernet.maintain(); } }

Étapes rapides

  • Si vous utilisez le Shield Ethernet, empilez les Shields Ethernet sur l'Arduino #1 et l'Arduino #2
  • Connectez un bouton/interrupteur à l'Arduino #1
  • Connectez une LED à l'Arduino #2
  • Ouvrez l'IDE Arduino (appelé Arduino IDE #1)
  • Installez la bibliothèque ezButton sur Arduino IDE
  • Connectez l'Arduino #1 au PC via un câble USB et sélectionnez le port COM de l'Arduino #1 sur l'Arduino IDE #1
  • Ouvrez une autre fenêtre de l'IDE Arduino (appelé Arduino IDE #2) en cliquant sur l'icône de l'IDE Arduino sur votre PC (important !(**))
  • Connectez l'Arduino #2 au PC via un câble USB et sélectionnez le port COM de l'Arduino #2 sur l'Arduino IDE #2
  • Copiez le code de l'Arduino #1, collez-le dans l'Arduino IDE #1 et enregistrez-le (nommé Arduino1)
  • Copiez le code de l'Arduino #2, collez-le dans l'Arduino IDE #2 et enregistrez-le (nommé Arduino2)
  • Téléchargez d'abord le code de l'Arduino #2 sur l'Arduino #2
  • Ouvrez le moniteur série sur l'Arduino IDE #2, obtenez l'adresse IP du serveur TCP.
COM6
Send
ARDUINO #2: TCP SERVER + AN LED TCP Server IP address: 192.168.0.2 -> Please update the serverAddress in Arduino #1 code
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  
  • Mettre à jour l'adresse IP du serveur TCP dans le code de l'Arduino #1
  • Téléverser le code de l'Arduino #1 sur l'Arduino #1
  • Ouvrir le moniteur série sur l'IDE Arduino #1
  • Appuyer et maintenir le bouton sur l'Arduino #1 → observer l'état de la LED sur l'Arduino #2 (ALLUMÉ)
  • Relâcher le bouton sur l'Arduino #1 → observer l'état de la LED sur l'Arduino #2 (ÉTEINT)
  • Appuyer, maintenir et relâcher le bouton plusieurs fois.
  • Voir la sortie sur les deux moniteurs série
    • Moniteur série de l'Arduino #1
    COM6
    Send
    ARDUINO #1: TCP CLIENT + A BUTTON/SWITCH Connected to TCP server - The button is pressed, sent command: 1 - The button is released, sent command: 0 - The button is pressed, sent command: 1 - The button is released, sent command: 0 - The button is pressed, sent command: 1 - The button is released, sent command: 0
    Autoscroll Show timestamp
    Clear output
    9600 baud  
    Newline  
    • Moniteur série de l'Arduino #2
    COM6
    Send
    ARDUINO #2: TCP SERVER + AN LED TCP Server IP address: 192.168.0.2 -> Please update the serverAddress in Arduino #1 code - Received command: 1 - Received command: 0 - Received command: 1 - Received command: 0 - Received command: 1 - Received command: 0
    Autoscroll Show timestamp
    Clear output
    9600 baud  
    Newline  

    ※ NOTE THAT:

    • Si vous ouvrez la fenêtre Arduino IDE #2 via "Fichier" → "Nouveau" ou "Ouvrir" depuis la fenêtre Arduino IDE #2, vous ne pourrez PAS ouvrir deux moniteurs série pour deux Arduino sur le même PC en même temps.
    • Il existe une alternative à ce protocole auto-défini. C'est le Modbus TCP. Le protocole Modbus est standardisé, il présente de nombreux avantages par rapport au protocole auto-défini. Voir plus dans le tutoriel Arduino - Modbus.

Vidéo

Comment connecter deux Arduino via Internet

Il existe deux types d'adresse IP : l'adresse IP privée et l'adresse IP publique. L'adresse IP que vous utilisez dans votre réseau domestique est généralement une adresse IP privée.

Vous pouvez facilement identifier l'adresse IP privée. L'adresse IP privée a trois schémas : 10.x.x.x, 172.16.x.x, 192.168.x.x

Il n'est PAS important d'utiliser l'adresse IP privée dans le cas suivant :

  • Si deux Arduino se trouvent sur le même réseau LAN, qu'ils communiquent directement ou via un serveur centralisé, que votre réseau LAN soit connecté à Internet ou non.
  • Si deux Arduino se trouvent sur des réseaux LAN différents et communiquent entre eux via un serveur centralisé.

Dans le cas où deux Arduino sont dans des réseaux LAN différents et communiquent directement entre eux, le client TCP Arduino peut utiliser l'adresse IP privée. Cependant, le serveur TCP Arduino DOIT utiliser soit :

  • Une adresse IP publique
  • Une adresse IP privée avec "Redirection de port" sur le routeur/point d'accès

Le processus de mise en place du "Port Forwarding" diffère pour chaque routeur/point d'accès. Cela sort du cadre de ce tutoriel.

※ OUR MESSAGES

  • Please feel free to share the link of this tutorial. However, Please do not use our content on any other websites. We invested a lot of effort and time to create the content, please respect our work!