- Diferència entre la comunicació UART i RS485
- Components necessaris
- Diagrama de circuits per a comunicacions per cable de llarga distància
- Mòdul convertidor MAX485 UART-RS485
- Cable Ethernet CAT-6E
- Explicació del codi Arduino
- Conclusió
Fa temps que utilitzem plaques de desenvolupament de microcontroladors com Arduino, Raspberry Pi, NodeMCU, ESP8266, MSP430, etc. a aquestes distàncies, la comunicació entre els diferents mòduls de sensor, relés, actuadors i controladors es pot fer fàcilment mitjançant cables de pont simple sense que ens preocupi la distorsió del senyal al mitjà i els sorolls elèctrics que s’hi introdueixen. Però si esteu construint un sistema de control amb aquestes plaques de desenvolupament a una distància superior a 10 a 15 metres, hauríeu de tenir en compte el soroll i la potència del senyal, perquè si voleu que el vostre sistema funcioni de manera fiable, no us podeu permetre el luxe de perdre el dades durant la transferència.
Hi ha molts tipus diferents de protocols de comunicació en sèrie, com I2C i SPI, que es poden implementar fàcilment amb Arduino i avui analitzarem un altre protocol més utilitzat anomenat RS485, que s’utilitza molt habitualment en entorns industrials de gran soroll per transferir les dades una llarga distància. En aquest tutorial, coneixerem el protocol de comunicació RS485 i com implementar-lo amb els dos Arduino Nano que tenim amb nosaltres i com utilitzar el mòdul de conversió MAX485 RS485 a UART. Anteriorment també hem realitzat la comunicació MAX485 amb Arduino i també la comunicació MAX485 amb Raspberry pi, també podeu consultar-les si us interessa.
Diferència entre la comunicació UART i RS485
La majoria dels sensors de baix cost i altres mòduls com GPS, Bluetooth, RFID, ESP8266, etc. que s’utilitzen habitualment amb Arduino, Raspberry Pi al mercat utilitzen comunicació basada en TTL UART perquè només requereix 2 cables TX (transmissor) i RX (Receptor). No és un protocol de comunicació estàndard, però és un circuit físic amb el qual podeu transmetre i rebre dades de sèrie amb altres perifèrics. Només pot transmetre / rebre dades en sèrie, de manera que primer converteix les dades paral·leles en dades de sèrie i després transmet les dades.
UART és un dispositiu de transmissió asíncrona, de manera que no hi ha cap senyal de rellotge per sincronitzar les dades entre els dos dispositius, sinó que utilitza bits d’inici i parada a l’inici i al final de cada paquet de dades, respectivament, per marcar les extremitats de les dades que es transfereixen. Les dades transmeses per UART s’organitzen en paquets. Cada paquet conté 1 bit inicial, de 5 a 9 bits de dades (depenent de la UART), un bit de paritat opcional i 1 o 2 bits de parada. Està molt ben documentat i àmpliament utilitzat i també té un bit de paritat per permetre la comprovació d’errors. Però hi ha algunes limitacions, ja que no pot suportar múltiples esclaus i múltiples amos i el marc de dades màxim es limita a 9 bits. Per a la transferència de dades, els índexs de transmissió tant de Master com de Slave han d’estar entre el 10% l’un de l’altre. A continuació es mostra l'exemple de com un personatge és un transmissor sobre una línia de dades UART. El senyal alt i mínim es mesuren amb el nivell GND, de manera que canviar el nivell GND tindrà un efecte desastrós en la transferència de dades.

D'altra banda, RS485 és una comunicació més basada en la indústria que es desenvolupa per a una xarxa de múltiples dispositius que també es poden utilitzar a distàncies llargues i a velocitats més grans. Funciona amb un mètode de mesura de senyalització diferencial en lloc de mesurar la tensió mitjançant el pin GND. Els senyals RS485 són flotants i cada senyal es transmet per una línia Sig + i una línia Sig-.
El receptor RS485 compara la diferència de tensió entre ambdues línies, en lloc del nivell de tensió absolut d’una línia de senyal. Això funciona bé i evita l’existència de bucles terrestres, una font comuna de problemes de comunicació. Els millors resultats s’aconsegueixen si les línies Sig + i Sig- es trenquen a mesura que la torsió anul·la l’efecte del soroll electromagnètic induït en un cable i proporciona una immunitat molt millor contra el soroll que permet al RS485 transmetre les dades fins a 1200 m d’interval.. El parell trenat també permet que les velocitats de transmissió siguin molt superiors a les que es poden fer amb cables rectes. A distàncies de transmissió petites es poden aconseguir velocitats de fins a 35 Mbps amb RS485, tot i que la velocitat de transmissió disminuirà amb la distància. A 1200 m de velocitat de transmissió, podeu utilitzar només 100 kbps de velocitat de transmissió. Necessiteu un cable Ethernet especial per realitzar aquest protocol de comunicació. Hi ha moltes categories de cables Ethernet que podem utilitzar, com ara CAT-4, CAT-5, CAT-5E, CAT-6, CAT-6A, etc. Al nostre tutorial utilitzarem el cable CAT-6E que té 4 parells trenats de cables de 24AWG i pot suportar fins a 600 MHz. Es connecta als dos extrems mitjançant un connector RJ45. Els nivells de tensió de línia típics dels controladors de línia són d'un mínim de ± 1,5 V fins a un màxim d'aproximadament ± 6 V. La sensibilitat d'entrada del receptor és de ± 200 mV. El soroll en el rang de ± 200 mV està essencialment bloquejat a causa de la cancel·lació de soroll en mode comú. Un exemple de com es transfereix un byte (0x3E) a través de les dues línies de la comunicació RS485.

