KKM: RS485 MODUL

RS-485 primopredajnik-Communication

Početnik si s Dasduinom. Ili s elektronikom? Za oko ti je zapeo određeni modul, ali ne znaš kako ga koristiti? Bez brige, tu je KKM! Kako Koristiti Module (KKM) je serija blog tutorijala tvrtke soldered na kojoj ćeš pronaći sve što ti treba kako bi započeo rad sa svojim omiljenim modulom. Tutorijali obuhvaćaju: tehničke karakteristike, princip rada, upute kako povezati modul s Dasduinom te osnovni kod. Sve ostalo prepuštamo tebi na maštu.

UVOD

RS485 je standard fizičke povezivosti za prijenos podataka koji definira električne karakteristike serijske komunikacije. Može se koristiti za povezivanje 2 ili više mikrokontrolera kao i za različite I/O uređaje koji podržavaju ovaj standard. Karakteristike ovog standarda čine ga vrlo korisnim u prijenosu podataka preko velikih udaljenosti u industrijskim postrojenjima gdje je izraženiji električni šum.

RS485:
• Omogućava serijsku komunikaciju na velike udaljenosti (do 1.2 km (100 kbps max))
• Diferencijalni prijenos
• Half-duplex
• Velike brzine prijenosa (do 10 Mbit/s (12 m max))
• Omogućava povezivost više predajnika/prijemnika duž istog kabla – „Multi-Drop“
• Naponske razine: +/- 1.5V do +/- 6V

KAKO RADI?

Najprije da se upoznamo s električnim karakteristikama RS485 komunikacije. Za razliku od poznatog RS232 standarda koji koristi jednovodni način prijenosa signala, RS485 koristi diferencijalni prijenos signala koji ima svoje prednosti.

Jednovodni prijenos signala je najjednostavniji i najčešće korišteni način prijenosa električnog signala putem vodova (R232, I2C, PS/2, WGA,..). Jedan vod nosi signal predstavljen varijabilnim naponom, dok je drugi vod spojen na referentni napon (uobičajeno ground, 0V). Takav sustav je jeftiniji za ugradnju nego diferencijalni, ali je i podložniji utjecaju šuma prouzročenim razlikama u referentnim naponima između prijemne i predajne strane ili indukcijom na signalnim vodovima

Glavna prednost jednovodnog (single-ended) nasuprot diferencijalnog prijenosa signala je manji broj prijenosnih linija potrebnih za odašiljanje više signala. Ako imamo n signala kod jednovodnog prijenosa potrebno je n+1 vodova (po jedan za svaki signal te jedan za ground) dok je za diferencijalni prijenos potrebno najmanje 2n vodova.

Kao glavna alternativa jednovodnog, koristi se diferencijalni prijenos informacije (RS485, HDMI, USB,…). Ovakva metoda prenosi diferencijalne parove signala, svaki u svome vodu. Prijemna strane će na taj način reagirati na razliku napona između dva signala, umjesto da očitava razinu signala u odnosu na referentnu razinu (ground). Razlog zašto je takva tehnika otpornija na šum nego jednovodan prijenos je taj što će bilo kakav vanjski elektromagnetski šum podjednako utjecati na oba signala te će naponska razlika ostati ista. Zato je ovakav standard pogodan za korištenje u industriji.

RS485 diferencijalni prijenos signala (n signala, 2n vodova)

RS485 omogućava da više uređaja komunicira na obosmjerni neistodobni način (half-duplex), odnosno komunikacija je moguća u oba smjera, no dok jedan master uređaj „priča“ svi ostali slave uređaji „slušaju“. Također, RS485 može biti konfiguriran i u full-duplex modu koji omogućava istodobnu komunikaciju u oba smjera, no za to je potrebno 4 voda što je skuplje za implementiranje.

Turnaround time: budući da se komunikacija i u jednom i u drugom smjeru odvija preko istog para, uređaj koji je do sada slao podatke mora prijeći u mod prijemnika. Pri dizajniranju sustava, bitno je paziti na interval tijekom kojega uređaj mijenja stanje. Ako je interval predug, uređaj može propustiti prvi (startni) bit ili prvih nekoliko bitova bitnih za daljnju komunikaciju pa dolazi do greške. Obično se za interval uzima vrijeme trajanja prijenosa 1 simbola, ovisno o baud rateu. Dobra vijest je da većina konvertera automatski odrađuje taj prijelaz, tako da je posao programera olakšan.

