Skip to main content

Por último comunicación Arduino-Arduino

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.

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

Objetivos
  • 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

Montaje 2: Conectar dos Arduinos

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).

Conexiones:Conexiones:

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.

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:

////////////////////// ARDUINO MAESTRO /////////////////
void setup(){ 
  Serial.begin(9600);
}
void loop()
{ Serial.write("r");
  delay(3000);
  Serial.write("l");
  delay(3000);
}

El programa para el Arduino ESCLAVO es:

////////////// ARDUINO ESCLAVO /////////
void setup(){ 
  pinMode(13,OUTPUT);
  Serial.begin(9600);
}
void loop(){ 
        char dato= Serial.read();//Guardamos en la variable dato el valor leido
        switch(dato){ //Comprobamos el dato
         case 'r':  //Si recibimos una 'r' ...
          for(int i=0; i

Si no tienes dos ARDUINOS

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

Si tienes dos ARDUINOS

Pues a disfrutar de tu "Red particular" :

Otras conexiones

Para la comunicación en una dirección:

  maestro(izquierda) -> 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:

El programa sería el siguiente:siguiente en el maestro

```cpp


///// 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; }}}}

```