Components necessaris
- Mòdul convertidor 2 × MAX485
- 2 × Arduino Nano
- LCD alfanumèric 2 × 16 * 2
- Potenciòmetres de neteja de 2 × 10k
- Cable Ethernet Cat-6E
- Taulers de pa
- Jumper Wires
Diagrama de circuits per a comunicacions per cable de llarga distància
La imatge següent mostra el diagrama del circuit del transmissor i del receptor per a la comunicació per cable de llarga distància d’Arduino. Tingueu en compte que tant els circuits del transmissor com el dels receptors tenen un aspecte idèntic, l’únic que difereix és el codi que hi ha escrit. També per a la demostració, fem servir una placa com a transmissor i una altra com a receptor, però podem programar fàcilment les plaques perquè funcionin com a transmissor i receptor amb la mateixa configuració.
El diagrama de connexió del circuit anterior també es dóna a continuació.


Com podeu veure més amunt, hi ha dos parells de circuits gairebé idèntics, cadascun amb un nano Arduino, un LCD alfanumèric de 16 * 2 i un convertidor MAX485 UART a RS485 IC connectats a cada extrem d’un cable Ethernet Cat-6E mitjançant un connector RJ45. El cable que he utilitzat al tutorial té una longitud de 25 m. Enviarem algunes dades des del costat de l’emissor pel cable des del Nano que es converteix en senyals RS485 a través del mòdul MAX RS485 que funciona en mode mestre.
Al final de la recepció, el mòdul convertidor MAX485 funciona com a esclau i, escoltant la transmissió del mestre, torna a convertir les dades RS485 que ha rebut als senyals UART TTL estàndard de 5 V per ser llegits pel Nano receptor i mostrar-los el 16 * Hi ha connectat 2 LCD alfanumèrics.
Mòdul convertidor MAX485 UART-RS485
Aquest mòdul convertidor UART-RS485 té un xip MAX485 incorporat que és un transceptor de baixa potència i de velocitat reduïda que s’utilitza per a la comunicació RS-485. Funciona amb una única font d’alimentació de + 5V i el corrent nominal és de 300 μA. Funciona en comunicació semi-dúplex per implementar la funció de convertir el nivell TTL en nivell RS-485, cosa que significa que pot transmetre o rebre en qualsevol moment, no tots dos, i pot aconseguir una velocitat de transmissió màxima de 2,5 Mbps. El transceptor MAX485 dibuixa un corrent de subministrament d'entre 120μA i 500μA en condicions de descàrrega o de càrrega completa quan el conductor està inhabilitat. El controlador està limitat per al corrent de curtcircuit i les sortides del controlador es poden situar en un estat d’alta impedància a través del circuit d’aturada tèrmica. L’entrada del receptor té una funció de seguretat que garanteix una sortida lògica elevada si l’entrada és de circuit obert.A més, té un fort rendiment anti-interferències. També té LED integrats per mostrar l’estat actual del xip, és a dir, si el xip s’alimenta o si transmet o rep dades, facilitant la seva depuració i ús.

El diagrama de circuits que s’indica anteriorment explica com el MAX485 IC integrat està connectat a diversos components i proporciona capçaleres d’espaiat estàndard de 0,1 polzades que s’utilitzaran amb taulers de suport si voleu.
Cable Ethernet CAT-6E
Quan pensem en la transferència de dades de llarga distància, pensem immediatament en connectar-nos a Internet mitjançant cables Ethernet. Avui en dia, utilitzem principalment Wi-Fi per a la connectivitat a Internet, però abans utilitzàvem cables Ethernet que anaven a cada ordinador personal per connectar-lo a Internet. La principal raó per la qual s’utilitzen aquests cables Ethernet sobre cables normals és que proporcionen una protecció molt millor contra el soroll i la distorsió del senyal a distàncies elevades. Tenen una jaqueta protectora sobre la capa d’aïllament per protegir-se de la interferència electromagnètica i, a més, cada parell de cables es torça junts per evitar la formació de bucles de corrent i, per tant, una protecció molt millor contra el soroll. Sovint s’acaben amb connectors RJ45 de 8 pins als dos extrems. Hi ha moltes categories de cables Ethernet que podem utilitzar com CAT-4, CAT-5,CAT-5E, CAT-6, CAT-6A, etc. Al nostre tutorial, farem servir un cable CAT-6E que té 4 parells trenats de cables de 24AWG i pot suportar fins a 600 MHz.
Imatge que mostra com es trenquen un parell de cables a l'interior de la capa d'aïllament del cable CAT-6E

