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:24: 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:
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<20; i++){
digitalWrite(13,HIGH);
delay(80);
digitalWrite(13,LOW);
delay(80);
}
break;
case 'l': //si recibimos una 'l' ...
for(int i=0; i<10; i++){
digitalWrite(13,HIGH);
delay(1000);
digitalWrite(13,LOW);
delay(1000);
}
break;
default:
digitalWrite(13,LOW);
break;
}
}
Si no tienes dos ARDUINOS
Puedes hacerlo con una simulación en 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
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 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;
}}}}