martes, 22 de octubre de 2013

Comunicación serie entre dos Arduinos

En algún momento nuestro cacharreo con arduino nos llevará a querer comunicar varias de estas placas amigas enviando y recibiendo información. En principio no debería suponer mayor dificultad que la que nos puede suponer enviar y recibir datos a través del monitor serie del IDE de Arduino.

Sin embargo esto no es así. En primer lugar, debemos recordar que las placas Arduino envían y reciben los datos byte a byte (o char a char), por lo que la recepción de cadenas de caracteres debe ser codificada convenientemente.

Por otra parte, una cuestión que me supuso un importante dolor de cabeza fue la necesidad de conectar los terminales de tierra de ambas placas para que funcionara la comunicación serie correctamente, ya que en caso contrario, sólo se reciben caracteres "extraños".

El código de ejemplo que he cargado en el arduino que actúa de emisor es el siguiente:

unsigned int i;

void setup() {
  Serial3.begin(9600);
  i=0;
}

void SendCommand(String string) {
  Serial3.print(string);
}

void loop() {
  SendCommand("Mensaje de prueba: DOSCOM=");
  SendCommand(String(i++));
  SendCommand(String('\n'));
  delay(2000);
}

Mientras que el código de ejemplo que he cargado en el arduino que actúa de receptor es el siguiente:

void setup() {
  Serial3.begin(9600);
  Serial.begin(9600);
}

String SerialCommand() {
  char c;
  String string="";
  while (c!='\n') {
     c = Serial3.read();
     if (c!=-1) {,
      string+=c;
     }
    delayMicroseconds(500);
  }
  return string;
}

void loop() {
  if (Serial3.available()) {
    Serial.print(SerialCommand());
  }
}

Como puede apreciarse no son precisamente ejemplos excesivamente elaborados o complejos, si bien cumplen perfectamente su función.

Destacar que para este ejemplo he tirado de dos placas arduino mega, motivo por el cual utilizo el Serial3. Esta posibilidad no está disponible en las placas Arduino Uno, ya que únicamente tienen un puerto serie, por lo que habrá que modificar convenientemente el código anterior.

Dejo un pequeño vídeo donde se puede apreciar en acción todo lo comentado. Por cierto, pregunta de examen: ¿en qué famosa película y anuncio podía escucharse la canción de fondo que aparece en el vídeo?




Finalmente os recuerdo que en caso de utilizar el puerto serie habitual en cualquier placa de la familia Arduino, deberemos desconectar la comunicación entre placas para programarlas, ya que de no hacerlo nos generará un error al tratar de cargar el código. Esto es debido a que la conexión USB con nuestro ordenador usa precisamente este puerto serie para programar la placa.

1 comentario:

  1. Gracias, muy orientador, mira que hay una coma de mas al final de una linea, gracias de nuevo, funciono perfecto.

    ResponderEliminar