สอนใช้ HMI อ่านเขียนข้อมูลกับ Arduino ผ่าน Modbus RTU
ให้หน้าจอ Samkoon SK-070QS-G เป็น Modbus RTU Master อ่านค่า Analog/Digital จาก Arduino UNO และเขียนค่า 16 bit / 1 bit กลับไป ผ่านบอร์ด RS485-TTL พร้อมโค้ด Arduino จากคลิปและการตั้งค่าใน SKTool
หน้าจอ Samkoon เป็น Modbus RTU Master ส่วน Arduino เป็น Slave ID 1 ที่เปิด Array data[16] เป็น Holding Register ผ่านไลบรารี Modbus-Master-Slave-for-Arduino ต่อกันด้วยบอร์ด RS485-TTL ที่ 9600, 8, None, 1 แล้วใน SKTool อ่าน/เขียน 4x0–4x3 (data[0]–data[3]) ด้วย Meter, Bit Lamp, Numeric Input และ Bit Switch
อัพเดทล่าสุด: 26 ตุลาคม 2569
ภาพรวม
คลิปนี้ใช้หน้าจอ HMI อ่านและเขียนข้อมูลกับ Arduino UNO ผ่าน Modbus RTU บนโต๊ะมีปุ่มกด 1 ปุ่ม (สัญญาณ Digital) และตัวต้านทานปรับค่าได้ (สัญญาณ Analog) ต่อเข้า Arduino ผลที่ได้คือ
- อ่านค่า Analog — หมุนตัวต้านทานแล้วเข็มของ Meter บนหน้าจอขยับตาม
- อ่านค่า Digital — ไฟบนหน้าจอเป็นสีแดงเมื่อไม่กดปุ่ม และดับเมื่อกดปุ่ม
- เขียนค่า 16 bit — ใส่ 555 บนหน้าจอ สักพัก Serial Monitor ของ Arduino IDE ก็แสดง 555
- เขียนค่า 1 bit — กดปุ่ม Bit Switch บนหน้าจอให้เป็น On แล้วค่าใน Arduino ก็เปลี่ยนเป็น 1
หน้าจอทำหน้าที่ Modbus Master (ผู้ขอและเขียนข้อมูล) ส่วน Arduino เป็น Modbus Slave ถ้ามี Arduino หลายตัวก็ตั้ง Slave ID ให้ต่างกันเพื่อทำระบบ 1 หน้าจอหลาย Arduino ได้
อุปกรณ์ในคลิป
- หน้าจอ Samkoon SK-070QS-G + WiFi Module (รองรับ SCADA, MQTT, HTTP) แต่หน้าจอรุ่นอื่นก็ใช้วิธีเดียวกันได้
- Arduino UNO
- บอร์ด RS485-TTL แปลง RS485 เป็นสัญญาณ TX/RX ของ Arduino
- ปุ่มกด และตัวต้านทานปรับค่าได้บน Breadboard
การต่อสาย
Arduino กับบอร์ด RS485-TTL
บอร์ดรับไฟ 5V จาก Arduino และขา TX/RX ของบอร์ดต่อเข้าขา TX/RX ของ Arduino ตามไดอะแกรมในคลิป
| Arduino | บอร์ด RS485-TTL |
|---|---|
| 5V | VCC |
| GND | GND |
| TX | TXD |
| RX | RXD |
ไดอะแกรมในสไลด์ใช้ขา 0 (RX) และ 1 (TX) ของ Arduino แต่บนโต๊ะจริงต่อเข้า ขา 10 (RX) และขา 11 (TX) เพราะใช้ Software Serial ซึ่งกำหนดขาอื่นนอกจาก 0 กับ 1 ให้สื่อสารแบบ Serial ได้ ขา 0/1 (Serial ปกติ) จึงว่างไว้ Monitor ค่าผ่านพอร์ต USB ได้โดยไม่ชนกัน ถ้าใช้งานจริงและไม่ต้อง Debug จะย้ายไปใช้ขา 0 กับ 1 ก็ได้
หน้าจอกับบอร์ด RS485-TTL
ด้านหลัง SK-070QS-G มีพอร์ต COM1: 232, COM2: 485/422 (หัว DB9) และ COM3: +485− (ขั้วต่อสาย)
- ใช้ COM3 — หน้าจอเขียนกำกับไว้แล้วว่าขาไหนเป็น A ขาไหนเป็น B ต่อเข้า A+ / B− ของบอร์ดได้เลย (บนโต๊ะในคลิปใช้แบบนี้)
- ใช้ COM2 (DB9) — ใช้ขั้วต่อ DB9 แบบ Terminal Block ต่อ Pin 8 = B และ Pin 9 = A อ้างอิงจาก Wiring ของหน้าจอ
โค้ดฝั่ง Arduino
ใช้ไลบรารี Modbus-Master-Slave-for-Arduino (ModbusRtu.h) ดาวน์โหลดเป็น Zip แล้วเพิ่มเข้าโปรเจกต์ด้วย Include Library → Add .ZIP Library ใน Arduino IDE จะใช้ไลบรารี Modbus Slave ตัวอื่นก็ได้ แต่โค้ดด้านล่างคือโค้ดในคลิป
#include <ModbusRtu.h> // https://github.com/smarmengol/Modbus-Master-Slave-for-Arduino
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // RX, TX
uint16_t data[16] = {};
Modbus slave(1, mySerial, 0); // Slave Id 1
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
mySerial.begin(9600);
slave.start();
pinMode(2, INPUT_PULLUP);
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
data[0] = analogRead(A0);
data[2] = digitalRead(2);
Serial.print("Analog A0 read value: ");
Serial.println(data[0]);
Serial.print("Holding register read value: ");
Serial.println(data[1]);
Serial.print("Digital Pin2 read value: ");
Serial.println(data[2]);
Serial.print("Digital data read value: ");
Serial.println(data[3]);
slave.poll(data, 16);
delay(500);
}
SoftwareSerial mySerial(10, 11)— ขา 10 เป็น RX ขา 11 เป็น TX จึงต่อขา 10/11 เข้าบอร์ด RS485-TTLdata[16]— Array 16 ตัวที่หน้าจออ่าน/เขียนผ่าน ModbusModbus slave(1, mySerial, 0)— สร้าง Slave ID 1 ที่สื่อสารผ่านmySerialSerial.begin(9600)ใช้ Monitor ค่า ส่วนmySerial.begin(9600)ใช้สื่อสาร Modbusslave.start()ให้ Arduino เริ่มทำงานเป็น Slave และpinMode(2, INPUT_PULLUP)ใช้ขา 2 อ่านปุ่มกด
หน้าที่ของแต่ละช่องใน Array
| ช่อง | ทิศทาง | ข้อมูล |
|---|---|---|
data[0] | Arduino → หน้าจอ | analogRead(A0) จากตัวต้านทานปรับค่าได้ |
data[1] | หน้าจอ → Arduino | ค่า 16 bit ที่เขียนจากหน้าจอ |
data[2] | Arduino → หน้าจอ | digitalRead(2) สถานะปุ่มกด |
data[3] | หน้าจอ → Arduino | ค่า bit ที่เขียนจากหน้าจอ |
slave.poll(data, 16) ตรวจว่าหน้าจอส่งคำขอมาหรือไม่ แล้วตอบด้วยข้อมูลใน data ทั้ง 16 ตัว ค่า delay ในคลิปพูดถึง 100 ms หรือ 500 ms (โค้ดใช้ 500) อย่าตั้งนานเกินไป ไม่อย่างนั้นหน้าจอจะถือว่า Time out แล้วแจ้ง Error
Compile แล้ว Upload ลง Arduino
ตั้งค่าฝั่งหน้าจอใน SKTool
ดาวน์โหลด SKTool V7.1 ได้จาก samkoon.com.cn (หน้า Download) เปิดโปรแกรมแล้วสร้าง Project ถ้ายังไม่มีพื้นฐานการเขียนหน้าจอ ดู Playlist สอน HMI ของ Factonation ได้ในคำอธิบายของคลิป
1. สร้าง Link Modbus RTU Master
ใน Link เลือกพอร์ตที่ต่อสายจริง (ในคลิปคือ COM3) แล้วตั้ง Connection Services เป็น Modbus → Modbus RTU Master
แท็บ Parameter
Baud rate: 9600
Data bits: 8
Check: NONE
Stop Bits: 1
Plc station: 1
Address mode: Extended Mode
ค่าสื่อสารต้องตรงกับที่ตั้งไว้ในโค้ด Arduino ส่วน Extended Mode ทำให้เลือก Slave ID ได้ทุกครั้งที่กำหนด Address ของ Control ในคลิปมี Arduino ตัวเดียวจึงใช้ Slave ID 1
นับจาก 0 ทั้งสองฝั่ง — Index ของ Array ใน Arduino (
data[0]) และ Address 4x ใน SKTool นับจาก 0 เหมือนกัน 4x 0 จึงตรงกับdata[0]และ 4x_Bit 2.00 คือ Bit 0 ของdata[2]ไม่ต้องบวกหรือลบ 1
2. Meter — อ่านค่า Analog
สร้าง Meter แล้วกดปุ่มรูปเครื่องคิดเลขที่ Monitor Address
COM3 / Modbus RTU Master / 4x
Station: 1 Address: 0
4x คือ Holding Register 16 bit ซึ่ง slave.poll() ฝั่ง Arduino เปิดให้อ่าน Address 0 คือ data[0] ค่าจากตัวต้านทาน จากนั้นตั้ง Min/Max ของ Meter แล้วกด OK
3. Bit Lamp — อ่านค่า Digital
สร้าง Bit Lamp ตั้ง Monitor Address เป็น 4x_Bit เพราะค่าใน 4x เป็น 16 bit แต่ต้องการอ่านแค่ bit เดียว (0 หรือ 1)
COM3 / Modbus RTU Master / 4x_Bit
Station: 1 Address: 2.00 (Register 2, Bit 0 = data[2])
4. Numeric Input — เขียนค่า 16 bit
สร้าง Numeric Input (ไอคอน 123) ตั้ง Address
COM3 / Modbus RTU Master / 4x
Station: 1 Address: 1 (data[1])
5. Bit Switch — เขียนค่า 1 bit
สร้าง Bit Switch ตั้ง Write Address
COM3 / Modbus RTU Master / 4x_Bit
Station: 1 Address: 3.00 (Register 3, Bit 0 = data[3])
6. ดาวน์โหลดลงหน้าจอ
เสียบสาย USB-C จากคอมพิวเตอร์เข้าหน้าจอ กด Download แล้วต่ออุปกรณ์ทั้งหมดตาม Wiring Diagram ด้านบน
ทดสอบ
- หมุนตัวต้านทาน เข็ม Meter ขยับตามค่า Analog
- กดปุ่มบน Breadboard ไฟ Bit Lamp เปลี่ยนสถานะ
- ใส่ตัวเลขใน Numeric Input แล้วดูค่า
Holding register read valueใน Serial Monitor - กด Bit Switch แล้วดูค่า
Digital data read valueใน Serial Monitor
สรุป
เมื่อหน้าจอ HMI คุยกับ Arduino ได้ ก็ใช้หน้าจออุตสาหกรรมแสดงกราฟิกให้โปรเจกต์ Arduino แทนจอ LCD ธรรมดา หรือส่งข้อมูลต่อไป SCADA หรือ HTTP ได้ ซึ่ง Factonation มีคลิปสอนไว้ใน YouTube แล้ว
บทถัดไป
การอ่านค่าเซนเซอร์ผ่าน HMI ด้วย Modbus RTU/RS485
มีคำถาม? ติดต่อทีมงาน
