Comunicación entre dos Arduinos

En este tutorial, vamos a aprender:

Comunicación entre dos Arduinos

El tutorial proporciona el código de Arduino para dos casos:

Hardware Requerido

2×Arduino UNO R4 WiFi
2×Cable USB Tipo-C

Alternatively if using Ethernet:

2×Arduino Uno R3
2×Cable USB 2.0 tipo A/B
2×Arduino Ethernet Shield
2×Ethernet Cable
1×(Recomendado) Shield de Bloque de Terminales de Tornillo para Arduino Uno R4
1×(Recomendado) Shield de Protoboard para Arduino Uno R4
1×(Recomendado) Carcasa para Arduino Uno R4
1×(Recomendado) Divisor de Alimentación para Arduino Uno R4
1×(Recomendado) Placa Base de Prototipado y Kit de Protoboard para Arduino Uno

Or you can buy the following kits:

1×DIYables STEM V3 Starter Kit (Arduino included)
1×DIYables Sensor Kit (30 sensors/displays)
1×DIYables Sensor Kit (18 sensors/displays)
Divulgación: Algunos de los enlaces proporcionados en esta sección son enlaces de afiliado de Amazon. Podemos recibir una comisión por las compras realizadas a través de estos enlaces sin costo adicional para usted. Apreciamos su apoyo.

Comunicación entre dos Arduinos - Visión general

Consideremos un caso específico: Arduino n.º 1 se comunica con Arduino n.º 2. Existen muchos métodos para habilitar la comunicación entre dos Arduinos. Podemos elegir uno de ellos en función del rango de comunicación. La tabla siguiente muestra algunos métodos y su rango de comunicación.

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

※ Nota:

(*):

  • Si dos Arduinos están conectados a Internet, el rango de comunicación es ilimitado
  • Si dos Arduinos no están conectados a Internet, pero están conectados en la misma red LAN, todavía pueden comunicarse entre sí. El rango de comunicación está limitado dentro de la red LAN.

Entre los métodos anteriores, este tutorial utiliza Ethernet/WiFi para permitir la comunicación entre dos Arduinos, porque permite que dos Arduinos se comuniquen a una distancia ilimitada.

Comunicación entre dos Arduinos vía Ethernet/WiFi

Dos Arduinos pueden comunicarse entre sí a través de Ethernet/WiFi si:

  • Dos Arduinos en la misma red LAN, la conectividad a Internet no es necesaria
  • Dos Arduinos en diferentes redes LAN, la conectividad a Internet es necesaria

No importa si dos Arduinos se conectan entre sí dentro de una red LAN local o a través de Internet, existen dos tipos de comunicación:

En el caso de comunicarse directamente, en la mayoría de los casos, un Arduino actúa como cliente TCP y el otro como servidor TCP.

En el caso de comunicarse a través de un servidor centralizado, en la mayoría de los casos, ambos Arduinos desempeñan el papel de cliente TCP.

Dependiendo de la aplicación, necesitamos elegir un protocolo de aplicación para comunicarse entre dos placas Arduino. A continuación se muestran algunos de los protocolos de aplicación que podemos usar:

  • Protocolo propio sobre TCP crudo (directamente)
  • Modbus TCP (directamente)
  • HTTP (directamente)
  • Telnet (directamente)
  • SSH (directamente)
  • MQTT (a través de un servidor central)

※ Nota:

No importa si:

  • Ambos Arduinos usan Ethernet
  • Ambos Arduinos usan WiFi
  • Un Arduino usa Ethernet, el otro usa WiFi

El protocolo UDP está fuera del alcance de este tutorial.

Aplicación de ejemplo

Realicemos la siguiente aplicación: un botón o interruptor conectado al Arduino #1 controla un LED conectado al Arduino #2 mediante Ethernet/WiFi.

Comunicación entre dos Arduinos

Este tutorial utiliza dos escudos Ethernet de Arduino. Puede usar otro WiFi Shield o Ethernet Shield en su lugar. Si usa otro escudo, solo necesita modificar el código un poco.

Como se mencionó anteriormente, hay algunos protocolos de aplicación que podemos usar. En este ejemplo, para simplificarlo, definiremos un protocolo por nosotros mismos (un protocolo definido por nosotros mismos).

Protocolo definido por uno mismo

Definamos un protocolo sencillo:

  • Se crea una conexión TCP entre Arduino #1 y Arduino #2
  • Arduino #1:
    • Actúa como cliente TCP, realiza activamente una solicitud de conexión TCP a Arduino #2
    • Cuando el interruptor se ponga en ENCENDIDO, Arduino #1 envía un byte (comando) con valor 1 a Arduino #2.
    • Cuando el interruptor se ponga en APAGADO, Arduino #1 envía un byte (comando) con valor 0 a Arduino #2.
  • Arduino #2:
    • Actúa como servidor TCP, escucha la solicitud de conexión TCP de Arduino #1
    • Si el byte recibido es 1, enciende el LED
    • Si el byte recibido es 0, apaga el LED

    Diagrama de cableado

    dos botones interruptor LED de Arduino

    ※ Nota:

    Necesitas añadir una resistencia para el LED si el LED no tiene una resistencia integrada. Puedes aprender más en los tutoriales Arduino - LED y Arduino - Button.

