Kommunikation zwischen zwei Arduino-Boards

In diesem Tutorial werden wir lernen:

Kommunikation zwischen zwei Arduinos

Das Tutorial stellt den Arduino-Code für zwei Fälle bereit:

Erforderliche Hardware

2×Arduino UNO R4 WiFi
2×USB-Kabel Typ-C

Alternatively if using Ethernet:

2×Arduino Uno R3
2×USB 2.0 Kabel Typ A/B
2×Arduino Ethernet Shield
2×Ethernet Cable
1×(Empfohlen) Schraubklemmenblock-Shield für Arduino Uno R4
1×(Empfohlen) Breadboard-Shield für Arduino Uno R4
1×(Empfohlen) Gehäuse für Arduino Uno R4
1×(Empfohlen) Stromverteiler für Arduino Uno R4
1×(Empfohlen) Prototyping-Grundplatte & Breadboard-Kit für Arduino Uno

Oder Sie können die folgenden Kits kaufen:

1×DIYables STEM V3 Starter-Kit (Arduino enthalten)
1×DIYables Sensor-Kit (30 Sensoren/Displays)
1×DIYables Sensor-Kit (18 Sensoren/Displays)
Offenlegung: Einige der in diesem Abschnitt bereitgestellten Links sind Amazon-Affiliate-Links. Wir können eine Provision für Käufe erhalten, die über diese Links getätigt werden, ohne zusätzliche Kosten für Sie. Wir schätzen Ihre Unterstützung.

Kommunikation zwischen zwei Arduino-Boards - Übersicht

Lassen Sie uns einen konkreten Fall betrachten: Arduino #1 kommuniziert mit Arduino #2. Es gibt viele Methoden, um die Kommunikation zwischen zwei Arduinos zu ermöglichen. Wir können je nach Reichweite der Kommunikation eine davon auswählen. In der untenstehenden Tabelle sind einige Methoden und ihre Reichweiten aufgeführt.

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(*)

※ Notiz:

(*):

  • Wenn zwei Arduino mit dem Internet verbunden sind, ist die Kommunikationsreichweite unbegrenzt
  • Wenn zwei Arduino nicht mit dem Internet verbunden sind, sich aber im selben LAN-Netzwerk befinden, können sie dennoch miteinander kommunizieren. Die Reichweite der Kommunikation ist innerhalb des LAN-Netzwerks begrenzt.

Unter den oben genannten Methoden verwendet dieses Tutorial Ethernet/WiFi, um die Kommunikation zwischen zwei Arduinos zu ermöglichen, da es zwei Arduinos erlaubt, über unbegrenzte Entfernungen hinweg zu kommunizieren.

Kommunikation zwischen zwei Arduinos über Ethernet/WiFi

Zwei Arduinos können miteinander über Ethernet/WiFi kommunizieren, wenn:

  • Zwei Arduino im selben LAN-Netzwerk; die Internetverbindung ist nicht erforderlich
  • Zwei Arduino in unterschiedlichen LAN-Netzwerken; die Internetverbindung ist erforderlich

Unabhängig davon, ob zwei Arduinos sich innerhalb eines lokalen LAN-Netzwerks oder über das Internet miteinander verbinden, gibt es zwei Arten der Kommunikation:

Bei direkter Kommunikation übernimmt in den meisten Fällen ein Arduino die Rolle des TCP-Clients, das andere übernimmt die Rolle des TCP-Servers.

Im Fall der Kommunikation über einen zentralen Server spielen in den meisten Fällen beide Arduino-Boards die Rolle eines TCP-Clients.

Je nach Anwendung müssen wir ein Kommunikationsprotokoll auswählen, um zwischen zwei Arduinos zu kommunizieren. Im Folgenden sind einige der Kommunikationsprotokolle aufgeführt, die wir verwenden können:

  • Eigenes Protokoll über rohes TCP (direkt)
  • Modbus TCP (direkt)
  • HTTP (direkt)
  • Telnet (direkt)
  • SSH (direkt)
  • MQTT (über einen zentralen Server)

※ Notiz:

Es spielt keine Rolle, ob:

  • Beide Arduinos verwenden Ethernet
  • Beide Arduinos verwenden WiFi
  • Ein Arduino verwendet Ethernet, das andere WiFi verwendet

Das UDP-Protokoll liegt außerhalb des Umfangs dieses Tutorials.

