Comunicação entre dois Arduinos

Neste tutorial, vamos aprender:

comunicação entre dois arduinos

O tutorial fornece o código Arduino para dois casos:

Comunicação entre dois Arduinos - Visão geral

Vamos considerar um caso específico: o Arduino #1 se comunica com o Arduino #2. Existem muitos métodos para permitir a comunicação entre dois Arduinos. Podemos escolher um deles dependendo do alcance da comunicação. A tabela abaixo mostra alguns métodos e o alcance de comunicação de cada um.

Métodos Alcance
I2C muito curto
SPI muito curto
UART (TTL) muito curto
UART (RS-232/485/422) curto
Bluetooth curto
LoRa longo
Ethernet/WiFi ilimitado(*)

※ Nota:

(*):

  • Se os dois Arduinos estiverem conectados à Internet, o alcance de comunicação é ilimitado
  • Se os dois Arduinos não estiverem conectados à Internet, mas estiverem conectados na mesma rede LAN, eles ainda podem se comunicar entre si. O alcance de comunicação fica limitado à rede LAN.

Entre os métodos acima, este tutorial usa Ethernet/WiFi para permitir a comunicação entre dois Arduinos, porque assim os dois Arduinos podem se comunicar a uma distância ilimitada.

Comunicação entre dois Arduinos via Ethernet/WiFi

Dois Arduinos podem se comunicar entre si via Ethernet/WiFi se:

  • Os dois Arduinos estiverem na mesma rede LAN; a conexão com a Internet NÃO é necessária
  • Os dois Arduinos estiverem em redes LAN diferentes; a conexão com a Internet é necessária

Não importa se os dois Arduinos se conectam entre si dentro de uma rede LAN local ou pela Internet, existem dois tipos de comunicação:

No caso da comunicação direta, na maioria das vezes, um Arduino faz o papel de cliente TCP e o outro faz o papel de servidor TCP.

No caso da comunicação por meio de um servidor centralizado, na maioria das vezes, os dois Arduinos fazem o papel de cliente TCP.

Dependendo da aplicação, precisamos escolher um protocolo de aplicação para a comunicação entre os dois Arduinos. Abaixo estão alguns dos protocolos de aplicação que podemos usar:

  • Protocolo próprio sobre TCP puro (diretamente)
  • Modbus TCP (diretamente)
  • HTTP (diretamente)
  • Telnet (diretamente)
  • SSH (diretamente)
  • MQTT (via um servidor centralizado)

※ Nota:

NÃO importa se:

  • Os dois Arduinos usam Ethernet
  • Os dois Arduinos usam WiFi
  • Um Arduino usa Ethernet e o outro usa WiFi

O protocolo UDP está fora do escopo deste tutorial.

Exemplo de Aplicação

Vamos fazer a seguinte aplicação: um botão/interruptor conectado ao Arduino #1 controla um LED conectado ao Arduino #2 via Ethernet/WiFi.

comunicação entre dois arduinos

Este tutorial usa dois Arduino Ethernet Shields. Você pode usar outro WiFi Shield ou Ethernet Shield no lugar. Se você usar outro shield, só precisa modificar um pouco o código.

Como mencionado acima, existem alguns protocolos de aplicação que podemos usar. Neste exemplo, para simplificar, vamos definir um protocolo por conta própria (um protocolo próprio)

Protocolo Próprio

Vamos definir um protocolo simples:

  • Uma conexão TCP é criada entre o Arduino #1 e o Arduino #2
  • Arduino #1:
    • Atua como cliente TCP, fazendo ativamente a requisição de conexão TCP ao Arduino #2
    • Quando o interruptor é colocado em ON, o Arduino #1 envia um byte (comando) com valor 1 para o Arduino #2.
    • Quando o interruptor é colocado em OFF, o Arduino #1 envia um byte (comando) com valor 0 para o Arduino #2.
  • Arduino #2:
    • Atua como servidor TCP, aguardando a requisição de conexão TCP do Arduino #1
    • Se o byte recebido for 1, liga o LED
    • Se o byte recebido for 0, desliga o LED

    Diagrama de Ligação

    dois arduinos led interruptor botão

    ※ Nota:

    você precisa adicionar um resistor para o LED se o LED não tiver um resistor embutido. Você pode aprender mais nos tutoriais Arduino - LED e Arduino - Botão

Comunicação entre dois Arduinos via WiFi

Código Arduino para o Arduino Uno R4 WiFi #1