Comunicación entre dos Arduinos vía WiFi

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

/* * Este código de Arduino fue desarrollado por es.newbiely.com * Este código de Arduino se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.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 de Arduino para Arduino Uno R4 WiFi #2

/* * Este código de Arduino fue desarrollado por es.newbiely.com * Este código de Arduino se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.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 } } }

Comunicación entre dos Arduinos vía Ethernet

Código de Arduino para Arduino Ethernet #1

/* * Este código de Arduino fue desarrollado por es.newbiely.com * Este código de Arduino se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.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 de Arduino para Arduino Ethernet #2

/* * Este código de Arduino fue desarrollado por es.newbiely.com * Este código de Arduino se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.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(); } }

Pasos R\u00e1pidos

  • Si se utiliza el Ethernet Shield, apile los Ethernet Shields en Arduino #1 y Arduino #2
  • Conecte un botón/interruptor al Arduino #1
  • Conecte un LED al Arduino #2
  • Abra Arduino IDE (llamado Arduino IDE #1)
  • Instale la biblioteca ezButton en Arduino IDE
  • Conecte el Arduino #1 a la PC mediante un cable USB y seleccione el puerto COM del Arduino #1 en Arduino IDE #1
  • Abra otra ventana de Arduino IDE (llamada Arduino IDE #2) haciendo clic en el icono de Arduino IDE en su PC (¡importante!())
  • Conecte el Arduino #2 a la PC mediante un cable USB y seleccione el puerto COM del Arduino #2 en Arduino IDE #2
  • Copie el código del Arduino #1, péguelo en Arduino IDE #1 y guárdelo (llamado Arduino1)
  • Copie el código del Arduino #2, péguelo en Arduino IDE #2 y guárdelo (llamado Arduino2)
  • Cargue el código del Arduino #2 en el Arduino #2 primero
  • Abra el Monitor Serial en Arduino IDE #2 y obtenga la dirección IP del servidor 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  
  • Subir el código del Arduino #1 al Arduino #1
  • Abrir el Monitor Serial en el IDE de Arduino #1
  • Mantén presionado el botón en el Arduino #1 → observa el estado del LED en el Arduino #2 (ENCENDIDO)
  • Suelta el botón en el Arduino #1 → observa el estado del LED en el Arduino #2 (APAGADO)
  • Presiona, mantén y suelta el botón varias veces.
  • Ver la salida en ambos Monitores Serial
    • Monitor Serial del 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  
    • Monitor Serial de 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  

    ※ Nota:

    • (): Si abres la ventana del IDE de Arduino #2 a través de "Archivo" → "Nuevo" o "Abrir" desde la ventana del IDE de Arduino #2, NO podrás abrir dos monitores de serie para dos Arduino en la misma PC al mismo tiempo.
    • Existe una alternativa a este protocolo autodefinido. Es Modbus TCP. El protocolo Modbus está estandarizado; tiene muchas ventajas sobre el protocolo autodefinido. Véase más en el tutorial Arduino - Modbus.

Video Tutorial

Estamos considerando crear tutoriales en video. Si considera que los tutoriales en video son importantes, suscríbase a nuestro canal de YouTube para motivarnos a crear los videos.

Cómo conectar dos Arduinos a través de Internet

Hay dos tipos de direcciones IP: direcciones IP privadas y direcciones IP públicas. La dirección IP que estás utilizando en la red doméstica suele ser una dirección IP privada.

Puedes identificar fácilmente la dirección IP privada. La dirección IP privada tiene tres patrones: 10.x.x.x, 172.16.x.x, 192.168.x.x

No importa usar la dirección IP privada en el siguiente caso:

  • Si dos Arduinos están en la misma red LAN, independientemente de si se comunican directamente o a través de un servidor centralizado, independientemente de si tu red LAN está conectada a Internet o no.
  • Si dos Arduinos están en redes LAN diferentes y se comunican entre sí a través de un servidor centralizado.

En el caso de que dos Arduinos estén en diferentes redes LAN y se comuniquen entre sí directamente. El cliente TCP de Arduino puede usar la dirección IP privada. Sin embargo, el servidor TCP de Arduino DEBE usar ya sea:

  • Una dirección IP pública
  • Una dirección IP privada con "Redirección de puertos" en Router/AP

El proceso de realizar el 'reenvío de puertos' es diferente en cada router/punto de acceso. Está fuera del alcance de este tutorial.

※ NUESTROS MENSAJES

  • No dude en compartir el enlace de este tutorial. Sin embargo, por favor no use nuestro contenido en otros sitios web. Hemos invertido mucho esfuerzo y tiempo en crear el contenido, ¡por favor respete nuestro trabajo!