La comunicació sèrie és una de les maneres més comunes d'intercanviar dades entre dispositius electrònics. Tot i això, quan les distàncies augmenten o l'entorn té interferències electromagnètiques, els senyals de comunicació poden ser propenses a errors. És aquí on entra en joc l'estàndard de comunicació RS485, que ofereix una alternativa robusta i efectiva. Arduino, amb la seva versatilitat, ens permet aprofitar al màxim aquest protocol de manera força senzilla.
En aquest article, veurem com es pot implementar la comunicació RS485 entre diversos Arduinos utilitzant mòduls basats en l'integrat MAX485, un xip que converteix senyals TTL (d'Arduino) a RS485 i viceversa. Al llarg d'aquest tutorial, cobrirem tant els conceptes bàsics com exemples pràctics que et permetran implementar la comunicació simplex, half-duplex i full-duplex entre microcontroladors Arduino, i explicar com pots estendre aquest sistema de comunicació per manejar múltiples dispositius en un sol bus RS485.
Què és el RS485?
El RS485 és un estàndard de comunicacions molt utilitzat a la indústria, conegut per la seva robustesa i la seva capacitat de suportar llargues distàncies de transmissió, fins i tot en entorns industrials sorollosos. A diferència d'altres tipus de comunicació en sèrie, com l'RS232, el RS485 permet connectar múltiples dispositius al mateix bus, cosa que el fa ideal per a aplicacions de control i automatització industrial.
Aquest protocol és resistent al soroll electromagnètic gràcies al fet que utilitza un sistema de senyalització diferencial, el que significa que les dades s'envien a través de dos fils, A i B, que són versions oposades a voltatge. Això permet que qualsevol soroll recollit als cables sigui fàcilment cancel·lat, assegurant la integritat del senyal.
Un dels principals avantatges del RS485 és que admet distàncies de fins a 1200 metres i velocitats de fins a 35 Mbps en curtes distàncies, cosa que el converteix en un protocol ideal per a aplicacions industrials i de control en entorns on el cablejat llarg és necessari.
Maneres de comunicació RS485

