- Skillnad mellan UART och RS485-kommunikation
- Komponenter krävs
- Kretsschema för trådbunden kommunikation över långa avstånd
- MAX485 UART-RS485 omvandlingsmodul
- Ethernet CAT-6E-kabel
- Arduino-kodförklaring
- Slutsats
Vi har använt Microcontroller Development Boards som Arduino, Raspberry Pi, NodeMCU, ESP8266, MSP430, etc. länge nu i våra små projekt där avståndet mellan sensorerna och kortet inte är mer än några centimeter högst på dessa avstånd kan kommunikationen mellan de olika sensormodulerna, reläerna, manöverdonen och styrenheterna enkelt göras via enkla bygelkablar utan att vi är oroliga för signalförvrängningen i mediet och de elektriska ljud som kryper in i det. Men om du bygger ett styrsystem med dessa utvecklingskort över ett avstånd som är större än 10 till 15 meter, bör du ta hänsyn till buller och signaleffekt, för om du vill att ditt system ska fungera tillförlitligt har du inte råd att förlora data vid överföring.
Det finns många olika typer av seriella kommunikationsprotokoll som I2C och SPI som enkelt kan implementeras med Arduino och idag ska vi titta på ett annat vanligt förekommande protokoll som heter RS485 som mycket ofta används i industriella miljöer med hög ljudnivå för att överföra data över ett långt avstånd. I den här handledningen ska vi lära oss om RS485-kommunikationsprotokollet och hur man implementerar det med de två Arduino Nano vi har med oss och hur man använder MAX485 RS485 till UART-omvandlingsmodul. Tidigare har vi också utfört MAX485-kommunikation med Arduino och även MAX485-kommunikation med Raspberry pi, du kan också kolla in dem om du är intresserad.
Skillnad mellan UART och RS485-kommunikation
De flesta av de billiga sensorerna och andra moduler som GPS, Bluetooth, RFID, ESP8266, etc. som vanligtvis används med Arduino, Raspberry Pi på marknaden använder UART TTL-baserad kommunikation eftersom det bara kräver två ledningar TX (Transmitter) och RX (Mottagare). Det är inte ett standardkommunikationsprotokoll, men det är en fysisk krets som du kan överföra och ta emot seriell data med andra kringutrustning. Det kan bara sända / ta emot data seriellt, så det konverterar först parallelldata till seriell data och överför sedan data.
UART är en asynkron överföringsenhet, därför finns det ingen klocksignal för att synkronisera data mellan de två enheterna istället använder den start- och stoppbitar i början respektive slutet av varje datapaket för att markera extremiteterna hos den data som överförs. UART-överförda data är organiserade i paket. Varje paket innehåller 1 startbit, 5 till 9 databitar (beroende på UART), en valfri paritetsbit och 1 eller 2 stoppbitar. Det är väldokumenterat och används ofta och det har också en paritetsbit för att möjliggöra felkontroll. Men det finns vissa begränsningar för det eftersom det inte kan stödja flera slavar och flera mästare och den maximala dataramen är begränsad till 9 bitar. För överföring av data måste baudhastigheterna för både Master och Slave vara mellan 10% av varandra. Nedan visas exemplet på hur en karaktär är en sändare över en UART-datalinje. Signal högt och lågt mäts mot GND-nivån så att förskjutning av GND-nivån kommer att ha en katastrofal effekt på dataöverföringen.
Å andra sidan är RS485 mer branschbaserad kommunikation som är utvecklad för ett nätverk av flera enheter som kan användas över långa avstånd och med högre hastigheter också. Det fungerar på en differentiell signalmetod i stället för på spänningsmätning med GND-stift. RS485-signalerna är flytande och varje signal sänds över en Sig + -linje och en Sig-line.
RS485-mottagaren jämför spänningsskillnaden mellan båda linjerna istället för den absoluta spänningsnivån på en signalledning. Detta fungerar bra och förhindrar förekomsten av markslingor, en vanlig källa till kommunikationsproblem. De bästa resultaten uppnås om Sig + och Sig-linjerna vrids eftersom vridning upphäver effekten av elektromagnetiskt brus som induceras i en kabel och ger en mycket bättre immunitet mot bruset vilket gör att RS485 kan överföra data upp till 1200 m avstånd. Twisted pair gör också att överföringshastigheterna kan vara mycket högre än vad som är möjligt med raka kablar. Vid små överföringsavstånd kan hastigheter upp till 35 Mbps realiseras med RS485 även om överföringshastigheten kommer att minska med avståndet. Vid 1200 m överföringshastighet kan du bara använda 100 kbps överföringshastighet. Du behöver en speciell Ethernet-kabel för att förverkliga detta kommunikationsprotokoll. Det finns många kategorier av Ethernet-kablar som vi kan använda som CAT-4, CAT-5, CAT-5E, CAT-6, CAT-6A, etc. I vår handledning ska vi använda CAT-6E-kabeln som har 4 tvinnade par 24AWG-ledningar och kan stödja upp till 600 MHz. Den avslutas i båda ändar av en RJ45-kontakt. Typiska linjespänningsnivåer från linjedrivarna är minst ± 1,5 V till maximalt ca ± 6 V. Mottagarens ingångskänslighet är ± 200 mV. Buller i området ± 200 mV är väsentligen blockerat på grund av brusreducering i vanligt läge. Ett exempel på hur en byte (0x3E) överförs över de två raderna i RS485-kommunikation.
Komponenter krävs
- 2 × MAX485 omvandlingsmodul
- 2 × Arduino Nano
- 2 × 16 * 2 Alfanumerisk LCD
- 2 × 10k torkarpotentiometrar
- Cat-6E Ethernet-kabel
- Brödbrädor
- Bygeltrådar
Kretsschema för trådbunden kommunikation över långa avstånd
Bilden nedan visar sändarens och mottagarens kretsschema för Arduinos långdistansbundna kommunikation. Observera att både sändar- och mottagarkretsar ser identiska ut, det enda som skiljer sig är koden skriven i den. Även för demonstrationen använder vi ett kort som sändare och ett kort som mottagare, men vi kan enkelt programmera korten att fungera som både sändare och mottagare med samma inställning
Anslutningsdiagrammet för ovanstående krets ges också nedan.
Som du kan se ovan finns det två nästan identiska kretspar där var och en har en Arduino nano, 16 * 2 alfanumerisk LCD och MAX485 UART till RS485-omvandlare IC ansluten till varje ände av en Ethernet Cat-6E-kabel via en RJ45-kontakt. Kabeln som jag har använt i handledningen är 25 meter lång. Vi skickar lite data från sändarsidan över kabeln från Nano som omvandlas till RS485-signaler via MAX RS485-modul som fungerar i huvudläge.
I den mottagande änden fungerar MAX485-omvandlingsmodulen som en slav och lyssnar på överföringen från mastern omvandlar den igen RS485-data som den mottog till standard 5V TTL UART-signaler som ska läsas av den mottagande Nano och visas på 16 * 2 Alfanumerisk LCD ansluten till den.
MAX485 UART-RS485 omvandlingsmodul
Denna UART-RS485-omvandlarmodul har ett inbyggt MAX485-chip som är en lågeffekts- och svänghastighetsbegränsad sändtagare som används för RS-485-kommunikation. Det fungerar vid en enda + 5V strömförsörjning och märkströmmen är 300 μA. Det fungerar på halv-duplexkommunikation för att implementera funktionen att konvertera TTL-nivån till RS-485-nivå vilket innebär att den antingen kan sända eller ta emot när som helst, inte båda, det kan uppnå en maximal överföringshastighet på 2,5 Mbps. MAX485-sändtagaren drar en matningsström mellan 120μA och 500μA under olastade eller fullastade förhållanden när föraren är inaktiverad. Drivenheten är begränsad för kortslutningsström och förarutgångarna kan placeras med hög impedans genom den termiska avstängningskretsen. Mottagarens ingång har en felsäker funktion som garanterar logisk hög utgång om ingången är öppen krets.Dessutom har den starka interferensprestanda. Det har också inbyggda lysdioder för att visa det aktuella läget för chipet, dvs. om chipet drivs eller om det sänder eller tar emot data vilket gör det lättare att felsöka och använda.
Kretsschemat ovan förklarar hur MAX485 IC ombord är ansluten till olika komponenter och tillhandahåller 0,1-tums standardavståndshuvuden som du kan använda med brödbräda.
Ethernet CAT-6E-kabel
När vi tänker på överföring av långväga data, tänker vi direkt på att ansluta till internet via Ethernet-kablar. Numera använder vi oftast Wi-Fi för internetanslutning men tidigare använde vi Ethernet-kablar som gick till varje persondator för att ansluta det till internet. Den främsta anledningen bakom att använda dessa Ethernet-kablar över normala ledningar är att de ger mycket bättre skydd mot brus som kryper in och snedvrider signalen över stora avstånd. De har en avskärmningsjacka över isoleringsskiktet för att skydda mot elektromagnetisk störning och varje ledningspar är också tvinnade ihop för att förhindra någon strömslingbildning och därmed mycket bättre skydd mot bullret. De avslutas ofta med 8-stifts RJ45-kontakter i vardera änden. Det finns många kategorier av Ethernet-kablar som vi kan använda som CAT-4, CAT-5,CAT-5E, CAT-6, CAT-6A, etc. I vår handledning kommer vi att använda CAT-6E-kabel som har 4 tvinnade par 24AWG-ledningar och kan stödja upp till 600 MHz.
Bild som visar hur ett par trådar vrids inuti isoleringsskiktet på CAT-6E-kabeln
RJ-45-kontakt avsedd för CAT-6E Ethernet-kabel
Arduino-kodförklaring
I det här projektet använder vi två Arduino Nano, en som sändare och en som mottagare som vardera kör en 16 * 2 alfanumerisk LCD för att visa resultaten. Så i Arduino-koden kommer vi att fokusera på att skicka data och visa de skickade eller mottagna data på LCD-skärmen.
För sändarsidan:
Vi börjar med att inkludera standardbiblioteket för att driva LCD-skärmen och deklarera D8-stiftet på Arduino Nano som en utgångsstift som vi senare kommer att använda för att förklara MAX485-modulen som en sändare eller mottagare.
int enablePin = 8; int potval = 0; #omfatta
Kommer nu till installationsdelen. Vi drar aktiveringsstiftet högt för att sätta MAX485-modulen i sändarläge. Eftersom det är en halv-duplex-IC kan den därför inte både sända och ta emot samtidigt. Vi kommer också att initialisera LCD-skärmen här och skriva ut ett välkomstmeddelande.
Serial.begin (9600); // initialisera serie vid baudrate 9600: pinMode (enablePin, OUTPUT); lcd.begin (16,2); lcd.print ("CIRCUIT DIGEST"); lcd.setCursor (0,1); lcd.print ("Transmitter Nano"); fördröjning (3000); lcd.clear ();
Nu i slingan skriver vi ett kontinuerligt ökande heltal på Serialinjerna som sedan överförs till den andra nano. Detta värde skrivs också ut på LCD-skärmen för visning och felsökning.
Serial.print ("Skickat värde ="); Serial.println (potval); // Seriell skriv POTval till RS-485 Buss lcd.setCursor (0,0); lcd.print ("Skickat värde"); lcd.setCursor (0,1); lcd.print (potval); fördröjning (1000); lcd.clear (); potval + = 1;
Mottagarsida:
Här börjar vi igen med att inkludera standardbiblioteket för att driva LCD-skärmen och deklarera D8-stiftet på Arduino Nano som en utgångsstift som vi senare kommer att använda för att förklara MAX485-modulen som en sändare eller mottagare.
int enablePin = 8; #omfatta
Kommer nu till installationsdelen. Vi drar aktiveringsstiftet högt för att sätta MAX485-modulen i mottagarläge. Eftersom det är en halv-duplex-IC kan den därför inte både sända och ta emot samtidigt. Vi kommer också att initialisera LCD-skärmen här och skriva ut ett välkomstmeddelande.
Serial.begin (9600); // initialisera serie vid baudrate 9600: pinMode (enablePin, OUTPUT); lcd.begin (16,2); lcd.print ("CIRCUIT DIGEST"); lcd.setCursor (0,1); lcd.print ("Receiver Nano"); fördröjning (3000); digitalWrite (enablePin, LOW); // (Pin 8 alltid LÅG för att få värde från Master)
Nu i slingan kontrollerar vi om det finns något tillgängligt på den seriella porten och läser sedan data och eftersom de inkommande data är ett heltal, analyserar vi det och visas på den anslutna LCD-skärmen.
int pwmval = Serial.parseInt (); // Få INTEGER-värde från Master till RS-485 Serial.print ("Jag fick värde"); Serial.println (pwmval); lcd.setCursor (0,0); lcd.print ("Mottaget värde"); lcd.setCursor (0,1); lcd.print (pwmval); fördröjning (1000); lcd.clear ();
Slutsats
Testinställningarna vi använde för detta projekt finns nedan.
Det fullständiga arbetet med detta projekt finns i videon som länkas nedan. Denna metod är en av de enkla och enkla att implementera metoder för att överföra data över långa avstånd. I det här projektet har vi bara använt en överföringshastighet på 9600 vilket ligger långt under den maximala överföringshastigheten vi kan uppnå med MAX-485-modulen men den här hastigheten är lämplig för de flesta sensormodulerna där ute och vi behöver inte riktigt alla maximala hastigheter när du arbetar med Arduino och andra utvecklingskort såvida du inte använder kabeln som en Ethernet-anslutning och behöver all bandbredd och överföringshastighet du kan få. Lek med överföringshastighet på egen hand och prova även andra Ethernet-kabeltyper. Om du har några frågor lämnar du dem i kommentarfältet nedan eller använder våra forum så försöker jag göra mitt bästa för att svara på dem. Fram till dess, adios!