Communicatie tussen twee Arduino

In deze tutorial gaan we leren:

communicatie tussen twee arduino

De tutorial bevat Arduino code voor twee situaties:

Benodigde Hardware

2×Arduino UNO R4 WiFi
2×USB-kabel Type-C

Alternatief bij gebruik van Ethernet:

2×Arduino Uno R3
2×USB 2.0-kabel type A/B
2×Arduino Ethernet Shield
2×Ethernetkabel
1×(Aanbevolen) Schroefklem Block Shield voor Arduino Uno R4
1×(Aanbevolen) Breadboard-Shield voor Arduino Uno R4
1×(Aanbevolen) Behuizing voor Arduino Uno R4
1×(Aanbevolen) Stromsplitter voor Arduino Uno R4
1×(Aanbevolen) Prototyping Basisplaat & Breadboard Kit voor Arduino Uno

Of u kunt de volgende kits kopen:

1×DIYables Sensorkit (30 sensoren/displays)
1×DIYables Sensorkit (18 sensoren/displays)
Openbaarmaking: Sommige van de links in deze sectie zijn Amazon-affiliate links. We kunnen een commissie ontvangen voor aankopen die via deze links worden gedaan, zonder extra kosten voor u. We waarderen uw steun.

Communicatie tussen twee Arduino - Overzicht

Laten we een specifieke situatie bekijken: Arduino #1 communiceert met Arduino #2. Er zijn veel methoden om communicatie tussen twee Arduino mogelijk te maken. We kunnen een methode kiezen afhankelijk van het communicatiebereik. De onderstaande tabel toont enkele methoden en hun bereik.

Methoden Bereik
I2C zeer kort
SPI zeer kort
UART (TTL) zeer kort
UART (RS-232/485/422) kort
Bluetooth kort
LoRa lang
Ethernet/WiFi onbeperkt(*)

※ Notiz:

(*):

  • Als twee Arduino’s verbonden zijn met het internet, is het communicatiebereik onbeperkt
  • Als twee Arduino’s niet verbonden zijn met het internet, maar in hetzelfde LAN-netwerk zitten, kunnen ze nog steeds met elkaar communiceren. Het bereik is beperkt tot het LAN-netwerk.

Van de bovenstaande methoden gebruikt deze tutorial Ethernet/WiFi om communicatie tussen twee Arduino mogelijk te maken omdat dit communicatie op onbeperkte afstand mogelijk maakt.

Communicatie tussen twee Arduino via Ethernet/WiFi

Twee Arduino’s kunnen via Ethernet/WiFi met elkaar communiceren als:

  • De twee Arduino’s in hetzelfde LAN-netwerk zitten, is internetverbinding NIET nodig
  • De twee Arduino’s in verschillende LAN-netwerken zitten, is internetverbinding WEL nodig

Ongeacht of twee Arduino’s binnen een lokaal LAN-netwerk of via het internet met elkaar verbonden zijn, zijn er twee soorten communicatie:

In het geval van directe communicatie speelt in de meeste gevallen de ene Arduino de rol van TCP-client en de andere de rol van TCP-server.

In het geval van communicatie via een gecentraliseerde server spelen beide Arduino meestal de rol van TCP-client.

Afhankelijk van de toepassing kiezen we een toepassingsprotocol voor de communicatie tussen twee Arduino. Hieronder staan enkele protocollen die we kunnen gebruiken:

  • Zelfgedefinieerd protocol over raw TCP (direct)
  • Modbus TCP (direct)
  • HTTP (direct)
  • Telnet (direct)
  • SSH (direct)
  • MQTT (via een gecentraliseerde server)

※ Notiz:

Het maakt NIET uit of:

  • Beide Arduino gebruikmaken van Ethernet
  • Beide Arduino gebruikmaken van WiFi
  • Eén Arduino gebruikmaakt van Ethernet en de andere van WiFi