Beispielanwendung

Wir realisieren die folgende Anwendung: Ein Knopf oder Schalter, der an Arduino Nr. 1 angeschlossen ist, steuert eine LED, die über Ethernet/WiFi mit Arduino Nr. 2 verbunden ist.

Kommunikation zwischen zwei Arduinos

Dieses Tutorial verwendet zwei Arduino Ethernet-Shields. Sie können stattdessen ein anderes WiFi-Shield oder Ethernet-Shield verwenden. Wenn Sie ein anderes Shield verwenden, muss der Code nur ein wenig angepasst werden.

Wie oben erwähnt gibt es einige Anwendungsprotokolle, die wir verwenden können. In diesem Beispiel, um es einfach zu machen, werden wir ein selbst definiertes Protokoll definieren (ein selbst definiertes Protokoll).

Selbstdefiniertes Protokoll

Lassen Sie uns ein einfaches Protokoll definieren:

  • Eine TCP-Verbindung wird zwischen Arduino #1 und Arduino #2 hergestellt
  • Arduino #1:
    • Als TCP-Client fungieren, aktiv eine TCP-Verbindungsanfrage an Arduino #2 senden
    • Wenn der Schalter auf EIN gestellt wird, sendet Arduino #1 ein Byte (Befehl) mit dem Wert 1 an Arduino #2.
    • Wenn der Schalter auf AUS gestellt wird, sendet Arduino #1 ein Byte (Befehl) mit dem Wert 0 an Arduino #2.
  • Arduino #2:
    • Als TCP-Server fungieren, auf die TCP-Verbindungsanfrage von Arduino #1 warten
    • Wenn das empfangene Byte 1 ist, LED einschalten
    • Wenn das empfangene Byte 0 ist, LED ausschalten

    Verdrahtungsdiagramm

    zwei Arduino-LED-Schalttasten

    ※ Notiz:

    Sie müssen einen Widerstand für die LED hinzufügen, wenn die LED keinen eingebauten Widerstand hat. Sie können mehr in den Tutorials Arduino - LED und Arduino - Button erfahren.

Die Kommunikation zwischen zwei Arduinos über WiFi

Arduino-Code für Arduino Uno R4 WiFi #1

