- Komunikasi Serial RS-485
- Menghubungkan RS-485 dengan Arduino
- Modul Konverter USB ke RS-485
- Cukup Modbus Master Software
- Alat Diperlukan
- Diagram Sirkuit
- Pemrograman Arduino UNO untuk RS-485 MODBUS Slave
- Menguji Arduino UNO sebagai Rs485 Modbus Slave
Modbus adalah protokol Komunikasi Serial yang ditemukan oleh Modicon pada tahun 1979 dan digunakan untuk mentransmisikan data melalui jalur serial antara perangkat elektronik industri. RS-485 Modbus menggunakan RS-485 untuk jalur transmisi. Perlu dicatat bahwa Modbus adalah protokol perangkat lunak dan bukan protokol perangkat keras. Ini dibagi menjadi dua bagian seperti Modbus Master dan Modbus Slave. Dalam jaringan Modbus RS-485 terdapat satu Master dan 127 Slave masing-masing dengan alamat unik dari 1 hingga 127. Dalam proyek Arduino MAX485 ini, kita akan menggunakan Arduino Uno sebagai Slave untuk komunikasi serial.
Modbus banyak digunakan di PLC (Programmable Logic Controllers). Dan selain itu, Modbus juga digunakan dalam Perawatan Kesehatan, Transportasi, Otomasi Rumah, dll. Modbus memiliki 255 kode fungsi dan terutama ada tiga versi Modbus yang populer:
- MODBUS RTU
- MODBUS ASCII
- MODBUS / TCP
Apa perbedaan antara Modbus ASCII dan Modbus RTU?
Modbus RTU dan Modbus ASCII menggunakan protokol yang sama. Satu-satunya perbedaan adalah bahwa byte yang dikirimkan melalui kabel disajikan sebagai biner dengan RTU dan sebagai ASCII yang dapat dibaca dengan Modbus RTU. Modbus RTU akan digunakan dalam tutorial ini.
Tutorial ini tentang menggunakan komunikasi Modbus RS-485 dengan Arduino UNO sebagai Slave. Di sini kita menginstal Software Modbus Master di PC dan mengontrol dua LED dan Servo Motor dengan menggunakan RS-485 sebagai saluran transmisi. LED dan motor servo ini dihubungkan dengan Slave Arduino dan dikontrol dengan mengirimkan nilai menggunakan Software Master Modbus. Karena tutorial ini menggunakan RS-485, disarankan untuk terlebih dahulu melalui Komunikasi Serial RS485 antara Arduino Uno dan Arduino Nano. RS485 juga dapat digunakan dengan pengontrol lain untuk komunikasi serial:
- RS-485 Komunikasi Serial antara Raspberry Pi & Arduino UNO
- Komunikasi Serial STM32F103C8 dengan Arduino UNO menggunakan RS-485
Mari kita mulai dengan menjelajahi beberapa latar belakang tentang RS-485 dan Modbus. Pelajari juga lebih lanjut tentang berbagai protokol Komunikasi Serial di sini.
Komunikasi Serial RS-485
RS-485 adalah protokol komunikasi serial asinkron yang tidak memerlukan jam. Ini menggunakan teknik yang disebut sinyal diferensial untuk mentransfer data biner dari satu perangkat ke perangkat lainnya.
Jadi apa metode transfer sinyal diferensial ini ??
Metode sinyal diferensial bekerja dengan cara membuat tegangan diferensial dengan menggunakan tegangan 5V positif dan negatif. Ini menyediakan komunikasi Half-Duplex saat menggunakan dua kabel dan Full-Duplex membutuhkan 4 kabel merangkak.
Dengan menggunakan metode ini:
- RS-485 mendukung kecepatan transfer data maksimum 30Mbps.
- Ini juga menyediakan jarak transfer data maksimum dibandingkan dengan protokol RS-232. Ini mentransfer data hingga maksimum 1200 meter.
- Keunggulan utama RS-485 dibandingkan RS-232 adalah adanya beberapa slave dengan Master tunggal sementara RS-232 hanya mendukung slave tunggal.
- Dapat memiliki maksimal 32 perangkat yang terhubung ke protokol RS-485.
- Keuntungan lain dari RS-485 adalah kebal terhadap kebisingan karena mereka menggunakan metode sinyal diferensial untuk mentransfer.
- RS-485 lebih cepat dibandingkan dengan protokol I2C.
Menghubungkan RS-485 dengan Arduino
Modul RS-485 dapat dihubungkan ke mikrokontroler manapun yang memiliki port serial. Untuk menggunakan modul RS-485 dengan mikrokontroler, diperlukan modul 5V MAX485 TTL hingga RS485 yang berbasis IC Maxim MAX485 karena memungkinkan komunikasi serial pada jarak jauh 1200 meter. Ini adalah dua arah dan setengah dupleks dan memiliki kecepatan transfer data 2,5 Mbps. Modul ini membutuhkan tegangan 5V.
Pin-Out dari RS-485:
Nama Pin |
Deskripsi Pin |
VCC |
5V |
SEBUAH |
Input Penerima Non-pembalik Output Driver Non-Pembalik |
B |
Membalik Input Penerima Membalik Output Driver |
GND |
GND (0V) |
R0 |
Penerima Keluar (RX pin) |
KEMBALI |
Output Penerima (LOW-Enable) |
DE |
Output Driver (HIGH-Enable) |
DI |
Masukan Driver (pin TX) |
Modul Konverter USB ke RS-485
Ini adalah modul Adaptor Konverter USB ke RS485 yang mendukung WIN7, XP, Vista, Linux, Mac OS dan menyediakan antarmuka RS485 yang mudah digunakan dengan menggunakan port COM di komputer . Modul ini adalah perangkat plug-and-play . Tidak ada struktur perintah, apa pun yang dikirim ke Port COM Virtual secara otomatis diubah ke RS485 dan sebaliknya. Modul ini sepenuhnya bertenaga sendiri dari bus USB. Jadi, tidak perlu catu daya eksternal untuk pengoperasian.
Ini muncul sebagai port Serial / COM dan dapat diakses dari aplikasi atau hyper-terminal. Konverter ini menyediakan komunikasi RS-485 setengah dupleks. Kisaran kecepatan Baud adalah 75 bps hingga 115200 bps, maksimum hingga 6 Mbps.
Untuk menggunakan perangkat ini terdapat berbagai Software Modbus yang tersedia di internet. Dalam tutorial ini sebuah perangkat lunak yang disebut Simply Modbus Software digunakan.
Cukup Modbus Master Software
Aplikasi Modbus Master Software dibutuhkan untuk mengirimkan data ke slave perangkat Modbus RS-485 Arduino melalui COM.
Cukup Modbus Master adalah perangkat lunak uji komunikasi data. Anda dapat mengunduh Simply Modbus Master dari tautan yang diberikan dan mempelajarinya lebih lanjut dengan merujuk Manual Perangkat Lunak.
Sebelum menggunakan perangkat lunak, penting untuk memahami terminologi berikut.
ID Budak:
Setiap slave dalam jaringan diberi alamat unit unik dari 1 hingga 127. Ketika master meminta data, byte pertama yang dikirimkannya adalah alamat Slave. Dengan cara ini setiap budak mengetahui setelah byte pertama apakah akan mengabaikan pesan tersebut atau tidak.
Kode fungsi:
Byte kedua yang dikirim oleh Master adalah kode Fungsi. Nomor ini memberi tahu budak tabel mana yang akan diakses dan apakah akan membaca atau menulis ke tabel.
Kode Fungsi Register yang Didukung:
Kode Fungsi |
Tindakan |
Nama Tabel |
04 (04 hex) |
Baca |
Register Input Analog |
03 (03 hex) |
Baca |
Register Holding Output Analog |
06 (06 hex) |
Menulis lajang |
Analog Output Holding Register |
16 (10 hex) |
Tulis banyak |
Register Holding Output Analog |
Kode Fungsi Coil yang Didukung:
Kode Fungsi |
Tindakan |
Nama Tabel |
02 (02 hex) |
Baca |
Kontak Input Diskrit |
01 (01 hex) |
Baca |
Kumparan Output Diskrit |
05 (05 hex) |
Menulis lajang |
Kumparan Keluaran Diskrit |
15 (0F hex) |
Tulis banyak |
Kumparan Output Diskrit |
CRC:
CRC adalah singkatan dari Cyclic Redundancy check. Ini adalah dua byte yang ditambahkan ke akhir setiap pesan Modbus untuk deteksi kesalahan.
Alat Diperlukan
Perangkat keras
- Arduino UNO
- Modul Konverter MAX-485 TTL ke RS-485
- Modul Konverter USB ke RS-485
- LED (2)
- 1k-Resistor (2)
- Layar LCD 16x2
- Potensiometer 10k
- Motor Servo SG-90
Perangkat lunak
- Cukup Modbus Master
Diagram Sirkuit
Koneksi Sirkuit antara modul konverter MAX-485 TTL ke RS-485 dan Arduino UNO:
Arduino UNO |
Modul Konverter MAX-485 TTL ke RS-485 |
0 (RX) |
RO |
1 (TX) |
DI |
4 |
DE & RE |
+ 5V |
VCC |
GND |
GND |
Koneksi Sirkuit antara Modul MAX-485 TTL ke RS-485 dan konverter USB ke RS-485:
MAX-485 TTL hingga RS-485 Modul Konverter |
Modul USB ke RS-485 Terhubung dengan PC |
SEBUAH |
SEBUAH |
B |
B |
Koneksi Sirkuit antara Arduino UNO dan layar LCD 16x2:
LCD 16x2 |
Arduino UNO |
VSS |
GND |
VDD |
+ 5V |
V0 |
Untuk mengontrol pin potensiometer untuk kontrol kontras / kecerahan LCD 16x2 |
RS |
8 |
RW |
GND |
E |
9 |
D4 |
10 |
D5 |
11 |
D6 |
12 |
D7 |
13 |
SEBUAH |
+ 5V |
K |
GND |
Koneksi Sirkuit antara 2 LED, Servo Motor dan Arduino UNO:
Arduino UNO |
LED1 |
LED2 |
Motor servo |
2 |
Anoda melalui resistor 1k |
- |
- |
5 |
- |
Anoda melalui resistor 1k |
- |
6 |
- |
- |
Pin PWM (Oranye) |
+ 5V |
- |
- |
+ 5V (MERAH) |
GND |
Katoda GND |
Katoda GND |
GND (Coklat) |
Pemrograman Arduino UNO untuk RS-485 MODBUS Slave
Arduino UNO dikonfigurasi sebagai Modbus Slave. Selain itu, Arduino UNO dipasang dengan dua LED dan satu Motor Servo. Jadi budak Arduino dikendalikan dari Master Modbus Software. Komunikasi antara Arduino UNO dan Modbus Master Software dilakukan dengan menggunakan modul RS-485. Untuk menghubungkannya dengan PC, modul konverter USB ke RS-485 digunakan. Dan Arduino UNO dengan modul converter MAX-485 TTL to RS-485, secara keseluruhan akan terlihat file berikut ini:
Untuk menggunakan Modbus di Arduino UNO, perpustakaan
Awalnya, sertakan perpustakaan yang diperlukan. Library ModbusRTU untuk menggunakan komunikasi Modbus RS-485, dan library liquid crystal untuk menggunakan LCD dengan Arduino UNO, dan library servo untuk menggunakan motor Servo dengan Arduino UNO.
#include
Sekarang pin anoda LED yang terhubung dengan pin Arduino 2 dan 5 didefinisikan sebagai LED1 dan LED2.
# tentukan led1 2 # tentukan led2 5
Selanjutnya objek untuk mengakses kelas Liquid Crystal dinyatakan dengan pin LCD (RS, E, D4, D5, D6, D7) yang dihubungkan dengan Arduino UNO.
LCD LiquidCrystal (8,9,10,11,12,13);
Setelah LCD selesai, Inisialisasi objek servo untuk kelas Servo. Juga Inisialisasi objek bus untuk kelas Modbus.
Servo servo; Bus modbus;
Selanjutnya untuk menyimpan nilai untuk komunikasi Modbus, sebuah array dideklarasikan dengan tiga nilai yang diinisialisasi dengan nol.
uint16_t modbus_array = {0,0,0};
Dalam fungsi setup , LCD pertama diatur dalam mode 16x2 dan pesan selamat datang ditampilkan dan dihapus.
lcd.begin (16,2); // Lcd disetel dalam mode 16x2 lcd.print ("RS-485 Modbus"); // Pesan Selamat Datang lcd.setCursor (0,1); lcd.print ("Arduino Slave"); penundaan (5000); lcd.clear ();
Setelah ini, pin LED1 dan LED2 ditetapkan sebagai pin keluaran.
pinMode (led1, OUTPUT); pinMode (led2, OUTPUT);
Pin pulsa servo yang terhubung ke PWM pin 6 Arduino terpasang.
servo.attach (6);
Sekarang untuk komunikasi Modbus, parameter berikut telah ditetapkan. '1' pertama mewakili ID Slave, '1' kedua menunjukkan bahwa ia menggunakan RS-485 untuk mentransfer data dan '4' mewakili pin RS-485 DE&RE yang terhubung ke Arduino UNO.
bus = Modbus (1,1,4);
Budak Modbus disetel pada 9600 baudrate.
Perulangan dimulai dengan definisi polling bus dan bus.poll () digunakan untuk menulis dan menerima nilai dari master Modbus.
bus.poll (modbus_array, sizeof (modbus_array) / sizeof (modbus_array));
Metode ini digunakan untuk memeriksa apakah ada data yang tersedia di port serial.
Jika ada data yang tersedia di port serial perpustakaan Modbus RTU akan memeriksa pesan (periksa alamat perangkat, panjang data, dan CRC) dan melakukan tindakan yang diperlukan.
Misalnya untuk menulis atau membaca nilai apa pun dari master, ModbusRTU harus menerima larik integer 16-bit unsigned dan panjangnya dari Modbus Master. Larik ini membawa data yang ditulis dari master.
Dalam tutorial ini ada tiga array untuk sudut motor LED1, LED2 dan Servo.
Pertama untuk menyalakan atau mematikan LED1 modbus_array digunakan.
if (modbus_array == 0) // Tergantung pada nilai dalam modubus_array yang ditulis oleh Master Modbus { digitalWrite (led1, LOW); // LED OFF jika 0 lcd.setCursor (0,0); lcd.print ("L1: OFF"); } lain { digitalWrite (led1, HIGH); // LED ON jika nilai selain 0 lcd.setCursor (0,0); lcd.print ("L1: ON"); }
Selanjutnya untuk MENGAKTIFKAN atau MENONAKTIFKAN LED2 modbus_array digunakan.
if (modbus_array == 0) // Tergantung pada nilai dalam modbus_array yang ditulis oleh Master Modbus { digitalWrite (led2, LOW); // LED OFF jika 0 lcd.setCursor (8,0); lcd.print ("L2: OFF"); } lain { digitalWrite (led2, HIGH); // LED ON jika nilai selain 0 lcd.setCursor (9,0); lcd.print ("L2: ON"); }
Selanjutnya untuk mengatur sudut motor Servo, modbus_array digunakan dan nilainya dicetak pada tampilan LCD 16x2.
int pwm = modbus_array; servo.write (pwm); lcd.setCursor (0,1); lcd.print ("Sudut servo:"); lcd.print (pwm); penundaan (200); lcd.clear ();
Ini menyelesaikan pemrograman Arduino UNO untuk mengerjakannya sebagai MODBUS Slave. Langkah selanjutnya adalah mengujinya sebagai Modbus Slave.
Menguji Arduino UNO sebagai Rs485 Modbus Slave
Setelah koneksi rangkaian selesai dan kodenya diunggah ke Arduino UNO, saatnya untuk menghubungkan modul USB to RS-485 dengan PC di mana software Simple Modbus Master diinstal.
Buka device manager dan periksa COM port sesuai PC Anda dimana USB to RS-485 Module terhubung dan setelah itu buka software Simply Modbus Master 8.1.1.
1. Setelah Simply Modbus Software dibuka sekarang buka opsi Write.
2. Setelah Simply Modbus Master Write dibuka. Atur parameternya
Mode di RTU, port COM menurut PC Anda (milik saya adalah COM6), Baud di 9600, Data Bits 8, Stop bit 1, Parity None dan Slave ID sebagai 1.
3. Setelah itu atur register pertama sebagai 40001 dan nilai yang akan ditulis adalah 3 dan kode fungsinya sebagai 16 (Write Holding Register).
Setelah itu tulis 1 ke 40001 (Untuk LED1 on) dan 1 ke 40002 (Untuk LED2 on) dan 90 ke 40003 (Untuk Servo Motor Angle) lalu klik tombol SEND.
Anda dapat melihat status LED ON dan sudut servo pada 90 derajat.
4. Setelah itu masukkan 40001 sebagai 1 dan 40002 sebagai 0 dan 40003 sebagai 180 dan klik tombol KIRIM.
5. Sekarang tuliskan 135 ke 40003 dan 40001 sebagai 0 dan 40002 sebagai 1.
Ini adalah bagaimana RS-485 Modbus dapat digunakan dalam komunikasi serial dengan Arduino UNO sebagai Slave. Dalam tutorial selanjutnya kita akan menggunakan Arduino Uno sebagai master dalam komunikasi MODBUS.
Temukan kode lengkapnya dan video Demonstrasi di bawah ini.