- Diferența dintre comunicarea UART și RS485
- Componente necesare
- Diagrama circuitului pentru comunicații pe distanțe lungi prin cablu
- Modul convertor MAX485 UART-RS485
- Cablu Ethernet CAT-6E
- Explicația codului Arduino
- Concluzie
Folosim plăci de dezvoltare a microcontrolerelor, cum ar fi Arduino, Raspberry Pi, NodeMCU, ESP8266, MSP430, etc. la aceste distanțe, comunicația dintre diferitele module de senzori, relee, actuatoare și controlere se poate face cu ușurință prin fire simple jumper fără ca noi să fim îngrijorați de distorsiunea semnalului din mediu și de zgomotele electrice care se strecoară în el. Dar dacă construiți un sistem de control cu aceste plăci de dezvoltare pe o distanță mai mare de 10 până la 15 metri, atunci ar trebui să luați în considerare zgomotul și puterea semnalului, deoarece dacă doriți ca sistemul dvs. să funcționeze în mod fiabil, atunci nu vă puteți permite să pierdeți date în timpul transferului.
Există multe tipuri diferite de protocoale de comunicații seriale, cum ar fi I2C și SPI, care pot fi implementate cu ușurință cu Arduino și astăzi vom analiza un alt protocol cel mai frecvent utilizat numit RS485, care este foarte frecvent utilizat în medii industriale cu zgomot ridicat pentru a transfera datele peste o distanță mare. În acest tutorial, vom învăța despre protocolul de comunicare RS485 și cum să-l implementăm cu cele două Arduino Nano pe care le avem cu noi și cum să folosim modulul de conversie MAX485 RS485 în UART. Anterior am mai realizat comunicarea MAX485 cu Arduino și, de asemenea, comunicarea MAX485 cu Raspberry pi, le puteți verifica și dacă sunteți interesat.
Diferența dintre comunicarea UART și RS485
Cele mai multe dintre senzori low-cost și alte module, cum ar fi GPS, Bluetooth, RFID, ESP8266, etc, care sunt utilizate în mod obișnuit cu Arduino, zmeură Pi în piață utilizează UART TTL bazate pe comunicare, deoarece necesită numai 2 fire TX (emițător) și RX (Receptor). Nu este un protocol de comunicare standard, dar este un circuit fizic cu care puteți transmite și primi date seriale cu alte periferice. Poate transmite / primi date numai în serie, deci convertește mai întâi datele paralele în date seriale și apoi transmite datele.
UART este un dispozitiv de transmisie asincronă, prin urmare nu există semnal de ceas pentru a sincroniza datele între cele două dispozitive, ci folosește biți de pornire și oprire la începutul și la sfârșitul fiecărui pachet de date, respectiv pentru a marca extremitățile datelor transferate. Datele transmise de UART sunt organizate în pachete. Fiecare pachet conține 1 bit de pornire, 5 până la 9 biți de date (în funcție de UART), un bit de paritate opțional și 1 sau 2 biți de oprire. Este foarte bine documentat și utilizat pe scară largă și are, de asemenea, un bit de paritate pentru a permite verificarea erorilor. Dar există unele limitări, deoarece nu poate suporta mai mulți sclavi și mai mulți stăpâni iar cadrul maxim de date este limitat la 9 biți. Pentru transferul de date, ratele de transmisie ale Master și Slave trebuie să fie între 10% una de cealaltă. Mai jos este ilustrat modul în care un personaj este un transmițător peste o linie de date UART. Semnalul înalt și minimul sunt măsurate în raport cu nivelul GND, astfel încât schimbarea nivelului GND va avea un efect dezastruos asupra transferului de date.
Pe de altă parte, RS485 este o comunicație mai mult bazată pe industrie, dezvoltată pentru o rețea de dispozitive multiple care pot fi utilizate pe distanțe lungi și la viteze mai mari. Funcționează pe o metodă de măsurare diferențială a semnalizării, mai degrabă decât pe măsurarea tensiunii cu pinul GND. Semnalele RS485 sunt plutitoare și fiecare semnal este transmis pe o linie Sig + și o linie Sig.
Receptorul RS485 compară diferența de tensiune între ambele linii, în loc de nivelul absolut de tensiune pe o linie de semnal. Acest lucru funcționează bine și previne existența buclelor la sol, o sursă comună de probleme de comunicare. Cele mai bune rezultate sunt obținute dacă Sig + și Sig-line sunt răsucite, deoarece răsucirea anulează efectul zgomotului electromagnetic indus într-un cablu și oferă o imunitate mult mai bună împotriva zgomotului, care permite RS485 să transmită datele până la o rază de 1200m. Perechea răsucită permite, de asemenea, viteze de transmisie să fie mult mai mari decât cele posibile cu cablurile drepte. La distanțe mici de transmisie, viteza de până la 35 Mbps poate fi realizată cu RS485, deși viteza transmisiei va scădea odată cu distanța. La 1200 m de viteză de transmisie, puteți utiliza doar 100 kbps de viteză de transmisie. Aveți nevoie de un cablu Ethernet special pentru realizarea acestui protocol de comunicare. Există multe categorii de cabluri Ethernet pe care le putem folosi, cum ar fi CAT-4, CAT-5, CAT-5E, CAT-6, CAT-6A etc. În tutorialul nostru, vom folosi cablul CAT-6E care are 4 perechi răsucite de fire de 24AWG și poate suporta până la 600MHz. Este terminat la ambele capete de un conector RJ45. Nivelurile tipice de tensiune de linie de la driverele de linie sunt de minim ± 1,5 V până la maximum aproximativ ± 6 V. Sensibilitatea de intrare a receptorului este de ± 200 mV. Zgomotul în intervalul de ± 200 mV este în esență blocat din cauza anularii zgomotului în modul comun. Un exemplu al modului în care un octet (0x3E) este transferat pe cele două linii de comunicare RS485.
Componente necesare
- 2 × Modul convertor MAX485
- 2 × Arduino Nano
- 2 × 16 * 2 LCD alfanumeric
- Potențiometre de ștergere 2 × 10k
- Cablu Ethernet Cat-6E
- Plăci de pâine
- Sârme jumper
Diagrama circuitului pentru comunicații pe distanțe lungi prin cablu
Imaginea de mai jos prezintă schema circuitului emițătorului și receptorului pentru comunicația prin cablu pe distanțe lungi a Arduino. Rețineți că ambele circuite ale emițătorului și ale receptorului arată identic, singurul lucru care diferă este codul scris în acesta. De asemenea, pentru demonstrație, folosim o placă ca emițător și o placă ca receptor, dar putem programa cu ușurință plăcile pentru a funcționa atât ca emițător, cât și ca receptor cu aceeași configurare
Schema de conectare pentru circuitul de mai sus este, de asemenea, prezentată mai jos.
După cum puteți vedea mai sus, există două perechi de circuite aproape identice, fiecare având un nano Arduino, 16 * 2 LCD alfanumeric și un convertor MAX485 UART la RS485 IC conectat la fiecare capăt al unui cablu Ethernet Cat-6E printr-un conector RJ45. Cablul pe care l-am folosit în tutorial are o lungime de 25m. Vom trimite câteva date de pe partea transmițătorului prin cablul de la Nano, care este convertit în semnale RS485 prin modulul RS485 MAX care funcționează în modul Master.
La capătul de recepție, modulul convertor MAX485 funcționează ca un Slave și, ascultând transmisia de la Master, convertește din nou datele RS485 pe care le-a primit în semnalele standard 5V TTL UART pentru a fi citite de către receptorul Nano și afișate la 16 2 LCD alfanumeric conectat la acesta.
Modul convertor MAX485 UART-RS485
Acest modul convertor UART-RS485 are un cip MAX485 integrat, care este un transceiver cu putere redusă și cu viteză redusă, utilizat pentru comunicarea RS-485. Funcționează la o singură sursă de alimentare de + 5V, iar curentul nominal este de 300 μA. Funcționează pe comunicații semi-duplex pentru a implementa funcția de conversie a nivelului TTL în nivel RS-485 ceea ce înseamnă că poate transmite sau primi în orice moment, nu ambele, poate atinge o rată de transmisie maximă de 2,5 Mbps. Transmițătorul MAX485 atrage un curent de alimentare între 120μA și 500μA în condiții de descărcare sau încărcare completă atunci când șoferul este dezactivat. Driverul este limitat pentru curentul de scurtcircuit, iar ieșirile driverului pot fi plasate la o stare de impedanță ridicată prin circuitul de oprire termică. Intrarea receptorului are o caracteristică de siguranță care garantează o ieșire logică ridicată dacă intrarea este în circuit deschis.În plus, are performanțe puternice anti-interferențe. De asemenea, are LED-uri la bord pentru a afișa starea curentă a cipului, adică dacă cipul este alimentat sau transmite sau recepționează date, facilitând depanarea și utilizarea acestuia.
Diagrama de circuit prezentată mai sus explică modul în care MAX485 IC de la bord este conectat la diferite componente și oferă anteturi de distanțare standard de 0,1 inci pentru a fi utilizate cu panou, dacă doriți.
Cablu Ethernet CAT-6E
Când ne gândim la transferul de date la distanță, ne gândim instant la conectarea la internet prin cabluri Ethernet. În zilele noastre, folosim majoritatea Wi-Fi pentru conectivitate la internet, dar mai devreme foloseam cabluri Ethernet care mergeau la fiecare computer personal pentru a-l conecta la internet. Principalul motiv din spatele utilizării acestor cabluri Ethernet pe fire normale este că oferă o protecție mult mai bună împotriva zgomotului care se strecoară și distorsionarea semnalului pe distanțe mari. Au o jachetă de protecție peste stratul de izolație pentru a proteja împotriva interferenței electromagnetice și, de asemenea, fiecare pereche de fire este răsucită pentru a preveni formarea buclei de curent și, astfel, o protecție mult mai bună împotriva zgomotului. Acestea sunt adesea terminate cu conectori RJ45 cu 8 pini la ambele capete. Există multe categorii de cabluri Ethernet pe care le putem folosi, cum ar fi CAT-4, CAT-5,CAT-5E, CAT-6, CAT-6A, etc. În tutorialul nostru, vom folosi un cablu CAT-6E care are 4 perechi răsucite de fire de 24AWG și poate suporta până la 600 MHz.
Imagine care arată cum sunt răsucite o pereche de fire în interiorul stratului de izolație al cablului CAT-6E
Conector RJ-45 destinat cablului Ethernet CAT-6E
Explicația codului Arduino
În acest proiect, folosim două Arduino Nano, unul ca transmițător și unul ca receptor, fiecare conducând câte un LCD alfanumeric de 16 * 2 pentru a afișa rezultatele. Deci, în codul Arduino, ne vom concentra pe trimiterea datelor și afișarea datelor trimise sau primite pe ecranul LCD.
Pentru partea emițătorului:
Începem cu includerea bibliotecii standard pentru conducerea ecranului LCD și declarăm pinul D8 al Arduino Nano ca pin de ieșire pe care îl vom folosi ulterior pentru a declara modulul MAX485 ca emițător sau receptor.
int enablePin = 8; int potval = 0; #include
Acum ajungem la partea de configurare. Vom trage pinul de activare sus pentru a pune modulul MAX485 în modul transmițător. Deoarece este un IC semi-duplex, prin urmare nu poate transmite și primi în același timp. De asemenea, vom inițializa ecranul LCD aici și vom imprima un mesaj de bun venit.
Serial.begin (9600); // inițializează serial la baudrate 9600: pinMode (enablePin, OUTPUT); lcd.inceput (16,2); lcd.print ("CIRCUIT DIGEST"); lcd.setCursor (0,1); lcd.print („Transmitter Nano”); întârziere (3000); lcd.clear ();
Acum, în buclă, scriem o valoare întreagă în continuă creștere pe liniile seriale, care este apoi transmisă celuilalt nano. Această valoare este imprimată și pe ecranul LCD pentru afișare și depanare.
Serial.print ("Valoare trimisă"); Serial.println (potval); // Serial Write POTval la RS-485 Bus lcd.setCursor (0,0); lcd.print („Valoare trimisă”); lcd.setCursor (0,1); lcd.print (potval); întârziere (1000); lcd.clear (); potval + = 1;
Partea receptorului:
Din nou, începem cu includerea bibliotecii standard pentru conducerea ecranului LCD și declarăm pinul D8 al Arduino Nano ca pin de ieșire pe care îl vom folosi ulterior pentru a declara modulul MAX485 ca emițător sau receptor.
int enablePin = 8; #include
Acum ajungem la partea de configurare. Vom trage pinul de activare sus pentru a pune modulul MAX485 în modul receptor. Deoarece este un IC semi-duplex, prin urmare nu poate transmite și primi în același timp. De asemenea, vom inițializa ecranul LCD aici și vom imprima un mesaj de bun venit.
Serial.begin (9600); // inițializează serial la baudrate 9600: pinMode (enablePin, OUTPUT); lcd.inceput (16,2); lcd.print ("CIRCUIT DIGEST"); lcd.setCursor (0,1); lcd.print („Receiver Nano”); întârziere (3000); digitalWrite (enablePin, LOW); // (Pinul 8 întotdeauna LOW pentru a primi valoare de la Master)
Acum, în buclă, verificăm dacă există ceva disponibil pe portul serial și apoi citim datele și întrucât datele primite sunt un număr întreg, le analizăm și le afișăm pe ecranul LCD conectat.
int pwmval = Serial.parseInt (); // Primiți valoarea INTEGER de la Master prin RS-485 Serial.print („Am valoare”); Serial.println (pwmval); lcd.setCursor (0,0); lcd.print („Valoare primită”); lcd.setCursor (0,1); lcd.print (pwmval); întârziere (1000); lcd.clear ();
Concluzie
Configurarea testului pe care am folosit-o pentru acest proiect poate fi găsită mai jos.
Funcționarea completă a acestui proiect poate fi găsită în videoclipul legat mai jos. Această metodă este una dintre metodele simple și ușor de implementat pentru a transfera datele pe distanțe mari. În acest proiect, am folosit doar o rată de transmisie de 9600, care este mult sub viteza maximă de transfer pe care o putem obține cu modulul MAX-485, dar această viteză este potrivită pentru majoritatea modulelor senzorilor de acolo și nu avem nevoie cu adevărat toate vitezele maxime în timp ce lucrați cu Arduino și alte plăci de dezvoltare, cu excepția cazului în care utilizați cablul ca conexiune ethernet și aveți nevoie de toată lățimea de bandă și viteza de transfer pe care o puteți obține. Jucați-vă cu viteza de transfer pe cont propriu și încercați și alte tipuri de cabluri Ethernet. Dacă aveți întrebări, lăsați-le în secțiunea de comentarii de mai jos sau folosiți forumurile noastre și voi încerca tot posibilul să le răspund. Până atunci, adios!