Connector RJ-45 destinat al cable Ethernet CAT-6E
Explicació del codi Arduino
En aquest projecte, estem utilitzant dos Arduino Nano, un com a transmissor i un com a receptor, cadascun amb una pantalla LCD alfanumèrica de 16 * 2 per mostrar els resultats. Per tant, al codi Arduino ens centrarem a enviar les dades i mostrar les dades enviades o rebudes a la pantalla LCD.
Per al costat del transmissor:
Comencem amb la inclusió de la biblioteca estàndard per conduir el LCD i declarem el pin D8 de l’Arduino Nano com a pin de sortida que posteriorment utilitzarem per declarar el mòdul MAX485 com a transmissor o receptor.
int enablePin = 8; int potval = 0; #incloure
Ara arribem a la part de configuració. Estirarem el pin d'activació per posar el mòdul MAX485 en mode transmissor. Com que és un CI semi-dúplex, per tant, no pot transmetre ni rebre alhora. Aquí també inicialitzarem la pantalla LCD i imprimirem un missatge de benvinguda.
Serial.begin (9600); // inicialitzar la sèrie a velocitat de transmissió 9600: pinMode (enablePin, OUTPUT); lcd.begin (16,2); lcd.print ("CIRCUIT DIGEST"); lcd.setCursor (0,1); lcd.print ("Transmissor Nano"); retard (3000); lcd.clear ();
Ara, al bucle, escrivim un valor enter que augmenta contínuament a les línies serials que després es transmet a l’altre nano. Aquest valor també s’imprimeix a la pantalla LCD per a la visualització i depuració.
Serial.print ("Valor enviat ="); Serial.println (potval); // Escriptura sèrie POTval al bus RS-485 lcd.setCursor (0,0); lcd.print ("Valor enviat"); lcd.setCursor (0,1); lcd.print (potval); retard (1000); lcd.clear (); potval + = 1;

Cara del receptor:
Una vegada més, comencem amb la inclusió de la biblioteca estàndard per conduir el LCD i declarem el pin D8 de l’Arduino Nano com a pin de sortida que posteriorment utilitzarem per declarar el mòdul MAX485 com a transmissor o receptor.
int enablePin = 8; #incloure
Ara arribem a la part de configuració. Estirarem el pin d'activació per posar el mòdul MAX485 en mode receptor. Com que és un CI semi-dúplex, per tant, no pot transmetre ni rebre alhora. Aquí també inicialitzarem la pantalla LCD i imprimirem un missatge de benvinguda.
Serial.begin (9600); // inicialitzar la sèrie a velocitat de transmissió 9600: pinMode (enablePin, OUTPUT); lcd.begin (16,2); lcd.print ("CIRCUIT DIGEST"); lcd.setCursor (0,1); lcd.print ("Receptor Nano"); retard (3000); digitalWrite (enablePin, LOW); // (Pin 8 sempre BAIX per rebre valor del Mestre)
Ara, al bucle, comprovem si hi ha alguna cosa disponible al port sèrie i després llegim les dades i, ja que les dades entrants són un nombre enter, les analitzem i les visualitzem a la pantalla LCD connectada.
int pwmval = Serial.parseInt (); // Rebeu el valor INTEGER del mestre mitjançant RS-485 Serial.print ("Tinc valor"); Serial.println (pwmval); lcd.setCursor (0,0); lcd.print ("Valor rebut"); lcd.setCursor (0,1); lcd.print (pwmval); retard (1000); lcd.clear ();

Conclusió
A continuació trobareu la configuració de prova que hem utilitzat per a aquest projecte.

El funcionament complet d’aquest projecte es pot trobar al vídeo enllaçat a continuació. Aquest mètode és un dels mètodes senzills i fàcils d’implementar per transferir les dades a llargues distàncies. En aquest projecte, només hem utilitzat una velocitat de transmissió de 9600, que és molt inferior a la velocitat màxima de transferència que podem assolir amb el mòdul MAX-485, però aquesta velocitat és adequada per a la majoria dels mòduls de sensor que hi ha i no necessitem realment totes les velocitats màximes mentre es treballa amb Arduino i altres plaques de desenvolupament, tret que utilitzeu el cable com a connexió ethernet i necessiteu tota l’amplada de banda i la velocitat de transferència que pugueu obtenir. Juga amb la velocitat de transferència pel teu compte i prova també amb altres tipus de cable Ethernet. Si teniu alguna pregunta, deixeu-les a la secció de comentaris de sota o utilitzeu els nostres fòrums i faré tot el possible per respondre-les. Fins llavors, adios!
