# Por último comunicación Arduino-Arduino

![](https://libros.catedu.es/uploads/images/gallery/2022-02/embedded-image-feoqmjuu.png)

Podemos conectar dos placas Arduino de distintas maneras: Bluetooth, Xbee, Ethernet, WIFI... Pero la forma más sencilla es aprovechar la conexión para la comunicación serie que ya posee Arduino.

##### <span style="color: rgb(22, 145, 121);">**Conocimiento previo**</span>

- Programación básica de Arduino.
- Bucles **for,** sentencias if-else, switch-case.

##### <span style="color: rgb(22, 145, 121);">**Objetivos**</span>

- Comunicación serie.
- Configuración maestro / esclavo.
- Crear un nuevo puerto serie.

Lista de materiales:

- 2 placas Arduino.

SI NO DISPONES DE DOS PLACAS DE ARDUINO, **TE PROPONEMOS SIMULARLO**

##### <span style="color: rgb(22, 145, 121);">**Montaje 24: Conectar dos Arduinos**</span>

El proceso es parecido al bluetooth. Aquí queremos que una Arduino envíe (MAESTRO) y que otra reciba (ESCLAVO), así que cada una correrá un programa distinto.

Podemos hacer también que ambas tarjetas envíen y reciban datos, para ello, la modificación sobre lo que expongo aquí serían muy sencillas, (básicamente copiar y pegar los trozos de código intercambiados).

**<span style="color: rgb(22, 145, 121);">Conexiones</span>:**

Usaremos los pines estándar de comunicación serie de Arduino:

- 0 : RX (pin por el que RECIBE los datos serie)
- 1 : TX (pin por el que ENVÍA los datos serie)

Para comunicación en 2 direcciones: los 2 pueden enviar / recibir. Las conexiones TX/RX se intercambian (lo que uno envía -TX- tiene que entrar en el otro -RX-). Cualquiera de las 2 puede ser Maestro o Esclavo. **IMPORTANTE**: Conectar ambas GND de las placas.

![](https://libros.catedu.es/uploads/images/gallery/2022-02/embedded-image-cier3hmo.png)

En el siguiente ejemplo , el maestro, cada 3 segundos envía un carácter al esclavo.

- Si envía una "r", el esclavo hará parpadear su led (d13) rápido.
- Si envía una "l", el esclavo hará parpadear su led (d13) lento.

El programa para el Arduino MAESTRO es:

[https://create.arduino.cc/editor/javierquintana/4e485b39-a075-416c-a951-4c7caa4edcc0/preview](https://create.arduino.cc/editor/javierquintana/4e485b39-a075-416c-a951-4c7caa4edcc0/preview)

<iframe frameborder="0" src="https://create.arduino.cc/editor/javierquintana/4e485b39-a075-416c-a951-4c7caa4edcc0/preview?embed" style="height: 510px; width: 100%; margin: 10px 0;"></iframe>

El programa para el Arduino ESCLAVO es:

[https://create.arduino.cc/editor/javierquintana/605a2867-7265-4e29-8253-d311696dbe05/preview](https://create.arduino.cc/editor/javierquintana/605a2867-7265-4e29-8253-d311696dbe05/preview)

<iframe frameborder="0" src="https://create.arduino.cc/editor/javierquintana/605a2867-7265-4e29-8253-d311696dbe05/preview?embed" style="height: 510px; width: 100%; margin: 10px 0;"></iframe>

#### <span style="color: rgb(22, 145, 121);">**Si no tienes dos ARDUINOS**</span>

Puedes hacerlo con una simulación en [https://www.tinkercad.com](https://www.tinkercad.com) en nuestro caso este fue el resultado:

Lo tienes aquí [https://www.tinkercad.com/things/dMPodSrbw0n-comunicacion-maestro-esclavo/editel?sharecode=FKrzh6UQa4CZ2UL4ma2WfTuJ3aIRTXRyNJtCWJAAvww](https://www.tinkercad.com/things/dMPodSrbw0n-comunicacion-maestro-esclavo/editel?sharecode=FKrzh6UQa4CZ2UL4ma2WfTuJ3aIRTXRyNJtCWJAAvww)

Y además lo puedes embeber en tu blog, página web... por ejemplo lo tienes aquí, ¡¡pincha en simulación!!

<iframe frameborder="0" height="453" marginheight="0" marginwidth="0" scrolling="no" src="https://www.tinkercad.com/embed/b44kP2GnRXy?editbtn=1" width="725"></iframe>

Si n lo ves claro, pincha en el vídeo

<iframe allowfullscreen="allowfullscreen" height="314" id="bkmrk--5" src="//www.youtube.com/embed/GNtVo0xP9mA?rel=0" width="560"></iframe>

#### **<span style="color: rgb(22, 145, 121);">Si tienes dos ARDUINOS</span>**

Pues a disfrutar de tu "Red particular" :

<iframe allowfullscreen="allowfullscreen" height="314" id="bkmrk--7" src="//www.youtube.com/embed/VmFl1mXa65U?rel=0" width="560"></iframe>

## <span style="color: rgb(22, 145, 121);">**Otras conexiones**</span>

<p class="callout info">Si quieres conectar dos Arduinos por comunicación I2C [visita esta página.](https://dronebotworkshop.com/i2c-arduino-arduino/)</p>

Para la comunicación **en una dirección**:

![](https://libros.catedu.es/uploads/images/gallery/2022-02/embedded-image-zsijufgb.png)

*maestro(izquierda) -&gt; esclavo(derecha)* sólo necesitamos 1 conexión:

NOTA:

Ocurre que esos pines también los usa para comunicarse por USB cuando está conectado al ordenador, de manera que si queremos tener ambas conexiones (USB/trasmisión serie) deberemos crear una nueva conexión serie (en una conexión software). Sólo podemos conectar 2 Arduinos pues sólo hay un puerto de serie en cada uno de ellos. Aunque la conexión es en un sentido, es necesario conectar los dos cables TX-RX y RX-TX

En este ejemplo, una de las Arduino la vamos a tener conectada al PC, por tanto, en el MAESTRO vamos a crear la conexión software serie sobre los pines 10(RX), 11(TX).

Lo puedes comprobar en la siguiente imagen:

![](https://libros.catedu.es/uploads/images/gallery/2022-02/embedded-image-wktrfgmg.png)

El programa sería el siguiente en el maestro

```

///// MAESTRO
int i=0; 
//CREAMOS UN NUEVO PUERTO SERIE (RX, TX)
SoftwareSerial Serie2(10,11); 
void setup()
{ pinMode(13,OUTPUT);
  Serial.begin(9600);          //Inicializa puerto estándar
  Serie2.begin(9600);         //Inicializa nuevo puerto
  digitalWrite(13,LOW);
}
void loop()
{ Serie2.write("r");
  delay(3000);
  Serie2.write("l");
  delay(3000);
}
```

Y en el esclavo sería el siguiente código :

```
////////////////////esclavo
void setup()

{ pinMode(13,OUTPUT);
  Serial.begin(9600);
}
void loop()

{ while (Serial.available())
   {
      //Guardamos en la variable dato el valor leido
       char dato= Serial.read();
       //Comprobamos el dato
       switch(dato)
       {//Si recibimos una 'r' ...
         case 'r':
         {for(int i=0; i<20 i++)
               digitalWrite(13,HIGH);
               delay(80);
               digitalWrite(13,LOW);
               delay(80);}
           break;
         }
         case 'l':
         {for(int i=0; i<10 i++)
               digitalWrite(13,HIGH);
               delay(200);
               digitalWrite(13,LOW);
               delay(200);}
           break;
}}}}
```