31 dic. 2011

Conectar 2 Arduino para comunicarse

Podemos conectar 2 Arduino para que se envíen datos uno al otro de muchas maneras, ya hemos visto el bluetooth, también mediante otros sistemas inalámbricos, como xbee, cable de red ethernet, etc.
Pero vamos a ver un método sencillo, mediante la conexión serie que todas las Arduino llevan y que normalmente usamos para cargar los programas o para ver por el monitor del IDE lo que ocurre en nuestra tarjeta.
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 envíar/ recibir).
Las conexiones TX/RX se intercambian (lo que uno envía -TX- tiene que entrar en el otro -RX-).
Cualquiera de las 2 pueden ser Maestro o Esclavo.
IMPORTANTE: Para la correcta comunicación serie necesitamos unir los GND de las 2 Arduino

Para la comunicación en 1 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).
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).


esclavomaestro

CÓDIGO:
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.

MAESTRO:
//MAESTRO
#include
int i=0; 
SoftwareSerial Serie2(10,11); //CREAMOS UN NUEVO PUERTO SERIE (RX, TX)

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



ESCLAVO:
//ESCLAVO
void setup()
{
  pinMode(13,OUTPUT);
  Serial.begin(9600);
  //Apagamos el led 13
  digitalWrite(13,LOW);
}

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 font="" i="">
               digitalWrite(13,HIGH);
               delay(80);
               digitalWrite(13,LOW);
               delay(80);}
           break;
         }
         case 'l':
         {
             for(int i=0; i<10 font="" i="">
               digitalWrite(13,HIGH);
               delay(200);
               digitalWrite(13,LOW);
               delay(200);}
           break;
}}}}