- Verschil tussen UART en RS485-communicatie
- Componenten vereist
- Schakelschema voor bedrade communicatie over lange afstanden
- MAX485 UART-RS485-omzettermodule
- Ethernet CAT-6E-kabel
- Arduino Code Uitleg
- Conclusie
We gebruiken Microcontroller Development Boards zoals Arduino, Raspberry Pi, NodeMCU, ESP8266, MSP430, etc. al heel lang in onze kleine projecten waar de afstand tussen de sensoren en het bord meestal niet meer dan enkele centimeters maximaal is en op deze afstanden kan de communicatie tussen de verschillende sensormodules, relais, actuatoren en controllers gemakkelijk worden gedaan via eenvoudige jumperdraden zonder dat we ons zorgen hoeven te maken over de signaalvervorming in het medium en de elektrische ruis die erin binnensluipt. Maar als u met deze ontwikkelborden een besturingssysteem bouwt over een afstand van meer dan 10 tot 15 meter, dan moet u rekening houden met de ruis en het signaalvermogen, want als u wilt dat uw systeem betrouwbaar werkt, kunt u het zich niet veroorloven om de gegevens tijdens het overbrengen.
Er zijn veel verschillende soorten seriële communicatieprotocollen zoals I2C en SPI die eenvoudig kunnen worden geïmplementeerd met Arduino en vandaag gaan we kijken naar een ander meest gebruikt protocol, genaamd RS485, dat heel vaak wordt gebruikt in industriële omgevingen met veel ruis om de gegevens over te dragen. een lange afstand. In deze tutorial gaan we leren over het RS485-communicatieprotocol en hoe we dit kunnen implementeren met de twee Arduino Nano die we bij ons hebben en hoe we de MAX485 RS485 naar UART-conversiemodule kunnen gebruiken. Eerder hebben we ook MAX485-communicatie uitgevoerd met Arduino en ook MAX485-communicatie met Raspberry pi, je kunt ze ook bekijken als je geïnteresseerd bent.
Verschil tussen UART en RS485-communicatie
De meeste van de goedkope sensoren en andere modules zoals GPS, Bluetooth, RFID, ESP8266, enz. Die vaak worden gebruikt met Arduino, Raspberry Pi op de markt maakt gebruik van UART TTL-gebaseerde communicatie omdat het slechts 2 draden TX (zender) en RX vereist (Ontvanger). Het is geen standaard communicatieprotocol, maar het is een fysiek circuit waarmee u seriële gegevens kunt verzenden en ontvangen met andere randapparatuur. Het kan alleen gegevens serieel verzenden / ontvangen, dus het converteert eerst de parallelle gegevens naar seriële gegevens en verzendt vervolgens de gegevens.
UART is een asynchroon transmissieapparaat en daarom is er geen kloksignaal om de gegevens tussen de twee apparaten te synchroniseren. In plaats daarvan gebruikt het start- en stopbits aan het begin en einde van elk datapakket om de uiteinden van de gegevens die worden overgedragen te markeren. UART-verzonden gegevens zijn georganiseerd in pakketten. Elk pakket bevat 1 startbit, 5 tot 9 databits (afhankelijk van de UART), een optionele pariteitsbit en 1 of 2 stopbits. Het is zeer goed gedocumenteerd en wordt veel gebruikt en het heeft ook een pariteitsbit om fouten te kunnen controleren. Maar er zijn enkele beperkingen, aangezien het niet meerdere slaves en meerdere masters kan ondersteunen en het maximale dataframe is beperkt tot 9 bits. Voor de gegevensoverdracht moeten de baudrates van zowel Master als Slave tussen 10% van elkaar liggen. Hieronder wordt het voorbeeld getoond van hoe een karakter een zender is via een UART-datalijn. Signaal hoog en laag worden gemeten tegen het GND-niveau, dus het verschuiven van het GND-niveau zal een rampzalig effect hebben op de gegevensoverdracht.
Aan de andere kant is RS485 meer op de industrie gebaseerde communicatie die is ontwikkeld voor een netwerk van meerdere apparaten die ook over lange afstanden en met hogere snelheden kunnen worden gebruikt. Het werkt op een differentiële signaleringsmethode van meten in plaats van spanningsmeting met GND-pin. De RS485-signalen zijn zwevend en elk signaal wordt verzonden via een Sig + -lijn en een Sig-lijn.
De RS485-ontvanger vergelijkt het spanningsverschil tussen beide lijnen, in plaats van het absolute spanningsniveau op een signaallijn. Dit werkt goed en voorkomt het bestaan van aardlussen, een veelvoorkomende bron van communicatieproblemen. De beste resultaten worden behaald als de Sig + en Sig- lijnen worden getwist, omdat twisten het effect van elektromagnetische ruis in een kabel tenietdoen en een veel betere immuniteit bieden tegen de ruis waardoor de RS485 de gegevens kan verzenden tot een bereik van 1200 m. Twisted pair zorgt er ook voor dat de transmissiesnelheden veel hoger zijn dan mogelijk is met rechte kabels. Bij kleine transmissieafstanden kunnen snelheden tot 35 Mbps worden gerealiseerd met RS485, hoewel de transmissiesnelheid afneemt met de afstand. Bij een transmissiesnelheid van 1200 m kunt u slechts 100 kbps transmissiesnelheid gebruiken. Voor het realiseren van dit communicatieprotocol heeft u een speciale ethernetkabel nodig. Er zijn veel categorieën Ethernet-kabels die we kunnen gebruiken, zoals CAT-4, CAT-5, CAT-5E, CAT-6, CAT-6A, enz. In onze tutorial gaan we CAT-6E-kabels gebruiken die 4 gedraaide paren 24AWG-draden heeft en tot 600 MHz kan ondersteunen. Het wordt aan beide uiteinden afgesloten met een RJ45-connector. Typische lijnspanningsniveaus van de lijndrivers zijn minimaal ± 1,5 V tot maximaal ongeveer ± 6 V. De ingangsgevoeligheid van de ontvanger is ± 200 mV. Ruis in het bereik van ± 200 mV wordt in wezen geblokkeerd door common-mode ruisonderdrukking. Een voorbeeld van hoe een byte (0x3E) wordt overgedragen via de twee lijnen van RS485-communicatie.
Componenten vereist
- 2 × MAX485-omzettermodule
- 2 × Arduino Nano
- 2 × 16 * 2 Alfanumeriek LCD
- 2 × 10k Ruitenwisser Potentiometers
- Cat-6E Ethernet-kabel
- Breadboards
- Doorverbindingsdraden
Schakelschema voor bedrade communicatie over lange afstanden
De onderstaande afbeelding toont het schakelschema van de zender en ontvanger voor Arduino's bedrade communicatie over lange afstanden. Houd er rekening mee dat zowel de zender- als de ontvangercircuits er identiek uitzien. Het enige dat verschilt, is de code die erin is geschreven. Ook voor de demonstratie gebruiken we één bord als zender en één bord als ontvanger, maar we kunnen de borden eenvoudig programmeren om als zender en ontvanger te werken met dezelfde opstelling.
Het aansluitschema voor het bovenstaande circuit wordt ook hieronder gegeven.
Zoals je hierboven kunt zien, zijn er twee bijna identieke circuits met elk een Arduino nano, 16 * 2 alfanumeriek LCD-scherm en een MAX485 UART naar RS485-converter-IC die is aangesloten op elk uiteinde van een Ethernet Cat-6E-kabel via een RJ45-connector. De kabel die ik in de tutorial heb gebruikt, is 25 meter lang. We sturen wat gegevens van de zenderzijde over de kabel van de Nano die wordt omgezet in RS485-signalen via de MAX RS485-module die in de mastermodus werkt.
Aan de ontvangende kant werkt de MAX485-convertormodule als een slaaf, en luisterend naar de transmissie van de master converteert hij opnieuw de ontvangen RS485-gegevens naar de standaard 5V TTL UART-signalen die door de ontvangende Nano kunnen worden gelezen en weergegeven op 16 * 2 Alfanumeriek LCD-scherm erop aangesloten.
MAX485 UART-RS485-omzettermodule
Deze UART-RS485-convertermodule heeft een ingebouwde MAX485-chip die een zendontvanger met een laag vermogen en een maximale snelheid is die wordt gebruikt voor RS-485-communicatie. Het werkt op een enkele + 5V-voeding en de nominale stroom is 300 μA. Het werkt op half-duplex communicatie om de functie van het omzetten van het TTL-niveau naar RS-485-niveau te implementeren, wat betekent dat het op elk moment kan verzenden of ontvangen, niet beide, het kan een maximale overdrachtssnelheid van 2,5 Mbps bereiken. MAX485-zendontvanger trekt een voedingsstroom tussen 120 μA en 500 μA onder onbelaste of volledig geladen omstandigheden wanneer de driver is uitgeschakeld. De driver is beperkt voor kortsluitstroom en de uitgangen van de driver kunnen op een hoge impedantietoestand worden geplaatst via het thermische uitschakelcircuit. De ingang van de ontvanger heeft een faalveilige functie die een logisch hoge output garandeert als de ingang een open circuit is.Bovendien heeft het sterke anti-interferentieprestaties. Het heeft ook ingebouwde LED's om de huidige status van de chip weer te geven, dwz of de chip van stroom wordt voorzien of dat deze gegevens verzendt of ontvangt, waardoor het eenvoudiger is om te debuggen en te gebruiken.
Het hierboven gegeven schakelschema legt uit hoe de ingebouwde MAX485 IC is verbonden met verschillende componenten en biedt 0,1-inch standaard afstandskoppen voor gebruik met breadboard als je wilt.
Ethernet CAT-6E-kabel
Als we denken aan gegevensoverdracht over lange afstanden, denken we meteen aan verbinding met internet via Ethernet-kabels. Tegenwoordig gebruiken we meestal wifi voor internetconnectiviteit, maar eerder gebruikten we Ethernet-kabels die naar elke pc gingen om deze met internet te verbinden. De belangrijkste reden achter het gebruik van deze Ethernet-kabels via normale draden is dat ze een veel betere bescherming bieden tegen binnendringende ruis en vervorming van het signaal over grote afstanden. Ze hebben een afschermmantel over de isolatielaag om te beschermen tegen de elektromagnetische interferentie en ook is elk paar draden in elkaar gedraaid om eventuele stroomlusvorming te voorkomen en dus een veel betere bescherming tegen de ruis. Ze worden vaak aan beide uiteinden afgesloten met 8-pins RJ45-connectoren. Er zijn veel categorieën Ethernet-kabels die we kunnen gebruiken, zoals CAT-4, CAT-5,CAT-5E, CAT-6, CAT-6A, etc. In onze tutorial gaan we CAT-6E-kabel gebruiken die 4 getwiste paren 24AWG-draden heeft en tot 600 MHz kan ondersteunen.
Afbeelding die laat zien hoe een paar draden in de isolatielaag van CAT-6E-kabel worden gedraaid
RJ-45-connector bedoeld voor CAT-6E Ethernet-kabel
Arduino Code Uitleg
In dit project gebruiken we twee Arduino Nano's, één als zender en één als ontvanger, elk met een 16 * 2 alfanumeriek LCD-scherm om de resultaten weer te geven. Dus in de Arduino-code zullen we ons concentreren op het verzenden van de gegevens en die verzonden of ontvangen gegevens op het LCD-scherm weergeven.
Voor zenderzijde:
We beginnen met het opnemen van de standaardbibliotheek voor het aansturen van de LCD en declareren de D8-pin van de Arduino Nano als een outputpin die we later zullen gebruiken om de MAX485-module als een zender of ontvanger te declareren.
int enablePin = 8; int potval = 0; # omvatten
Kom nu naar het setup-gedeelte. We trekken de activeringspin hoog om de MAX485-module in zendermodus te zetten. Omdat het een half-duplex IC is, kan het niet tegelijkertijd verzenden en ontvangen. We zullen hier ook het LCD-scherm initialiseren en een welkomstbericht afdrukken.
Serial.begin (9600); // initialiseer serieel op baudrate 9600: pinMode (enablePin, OUTPUT); lcd.begin (16,2); lcd.print ("CIRCUIT DIGEST"); lcd.setCursor (0,1); lcd.print ("Zender Nano"); vertraging (3000); lcd.clear ();
Nu in de lus schrijven we een continu toenemende integerwaarde op de seriële lijnen die vervolgens naar de andere nano worden verzonden. Deze waarde wordt ook op het LCD-scherm afgedrukt voor weergave en foutopsporing.
Serial.print ("Verzonden waarde ="); Serial.println (potval); // Serieel schrijven POTval naar RS-485-bus lcd.setCursor (0,0); lcd.print ("Verzonden waarde"); lcd.setCursor (0,1); lcd.print (potval); vertraging (1000); lcd.clear (); potval + = 1;
Ontvangerzijde:
Ook hier beginnen we met het opnemen van de standaardbibliotheek voor het aansturen van het LCD-scherm en declareren de D8-pin van de Arduino Nano als een outputpin die we later zullen gebruiken om de MAX485-module als een zender of ontvanger aan te geven.
int enablePin = 8; # omvatten
Kom nu naar het setup-gedeelte. We trekken de activeringspin hoog om de MAX485-module in ontvangermodus te zetten. Omdat het een half-duplex IC is, kan het niet tegelijkertijd verzenden en ontvangen. We zullen hier ook het LCD-scherm initialiseren en een welkomstbericht afdrukken.
Serial.begin (9600); // initialiseer serieel op baudrate 9600: pinMode (enablePin, OUTPUT); lcd.begin (16,2); lcd.print ("CIRCUIT DIGEST"); lcd.setCursor (0,1); lcd.print ("Receiver Nano"); vertraging (3000); digitalWrite (enablePin, LOW); // (Pin 8 altijd LAAG om waarde van Master te ontvangen)
Nu we in de lus zitten, controleren we of er iets beschikbaar is op de seriële poort en lezen we de gegevens en aangezien de binnenkomende gegevens een geheel getal zijn, analyseren we deze en geven we ze weer op het aangesloten LCD-scherm.
int pwmval = Serial.parseInt (); // Ontvang INTEGER-waarde van Master via RS-485 Serial.print ("I got value"); Serial.println (pwmval); lcd.setCursor (0,0); lcd.print ("Ontvangen waarde"); lcd.setCursor (0,1); lcd.print (pwmval); vertraging (1000); lcd.clear ();
Conclusie
De testopstelling die we voor dit project hebben gebruikt, vindt u hieronder.
De volledige werking van dit project is te vinden in de onderstaande video. Deze methode is een van de eenvoudige en gemakkelijk te implementeren methoden om de gegevens over grote afstanden over te dragen. In dit project hebben we alleen een baudrate van 9600 gebruikt, wat ruim onder de maximale overdrachtssnelheid ligt die we kunnen bereiken met de MAX-485-module, maar deze snelheid is geschikt voor de meeste sensormodules die er zijn en we hebben niet echt nodig alle maximale snelheden tijdens het werken met Arduino en andere ontwikkelborden, tenzij je de kabel als een ethernetverbinding gebruikt en alle bandbreedte en overdrachtssnelheid nodig hebt die je kunt krijgen. Speel zelf met de overdrachtssnelheid en probeer ook andere soorten ethernetkabels. Als je vragen hebt, laat ze dan achter in het commentaargedeelte hieronder of gebruik onze forums en ik zal mijn best doen om ze te beantwoorden. Tot dan, adios!