- RS-485 Seri Haberleşme
- RS-485'i Arduino ile bağlama
- USB'den RS-485'e Dönüştürücü Modül
- Simply Modbus Master Yazılımı
- Gerekli aletler
- Devre şeması
- RS-485 MODBUS Slave için Arduino UNO'nun Programlanması
- Arduino UNO'yu Rs485 Modbus Slave Olarak Test Etme
Modbus, 1979 yılında Modicon tarafından keşfedilen ve endüstriyel elektronik cihazlar arasında seri hatlar üzerinden veri iletimi için kullanılan bir Seri İletişim protokolüdür. RS-485 Modbus, iletim hatları için RS-485 kullanır. Modbus'un bir yazılım protokolü olduğu ve bir donanım protokolü olmadığı unutulmamalıdır. Modbus Master ve Modbus Slave olmak üzere iki kısma ayrılmıştır. RS-485 Modbus ağında, her biri 1'den 127'ye kadar benzersiz adrese sahip bir Master ve 127 Slave vardır. Bu MAX485 Arduino projesinde, Arduino Uno'yu seri iletişim için Slave olarak kullanacağız.
Modbus çoğunlukla PLC'lerde (Programlanabilir Mantık Denetleyicileri) kullanılır. Bunun dışında Modbus, Sağlık Hizmetleri, Ulaşım, Ev Otomasyonu vb. Alanlarda da kullanılmaktadır. Modbus 255 fonksiyon koduna sahiptir ve Modbus'un başlıca üç popüler sürümü vardır:
- MODBUS RTU
- MODBUS ASCII
- MODBUS / TCP
Modbus ASCII ile Modbus RTU arasındaki fark nedir?
Modbus RTU ve Modbus ASCII aynı protokolü konuşuyor. Tek fark, kablo üzerinden iletilen baytların RTU ile ikili olarak ve Modbus RTU ile okunabilir ASCII olarak sunulmasıdır. Bu eğitimde Modbus RTU kullanılacaktır.
Bu eğitim, Arduino UNO ile Slave olarak RS-485 Modbus iletişimini kullanmakla ilgilidir . Burada Simply Modbus Master Yazılımını PC'ye kuruyoruz ve iletim hattı olarak RS-485 kullanarak iki LED ve Servo Motoru kontrol ediyoruz. Bu LED'ler ve servo motor Slave Arduino ile bağlanır ve Master Modbus Yazılımı kullanılarak değerler gönderilerek kontrol edilir. Bu eğitimde RS-485 kullanıldığından, önce Arduino Uno ve Arduino Nano arasında RS485 Seri İletişiminden geçmeniz önerilir. RS485, seri iletişim için diğer kontrolörlerle de kullanılabilir:
- Raspberry Pi & Arduino UNO arasında RS-485 Seri Haberleşme
- RS-485 kullanarak STM32F103C8 ve Arduino UNO Arasında Seri İletişim
RS-485 ve Modbus hakkında biraz arka plan inceleyerek başlayalım. Ayrıca burada çeşitli Seri İletişim protokolleri hakkında daha fazla bilgi edinin.
RS-485 Seri Haberleşme
RS-485, saat gerektirmeyen bir asenkron seri iletişim protokolüdür. İkili verileri bir cihazdan diğerine aktarmak için diferansiyel sinyal adı verilen bir teknik kullanır.
Peki bu diferansiyel sinyal transfer yöntemi nedir?
Diferansiyel sinyal yöntemi, pozitif ve negatif 5V kullanarak diferansiyel voltaj oluşturarak çalışır. Bu içerir Yarı-Dubleks kullanıldığında iletişim iki kabloyu ve Tam-çift yönlü gerektirir 4 ayak teller.
Bu yöntemi kullanarak:
- RS-485, maksimum 30 Mbps'lik daha yüksek veri aktarım hızını destekler.
- Ayrıca RS-232 protokolüne kıyasla maksimum veri aktarım mesafesi sağlar. Verileri maksimum 1200 metreye kadar aktarır.
- RS-485'in RS-232'ye göre ana avantajı, tek Master ile çoklu slave, RS-232 ise sadece tek slave'i destekler.
- RS-485 protokolüne bağlı maksimum 32 cihaz olabilir.
- RS-485'in bir başka avantajı, aktarım için diferansiyel sinyal yöntemini kullandıklarından gürültüden etkilenmemesidir.
- RS-485, I2C protokolüne göre daha hızlıdır.
RS-485'i Arduino ile bağlama
RS-485 Modülü, seri porta sahip herhangi bir mikrodenetleyiciye bağlanabilir. RS-485 modülünü mikro denetleyicilerle kullanmak için, 1200 metrelik uzun mesafelerde seri iletişime izin verdiği için Maxim MAX485 IC'ye dayalı 5V MAX485 TTL - RS485 adlı bir modüle ihtiyaç vardır. Çift yönlü ve yarı dublekstir ve 2.5 Mbps veri aktarım hızına sahiptir. Bu modül, 5V'luk bir voltaj gerektirir.
RS-485'in Pin Çıkışı:
Pin Adı |
Pin Açıklaması |
VCC |
5V |
Bir |
Tersine Çevrilmeyen Alıcı Girişi Ters Çevirmeyen Sürücü Çıkışı |
B |
Alıcı Girişini Ters Çevirme Ters Sürücü Çıkışı |
GND |
GND (0V) |
R0 |
Alıcı Çıkışı (RX pin) |
YENİDEN |
Alıcı Çıkışı (LOW-Enable) |
DE |
Sürücü Çıkışı (YÜKSEK Etkin) |
DI |
Sürücü Girişi (TX pini) |
USB'den RS-485'e Dönüştürücü Modül
WIN7, XP, Vista, Linux, Mac OS destekleyen ve bilgisayardaki COM portunu kullanarak kullanımı kolay bir RS485 arayüzü sağlayan USB'den RS485'e Dönüştürücü Adaptör modülüdür . Bu modül tak ve çalıştır bir cihazdır . Komut yapısı yoktur, Sanal COM Portuna gönderilen her şey otomatik olarak RS485'e dönüştürülür ve bunun tersi de geçerlidir. Modül, USB veri yolundan tamamen kendi kendine çalışır. Bu nedenle, işletim için harici güç kaynağına gerek yoktur.
Seri / COM bağlantı noktası olarak görünür ve uygulamalardan veya hiper terminalden erişilebilir. Bu dönüştürücü, yarı çift yönlü RS-485 iletişimi sağlar. Baud hızı aralığı 75 bps ila 115200 bps, maksimum 6 Mbps'dir.
Bu cihazı kullanmak için internette çeşitli Modbus Yazılımları mevcuttur. Bu eğitimde Simply Modbus Software adlı bir yazılım kullanılmıştır.
Simply Modbus Master Yazılımı
COM üzerinden slave Modbus RS-485 Arduino cihazına veri göndermek için Modbus Master Yazılım uygulamasına ihtiyaç vardır.
Simply Modbus Master, bir veri iletişimi test yazılımıdır. Simply Modbus Master'ı verilen bağlantıdan indirebilir ve Yazılım Kılavuzuna bakarak bunun hakkında daha fazla bilgi edinebilirsiniz.
Yazılımı kullanmadan önce, aşağıdaki terminolojilere aşina olmak önemlidir.
Slave Kimliği:
Bir ağdaki her bir slave'e 1'den 127'ye kadar benzersiz bir ünite adresi atanır. Master veri talep ettiğinde, gönderdiği ilk bayt Slave adresidir. Bu şekilde her slave, ilk bayttan sonra mesajı göz ardı edip etmeyeceğini bilir.
Fonksiyon kodu:
Master tarafından gönderilen ikinci bayt, Fonksiyon kodudur. Bu numara, slave'e hangi tabloya erişeceğini ve tablodan okuyup yazmayacağını söyler.
Desteklenen Kayıt Fonksiyonu kodları:
Fonksiyon Kodu |
Aksiyon |
Tablo ismi |
04 (04 onaltılık) |
Okuyun |
Analog Giriş Kayıtları |
03 (03 onaltılık) |
Okuyun |
Analog Çıkış Tutma Yazmacıları |
06 (06 onaltılık) |
Tek yaz |
Analog Çıkış Tutma Kaydı |
16 (10 altıgen) |
Birden çok yaz |
Analog Çıkış Tutma Yazmacıları |
Desteklenen Bobin Fonksiyon kodları:
Fonksiyon Kodu |
Aksiyon |
Tablo ismi |
02 (02 onaltılık) |
Okuyun |
Ayrık Giriş Kontakları |
01 (01 onaltılık) |
Okuyun |
Ayrık Çıkış Bobinleri |
05 (05 altıgen) |
Tek yaz |
Ayrık Çıkış Bobini |
15 (0F onaltılık) |
Birden çok yaz |
Ayrık Çıkış Bobinleri |
CRC:
CRC, Döngüsel Artıklık denetimi anlamına gelir. Hata tespiti için her Modbus mesajının sonuna eklenen iki bayttır.
Gerekli aletler
Donanım
- Arduino UNO
- MAX-485 TTL - RS-485 Dönüştürücü Modül
- USB'den RS-485'e Dönüştürücü Modül
- LED (2)
- 1k-Direnç (2)
- 16x2 LCD ekran
- 10k Potansiyometre
- Servo Motor SG-90
Yazılım
- Basitçe Modbus Master
Devre şeması
MAX-485 TTL - RS-485 dönüştürücü modülü ve Arduino UNO arasındaki Devre Bağlantısı:
Arduino UNO |
MAX-485 TTL - RS-485 Dönüştürücü Modül |
0 (RX) |
RO |
1 (TX) |
DI |
4 |
DE & RE |
+ 5V |
VCC |
GND |
GND |
MAX-485 TTL'den RS-485 Modülüne ve USB'den RS-485'e dönüştürücü arasındaki Devre Bağlantısı:
MAX-485 TTL - RS-485 Dönüştürücü Modülü |
USB'den RS-485 Modülüne PC ile bağlantılı |
Bir |
Bir |
B |
B |
Arduino UNO ve 16x2 LCD ekran arasındaki Devre Bağlantıları:
16x2 LCD |
Arduino UNO |
VSS |
GND |
VDD |
+ 5V |
V0 |
16x2 LCD'nin kontrast / parlaklık kontrolü için potansiyometre pinini kontrol etmek için |
RS |
8 |
RW |
GND |
E |
9 |
D4 |
10 |
D5 |
11 |
D6 |
12 |
D7 |
13 |
Bir |
+ 5V |
K |
GND |
2 LED, Servo Motor ve Arduino UNO arasındaki Devre Bağlantısı:
Arduino UNO |
LED1 |
LED2 |
Servo Motor |
2 |
1k direnç üzerinden anot |
- |
- |
5 |
- |
1k direnç üzerinden anot |
- |
6 |
- |
- |
PWM pimi (Turuncu) |
+ 5V |
- |
- |
+ 5V (KIRMIZI) |
GND |
Katot GND |
Katot GND |
GND (Kahverengi) |
RS-485 MODBUS Slave için Arduino UNO'nun Programlanması
Arduino UNO, Modbus Slave olarak yapılandırılmıştır. Ayrıca Arduino UNO'ya iki LED ve bir Servo Motor takılmıştır. Dolayısıyla, bağımlı Arduino Master Modbus Yazılımından kontrol edilir. Arduino UNO ve Modbus Master Yazılımı arasındaki iletişim RS-485 modülü kullanılarak gerçekleştirilir. PC'ye bağlamak için USB'den RS-485'e dönüştürücü modül kullanılır. Ve MAX-485 TTL - RS-485 dönüştürücü modülüne sahip Arduino UNO, tüm kurulum dosyası aşağıdaki gibi görünecektir:
Arduino UNO'da Modbus kullanmak için bir kütüphane
Başlangıçta gerekli kitaplığı ekleyin. ModbusRTU kütüphanesi RS-485 Modbus iletişimini kullanmak içindir ve likit kristal kütüphanesi Arduino UNO ile LCD kullanmak içindir ve servo kütüphanesi Arduino UNO ile Servo motor kullanmak içindir.
#Dahil etmek
Artık Arduino pin 2 ve 5 ile bağlanan LED anot pinleri LED1 ve LED2 olarak tanımlanmıştır.
#define led1 2 #define led2 5
Daha sonra, Arduino UNO'ya bağlanan LCD pinleri (RS, E, D4, D5, D6, D7) ile Liquid Crystal sınıfına erişim nesnesi ilan edilir.
LiquidCrystal lcd (8,9,10,11,12,13);
LCD tamamlandığında, Servo sınıfı için servo nesnesini başlatın. Ayrıca Modbus sınıfı için veri yolu nesnesini başlatın.
Servo servo; Modbus veriyolu;
Modbus iletişimi için değerleri depolamanın ardından, sıfır ile başlatılan üç değerle bir dizi bildirilir.
uint16_t modbus_array = {0,0,0};
In kurulum fonksiyonu, öncelikle LCD 16x2 modunda ayarlanır ve bir karşılama mesajı görüntülenir ve temizlenir.
lcd.begin (16,2); // 16x2 modunda Lcd seti lcd.print ("RS-485 Modbus"); // Hoş Geldiniz Mesajı lcd.setCursor (0,1); lcd.print ("Arduino Slave"); gecikme (5000); lcd.clear ();
Bundan sonra LED1 ve LED2 pinleri çıkış pinleri olarak ayarlanır.
pinMode (led1, OUTPUT); pinMode (led2, OUTPUT);
Arduino'nun PWM pini 6'ya bağlı servo darbe pimi takılıdır.
servo.attach (6);
Şimdi Modbus iletişimi için aşağıdaki parametreler ayarlanır. İlk '1' Slave ID'yi, ikincisi '1' veri aktarmak için RS-485'i kullandığını ve '4' Arduino UNO'ya bağlı RS-485 DE&RE pinini temsil eder.
veri yolu = Modbus (1,1,4);
Modbus slave, 9600 baud hızında ayarlanmıştır.
Döngü, veri yolu anketinin tanımıyla başlar ve ana Modbus'tan değer yazmak ve almak için bus.poll () kullanılır.
bus.poll (modbus_array, sizeof (modbus_array) / sizeof (modbus_array));
Bu yöntem, seri bağlantı noktasında herhangi bir veri olup olmadığını kontrol etmek için kullanılır.
Seri portta herhangi bir veri mevcutsa, Modbus RTU kütüphanesi mesajı kontrol edecek (cihaz adresini, veri uzunluğunu ve CRC'yi kontrol edecek) ve gerekli eylemi gerçekleştirecektir.
Örneğin, ana birimden herhangi bir değer yazmak veya okumak için, ModbusRTU işaretsiz 16 bitlik bir tamsayı dizisi ve uzunluğunu Ana Modbus'tan almalıdır. Bu dizi, ana bilgisayardan yazılan verileri taşır.
Bu eğitimde LED1, LED2 ve Servo motor açısı için üç dizi vardır .
Önce AÇMAK veya KAPATMAK için LED1 modbus_array kullanılır.
if (modbus_array == 0) // Master Modbus tarafından yazılan modubus_array'deki değere bağlıdır { digitalWrite (led1, LOW); // 0 ise LED KAPALI lcd.setCursor (0,0); lcd.print ("L1: KAPALI"); } else { digitalWrite (led1, HIGH); // 0'dan farklı bir değer varsa LED AÇIK lcd.setCursor (0,0); lcd.print ("L1: AÇIK"); }
AÇMA veya KAPATMA'nın yanında LED2 modbus_array kullanılır.
if (modbus_array == 0) // Master Modbus tarafından yazılan modbus_array'deki değere bağlıdır { digitalWrite (led2, LOW); // 0 ise LED KAPALI lcd.setCursor (8,0); lcd.print ("L2: KAPALI"); } else { digitalWrite (led2, HIGH); // 0'dan farklı bir değer varsa LED AÇIK lcd.setCursor (9,0); lcd.print ("L2: AÇIK"); }
Servo motorun açısını ayarlamak için kullanılan modbus_array ve 16x2 LCD ekranda değer yazdırılır.
int pwm = modbus_array; servo.write (pwm); lcd.setCursor (0,1); lcd.print ("Servo açısı:"); lcd.print (pwm); gecikme (200); lcd.clear ();
Bu, Arduino UNO'yu MODBUS Slave olarak çalıştırmak için programlamayı bitirir. Bir sonraki adım, onu Modbus Slave olarak test edecek.
Arduino UNO'yu Rs485 Modbus Slave Olarak Test Etme
Devre bağlantıları tamamlandıktan ve kod Arduino UNO'ya yüklendikten sonra, Basit Modbus Master yazılımının kurulu olduğu PC ile USB'yi RS-485 modülüne bağlama zamanı.
Cihaz yöneticisini açın ve USB - RS-485 Modülünün bağlı olduğu PC'nize göre COM portunu kontrol edin ve ardından Simply Modbus Master 8.1.1 yazılımını açın.
1. Simply Modbus Software açıldıktan sonra şimdi Yaz seçeneğini açın.
2. Simply Modbus Master Write açıldıktan sonra. Parametreleri ayarlayın
RTU'da mod, PC'nize göre COM portu (benimki COM6 idi), 9600'de Baud, Veri Bitleri 8, Durdurma biti 1, Eşlik Yok ve Bağımlı Kimliği 1.
3. Bundan sonra ilk kaydı 40001 olarak ayarlayın ve yazılacak değerler 3 ve fonksiyon kodu 16 (Yazma Holding Kaydı) olarak ayarlayın.
Bundan sonra 1 ila 40001 (LED1 açık) ve 1 ila 40002 (LED2 açık) ve 90 ila 40003 (Servo Motor Açısı için) yazıp GÖNDER düğmesine tıklayın.
Hem LED durumunun AÇIK olduğunu hem de servo açısının 90 derece olduğunu görebilirsiniz.
4. Daha sonra 40001'i 1 ve 40002'yi 0 ve 40003'ü 180 olarak girip GÖNDER butonuna tıklayın.
5. Şimdi 135 - 40003 ve 40001'i 0 ve 40002'yi 1 olarak yazınız.
Bu nasıl RS-485 Modbus Slave olarak Arduino UNO seri iletişim kullanılabilir. Bir sonraki eğitimde Arduino Uno'yu MODBUS iletişiminde ana olarak kullanacağız.
Aşağıda tam kodu ve bir Tanıtım videosunu bulun.