La comunicación serie es una de las formas más comunes de intercambiar datos entre dispositivos electrónicos. Sin embargo, cuando las distancias aumentan o el entorno tiene interferencias electromagnéticas, las señales de comunicación pueden ser propensas a errores. Ahí es donde entra en juego el estándar de comunicación RS485, que ofrece una alternativa robusta y efectiva. Arduino, con su versatilidad, nos permite aprovechar al máximo este protocolo de manera bastante sencilla.
En este artículo, veremos cómo se puede implementar la comunicación RS485 entre varios Arduinos utilizando módulos basados en el integrado MAX485, un chip que convierte señales TTL (de Arduino) a RS485 y viceversa. A lo largo de este tutorial, cubriremos tanto los conceptos básicos como ejemplos prácticos que te permitirán implementar la comunicación simplex, half-duplex y full-duplex entre microcontroladores Arduino, y explicar cómo puedes extender este sistema de comunicación para manejar múltiples dispositivos en un solo bus RS485.
¿Qué es el RS485?
El RS485 es un estándar de comunicaciones muy utilizado en la industria, conocido por su robustez y su capacidad de soportar largas distancias de transmisión, incluso en entornos industriales ruidosos. A diferencia de otros tipos de comunicación en serie, como el RS232, el RS485 permite conectar múltiples dispositivos en el mismo bus, lo que lo hace ideal para aplicaciones de control y automatización industrial.
Este protocolo es resistente al ruido electromagnético gracias a que usa un sistema de señalización diferencial, lo que significa que los datos se envían a través de dos hilos, A y B, que son versiones opuestas en voltaje. Esto permite que cualquier ruido recogido en los cables sea fácilmente cancelado, asegurando la integridad de la señal.
Una de las principales ventajas del RS485 es que admite distancias de hasta 1200 metros y velocidades de hasta 35 Mbps en cortas distancias, lo que lo convierte en un protocolo ideal para aplicaciones industriales y de control en entornos donde el cableado largo es necesario.
Modos de comunicación RS485
En la comunicación RS485, podemos configurar el sistema de tres maneras diferentes: simplex, half-duplex y full-duplex. Cada uno tiene sus particularidades y se implementa de acuerdo a las necesidades del proyecto.
Comunicación Simplex
En el modo simplex, la comunicación solo va en una dirección, es decir, un dispositivo actúa como emisor y otro como receptor. Esto es útil en situaciones donde solo se desea enviar o recibir datos sin necesidad de retroalimentación.
Por ejemplo, podemos configurar un sistema donde un Arduino lea un valor de sensor y lo envíe a otro dispositivo que simplemente lo reciba. En este caso, como solo hay datos viajando en una dirección, se puede prescindir de ciertos elementos adicionales de control, haciendo el sistema más simple y económico.
Comunicación Half-Duplex
La mayoría de las aplicaciones RS485 en Arduino se implementan en modo half-duplex porque este solo requiere dos hilos, y te permite tanto enviar como recibir datos, aunque no simultáneamente. Es decir, si un dispositivo está enviado datos, los otros dispositivos deben estar en modo recepción, y viceversa.
Para cambiar entre los modos de transmisión y recepción, se usan pines adicionales (RE/DE) en el módulo MAX485, que controlarás desde el código para determinar si el dispositivo debe estar enviando o recibiendo en un momento dado.
Este modo es especialmente útil si tienes varios dispositivos en el mismo bus que necesitan comunicarse entre ellos, pero no de manera simultánea.
Comunicación Full-Duplex
En el modo full-duplex, los dispositivos pueden enviar y recibir datos al mismo tiempo. Sin embargo, para implementar full-duplex en RS485 se requieren dos pares de hilos trenzados, lo que aumenta el costo y la complejidad del cableado. Además, necesitarás dos módulos MAX485 por cada dispositivo para gestionar los canales de transmisión y recepción de manera separada.
Componentes necesarios para la comunicación RS485 con Arduino
Para implementar un sistema de comunicación RS485 en Arduino, necesitarás los siguientes componentes:
- Uno o más Arduinos: Cualquier modelo de Arduino servirá, pero en este tutorial utilizaremos Arduino UNO y Arduino MEGA como ejemplos.
- Módulos MAX485: Estos módulos permiten convertir las señales TTL de Arduino a RS485 y viceversa. Son muy económicos y fáciles de encontrar en tiendas como AliExpress o eBay.
- Resistencias de terminación: Se suele colocar una resistencia de entre 120 ohmios en cada extremo del bus para evitar reflexiones en la señal. En distancias cortas, es posible prescindir de ellas, pero en instalaciones más largas son indispensables para mantener la integridad de la señal.
- Cables de par trenzado: Se recomienda usar cables de par trenzado para minimizar la interferencia electromagnética, especialmente en entornos industriales ruidosos.
Esquema general de conexión
Conectar los módulos MAX485 a un Arduino es bastante sencillo. Los pines más importantes son A y B, que corresponden a las líneas del bus RS485. Estos pines deben conectarse a todos los dispositivos en el bus. Además, el módulo cuenta con pines RE y DE que controlan si el módulo está en modo receptor o emisor.
En general, la conexión de los módulos al Arduino se realiza de la siguiente manera:
- VCC y GND del módulo se conectan a VCC y GND en el Arduino.
- DI (Data Input) del módulo se conecta al pin TX de Arduino si el módulo va a actuar como emisor.
- RO (Receiver Output) del módulo se conecta al pin RX de Arduino si el módulo va a actuar como receptor.
- DE y RE deben controlarse desde un pin digital de Arduino para alternar entre los modos de transmisión y recepción.
Si solo necesitas que el módulo funcione como emisor o receptor, puedes conectar RE y DE directamente a HIGH o LOW. Sin embargo, para comunicaciones más complejas donde el dispositivo tiene que cambiar entre transmitir y recibir, es mejor controlar estos pines desde el software.
Ejemplos de código para la comunicación RS485
A continuación, se muestran varios ejemplos que cubren las diferentes configuraciones de comunicación con RS485 en Arduino.
Comunicación Simplex
Código del emisor
Para un sistema simplex básico en el que solo tenemos un emisor y un receptor, el código para el emisor podría verse así:
void setup() { Serial.begin(9600); } void loop() { Serial.write(analogRead(0)); delay(500); }
Código del receptor
El receptor simplemente leerá los datos que llegan a través del puerto serie:
void setup() { Serial.begin(9600); } void loop() { if (Serial.available()) { int data = Serial.read(); Serial.println(data); } }
Comunicación Half-Duplex
En este ejemplo, implementamos un sistema half-duplex donde los dispositivos alternan entre enviar y recibir datos.
Código del maestro
const int reDePin = 2; void setup() { pinMode(reDePin, OUTPUT); Serial.begin(9600); } void loop() { digitalWrite(reDePin, HIGH); Serial.write('H'); delay(100); digitalWrite(reDePin, LOW); if (Serial.available()) { int data = Serial.read(); Serial.println(data); } }
Código del esclavo
const int reDePin = 2; void setup() { pinMode(reDePin, OUTPUT); Serial.begin(9600); } void loop() { digitalWrite(reDePin, LOW); if (Serial.available()) { int data = Serial.read(); delay(100); digitalWrite(reDePin, HIGH); Serial.write(data + 1); } }
Comunicación Full-Duplex
Para implementar la comunicación full-duplex, se necesitarán dos módulos MAX485 por Arduino. Cada par de módulos se encargará de una línea de datos: uno para transmitir y otro para recibir.
El código será similar a los ejemplos previos, pero en este caso ambos dispositivos siempre estarían transmitiendo y recibiendo simultáneamente.
Ampliación a múltiples dispositivos en RS485
El RS485 tiene la capacidad de conectar hasta 32 dispositivos en un solo bus, y en casos especiales se puede llegar a más. Eso lo convierte en una opción excelente para proyectos que involucren varios microcontroladores o dispositivos. Para identificar cada uno de ellos en la red, es común implementar una dirección o ID para cada dispositivo.
En este caso, el maestro enviará un mensaje con la dirección del dispositivo con el que quiere comunicarse, y solo ese dispositivo será el encargado de procesar el mensaje y dar una respuesta.
A esto se le suma la posibilidad de usar protocolos más complejos como MODBUS, que permiten crear redes altamente eficientes y seguras en la industria.
Para proyectos de hogar o aplicaciones menos demandantes, simplemente puedes asignar un identificador a cada Arduino y hacer que respondan solo a los mensajes destinados a ellos.