Comunicación entre dos Arduinos con el Puerto Serie

En este artículo aprenderás a comunicar dos Arduinos entre sí utilizando el puerto Serie. Con esta aplicación, podrás implementar muchos sistemas de monitoreo y control, transmisión de datos, entre muchas otras aplicaciones.

Comunicación por el puerto Serie

Como vimos en un artículo anterior, la placa Arduino contiene un puerto de comunicación Serie, que consta de dos pines: uno de transmisión Tx y uno de recepción Rx. Este puerto está internamente conectado al puerto USB, por lo que podemos visualizarlo en un monitor de puerto Serie en nuestra computadora, como lo hicimos en el artículo anterior, si quieres verlo te dejo el video:

¿Cómo comunicar dos Arduinos entre sí?

Si bien el caso anterior es de utilidad, ¿cómo le puedo hacer para comunicar dos placas Arduino entre ellas, sin necesidad de la computadora? Es precisamente lo que veremos el día de hoy.

Muchas veces puede ser interesante que un Arduino le envíe órdenes de control a otro, por ejemplo, cuando estamos monitoreando temperatura y queremos enviarle ese dato a otra placa Arduino para que la almacene, o realice una operación de control como encender un ventilador. Los casos de aplicación son infinitos, te invito a que me comentes qué proyecto se te ocurre con esta idea.

Para explicarte como realizar esta comunicación, realizaremos varios ejemplos.

Encender y apagar LEDs de un Arduino a otro

El primer ejemplo será encender y apagar un LED enviando la orden desde un Arduino distinto como lo muestra el siguiente diagrama. Es importante conectar la terminal de GND del Arduino 1 con el GND del Arduino 2.

Diagrama de conexiones ejemplo 1. Controlar un led de un arduino por el puerto serie.
Diagrama de conexiones ejemplo 1.

Es muy importante que antes de programar cada Arduino, desconectes los cables que unen los dos puertos Serie, ya que este puerto Serie está internamente conectado al puerto USB por lo que es utilizado al reprogramar.

Vamos a agregar dos botones al Arduino 1, uno para encender y uno para apagar el LED, cuando se pulsen, enviará a través del puerto Serie la instrucción de encender el LED en el Arduino 2.

Utilizaremos el siguiente código en el Arduino 1

Recuerda que para evitar los rebotes en el push button, hay que utilizar una librería cómo lo vimos acá.

Sin embargo, esta librería se puede utilizar de una manera más completa, para asegurarnos de eliminar siempre los rebotes. Para eso creamos un evento que en este ejemplo lo estamos llamando «boton1_pulsado» que solamente se llamará cuando efectivamente sea pulsado y ejecutará la función void boton1_pulsado(GFButton & btn) solamente una vez.

Si quieres aprender esta manera mejorada de eliminar rebotes déjame tu petición en los comentarios y subiré un video explicando con mayor detalle esta función.

La idea es que al enviar una «palabra clave» el Arduino 2 la reciba y solamente si recibe esta instrucción, realice el encendido del LED. La palabra clave será «LED1ON_» para encender el LED y «LED1OFF_» para apagarlo.

En la función loop se agregan dos líneas boton1.process(); boton2.process(); estas líneas mandan revisar si los botones fueron pulsados, cuando se detecte el pulso, se ejecutará la función correspondiente al boton1 o boton2 según corresponda. Por ejemplo, si se pulsa el botón 1, se ejecutará la función botonON_pulsado y se enviará la palabra clave «LED1ON_» por el puerto Serie.

Observa que he agregado un guion bajo (_) al final de la palabra clave, esto nos va a servir para determinar el final de la palabra clave.

En el Arduino 2 agregaremos el siguiente código:

Con este código decodificaremos el mensaje que entre por el puerto Serie. Lo primero a observar es la función que viene hasta el final llamada serialEvent, esta función detecta cuando ha llegado un mensaje por el puerto Serie. Posteriormente guarda todo lo que ha llegado como mensaje en una variable llamada inputString caracter a caracter hasta que detecta el caracter de final, que para nuestro caso es el guion bajo «_».

En el loop principal, revisamos si el mensaje que llegó ha sido completamente recibido, si fue así, revisa si llegó «LED1ON» o LED1OFF», para realizar el encendido o apagado del LED según corresponda.