UDP-protocol valt buiten de scope van deze tutorial.

Voorbeeldtoepassing

Laten we de volgende toepassing realiseren: Een knop/schakelaar verbonden met Arduino #1 bestuurt een LED verbonden met Arduino #2 via Ethernet/WiFi.

communicatie tussen twee arduino

Deze tutorial gebruikt twee Arduino Ethernet Shields. U kunt in plaats daarvan een andere WiFi Shield of Ethernet Shield gebruiken. Bij een ander shield hoeft u alleen de code iets aan te passen.

Zoals hierboven genoemd zijn er verschillende toepassingsprotocollen mogelijk. In dit voorbeeld houden we het simpel, we definiëren ons eigen protocol (een zelfgedefinieerd protocol).

Zelfgedefinieerd Protocol

Laten we een simpel protocol definiëren:

  • Er wordt een TCP-verbinding opgezet tussen Arduino #1 en Arduino #2
  • Arduino #1:
    • Gedraagt zich als TCP-client, maakt actief verbinding met Arduino #2
    • Als de schakelaar op AAN wordt gezet, stuurt Arduino #1 een byte (commando) met waarde 1 naar Arduino #2
    • Als de schakelaar op UIT wordt gezet, stuurt Arduino #1 een byte (commando) met waarde 0 naar Arduino #2
  • Arduino #2:
    • Gedraagt zich als TCP-server, luistert naar verbindingen van Arduino #1
    • Ontvangt het een byte met waarde 1, dan gaat de LED AAN
    • Ontvangt het een byte met waarde 0, dan gaat de LED UIT

    Aansluitschema

    twee arduino led schakelaar knop

    ※ Notiz:

    U moet een weerstand toevoegen voor de LED als de LED geen ingebouwde weerstand heeft. Meer informatie vindt u in de Arduino - LED en Arduino - Knop tutorials.

Communicatie tussen twee Arduino via WiFi

Arduino Code voor Arduino Uno R4 WiFi #1

