- Sériová komunikace RS-485
- Připojení RS-485 k Arduinu
- Modul převodníku USB na RS-485
- Jednoduše software Modbus Master
- Potřebné nástroje
- Kruhový diagram
- Programování Arduino UNO pro RS-485 Slave MODBUS
- Testování Arduino UNO jako Rs485 Modbus Slave
Modbus je protokol sériové komunikace, který objevil Modicon v roce 1979 a používá se k přenosu dat po sériových linkách mezi průmyslovými elektronickými zařízeními. RS-485 Modbus používá pro přenosová vedení RS-485. Je třeba poznamenat, že Modbus je softwarový protokol a nikoli hardware protokol. Je rozdělena na dvě části, jako je Modbus Master a Modbus Slave. V síti RS-485 Modbus je jeden Master a každý 127 Slave s jedinečnou adresou od 1 do 127. V tomto projektu MAX485 Arduino použijeme Arduino Uno jako Slave pro sériovou komunikaci.
Modbus se většinou používají v PLC (Programmable Logic Controllers). A kromě toho se Modbus používá také ve zdravotnictví, dopravě, domácí automatizaci atd. Modbus má 255 funkčních kódů a existují hlavně tři populární verze Modbus:
- MODBUS RTU
- MODBUS ASCII
- MODBUS / TCP
Jaký je rozdíl mezi Modbus ASCII a Modbus RTU?
Modbus RTU a Modbus ASCII mluví stejným protokolem. Jediný rozdíl je v tom, že bajty přenášené po vodiči jsou prezentovány jako binární s RTU a jako čitelné ASCII s Modbus RTU. V tomto výukovém programu bude použit Modbus RTU.
Tento výukový program je o použití komunikace RS-485 Modbus s Arduino UNO jako Slave. Zde instalujeme jednoduše Modbus Master Software do PC a ovládáme dvě LED diody a servomotor pomocí RS-485 jako přenosového vedení. Tyto LED a servomotor jsou spojeny se Slave Arduino a jsou řízeny zasíláním hodnot pomocí softwaru Master Modbus. Protože tento výukový program používá RS-485, doporučuje se nejprve projít sériovou komunikací RS485 mezi Arduino Uno a Arduino Nano. RS485 lze také použít s jinými řadiči pro sériovou komunikaci:
- Sériová komunikace RS-485 mezi Raspberry Pi a Arduino UNO
- Sériová komunikace mezi STM32F103C8 a Arduino UNO pomocí RS-485
Začněme zkoumáním pozadí o RS-485 a Modbus. Zde se také dozvíte více o různých protokolech sériové komunikace.
Sériová komunikace RS-485
RS-485 je asynchronní sériový komunikační protokol, který nevyžaduje hodiny. K přenosu binárních dat z jednoho zařízení do druhého používá techniku zvanou diferenciální signál.
Jaká je tedy tato metoda přenosu diferenciálního signálu ??
Metoda diferenciálního signálu funguje vytvořením rozdílového napětí pomocí kladného a záporného 5V. Poskytuje komunikaci Half-Duplex při použití dvou vodičů a Full-Duplex vyžaduje vodiče se čtyřmi čtyřmi vodiči.
Pomocí této metody:
- RS-485 podporuje vyšší rychlost přenosu dat, maximálně 30 Mb / s.
- Poskytuje také maximální vzdálenost pro přenos dat ve srovnání s protokolem RS-232. Přenáší data maximálně do 1200 metrů.
- Hlavní výhodou RS-485 oproti RS-232 je vícenásobný slave s jedním Masterem, zatímco RS-232 podporuje pouze jednoho slave.
- Může mít maximálně 32 zařízení připojených k protokolu RS-485.
- Další výhodou RS-485 je imunita vůči šumu, protože k přenosu používají metodu diferenciálního signálu.
- RS-485 je rychlejší ve srovnání s protokolem I2C.
Připojení RS-485 k Arduinu
Modul RS-485 lze připojit k jakémukoli mikrokontroléru se sériovým portem. Pro použití modulu RS-485 s mikrokontroléry je nutný modul s názvem 5V MAX485 TTL na RS485, který je založen na Maxim MAX485 IC, protože umožňuje sériovou komunikaci na velkou vzdálenost 1200 metrů. Je obousměrný a poloduplexní a má rychlost přenosu dat 2,5 Mb / s. Tento modul vyžaduje napětí 5V.
Pin-Out RS-485:
Název PIN |
Popis kolíku |
VCC |
5V |
A |
Neinvertující vstup přijímače Neinvertující výstup ovladače |
B |
Obrácení vstupu přijímače Obrácení výstupu ovladače |
GND |
GND (0V) |
R0 |
Přijímač Out (RX pin) |
RE |
Výstup přijímače (LOW-Enable) |
DE |
Výstup ovladače (HIGH-Enable) |
DI |
Driver Driver (TX pin) |
Modul převodníku USB na RS-485
Jedná se o modul adaptéru USB na RS485, který podporuje WIN7, XP, Vista, Linux, Mac OS a poskytuje snadno použitelné rozhraní RS485 pomocí portu COM v počítači . Tento modul je zařízení typu plug-and-play . Neexistují žádné příkazové struktury, vše, co je odesláno na virtuální port COM, se automaticky převede na RS485 a naopak. Modul je zcela napájen z USB sběrnice. Není tedy potřeba pro provoz externí napájecí zdroj.
Zobrazuje se jako sériový port / COM a je přístupný z aplikací nebo hyper-terminálu. Tento převodník poskytuje poloduplexní komunikaci RS-485. Rozsah přenosové rychlosti je 75 bps až 115200 bps, maximálně až 6 Mbps.
Pro použití tohoto zařízení je na internetu k dispozici různý software Modbus. V tomto výukovém programu se používá software nazvaný Simply Modbus Software.
Jednoduše software Modbus Master
Softwarová aplikace Modbus Master je nutná k odesílání dat na slave zařízení Modbus RS-485 Arduino přes COM.
Jednoduše Modbus Master je testovací software pro datovou komunikaci. Můžete si stáhnout Simply Modbus Master z daného odkazu a dozvědět se o něm více v příručce k softwaru.
Před použitím softwaru je důležité se seznámit s následující terminologií.
ID otroka:
Každému slave v síti je přiřazena jedinečná adresa jednotky od 1 do 127. Když master požaduje data, první bajt, který odešle, je adresa slave. Tímto způsobem každý slave po prvním bajtu ví, zda má nebo nemá ignorovat zprávu.
Kód funkce:
Druhým bajtem zaslaným Masterem je funkční kód. Toto číslo říká podřízenému, ke které tabulce má přistupovat a zda má z tabulky číst nebo zapisovat.
Podporované kódy funkcí registru:
Kód funkce |
Akce |
Název tabulky |
04 (04 hex) |
Číst |
Analogové vstupní registry |
03 (03 hex) |
Číst |
Analogové výstupy uchovávající registry |
06 (06 hex) |
Pište svobodně |
Registr držení analogového výstupu |
16 (10 hex) |
Napište více |
Analogové výstupy uchovávající registry |
Podporované kódy funkcí cívky:
Kód funkce |
Akce |
Název tabulky |
02 (02 hex) |
Číst |
Diskrétní vstupní kontakty |
01 (01 hex) |
Číst |
Diskrétní výstupní cívky |
05 (05 hex) |
Pište svobodně |
Diskrétní výstupní cívka |
15 (0F hex) |
Napište více |
Diskrétní výstupní cívky |
CRC:
CRC je zkratka pro kontrolu cyklické redundance. Jsou to dva bajty přidané na konec každé zprávy Modbus pro detekci chyb.
Potřebné nástroje
Hardware
- Arduino UNO
- Modul převodníku MAX-485 TTL na RS-485
- Modul převodníku USB na RS-485
- LED (2)
- 1k rezistor (2)
- 16x2 LCD displej
- 10k potenciometr
- Servomotor SG-90
Software
- Prostě Modbus Master
Kruhový diagram
Zapojení obvodu mezi modulem převodníku MAX-485 TTL na RS-485 a Arduino UNO:
Arduino UNO |
Modul převodníku MAX-485 TTL na RS-485 |
0 (RX) |
RO |
1 (vysílání) |
DI |
4 |
DE & RE |
+ 5V |
VCC |
GND |
GND |
Zapojení obvodu mezi modulem MAX-485 TTL na RS-485 a převodníkem USB na RS-485:
MAX-485 TTL až RS-485 Modul převaděče |
Modul USB na RS-485 Propojeno s PC |
A |
A |
B |
B |
Připojení obvodu mezi Arduino UNO a 16x2 LCD displejem:
16x2 LCD |
Arduino UNO |
VSS |
GND |
VDD |
+ 5V |
V0 |
Ovládací kolík potenciometru pro ovládání kontrastu / jasu 16x2 LCD |
RS |
8 |
RW |
GND |
E |
9 |
D4 |
10 |
D5 |
11 |
D6 |
12 |
D7 |
13 |
A |
+ 5V |
K. |
GND |
Zapojení obvodu mezi 2 LED, servomotorem a Arduino UNO:
Arduino UNO |
LED1 |
LED2 |
Servomotor |
2 |
Anoda přes 1k rezistor |
- |
- |
5 |
- |
Anoda přes 1k rezistor |
- |
6 |
- |
- |
Pin PWM (oranžový) |
+ 5V |
- |
- |
+ 5 V (ČERVENÁ) |
GND |
GND katody |
GND katody |
GND (hnědá) |
Programování Arduino UNO pro RS-485 Slave MODBUS
Arduino UNO je konfigurováno jako Modbus Slave. Také Arduino UNO je připojen dvěma LED diodami a jedním servomotorem. Podřízené Arduino je tedy řízeno z softwaru Master Modbus. Komunikace mezi Arduino UNO a softwarem Modbus Master se provádí pomocí modulu RS-485. Pro připojení k PC se používá modul převodníku USB na RS-485. A Arduino UNO s modulem převodníku MAX-485 TTL na RS-485 bude celé nastavení vypadat takto:
Pro použití Modbus v Arduino UNO, knihovně
Zpočátku zahrňte požadovanou knihovnu. Knihovna ModbusRTU je určena pro použití komunikace Modbus RS-485 a knihovna tekutých krystalů je určena pro použití LCD s Arduino UNO a knihovna servo je pro použití servomotoru s Arduino UNO.
#zahrnout
Nyní jsou anodové kolíky LED, které jsou spojeny s kolíky Arduino 2 a 5, definovány jako LED1 a LED2.
#define led1 2 #define led2 5
Dále je objekt pro přístup ke třídě tekutých krystalů deklarován pomocí pinů LCD (RS, E, D4, D5, D6, D7), které jsou spojeny s Arduino UNO.
LiquidCrystal lcd (8,9,10,11,12,13);
Po dokončení LCD inicializujte servo objekt pro třídu Servo. Také inicializujte objekt sběrnice pro třídu Modbus.
Servo servo; Sběrnice Modbus;
Dále pro ukládání hodnot pro komunikaci Modbus je deklarováno pole se třemi hodnotami inicializovanými nulou.
uint16_t modbus_array = {0,0,0};
Ve funkci nastavení je nejprve nastaven LCD v režimu 16x2 a je zobrazena a vymazána uvítací zpráva.
lcd.begin (16,2); // LCD nastaveno v režimu 16x2 lcd.print ("RS-485 Modbus"); // uvítací zpráva lcd.setCursor (0,1); lcd.print ("Arduino Slave"); zpoždění (5 000); lcd.clear ();
Poté jsou piny LED1 a LED2 nastaveny jako výstupní piny.
pinMode (led1, VÝSTUP); pinMode (led2, VÝSTUP);
Servo pulzní kolík připojený k PWM kolíku 6 Arduina je připojen.
servo.attach (6);
Nyní jsou pro komunikaci Modbus nastaveny následující parametry. První „1“ představuje Slave ID, druhé „1“ znamená, že k přenosu dat používá RS-485 a „4“ představuje RS-485 DE&RE pin připojený k Arduino UNO.
sběrnice = Modbus (1,1,4);
Modbus slave je nastaven na 9600 baudrate.
Smyčka začíná definicí dotazování sběrnice a sběrnice bus.poll () se používá k zápisu a příjmu hodnoty z nadřazeného modulu Modbus.
bus.poll (modbus_array, sizeof (modbus_array) / sizeof (modbus_array));
Tato metoda se používá ke kontrole, zda jsou na sériovém portu k dispozici nějaká data.
Pokud jsou na sériovém portu k dispozici nějaká data, knihovna Modbus RTU zkontroluje zprávu (zkontroluje adresu zařízení, délku dat a CRC) a provede požadovanou akci.
Například pro zápis nebo čtení jakékoli hodnoty z masteru musí ModbusRTU obdržet 16bitové celé číslo bez znaménka a jeho délku z Master Modbus. Toto pole nese data, která jsou zapsána z hlavní jednotky.
V tomto výukovém programu jsou tři pole pro LED1, LED2 a úhel servomotoru.
Nejprve se zapne nebo vypne LED1 modbus_array.
if (modbus_array == 0) // Závisí na hodnotě v modubus_array zapsané Master Modbus { digitalWrite (led1, LOW); // LED nesvítí, pokud 0 lcd.setCursor (0,0); lcd.print ("L1: OFF"); } else { digitalWrite (led1, HIGH); // LED Svítí, pokud je hodnota jiná než 0 lcd.setCursor (0,0); lcd.print ("L1: ON"); }
Vedle zapnutí nebo vypnutí se používá LED2 modbus_array.
if (modbus_array == 0) // Závisí na hodnotě v modbus_array zapsané Master Modbus { digitalWrite (led2, LOW); // LED nesvítí, pokud 0 lcd.setCursor (8,0); lcd.print ("L2: OFF"); } else { digitalWrite (led2, HIGH); // LED Svítí, pokud je hodnota jiná než 0 lcd.setCursor (9,0); lcd.print ("L2: ON"); }
Dále pro nastavení úhlu servomotoru se použitý modbus_array a hodnota vytisknou na 16x2 LCD displeji.
int pwm = modbus_array; servo.write (pwm); lcd.setCursor (0,1); lcd.print ("Úhel serva:"); lcd.print (pwm); zpoždění (200); lcd.clear ();
Tím je programování Arduino UNO ukončeno pro práci jako MODBUS Slave. Dalším krokem bude testování jako Modbus Slave.
Testování Arduino UNO jako Rs485 Modbus Slave
Po dokončení připojení obvodu a nahrání kódu do Arduino UNO je čas připojit USB k modulu RS-485 k PC, kde je nainstalován software Simple Modbus Master.
Otevřete správce zařízení a zkontrolujte port COM podle vašeho počítače, kde je připojen modul USB k RS-485, a poté otevřete software Simply Modbus Master 8.1.1.
1. Po otevření softwaru Simply Modbus otevřete nyní možnost Zápis.
2. Po otevření Simply Modbus Master Write. Nastavte parametry
Režim v RTU, COM port podle vašeho PC (můj byl COM6), Baud na 9600, Data Bits 8, Stop bit 1, Parity None a Slave ID jako 1.
3. Poté nastavte první registr jako 40001 a hodnoty pro zápis jsou 3 a kód funkce jako 16 (Write Holding Register).
Poté napište 1 až 40001 (pro LED1 svítí) a 1 až 40002 (pro LED2 svítí) a 90 až 40003 (pro úhel servomotoru) a poté klikněte na tlačítko ODESLAT.
Můžete vidět, jak stav LED svítí, tak úhel serva v 90 stupních.
4. Poté zadejte 40001 jako 1 a 40002 jako 0 a 40003 jako 180 a klikněte na tlačítko ODESLAT.
5. Nyní píšeme 135 až 40003 a 40001 jako 0 a 40002 jako 1.
Takto lze použít RS-485 Modbus v sériové komunikaci s Arduino UNO jako Slave. V dalším tutoriálu použijeme Arduino Uno jako master v zahájení MODBUS.
Níže naleznete kompletní kód a ukázkové video.