Si todo ha funcionado correctamente, deberías de ver algo así:

Resultado del ejemplo 1.

Este tipo de comunicación se conoce como unidireccional, ya que el Arduino 1 solamente funciona como emisor y el Arduino 2 solamente funciona como receptor, la información solamente tiene un camino.

Algunas recomendaciones:

  • No abrir el puerto Serie de tu computadora, ya que interfiere con la sincronización de la información.
  • Siempre desconectar los cables que unen los puertos Serie antes de reprogramar.
  • No utilizar una velocidad alta de transmisión, aunque no debería de haber problemas, con 9600 baudios es suficiente.
  • Evitar enviar mensajes demasiado largos (aunque si se puede).
  • No utilizar cables mayores a 10 metros con una velocidad de 9600 baudios.

¿Te está gustando este artículo?

Te invito a descargar totalmente gratis la Guía de Inicio en Arduino

Encontrarás mucha información extra, conceptos y sobre todo podrás llevarla contigo en todo momento

Comunicar 2 Arduinos con puerto Serie y LCD

Ahora realizaremos una comunicación full-dúplex; es decir, el Arduino 1 envía una orden, el Arduino 2 la recibe, la ejecuta y responde con un mensaje, por último, el Arduino 1 la recibe y ejecuta una acción, en nuestro caso será mostrar en un display un mensaje.

Conectaremos el siguiente diagrama utilizando un LCD:

Diagrama del ejemplo 2, dos arduinos por el puerto serie
Diagrama del ejemplo 2.

Para esto, utilizaremos el código mostrado a continuación:

ARDUINO 1

Se agregó al código anterior lo necesario para inicializar el LCD como lo vimos en este artículo.

Posteriormente, utilizamos la misma lógica que en el ejemplo anterior, agregamos una función para detectar cuando ha llegado algo por el puerto serie mediante la función serialEvent(), esta función se ejecuta de manera automática justo cuando llegó algo al puerto serie, la llamaremos interrupción por el puerto serie, más adelante te enseñaré a utilizar a detalle las interrupciones en Arduino.

Cada vez que al Arduino 1 le llegue el mensaje L1ON_ mandará a escribir en el LCD el mensaje "LED 1 -> ON" y cuando al Arduino 1 le llegue el mensaje L1OFF_ mandará a escribir en el LCD el mensaje "LED 1 -> OFF".

En el ARDUINO 2:

Realmente este código es el mismo que utilizamos anteriormente, solamente agregamos una respuesta por el puerto Serie cada vez que llegue el mensaje de encender o apagar.

Los mensajes que envían o reciben los Arduinos, pueden ser personalizados, pueden llevar solamente un caracter o string –como en este caso. Te mostré este ejemplo con strings, ya que es más interesante que solamente enviando un caracter y el funcionamiento es prácticamente el mismo.

Aplicaciones

Realmente este ejemplo demostrativo es muy sencillo, pero puedes aplicarlo a cualquier proyecto de interés, por ejemplo:

Puedes agregar un módulo de comunicación inalámbrico en la salida de cada puerto Serie, de esta manera evitarías el uso de cables para comunicar ambos sistemas, algo así:

Diagrama de la propuesta dos arduinos por el puerto serie
Diagrama de la propuesta.

En este caso he agregado dos módulos de comunicación ZigBee, son módulos de comunicación inalámbrica de bajo consumo energético, muy utilizados para la comunicación entre dispositivos electrónicos. Con ellos, la distancia de comunicación puede ir desde unos cuantos metros hasta algunos kilómetros (utilizando los accesorios adecuados), yo personalmente los he utilizado para rangos de unos cuantos metros hasta 200 metros sin ningún problema ni antenas adicionales.

También puedes reemplazar el módulo por un emisor/receptor infrarrojo, WiFi, etcétera. Realmente las opciones son demasiadas, lo importante es que aprendas el principio de funcionamiento y tú lo apliques en tu proyecto de acuerdo a tus necesidades.

Si quieres ver un ejemplo como el mostrado anteriormente, déjame tus comentarios solicitando este ejemplo.


¿Qué te ha parecido el artículo de esta ocasión?, déjame tus comentarios, dudas, sugerencias y sobre todo comparte tus resultados!

Recuerda visitar nuestras redes sociales

Deja un comentario