Termination resistors: pri slanju bitova s jednog kraja kabla na drugi, uvijek postoji refleksija napona koja se vraća duž kabla i veća je kada je rastući brid strmiji (oštriji) i kada su prijenosne linije duže. To negativno utječe na komunikaciju i da bi se takva pojava smanjila koriste se otpornici između linija A i B. Njihova vrijednost bi trebala biti jednaka karakterističnoj impedanciji vodova (tipično 120 Ohma za paricu).

Slika koja prikazuje signale s neprilagođenim otporom (lijevo) i prilagođenim otporom (desno)

Također, pri slanju podataka, pojavom rastućeg brida pojavljuju se i komponente visokih frekvencija koje izazivaju elektromagnetsku interferenciju. Pri većim brzinama prijenosa i duljim prijenosnim linijama još je izraženija i zbog toga se signalne linije najčešće koristi parica (uvrnuti par).

Bias resistors: Kod RS485 mreža može se dogoditi da u jednom trenutku niti jedan uređaj ne šalje podatke. Diferencijalna razlika između prijenosnih linija tada je 0V i to je neodređeno stanje za prijemnike. Takvo stanje može kod prijemnika izazvati netočne podatke zbog šuma pokupljenog na prijenosnim linijama te se u tu svrhu koriste otpornici koji će u konfiguraciji naponskog djelila postaviti signalne linije na valjani napon.

Raspored bias i termination otpornika na krajevima vodova

 

 

 

KAKO POVEZATI?

GND ————> GND
Vcc ————-> +5 V
RO ————-> Pin 7
RE ————> Pin 13
DE ————> Pin 13
DI ————> Pin 6
A ————> A
B ————> B
RO (receiver output) – pin koji registrira naponsku razliku između signalnih linija A i B i bit će high ako je A>B za 200 mV, a low ako je A<B za 200 mV. To je pin preko kojega mikrokontroler prima podatke (Rx)
/RE (receiver output enable) – kada je RE low, RO je omogućen, odnosno uređaj prelazi u receiver mode. Kada je RE high, RO je u stanju visoke impedancije i uređaj ne može primati podatke
DE (driver output enable) – ako je DE high, uređaj je u transmitter modu, ako je DE low uređaj ne može slati podatke
DI (driver input) – pin preko kojeg mikrokontroler šalje podatke (Tx), ako ga postavi na high linija A je na 0V, a linija B na 5V i obrnuto za low

ARDUINO KOD

Sljedeći kod omogućit će nam da obosmjerno komuniciramo koristeći dva Dasduina. Najprije #1 pošalje ono što smo upisali u SerialMonitor, #2 to čita i šalje nazad iste podatke. Ako su i poslani i povratni podatci jednaki upisanom u SerialMonitor, komunikacijski proces je uspješno i neometano izvršen.

TRANSMITER #1

#include "SoftwareSerial.h"
SoftwareSerial RS485(7, 6);  //RO, DI (receiver output, driver input) - Rx, Tx
                            //communication lines between Croduino and MAX485
                            
#define RE_DE 13            //receiver output enable_driver output enable
                            //RE_DE - HIGH  TRANSMITTER MODE
                            //RE_DE - LOW   RECEIVER MODE
                            
char data;        //data to be sent to the other Croduino
char data_returned;   //returned data from the other Croduino
void setup(){
  Serial.begin(9600);     //start serial communication
  RS485.begin(9600);      //start RS485 communication
  pinMode(RE_DE, OUTPUT);  
  digitalWrite(RE_DE, HIGH);
  Serial.println("Transmitter:");
}
void loop(){
  if(Serial.available()){       //check if there is any data available at serial monitor
    data = Serial.read();       //read that data and store it in a variable
    digitalWrite(RE_DE, HIGH);  //go into transmitting mode
    RS485.write(data);          //send data over RS485 lines
    digitalWrite(RE_DE, LOW);   //go back into listening mode
  }
  delay(50);
  if (RS485.available()){    //Look for response data from other Croduino
    data_returned = RS485.read();   //read that data
    Serial.print(data_returned);    //print on serial monitor
  
}

RECEIVER #2

#include "SoftwareSerial.h"
SoftwareSerial RS485(7,6);
#define RE_DE 13
char data_received;
void setup(){
  Serial.begin(9600);
  RS485.begin(9600);
  pinMode(RE_DE, OUTPUT);
  digitalWrite(RE_DE, LOW);
  Serial.println("Receiver:");
}
void loop(){
  if(RS485.available()){          //check if there is any data available at RS485 lines
    data_received = RS485.read();   //read and store that data in a variable
    Serial.print(data_received);    //output data on serial monitor
    delay(50);
    digitalWrite(RE_DE, HIGH);        // Enable RS485 Transmit   
    RS485.write(data_received);     // Send back read data 
    digitalWrite(RE_DE, LOW);       //return to the listening mode
  }
}