- Komunikasi Bersiri RS-485
- Menghubungkan RS-485 dengan Arduino
- Modul Penukar USB ke RS-485
- Perisian Master Modbus
- Alat Diperlukan
- Rajah Litar
- Pengaturcaraan Arduino UNO untuk RS-485 MODBUS Slave
- Menguji Arduino UNO sebagai Rs485 Modbus Slave
Modbus adalah protokol Serial Communication yang ditemui oleh Modicon pada tahun 1979 dan digunakan untuk menghantar data melalui talian bersiri antara peranti elektronik industri. RS-485 Modbus menggunakan RS-485 untuk saluran penghantaran. Perlu diingatkan bahawa Modbus adalah protokol perisian dan bukan protokol perkakasan. Ia terbahagi kepada dua bahagian seperti Modbus Master dan Modbus Slave. Dalam rangkaian Modbus RS-485 terdapat satu Master dan 127 Slave masing-masing dengan alamat unik dari 1 hingga 127. Dalam projek MAX485 Arduino ini, kami akan menggunakan Arduino Uno sebagai Slave untuk komunikasi bersiri.
Modbus kebanyakannya digunakan dalam PLC (Pengawal Logik yang Dapat Diprogramkan). Selain itu, Modbus juga digunakan dalam Penjagaan Kesihatan, Pengangkutan, Automasi Rumah dan lain-lain. Modbus mempunyai 255 kod fungsi dan terdapat tiga versi popular Modbus:
- MODBUS RTU
- MODBUS ASCII
- MODBUS / TCP
Apakah perbezaan antara Modbus ASCII dan Modbus RTU?
Modbus RTU dan Modbus ASCII membincangkan protokol yang sama. Satu-satunya perbezaan adalah bahawa bait yang dihantar melalui wayar disajikan sebagai binari dengan RTU dan sebagai ASCII yang dibaca dengan Modbus RTU. Modbus RTU akan digunakan dalam tutorial ini.
Tutorial ini adalah mengenai penggunaan komunikasi Modbus RS-485 dengan Arduino UNO sebagai Slave. Di sini kami memasang Perisian Simply Modbus Master di PC dan mengendalikan dua LED dan Servo Motor dengan menggunakan RS-485 sebagai saluran penghantaran. LED dan motor servo ini dihubungkan dengan Slave Arduino dan dikawal dengan menghantar nilai menggunakan Perisian Master Modbus. Oleh kerana tutorial ini menggunakan RS-485, disarankan untuk terlebih dahulu melalui Komunikasi Bersiri RS485 antara Arduino Uno dan Arduino Nano. RS485 juga dapat digunakan dengan pengawal lain untuk komunikasi bersiri:
- Komunikasi Bersiri RS-485 antara Raspberry Pi & Arduino UNO
- Komunikasi Bersiri Antara STM32F103C8 dan Arduino UNO menggunakan RS-485
Mari kita mulakan dengan meneroka beberapa latar belakang mengenai RS-485 dan Modbus. Ketahui lebih lanjut mengenai pelbagai protokol Komunikasi Bersiri di sini.
Komunikasi Bersiri RS-485
RS-485 adalah protokol komunikasi bersiri tak segerak yang tidak memerlukan jam. Ia menggunakan teknik yang disebut isyarat pembezaan untuk memindahkan data binari dari satu peranti ke peranti lain.
Jadi apakah kaedah pemindahan isyarat pembezaan ini ??
Kaedah isyarat pembezaan berfungsi dengan membuat voltan pembezaan dengan menggunakan 5V positif dan negatif. Ia menyediakan komunikasi Half-Duplex ketika menggunakan dua wayar dan Full-Duplex memerlukan wayar 4 Fours.
Dengan menggunakan kaedah ini:
- RS-485 menyokong kadar pemindahan data maksimum 30Mbps maksimum.
- Ia juga memberikan jarak transfer data maksimum dibandingkan dengan protokol RS-232. Ia memindahkan data hingga maksimum 1200 meter.
- Kelebihan utama RS-485 berbanding RS-232 adalah hamba berganda dengan Master tunggal sementara RS-232 hanya menyokong hamba tunggal.
- Boleh mempunyai maksimum 32 peranti yang disambungkan ke protokol RS-485.
- Kelebihan lain dari RS-485 adalah kebal terhadap bunyi kerana mereka menggunakan kaedah isyarat pembezaan untuk memindahkan.
- RS-485 lebih pantas berbanding protokol I2C.
Menghubungkan RS-485 dengan Arduino
Modul RS-485 boleh dihubungkan ke mana-mana mikrokontroler yang mempunyai port bersiri. Untuk menggunakan modul RS-485 dengan mikrokontroler, diperlukan modul yang disebut 5V MAX485 TTL hingga RS485 yang berdasarkan pada Maxim MAX485 IC kerana ia membolehkan komunikasi bersiri pada jarak jauh 1200 meter. Ini adalah dua arah dan separuh dupleks dan mempunyai kadar pemindahan data 2.5 Mbps. Modul ini memerlukan voltan 5V.
Pin-Out dari RS-485:
Nama Pin |
Huraian Pin |
VCC |
5V |
A |
Input Penerima Bukan Pembalik Keluaran Pemacu Bukan Pembalik |
B |
Input Penerima Pembalik Membalikkan Output Pemacu |
GND |
GND (0V) |
R0 |
Penerima Keluar (pin RX) |
RE |
Output Penerima (LOW-Enable) |
DE |
Keluaran Pemacu (Diaktifkan TINGGI) |
DI |
Input Pemacu (pin TX) |
Modul Penukar USB ke RS-485
Ini adalah modul Adapter USB to RS485 Converter yang menyokong WIN7, XP, Vista, Linux, Mac OS dan menyediakan antara muka RS485 yang mudah digunakan dengan menggunakan port COM di komputer . Modul ini adalah peranti plug-and-play . Tidak ada struktur perintah, apa pun yang dihantar ke Port COM Maya secara automatik ditukar menjadi RS485 dan sebaliknya. Modul ini berkuasa sepenuhnya dari bas USB. Jadi, tidak memerlukan bekalan kuasa luaran untuk operasi.
Ia muncul sebagai port Serial / COM dan dapat diakses dari aplikasi atau terminal hiper. Penukar ini menyediakan komunikasi RS-485 half-duplex. Julat kadar Baud adalah 75 bps hingga 115200 bps, maksimum hingga 6 Mbps.
Untuk menggunakan peranti ini terdapat pelbagai Perisian Modbus yang terdapat di internet. Dalam tutorial ini digunakan perisian bernama Simply Modbus Software.
Perisian Master Modbus
Aplikasi Perisian Modbus Master diperlukan untuk mengirim data ke perangkat Arbusino Modbus RS-485 slave melalui COM.
Simply Modbus Master adalah perisian ujian komunikasi data. Anda boleh memuat turun Simply Modbus Master dari pautan yang diberikan dan mengetahui lebih lanjut mengenainya dengan merujuk Manual Perisian.
Sebelum menggunakan perisian, penting untuk memahami terminologi berikut.
ID hamba:
Setiap hamba dalam rangkaian diberikan alamat unit unik dari 1 hingga 127. Apabila master meminta data, bait pertama yang dihantarnya adalah alamat Slave. Dengan cara ini, setiap hamba tahu selepas bait pertama akan mengabaikan mesej atau tidak.
Kod fungsi:
Byte kedua yang dihantar oleh Master adalah kod Fungsi. Nombor ini memberitahu hamba jadual mana yang hendak diakses dan sama ada membaca dari atau menulis ke meja.
Kod Fungsi Daftar yang Disokong:
Kod Fungsi |
Tindakan |
Nama Jadual |
04 (04 heks) |
Baca |
Daftar Input Analog |
03 (03 heks) |
Baca |
Daftar Pemegangan Keluaran Analog |
06 (06 heks) |
Tulis tunggal |
Daftar Pemegangan Keluaran Analog |
16 (10 heks) |
Tulis berganda |
Daftar Pemegangan Keluaran Analog |
Kod Fungsi Gegelung yang Disokong:
Kod Fungsi |
Tindakan |
Nama Jadual |
02 (02 heks) |
Baca |
Kenalan Input Discrete |
01 (01 heks) |
Baca |
Gegelung Output diskrit |
05 (05 heks) |
Tulis tunggal |
Gegelung Output diskrit |
15 (hex 0F) |
Tulis berganda |
Gegelung Output diskrit |
CRC:
CRC bermaksud Cyclic Redundancy check. Ini adalah dua bait yang ditambahkan ke akhir setiap mesej Modbus untuk pengesanan ralat.
Alat Diperlukan
Perkakasan
- Arduino UNO
- Modul Penukar MAX-485 TTL ke RS-485
- Modul Penukar USB ke RS-485
- LED (2)
- 1k-Perintang (2)
- Paparan LCD 16x2
- Potensiometer 10k
- Servo Motor SG-90
Perisian
- Cukup Modbus Master
Rajah Litar
Sambungan Litar antara modul penukar MAX-485 TTL ke RS-485 dan Arduino UNO:
Arduino UNO |
Modul Penukar MAX-485 TTL ke RS-485 |
0 (RX) |
RO |
1 (TX) |
DI |
4 |
DE & RE |
+ 5V |
VCC |
GND |
GND |
Sambungan Litar antara Modul MAX-485 TTL ke RS-485 dan penukar USB ke RS-485:
MAX-485 TTL ke RS-485 Modul Penukar |
Modul USB ke RS-485 Bersambung dengan PC |
A |
A |
B |
B |
Sambungan Litar antara paparan LCD Arduino UNO dan 16x2:
LCD 16x2 |
Arduino UNO |
VSS |
GND |
VDD |
+ 5V |
V0 |
Untuk mengawal pin potensiometer untuk kawalan kontras / kecerahan LCD 16x2 |
RS |
8 |
RW |
GND |
E |
9 |
D4 |
10 |
D5 |
11 |
D6 |
12 |
D7 |
13 |
A |
+ 5V |
K |
GND |
Sambungan Litar antara 2 LED, Servo Motor dan Arduino UNO:
Arduino UNO |
LED1 |
LED2 |
Motor Servo |
2 |
Anod melalui perintang 1k |
- |
- |
5 |
- |
Anod melalui perintang 1k |
- |
6 |
- |
- |
Pin PWM (Jingga) |
+ 5V |
- |
- |
+ 5V (MERAH) |
GND |
Cathode GND |
Cathode GND |
GND (Coklat) |
Pengaturcaraan Arduino UNO untuk RS-485 MODBUS Slave
Arduino UNO dikonfigurasikan sebagai Modbus Slave. Juga, Arduino UNO dilampirkan dengan dua LED dan satu Servo Motor. Jadi hamba Arduino dikendalikan dari Perisian Modbus Master. Komunikasi antara Arduino UNO dan Modbus Master Software dicapai dengan menggunakan modul RS-485. Untuk menghubungkannya dengan PC, modul penukar USB ke RS-485 digunakan. Dan Arduino UNO dengan modul penukar MAX-485 TTL ke RS-485, keseluruhan penyediaan akan kelihatan seperti berikut:
Untuk menggunakan Modbus di Arduino UNO, perpustakaan
Pada mulanya, sertakan perpustakaan yang diperlukan. Perpustakaan ModbusRTU adalah untuk menggunakan komunikasi Modbus RS-485, dan perpustakaan kristal cair adalah untuk menggunakan LCD dengan Arduino UNO, dan perpustakaan servo adalah untuk menggunakan motor Servo dengan Arduino UNO.
#sertakan
Kini pin anod LED yang dihubungkan dengan pin Arduino 2 dan 5 ditakrifkan sebagai LED1 dan LED2.
#define led1 2 #define led2 5
Seterusnya objek untuk mengakses kelas Liquid Crystal dinyatakan dengan pin LCD (RS, E, D4, D5, D6, D7) yang dihubungkan dengan Arduino UNO.
LiquidCrystal lcd (8,9,10,11,12,13);
Apabila LCD selesai, Inisialisasi objek servo untuk Servo kelas. Juga Memulakan objek bas untuk Modbus kelas
Servo servo; Bas Modbus;
Seterusnya untuk menyimpan nilai untuk komunikasi Modbus, array dinyatakan dengan tiga nilai yang dimulakan dengan sifar.
uint16_t modbus_array = {0,0,0};
Dalam fungsi persediaan , pertama LCD diset dalam mod 16x2 dan mesej selamat datang dipaparkan dan dibersihkan.
lcd.begin (16,2); // Lcd ditetapkan dalam mod 16x2 lcd.print ("RS-485 Modbus"); // Mesej Selamat Datang lcd.setCursor (0,1); lcd.print ("Arduino Slave"); kelewatan (5000); lcd.clear ();
Selepas ini, pin LED1 dan LED2 ditetapkan sebagai pin output.
pinMode (led1, OUTPUT); pinMode (led2, OUTPUT);
Pin denyut servo yang disambungkan ke pin PWM 6 dari Arduino dilampirkan.
servo.attach (6);
Sekarang untuk komunikasi Modbus parameter berikut ditetapkan. Pertama '1' mewakili Slave ID, kedua '1' menunjukkan bahawa ia menggunakan RS-485 untuk memindahkan data dan '4' mewakili RS-485 DE&RE pin yang disambungkan ke Arduino UNO.
bas = Modbus (1,1,4);
Budak Modbus ditetapkan pada 9600 baudrate.
Gelung bermula dengan definisi bus poll dan bus.poll () digunakan untuk menulis dan menerima nilai dari Modbus induk.
bus.poll (modbus_array, sizeof (modbus_array) / sizeof (modbus_array));
Kaedah ini digunakan untuk memeriksa apakah ada data yang tersedia di port bersiri.
Sekiranya terdapat data yang tersedia di port bersiri, Perpustakaan Modbus RTU akan memeriksa pesan (periksa alamat perangkat, panjang data, dan CRC) dan melakukan tindakan yang diperlukan.
Contohnya untuk menulis atau membaca sebarang nilai dari master, ModbusRTU mesti menerima susunan bilangan bulat 16-bit yang tidak ditandatangani dan panjangnya dari Modbus Master. Susunan ini membawa data yang ditulis dari induk.
Dalam tutorial ini terdapat tiga tatasusunan untuk sudut motor LED1, LED2 dan Servo.
Mula-mula menghidupkan atau mematikan modbus_array LED1 digunakan.
if (modbus_array == 0) // Bergantung pada nilai dalam modubus_array yang ditulis oleh Master Modbus { digitalWrite (led1, LOW); // LED MATI jika 0 lcd.setCursor (0,0); lcd.print ("L1: MATI"); } lain { digitalWrite (led1, TINGGI); // LED ON jika nilai selain 0 lcd.setCursor (0,0) lcd.print ("L1: ON"); }
Di sebelah untuk menghidupkan atau mematikan modbus_array LED2 digunakan.
if (modbus_array == 0) // Bergantung pada nilai dalam modbus_array yang ditulis oleh Master Modbus { digitalWrite (led2, LOW); // LED MATI jika 0 lcd.setCursor (8,0); lcd.print ("L2: MATI"); } lain { digitalWrite (led2, TINGGI); // LED ON jika nilai selain dari 0 lcd.setCursor (9,0); lcd.print ("L2: ON"); }
Di sebelah untuk menetapkan sudut motor Servo modbus_array yang digunakan dan nilai dicetak dalam paparan LCD 16x2.
int pwm = modbus_array; servo.write (pwm); lcd.setCursor (0,1); lcd.print ("Sudut servo:"); lcd.print (pwm); kelewatan (200); lcd.clear ();
Ini menyelesaikan pengaturcaraan Arduino UNO kerana menggunakannya sebagai Slave MODBUS Langkah seterusnya akan mengujinya sebagai Modbus Slave.
Menguji Arduino UNO sebagai Rs485 Modbus Slave
Setelah sambungan litar selesai dan kodnya dimuat ke Arduino UNO, sudah tiba masanya untuk menyambungkan modul USB ke RS-485 dengan PC di mana perisian Simple Modbus Master dipasang.
Buka pengurus peranti dan periksa port COM mengikut PC anda di mana Modul USB ke RS-485 disambungkan dan setelah itu buka perisian Simply Modbus Master 8.1.1.
1. Setelah Perisian Simply Modbus dibuka sekarang buka pilihan Tulis.
2. Setelah Simply Modbus Master Write dibuka. Tetapkan parameter
Mod dalam RTU, port COM mengikut PC anda (milik saya adalah COM6), Baud pada 9600, Data Bits 8, Stop bit 1, Parity None dan Slave ID sebagai 1.
3. Selepas itu tetapkan daftar pertama sebagai 40001 dan nilai untuk menulis adalah 3 dan kod fungsi sebagai 16 (Tulis Holding Register)
Selepas itu tulis 1 hingga 40001 (Untuk LED1 aktif) dan 1 hingga 40002 (Untuk LED2 hidup) dan 90 hingga 40003 (Untuk Servo Motor Angle) dan kemudian klik butang HANTAR.
Anda dapat melihat kedua-dua status LED ON dan sudut servo pada 90 darjah.
4. Selepas itu masukkan 40001 sebagai 1 dan 40002 sebagai 0 dan 40003 sebagai 180 dan klik butang HANTAR.
5. Sekarang tuliskan 135 hingga 40003 dan 40001 sebagai 0 dan 40002 sebagai 1.
Inilah cara RS-485 Modbus dapat digunakan dalam komunikasi bersiri dengan Arduino UNO sebagai Slave. Dalam tutorial seterusnya, kita akan menggunakan Arduino Uno sebagai master dalam modbus.
Cari kod lengkap dan video Demonstrasi di bawah.