/* * Dieser Arduino Code wurde von newbiely.de entwickelt * Dieser Arduino Code wird der Öffentlichkeit ohne jegliche Einschränkung zur Verfügung gestellt. * Für vollständige Anleitungen und Schaltpläne besuchen Sie bitte: * https://newbiely.de/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 für Arduino Uno R4 WiFi #2

/* * Dieser Arduino Code wurde von newbiely.de entwickelt * Dieser Arduino Code wird der Öffentlichkeit ohne jegliche Einschränkung zur Verfügung gestellt. * Für vollständige Anleitungen und Schaltpläne besuchen Sie bitte: * https://newbiely.de/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 } } }

Kommunikation zwischen zwei Arduinos über Ethernet

Arduino-Code für Arduino Ethernet #1

/* * Dieser Arduino Code wurde von newbiely.de entwickelt * Dieser Arduino Code wird der Öffentlichkeit ohne jegliche Einschränkung zur Verfügung gestellt. * Für vollständige Anleitungen und Schaltpläne besuchen Sie bitte: * https://newbiely.de/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 für Arduino-Ethernet #2

/* * Dieser Arduino Code wurde von newbiely.de entwickelt * Dieser Arduino Code wird der Öffentlichkeit ohne jegliche Einschränkung zur Verfügung gestellt. * Für vollständige Anleitungen und Schaltpläne besuchen Sie bitte: * https://newbiely.de/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(); } }

Schnelle Schritte

  • Falls Sie das Ethernet Shield verwenden, stapeln Sie Ethernet Shields auf Arduino #1 und Arduino #2.
  • Schließen Sie einen Knopf/Schalter an Arduino #1 an.
  • Schließen Sie eine LED an Arduino #2 an.
  • Öffnen Sie die Arduino IDE (die Arduino IDE #1 genannt).
  • Installieren Sie die ezButton-Bibliothek in der Arduino IDE.
  • Verbinden Sie Arduino #1 über ein USB-Kabel mit dem PC und wählen Sie den COM-Port von Arduino #1 in der Arduino IDE #1 aus.
  • Öffnen Sie ein weiteres Arduino IDE-Fenster (das Arduino IDE #2 genannt) durch Klicken Sie auf das Symbol der Arduino IDE auf Ihrem PC (wichtig!()).
  • Verbinden Sie Arduino #2 über ein USB-Kabel mit dem PC und wählen Sie den COM-Port von Arduino #2 in der Arduino IDE #2 aus.
  • Kopieren Sie den Arduino #1-Code, fügen Sie ihn in die Arduino IDE #1 ein und speichern Sie ihn (als Arduino1).
  • Kopieren Sie den Arduino #2-Code, fügen Sie ihn in die Arduino IDE #2 ein und speichern Sie ihn (als Arduino2).
  • Laden Sie zuerst den Arduino #2-Code auf Arduino #2 hoch.
  • Öffnen Sie den Serial Monitor in der Arduino IDE #2 und erhalten Sie die TCP-Server-IP-Adresse.
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  
  • Aktualisieren Sie die TCP-Server-IP-Adresse im Arduino-#1-Code
  • Laden Sie den Arduino-#1-Code auf Arduino #1 hoch
  • Öffnen Sie den seriellen Monitor in der Arduino-IDE #1
  • Drücken und halten Sie den Knopf an Arduino #1 → sehen Sie den LED-Zustand an Arduino #2 (AN)
  • Lassen Sie den Knopf an Arduino #1 los → sehen Sie den LED-Zustand an Arduino #2 (AUS)
  • Drücken, Halten und mehrmals Loslassen des Knopfs
  • Sehen Sie die Ausgaben auf beiden seriellen Monitoren
  • Serieller Monitor von 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  
  • Serieller Monitor von 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  

※ Notiz:

  • (): Wenn Sie das Arduino IDE #2-Fenster über "Datei" → "Neu" oder "Öffnen" aus dem Arduino IDE #2-Fenster öffnen, werden Sie nicht in der Lage sein, zwei serielle Monitore für zwei Arduino-Boards gleichzeitig auf dem selben PC zu öffnen.
  • Es gibt eine Alternative zu diesem selbst definierten Protokoll. Es handelt sich um Modbus TCP. Das Modbus-Protokoll ist standardisiert und bietet viele Vorteile gegenüber dem selbst definierten Protokoll. Weitere Informationen finden Sie im Arduino - Modbus Tutorial

Video Tutorial

Wir erwägen die Erstellung von Video-Tutorials. Wenn Sie Video-Tutorials für wichtig halten, abonnieren Sie bitte unseren YouTube-Kanal , um uns zu motivieren, die Videos zu erstellen.

Wie man zwei Arduinos über das Internet verbindet

Es gibt zwei Arten von IP-Adressen: private IP-Adressen und öffentliche IP-Adressen. Die IP-Adresse, die Sie im Heimnetzwerk verwenden, ist in der Regel eine private IP-Adresse.

Sie können die private IP-Adresse leicht identifizieren. Die private IP-Adresse hat drei Muster: 10.x.x.x, 172.16.x.x, 192.168.x.x

Es spielt keine Rolle, die private IP-Adresse im folgenden Fall zu verwenden:

  • Wenn zwei Arduino-Boards im selben LAN-Netzwerk sind, unabhängig davon, ob sie direkt kommunizieren oder über einen zentralen Server, unabhängig davon, ob das LAN-Netzwerk mit dem Internet verbunden ist oder nicht.
  • Wenn zwei Arduino-Boards sich in unterschiedlichen LAN-Netzen befinden und miteinander über einen zentralen Server kommunizieren.

Wenn sich zwei Arduinos in unterschiedlichen LAN-Netzen befinden und direkt miteinander kommunizieren, kann der Arduino-TCP-Client die private IP-Adresse verwenden. Der Arduino-TCP-Server muss jedoch entweder:

  • Eine öffentliche IP-Adresse
  • Eine private IP-Adresse mit Portweiterleitung auf dem Router/AP

Der Prozess der Portweiterleitung ist bei jedem Router/AP unterschiedlich. Dies liegt außerhalb des Umfangs dieses Tutorials.

※ UNSERE NACHRICHTEN

  • Sie können gerne den Link zu diesem Tutorial teilen. Bitte verwenden Sie jedoch unsere Inhalte nicht auf anderen Websites. Wir haben viel Mühe und Zeit in die Erstellung der Inhalte investiert, bitte respektieren Sie unsere Arbeit!