- การสื่อสารแบบอนุกรม RS-485
- เชื่อมต่อ RS-485 กับ Arduino
- โมดูลแปลง USB เป็น RS-485
- เพียงแค่ซอฟต์แวร์ Modbus Master
- เครื่องมือที่จำเป็น
- แผนภูมิวงจรรวม
- การเขียนโปรแกรม Arduino UNO สำหรับ RS-485 MODBUS Slave
- ทดสอบ Arduino UNO เป็น Rs485 Modbus Slave
Modbus เป็นโปรโตคอลการสื่อสารแบบอนุกรมซึ่ง Modicon ค้นพบในปีพ. ศ. 2522 และใช้สำหรับการส่งข้อมูลผ่านสายอนุกรมระหว่างอุปกรณ์อิเล็กทรอนิกส์อุตสาหกรรม RS-485 Modbus ใช้ RS-485 สำหรับสายส่ง มันควรจะตั้งข้อสังเกตว่าModbus เป็นโปรโตคอลซอฟแวร์และไม่ได้เป็นโปรโตคอลฮาร์ดแวร์แบ่งออกเป็นสองส่วนเช่น Modbus Master และ Modbus Slave ในเครือข่าย RS-485 Modbus มี Master หนึ่งตัวและ 127 Slaves แต่ละตัวมีที่อยู่ที่ไม่ซ้ำกันตั้งแต่ 1 ถึง 127 ใน โครงการMAX485 Arduinoนี้เราจะใช้ Arduino Uno เป็น Slave สำหรับการสื่อสารแบบอนุกรม
Modbus ส่วนใหญ่จะใช้ในPLC (Programmable Logic Controllers) และนอกเหนือจากนี้ Modbus ยังใช้ใน Healthcare, Transportation, Home Automation เป็นต้น Modbus มีรหัสฟังก์ชัน 255 รหัสและ Modbus ที่เป็นที่นิยมส่วนใหญ่มีสามเวอร์ชัน:
- MODBUS RTU
- MODBUS ASCII
- MODBUS / TCP
อะไรคือความแตกต่างระหว่าง Modbus ASCII และ Modbus RTU?
Modbus RTU และ Modbus ASCIIพูดถึงโปรโตคอลเดียวกัน ข้อแตกต่างเพียงอย่างเดียวคือไบต์ที่ส่งผ่านสายจะแสดงเป็นไบนารีกับ RTU และ ASCII ที่อ่านได้ด้วย Modbus RTU Modbus RTU จะถูกใช้ในบทช่วยสอนนี้
บทช่วยสอนนี้เกี่ยวกับการใช้การสื่อสาร RS-485 Modbus กับ Arduino UNO ในฐานะ Slave ที่นี่เราติดตั้งซอฟต์แวร์ Simply Modbus Masterในเครื่องพีซีและควบคุม LED สองดวงและเซอร์โวมอเตอร์โดยใช้ RS-485 เป็นสายส่ง LED และเซอร์โวมอเตอร์เหล่านี้เชื่อมต่อกับ Slave Arduino และควบคุมโดยการส่งค่าโดยใช้ซอฟต์แวร์ Master Modbus เนื่องจากบทช่วยสอนนี้ใช้ RS-485 จึงขอแนะนำให้ทำผ่าน RS485 Serial Communication ระหว่าง Arduino Uno และ Arduino Nano ก่อน RS485 สามารถใช้กับคอนโทรลเลอร์อื่น ๆ สำหรับการสื่อสารแบบอนุกรม:
- RS-485 Serial Communication ระหว่าง Raspberry Pi และ Arduino UNO
- การสื่อสารแบบอนุกรมระหว่าง STM32F103C8 และ Arduino UNO โดยใช้ RS-485
เริ่มต้นด้วยการสำรวจความเป็นมาเกี่ยวกับ RS-485 และ Modbus เรียนรู้เพิ่มเติมเกี่ยวกับโปรโตคอล Serial Communication ต่างๆได้ที่นี่
การสื่อสารแบบอนุกรม RS-485
RS-485 เป็นโปรโตคอลการสื่อสารแบบอนุกรมแบบอะซิงโครนัสซึ่งไม่ต้องใช้นาฬิกา ใช้เทคนิคที่เรียกว่าสัญญาณที่แตกต่างเพื่อถ่ายโอนข้อมูลไบนารีจากอุปกรณ์หนึ่งไปยังอีกอุปกรณ์หนึ่ง
วิธีการถ่ายโอนสัญญาณส่วนต่างนี้คืออะไร ??
วิธีสัญญาณดิฟเฟอเรนเชียลทำงานโดยการสร้างแรงดันแตกต่างโดยใช้ 5V บวกและลบ มันมี half-duplex สื่อสารเมื่อใช้ สองสาย และ Full-Duplex ต้อง 4 สี่ สาย
โดยใช้วิธีนี้:
- RS-485 รองรับอัตราการถ่ายโอนข้อมูลที่สูงขึ้นสูงสุด 30Mbps
- นอกจากนี้ยังให้ระยะการถ่ายโอนข้อมูลสูงสุดเมื่อเทียบกับโปรโตคอล RS-232 ถ่ายโอนข้อมูลได้สูงสุด 1200 เมตร
- ข้อได้เปรียบหลักของ RS-485 เหนือ RS-232 คือทาสหลายตัวที่มี Master เดียวในขณะที่ RS-232 รองรับเฉพาะทาสเดี่ยว
- สามารถมีอุปกรณ์ได้สูงสุด 32 เครื่องที่เชื่อมต่อกับโปรโตคอล RS-485
- ประโยชน์จาก RS-485 ก็คือภูมิคุ้มกันเพื่อเสียงที่พวกเขาใช้วิธีการที่แตกต่างกันของสัญญาณในการถ่ายโอน
- RS-485 เร็วกว่าเมื่อเทียบกับโปรโตคอล I2C
เชื่อมต่อ RS-485 กับ Arduino
สามารถเชื่อมต่อโมดูล RS-485 กับไมโครคอนโทรลเลอร์ที่มีพอร์ตอนุกรม สำหรับการใช้โมดูล RS-485 กับไมโครคอนโทรลเลอร์จำเป็นต้องใช้โมดูลที่เรียกว่า5V MAX485 TTL ถึง RS485 ซึ่งใช้ IC Maxim MAX485เนื่องจากอนุญาตให้มีการสื่อสารแบบอนุกรมในระยะทางยาว 1200 เมตร เป็นแบบสองทิศทางและฮาล์ฟดูเพล็กซ์และมีอัตราการถ่ายโอนข้อมูล 2.5 Mbps โมดูลนี้ต้องการแรงดันไฟฟ้า 5V
Pin-Out ของ RS-485:
ชื่อพิน |
คำอธิบายพิน |
VCC |
5V |
ก |
อินพุตตัวรับแบบไม่กลับด้าน เอาต์พุตไดรเวอร์ที่ไม่กลับด้าน |
ข |
Inverting ตัวรับอินพุต การเปลี่ยนเอาต์พุตไดรเวอร์ |
GND |
GND (0 โวลต์) |
R0 |
ตัวรับสัญญาณออก (ขา RX) |
RE |
เอาต์พุตตัวรับ (เปิดใช้งานต่ำ) |
DE |
เอาต์พุตไดรเวอร์ (เปิดใช้งานสูง) |
DI |
อินพุตไดรเวอร์ (พิน TX) |
โมดูลแปลง USB เป็น RS-485
นี้เป็น USB เข้ากับโมดูล RS485 Converter อะแดปเตอร์ที่รองรับ Win7, XP, Vista, Linux, Mac OS และให้ง่ายต่อการใช้อินเตอร์เฟซ RS485 โดยวิธีการของการใช้พอร์ต COM ในคอมพิวเตอร์ โมดูลนี้เป็นอุปกรณ์แบบ plug-and-play ไม่มีโครงสร้างคำสั่งใด ๆ ก็ตามที่ส่งไปยัง Virtual COM Port จะถูกแปลงเป็น RS485 โดยอัตโนมัติและในทางกลับกัน โมดูลขับเคลื่อนด้วยตัวเองจากบัส USB ดังนั้นไม่จำเป็นต้องใช้แหล่งจ่ายไฟภายนอกสำหรับการทำงาน
แสดงเป็นพอร์ต Serial / COM และสามารถเข้าถึงได้จากแอปพลิเคชันหรือไฮเปอร์เทอร์มินัล ตัวแปลงนี้ให้การสื่อสาร RS-485 แบบ half-duplex ช่วงอัตราบอดคือ 75 bps ถึง 115200 bps สูงสุด 6 Mbps
ในการใช้อุปกรณ์นี้มีซอฟต์แวร์ Modbus มากมายในอินเทอร์เน็ต ในบทช่วยสอนนี้จะใช้ซอฟต์แวร์ที่เรียกว่า Simply Modbus Software
เพียงแค่ซอฟต์แวร์ Modbus Master
แอพลิเคชัน Modbus โทซอฟแวร์ที่จำเป็นในการส่งข้อมูลทาส Modbus RS-485 อุปกรณ์ Arduino ผ่าน COM
Simply Modbus Master เป็นซอฟต์แวร์ทดสอบการสื่อสารข้อมูล คุณสามารถดาวน์โหลด Simply Modbus Master จากลิงค์ที่ให้มาและเรียนรู้เพิ่มเติมโดยอ้างอิงคู่มือซอฟต์แวร์
ก่อนใช้ซอฟต์แวร์สิ่งสำคัญคือต้องทำความคุ้นเคยกับคำศัพท์ต่อไปนี้
รหัสทาส:
ทาสแต่ละตัวในเครือข่ายจะถูกกำหนดแอดเดรสยูนิตที่ไม่ซ้ำกันตั้งแต่ 1 ถึง 127 เมื่อมาสเตอร์ร้องขอข้อมูลไบต์แรกที่ส่งคือที่อยู่ของสเลฟ วิธีนี้ทาสแต่ละคนจะรู้หลังจากไบต์แรกว่าจะละเว้นข้อความหรือไม่
รหัสฟังก์ชัน:
ไบต์ที่สองที่ส่งโดย Master คือรหัสฟังก์ชัน ตัวเลขนี้จะบอกทาสว่าจะเข้าถึงตารางใดและจะอ่านจากหรือเขียนลงในตาราง
รหัสฟังก์ชันการลงทะเบียนที่รองรับ:
รหัสฟังก์ชัน |
หนังบู๊ |
ชื่อตาราง |
04 (04 ฐานสิบหก) |
อ่าน |
รีจิสเตอร์อินพุตแบบอนาล็อก |
03 (03 ฐานสิบหก) |
อ่าน |
อนาล็อกเอาท์พุทโฮลดิ้งรีจิสเตอร์ |
06 (06 ฐานสิบหก) |
เขียนเดี่ยว |
Analog Output Holding Register |
16 (10 ฐานสิบหก) |
เขียนหลาย ๆ |
อนาล็อกเอาท์พุทโฮลดิ้งรีจิสเตอร์ |
รหัสฟังก์ชันคอยล์ที่รองรับ:
รหัสฟังก์ชัน |
หนังบู๊ |
ชื่อตาราง |
02 (02 ฐานสิบหก) |
อ่าน |
รายชื่ออินพุตไม่ต่อเนื่อง |
01 (01 ฐานสิบหก) |
อ่าน |
ขดลวดเอาต์พุตไม่ต่อเนื่อง |
05 (05 ฐานสิบหก) |
เขียนเดี่ยว |
ขดลวดเอาต์พุตไม่ต่อเนื่อง |
15 (0F เลขฐานสิบหก) |
เขียนหลาย ๆ |
ขดลวดเอาต์พุตไม่ต่อเนื่อง |
CRC:
CRC ย่อมาจาก Cyclic Redundancy check เป็นสองไบต์ที่เพิ่มท้ายข้อความ Modbus สำหรับการตรวจจับข้อผิดพลาด
เครื่องมือที่จำเป็น
ฮาร์ดแวร์
- Arduino UNO
- MAX-485 TTL เป็นโมดูลตัวแปลง RS-485
- โมดูลแปลง USB เป็น RS-485
- ไฟ LED (2)
- ตัวต้านทาน 1k (2)
- จอ LCD 16x2
- โพเทนชิออมิเตอร์ 10k
- เซอร์โวมอเตอร์ SG-90
ซอฟต์แวร์
- เพียงแค่ Modbus Master
แผนภูมิวงจรรวม
การเชื่อมต่อวงจรระหว่างโมดูลตัวแปลง MAX-485 TTL ถึง RS-485 และ Arduino UNO:
Arduino UNO |
MAX-485 TTL เป็นโมดูลตัวแปลง RS-485 |
0 (RX) |
RO |
1 (TX) |
DI |
4 |
DE & RE |
+ 5V |
VCC |
GND |
GND |
การเชื่อมต่อวงจรระหว่างโมดูล MAX-485 TTL ถึง RS-485 และตัวแปลง USB เป็น RS-485:
MAX-485 TTL ถึง RS-485 โมดูลตัวแปลง |
โมดูล USB เป็น RS-485 เชื่อมต่อกับพีซี |
ก |
ก |
ข |
ข |
การเชื่อมต่อวงจรระหว่าง Arduino UNO และจอ LCD 16x2:
16x2 LCD |
Arduino UNO |
VSS |
GND |
VDD |
+ 5V |
V0 |
ในการควบคุมพินของโพเทนชิออมิเตอร์สำหรับการควบคุมความคมชัด / ความสว่างของ LCD 16x2 |
อาร์เอส |
8 |
RW |
GND |
จ |
9 |
D4 |
10 |
D5 |
11 |
D6 |
12 |
D7 |
13 |
ก |
+ 5V |
เค |
GND |
การเชื่อมต่อวงจรระหว่าง 2 LEDs, Servo Motor และ Arduino UNO:
Arduino UNO |
LED1 |
LED2 |
เซอร์โวมอเตอร์ |
2 |
ขั้วบวกผ่านตัวต้านทาน 1k |
- |
- |
5 |
- |
ขั้วบวกผ่านตัวต้านทาน 1k |
- |
6 |
- |
- |
พิน PWM (สีส้ม) |
+ 5V |
- |
- |
+ 5V (สีแดง) |
GND |
แคโทด GND |
แคโทด GND |
GND (สีน้ำตาล) |
การเขียนโปรแกรม Arduino UNO สำหรับ RS-485 MODBUS Slave
UNO Arduino การกำหนดค่าเป็นModbus ทาส นอกจากนี้Arduino UNO ยังติดตั้ง LED สองดวงและเซอร์โวมอเตอร์หนึ่งตัว ดังนั้นทาส Arduino จึงถูกควบคุมจากซอฟต์แวร์ Master Modbus การสื่อสารระหว่าง Arduino UNO และซอฟต์แวร์ Modbus Master ทำได้โดยใช้โมดูล RS-485 สำหรับการเชื่อมต่อกับพีซีจะใช้โมดูลตัวแปลง USB เป็น RS-485 และ Arduino UNO พร้อมโมดูลตัวแปลงMAX-485 TTL เป็น RS-485การตั้งค่าทั้งหมดจะมีลักษณะดังนี้:
สำหรับการใช้ Modbus ใน Arduino UNO ไลบรารี
ในขั้นต้นให้รวมไลบรารีที่จำเป็น ไลบรารี ModbusRTU ใช้สำหรับการสื่อสาร RS-485 Modbus และไลบรารีคริสตัลเหลวใช้สำหรับ LCD กับ Arduino UNO และไลบรารีเซอร์โวสำหรับใช้เซอร์โวมอเตอร์กับ Arduino UNO
# รวม
ตอนนี้พินแอโนด LED ที่เชื่อมต่อกับหมุด Arduino 2 และ 5 ถูกกำหนดให้เป็น LED1 และ LED2
#define led1 2 #define led2 5
ถัดไปวัตถุสำหรับเข้าถึงคลาส Liquid Crystal จะถูกประกาศด้วยหมุด LCD (RS, E, D4, D5, D6, D7) ที่เชื่อมต่อกับ Arduino UNO
LiquidCrystal LCD (8,9,10,11,12,13);
เมื่อ LCD เสร็จสิ้นให้เตรียมใช้งานวัตถุเซอร์โวสำหรับคลาส Servo เริ่มต้นอ็อบเจ็กต์บัสสำหรับคลาส Modbus ด้วย
เซอร์โวเซอร์โว; รถบัส Modbus;
ถัดไปสำหรับการจัดเก็บค่าสำหรับการสื่อสาร Modbus อาร์เรย์จะถูกประกาศโดยค่าสามค่าเริ่มต้นด้วยศูนย์
uint16_t modbus_array = {0,0,0};
ในฟังก์ชั่น การตั้งค่า ประการแรก LCD ถูกตั้งค่าในโหมด 16x2 และข้อความต้อนรับจะปรากฏขึ้นและล้าง
lcd.begin (16,2); // ตั้งค่า Lcd ในโหมด 16x2 lcd.print ("RS-485 Modbus"); // ข้อความต้อนรับ lcd.setCursor (0,1); lcd.print ("Arduino Slave"); ล่าช้า (5000); lcd.clear ();
หลังจากนี้พิน LED1 และ LED2 จะถูกกำหนดเป็นพินเอาต์พุต
PinMode (led1, เอาท์พุท); PinMode (led2, เอาท์พุท);
ต่อพินพัลส์เซอร์โวที่เชื่อมต่อกับ PWM พิน 6 ของ Arduino
เซอร์โวแนบ (6);
ตอนนี้สำหรับการสื่อสาร Modbus มีการตั้งค่าพารามิเตอร์ต่อไปนี้ ตัวแรก '1' แสดงถึง Slave ID ตัวที่สอง '1' แสดงว่าใช้ RS-485 ในการถ่ายโอนข้อมูลและ '4' หมายถึงพิน RS-485 DE&RE ที่เชื่อมต่อกับ Arduino UNO
บัส = Modbus (1,1,4);
Modbus Slave ตั้งค่าไว้ที่ 9600 baudrate
ลูปเริ่มต้นด้วยนิยามของบัสโพลล์และ bus.poll () ใช้เพื่อเขียนและรับค่าจาก Modbus ต้นแบบ
bus.poll (modbus_array, sizeof (modbus_array) / sizeof (modbus_array));
วิธีนี้ใช้เพื่อตรวจสอบว่ามีข้อมูลที่พอร์ตอนุกรมหรือไม่
หากมีข้อมูลใด ๆ ที่พอร์ตอนุกรมไลบรารี Modbus RTU จะตรวจสอบข้อความ (ตรวจสอบที่อยู่อุปกรณ์ความยาวข้อมูลและ CRC) และดำเนินการตามที่กำหนด
ตัวอย่างเช่นในการเขียนหรืออ่านค่าใด ๆ จากมาสเตอร์ ModbusRTU ต้องได้รับอาร์เรย์จำนวนเต็ม 16 บิตที่ไม่ได้ลงชื่อและความยาวจาก Master Modbus อาร์เรย์นี้มีข้อมูลที่เขียนจากต้นแบบ
ในบทช่วยสอนนี้มีอาร์เรย์สามชุดสำหรับ LED1, LED2 และมุมเซอร์โวมอเตอร์
ก่อนอื่นให้เปิดหรือปิด LED1 modbus_arrayจะถูกใช้
if (modbus_array == 0) // ขึ้นอยู่กับค่าใน modubus_array ที่เขียนโดย Master Modbus { digitalWrite (led1, LOW); // LED OFF ถ้า 0 lcd.setCursor (0,0); lcd.print ("L1: ปิด"); } else { digitalWrite (led1, HIGH); // LED ON หากค่าอื่นที่ไม่ใช่ 0 lcd.setCursor (0,0); lcd.print ("L1: ON"); }
ถัดไปเพื่อเปิดหรือปิด LED2 modbus_arrayถูกใช้
if (modbus_array == 0) // ขึ้นอยู่กับค่าใน modbus_array ที่เขียนโดย Master Modbus { digitalWrite (led2, LOW); // LED OFF ถ้า 0 lcd.setCursor (8,0); lcd.print ("L2: ปิด"); } else { digitalWrite (led2, สูง); // LED ON หากค่าอื่นที่ไม่ใช่ 0 lcd.setCursor (9,0); lcd.print ("L2: ON"); }
ถัดไปเพื่อกำหนดมุมของเซอร์โวมอเตอร์modbus_array ที่ใช้และค่าจะถูกพิมพ์ลงในจอ LCD 16x2
int pwm = modbus_array; เซอร์โวเขียน (pwm); lcd.setCursor (0,1); lcd.print ("มุมเซอร์โว:"); lcd.print (pwm); ล่าช้า (200); lcd.clear ();
เสร็จสิ้นการเขียนโปรแกรม Arduino UNO สำหรับการทำงานเป็น MODBUS Slave ขั้นตอนต่อไปจะทดสอบเป็น Modbus Slave
ทดสอบ Arduino UNO เป็น Rs485 Modbus Slave
หลังจากการเชื่อมต่อวงจรเสร็จสมบูรณ์และอัปโหลดรหัสไปยัง Arduino UNO แล้วก็ถึงเวลาเชื่อมต่อโมดูล USB กับ RS-485กับพีซีที่ติดตั้งซอฟต์แวร์Simple Modbus Master
เปิดตัวจัดการอุปกรณ์และตรวจสอบพอร์ต COM ตามพีซีของคุณที่เชื่อมต่อโมดูล USB เป็น RS-485 และหลังจากนั้นเปิดซอฟต์แวร์ Simply Modbus Master 8.1.1
1. หลังจากเปิด ซอฟต์แวร์ Simply Modbus แล้วให้เปิดตัวเลือกเขียน
2. หลังจากเปิดโปรแกรม Simply Modbus Master Write ตั้งค่าพารามิเตอร์
โหมดใน RTU, พอร์ต COM ตามพีซีของคุณ (ของฉันคือ COM6), Baud ที่ 9600, Data Bits 8, Stop bit 1, Parity None และ Slave ID เป็น 1
3. หลังจากนั้นตั้งค่ารีจิสเตอร์แรกเป็น 40001 และค่าที่จะเขียนคือ 3 และโค้ดฟังก์ชันเป็น 16 (Write Holding Register)
หลังจากนั้นให้เขียน 1 ถึง 40001 (สำหรับ LED1 บน) และ 1 ถึง 40002 (สำหรับ LED2 บน) และ 90 ถึง 40003 (สำหรับมุมเซอร์โวมอเตอร์) จากนั้นคลิกปุ่มส่ง
คุณสามารถดูสถานะ LED ทั้งสองแบบเปิดและมุมเซอร์โวที่ 90 องศา
4. หลังจากนั้นป้อน 40001 เป็น 1 และ 40002 เป็น 0 และ 40003 เป็น 180 แล้วคลิกปุ่มส่ง
5. ตอนนี้เขียน 135 ถึง 40003 และ 40001 เป็น 0 และ 40002 เป็น 1
นี่คือวิธีที่RS-485 Modbus สามารถใช้ในการสื่อสารแบบอนุกรมกับ Arduino UNO as Slave ในบทช่วยสอนถัดไปเราจะใช้ Arduino Uno เป็นหลักในการเริ่ม MODBUS
ค้นหาโค้ดทั้งหมดและวิดีโอสาธิตด้านล่าง