A la comunicació RS485, podem configurar el sistema de tres maneres diferents: simplex, half-duplex i full-duplex. Cadascú té les seves particularitats i s'implementa segons les necessitats del projecte.
Comunicació Simplex
En mode simplex, la comunicació només va en una direcció, és a dir, un dispositiu actua com emissor i un altre com receptor. Això és útil en situacions on només es vol enviar o rebre dades sense necessitat de retroalimentació.
Per exemple, podem configurar un sistema on un Arduino llegeixi un valor de sensor i l'envieu a un altre dispositiu que simplement el rebeu. En aquest cas, com que només hi ha dades viatjant en una adreça, es pot prescindir de certs elements addicionals de control, fent el sistema més simple i econòmic.
Comunicació Half-Duplex
La majoria de les aplicacions RS485 a Arduino s'implementen en mode half-duplex perquè aquest només requereix dos fils, i us permet tant enviar com rebre dades, encara que no simultàniament. És a dir, si un dispositiu està enviat dades, els altres dispositius han d'estar en mode de recepció, i viceversa.
Per canviar entre els modes de transmissió i recepció, es fan servir pins addicionals (RE/DE) al mòdul MAX485, que controlaràs des del codi per determinar si el dispositiu ha d'estar enviant o rebent en un moment donat.
Aquest mode és especialment útil si tens diversos dispositius al mateix bus que necessiten comunicar-se entre ells, però no de manera simultània.
Comunicació Full-Duplex
En el mode full-duplex, els dispositius poden enviar i rebre dades alhora. No obstant això, per implementar full-duplex a RS485 es requereixen dos parells de fils trenats, el que augmenta el cost i la complexitat del cablatge. A més, necessitareu dos mòduls MAX485 per cada dispositiu per gestionar els canals de transmissió i recepció de manera separada.
Components necessaris per a la comunicació RS485 amb Arduino
Per implementar un sistema de comunicació RS485 a Arduino, necessitaràs els components següents:
- Un o més Arduinos: Qualsevol model d'Arduino servirà, però en aquest tutorial farem servir Arduino UNO i Arduino MEGA com a exemples.
- Mòduls MAX485: Aquests mòduls permeten convertir els senyals TTL d'Arduino a RS485 i viceversa. Són molt econòmics i fàcils de trobar a botigues com AliExpress o eBay.
- Resistències de terminació: Se sol col·locar una resistència d'entre 120 ohms a cada extrem del bus per evitar reflexions al senyal. En distàncies curtes, és possible prescindir-ne, però en instal·lacions més llargues són indispensables per mantenir la integritat del senyal.
- Cables de parell trenat: Es recomana fer servir cables de parell trenat per minimitzar la interferència electromagnètica, especialment en entorns industrials sorollosos.
Esquema general de connexió
Connectar els mòduls MAX485 a un Arduino és força senzill. Els pins més importants són A i B, que corresponen a les línies del bus RS485. Aquests pins han de connectar-se a tots els dispositius al bus. A més, el mòdul compta amb pins RE i DE que controlen si el mòdul està en mode receptor o emissor.
En general, la connexió dels mòduls a l'Arduino es realitza de la manera següent:
- VCC i GND del mòdul es connecten a VCC i GND a l'Arduino.
- DI (Data Input) del mòdul es connecta al pin TX d'Arduino si el mòdul actuarà com a emissor.
- RO (Receiver Output) del mòdul es connecta al pin RX d'Arduino si el mòdul actuarà com a receptor.
- DE i RE han de controlar des d'un pin digital d'Arduino per alternar entre els modes de transmissió i recepció.
Si només cal que el mòdul funcioni com a emissor o receptor, pots connectar RE i DE directament a HIGH o LOW. Tot i això, per a comunicacions més complexes on el dispositiu ha de canviar entre transmetre i rebre, és millor controlar aquests pins des del programari.
Exemples de codi per a la comunicació RS485
A continuació, es mostren diversos exemples que cobreixen les diferents configuracions de comunicació amb RS485 a Arduino.
Comunicació Simplex
Codi de l'emissor
Per a un sistema simplex bàsic en què només tenim un emissor i un receptor, el codi per a l'emissor es podria veure així:
void setup() { Serial.begin(9600); } void loop() { Serial.write(analogRead(0)); delay(500); }
Codi del receptor
El receptor simplement llegirà les dades que arriben a través del port sèrie:
void setup() { Serial.begin(9600); } void loop() { if (Serial.available()) { int data = Serial.read(); Serial.println(data); } }
Comunicació Half-Duplex
En aquest exemple, implementem un sistema half-duplex on els dispositius alternen entre enviar i rebre dades.
Codi del mestre
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); } }
Codi de l'esclau
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ó Full-Duplex
Per implementar la comunicació full-duplex, caldrà dos mòduls MAX485 per Arduino. Cada parell de mòduls s'encarregarà d'una línia de dades: una per transmetre i una altra per rebre.
El codi serà similar als exemples previs, però en aquest cas tots dos dispositius sempre estarien transmetent i rebent simultàniament.
Ampliació a múltiples dispositius a RS485
El RS485 té la capacitat de connectar fins a 32 dispositius en un sol bus, i en casos especials es pot arribar a més. Això ho converteix en una opció excel·lent per a projectes que involucrin diversos microcontroladors o dispositius. Per identificar cadascun d'ells a la xarxa, és comú implementar una adreça o ID per a cada dispositiu.
En aquest cas, el mestre enviarà un missatge amb l'adreça del dispositiu amb què es vol comunicar, i només aquest dispositiu serà l'encarregat de processar el missatge i donar una resposta.
A això se li suma la possibilitat de fer servir protocols més complexos com MODBUS, que permeten crear xarxes altament eficients i segures a la indústria.
Per a projectes de llar o aplicacions menys demandants, simplement pots assignar un identificador a cada Arduino i fer que responguin només als missatges destinats a ells.