/* * Este código de Arduino foi desenvolvido por pt.newbiely.com * Este código de Arduino é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/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"); } }

Código Arduino para o Arduino Uno R4 WiFi #2

/* * Este código de Arduino foi desenvolvido por pt.newbiely.com * Este código de Arduino é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/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 } } }

Comunicação entre dois Arduinos via Ethernet

Código Arduino para o Arduino Ethernet #1

/* * Este código de Arduino foi desenvolvido por pt.newbiely.com * Este código de Arduino é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/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"); } }

Código Arduino para o Arduino Ethernet #2

/* * Este código de Arduino foi desenvolvido por pt.newbiely.com * Este código de Arduino é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/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(); } }

Passos Rápidos

  • Se estiver usando o Ethernet Shield, encaixe os Ethernet Shields no Arduino #1 e no Arduino #2
  • Ligue um botão/interruptor ao Arduino #1
  • Ligue um LED ao Arduino #2
  • Abra a Arduino IDE (chamada de Arduino IDE #1)
  • Instale a biblioteca ezButton na Arduino IDE
  • Conecte o Arduino #1 ao PC via cabo USB e selecione a porta COM do Arduino #1 na Arduino IDE #1
  • Abra outra janela da Arduino IDE (chamada de Arduino IDE #2) clicando no ícone da Arduino IDE no seu PC (importante!())
  • Conecte o Arduino #2 ao PC via cabo USB e selecione a porta COM do Arduino #2 na Arduino IDE #2
  • Copie o código do Arduino #1, cole na Arduino IDE #1 e salve (com o nome Arduino1)
  • Copie o código do Arduino #2, cole na Arduino IDE #2 e salve (com o nome Arduino2)
  • Faça o upload do código do Arduino #2 para o Arduino #2 primeiro
  • Abra o Serial Monitor na Arduino IDE #2 e pegue o endereço IP do servidor TCP
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Uno
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno' on 'COM15')
New Line
9600 baud
ARDUINO #2: TCP SERVER + AN LED TCP Server IP address: 192.168.0.2 -> Please update the serverAddress in Arduino #1 code
Ln 11, Col 1
Arduino Uno on COM15
2
  • Atualize o endereço IP do servidor TCP no código do Arduino #1
  • Faça o upload do código do Arduino #1 para o Arduino #1
  • Abra o Serial Monitor na Arduino IDE #1
  • Pressione e segure o botão no Arduino #1 → veja o estado do LED no Arduino #2 (ON)
  • Solte o botão no Arduino #1 → veja o estado do LED no Arduino #2 (OFF)
  • Pressione, segure e solte o botão várias vezes.
  • Veja a saída nos dois Serial Monitors
    • Serial Monitor do Arduino #1
    ∞
    Newbiely | Arduino IDE 2.3.8
    ──
    ☐
    ✕
    File
    Edit
    Sketch
    Tools
    Help
    Arduino Uno
    Newbiely.ino
    ···
    8 Serial.println("Hello World!");
    Output
    Serial Monitor
    Message (Enter to send message to 'Arduino Uno' on 'COM15')
    New Line
    9600 baud
    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
    Ln 11, Col 1
    Arduino Uno on COM15
    2
    • Serial Monitor do Arduino #2
    ∞
    Newbiely | Arduino IDE 2.3.8
    ──
    ☐
    ✕
    File
    Edit
    Sketch
    Tools
    Help
    Arduino Uno
    Newbiely.ino
    ···
    8 Serial.println("Hello World!");
    Output
    Serial Monitor
    Message (Enter to send message to 'Arduino Uno' on 'COM15')
    New Line
    9600 baud
    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
    Ln 11, Col 1
    Arduino Uno on COM15
    2

    ※ Nota:

    • (): Se você abrir a janela da Arduino IDE #2 pelo menu "File" → "New" ou "Open" a partir da janela da Arduino IDE #2, você NÃO conseguirá abrir dois Serial Monitors para dois Arduinos no mesmo PC ao mesmo tempo.
    • Existe uma alternativa a este protocolo próprio. É o Modbus TCP. O protocolo Modbus é padronizado e tem muitas vantagens sobre o protocolo próprio. Veja mais no tutorial Arduino - Modbus

Vídeo

Como conectar dois Arduinos pela Internet

Existem dois tipos de endereço IP: endereço IP privado e endereço IP público. O endereço IP que você usa na rede da sua casa normalmente é um endereço IP privado.

Você pode identificar facilmente um endereço IP privado. O endereço IP privado tem três padrões: 10.x.x.x, 172.16.x.x, 192.168.x.x

NÃO há problema em usar o endereço IP privado nos seguintes casos:

  • Se os dois Arduinos estiverem na mesma rede LAN, quer se comuniquem diretamente ou por meio de um servidor centralizado, e quer a sua rede LAN esteja conectada à Internet ou não.
  • Se os dois Arduinos estiverem em redes LAN diferentes e se comunicarem entre si por meio de um servidor centralizado

No caso de os dois Arduinos estarem em redes LAN diferentes e se comunicarem diretamente entre si, o cliente TCP no Arduino pode usar o endereço IP privado. No entanto, o servidor TCP no Arduino PRECISA usar uma das opções:

  • Um endereço IP público
  • Um endereço IP privado com "Port Forwarding" (redirecionamento de portas) no Roteador/AP

O processo de configurar o "Port Forwarding" é diferente em cada roteador/AP. Isso está fora do escopo deste tutorial.

※ NOSSAS MENSAGENS

  • Fique à vontade para compartilhar o link deste tutorial. Porém, por favor, não use nosso conteúdo em outros sites. Investimos muito esforço e tempo para criar este conteúdo, por favor respeite nosso trabalho!