/* * Deze Arduino code is ontwikkeld door newbiely.nl * Deze Arduino code wordt zonder enige beperking aan het publiek beschikbaar gesteld. * Voor volledige instructies en schema's, bezoek: * https://newbiely.nl/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"); } }

Arduino Code voor Arduino Uno R4 WiFi #2

/* * Deze Arduino code is ontwikkeld door newbiely.nl * Deze Arduino code wordt zonder enige beperking aan het publiek beschikbaar gesteld. * Voor volledige instructies en schema's, bezoek: * https://newbiely.nl/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 } } }

Communicatie tussen twee Arduino via Ethernet

Arduino Code voor Arduino Ethernet #1

/* * Deze Arduino code is ontwikkeld door newbiely.nl * Deze Arduino code wordt zonder enige beperking aan het publiek beschikbaar gesteld. * Voor volledige instructies en schema's, bezoek: * https://newbiely.nl/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"); } }

Arduino Code voor Arduino Ethernet #2

/* * Deze Arduino code is ontwikkeld door newbiely.nl * Deze Arduino code wordt zonder enige beperking aan het publiek beschikbaar gesteld. * Voor volledige instructies en schema's, bezoek: * https://newbiely.nl/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(); } }

Snelle Stappen

  • Als u het Ethernet Shield gebruikt, stapel dan het Ethernet Shield op Arduino #1 en Arduino #2
  • Verbind een knop/schakelaar met Arduino #1
  • Verbind een LED met Arduino #2
  • Open Arduino IDE (hierna Arduino IDE #1 genoemd)
  • Installeer de ezButton library in Arduino IDE
  • Verbind Arduino #1 met de pc via USB-kabel en selecteer de juiste COM-poort van Arduino #1 in Arduino IDE #1
  • Open een tweede Arduino IDE venster (Arduino IDE #2) door op het Arduino IDE icoon te klikken op uw pc (belangrijk!())
  • Verbind Arduino #2 met de pc via USB-kabel en selecteer de juiste COM-poort van Arduino #2 in Arduino IDE #2
  • Kopieer de code voor Arduino #1, plak deze in Arduino IDE #1 en sla op (bewaar als Arduino1)
  • Kopieer de code voor Arduino #2, plak deze in Arduino IDE #2 en sla op (bewaar als Arduino2)
  • Upload eerst de code naar Arduino #2
  • Open de Serial Monitor in Arduino IDE #2 en noteer het TCP Server IP-adres
COM6
Send
ARDUINO #2: TCP SERVER + EEN LED TCP Server IP-adres: 192.168.0.2 -> Pas het serverAddress aan in de Arduino #1 code
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  
  • Pas het TCP Server IP-adres aan in de Arduino #1 code
  • Upload de code naar Arduino #1
  • Open de Serial Monitor in Arduino IDE #1
  • Houd de knop op Arduino #1 ingedrukt → zie de staat van de LED op Arduino #2 (AAN)
  • Laat de knop op Arduino #1 los → zie de staat van de LED op Arduino #2 (UIT)
  • Druk, houd vast en laat de knop meerdere keren los
  • Bekijk de output op beide Serial Monitors
    • Serial Monitor van Arduino #1
    COM6
    Send
    ARDUINO #1: TCP CLIENT + EEN KNOP/SCHAKELAAR 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  
    • Serial Monitor van Arduino #2
    COM6
    Send
    ARDUINO #2: TCP SERVER + EEN LED TCP Server IP-address: 192.168.0.2 -> Pas het serverAddress aan in de 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  

    ※ Notiz:

    • (): Als u Arduino IDE #2 opent via "Bestand" → "Nieuw" of "Openen" vanuit het huidige Arduino IDE #2 venster, kunt u NIET tegelijkertijd twee Serial Monitors openen voor twee Arduino op dezelfde pc.
    • Er is een alternatief voor dit zelfgedefinieerde protocol: Modbus TCP. Het Modbus protocol is gestandaardiseerd en biedt veel voordelen ten opzichte van het zelfgedefinieerde protocol. Zie meer in de Arduino - Modbus tutorial.

Video Tutorial

We overwegen het maken van videotutorials. Als u videotutorials belangrijk vindt, abonneer u dan op ons YouTube-kanaal om ons te motiveren de video's te maken.

Hoe twee Arduino via Internet te verbinden

Er zijn twee soorten IP-adressen: privé IP-adres en publiek IP-adres. Het IP-adres dat u thuis gebruikt is meestal een privé IP-adres.

U kunt een privé IP-adres gemakkelijk herkennen aan een van de drie patronen: 10.x.x.x, 172.16.x.x, 192.168.x.x

Het maakt NIET uit om een privé IP-adres te gebruiken in de volgende gevallen:

  • Als twee Arduino’s in hetzelfde LAN-netwerk zitten, ongeacht of ze rechtstreeks of via een centrale server communiceren, en ongeacht of het LAN-netwerk verbonden is met het internet
  • Als twee Arduino’s in verschillende LAN-netwerken zitten en communiceren via een centrale server

In het geval dat twee Arduino’s in verschillende LAN-netwerken zitten en rechtstreeks communiceren:

  • De Arduino TCP-client kan een privé IP-adres gebruiken
  • De Arduino TCP-server MOET één van de volgende gebruiken:
    • Een publiek IP-adres
    • Een privé IP-adres met "Port Forwarding" op de Router/AP

    Het proces van "Port Forwarding" verschilt per router/AP en valt buiten de scope van deze tutorial.

Opmerkingen

※ ONZE BERICHTEN

  • U bent welkom om de link naar deze tutorial te delen. Gebruik onze inhoud echter niet op andere websites. We hebben veel moeite en tijd gestoken in het maken van de inhoud, respecteer alstublieft ons werk!