title: Multitasking Real-Time Arduino System with ARTe description: เรียนรู้วิธีการเปลี่ยน Arduino ให้เป็นระบบ Real-Time OS (RTOS) ด้วย ARTe เพื่อจัดการงานแบบ Multitasking อย่างมีประสิทธิภาพ
บทนำ (Introduction)
โปรเจกต์นี้เป็นการสาธิตการนำ Arduino มาประยุกต์ใช้งานร่วมกับระบบปฏิบัติการแบบเรียลไทม์ (Real-Time Operating System หรือ RTOS) ที่ชื่อว่า ERIKA Enterprise ผ่านเครื่องมือขยายขีดความสามารถที่ชื่อว่า ARTe (Arduino Real-Time extension)
โดยปกติแล้ว Arduino จะทำงานแบบ Single-tasking หรือทำงานทีละคำสั่งใน loop() เดียว ซึ่งหากมีงานหลายอย่างที่ต้องทำพร้อมกันและต้องการความแม่นยำด้านเวลา (Deterministic Timing) การเขียนโค้ดแบบเดิมจะทำได้ยาก โปรเจกต์นี้จึงถูกออกแบบมาเพื่อโชว์ศักยภาพในการจัดการงานหลายอย่าง (Multitasking) พร้อมกัน เช่น การวัดระยะทาง การวัดอุณหภูมิ และการควบคุมไฟกระพริบ โดยแต่ละงานมีรอบการทำงาน (Period) และลำดับความสำคัญ (Priority) ที่ชัดเจน
คุณสามารถศึกษารายละเอียดเพิ่มเติมเกี่ยวกับ ARTe ได้ที่เว็บไซต์ทางการของผู้พัฒนา: http://arte.retis.santannapisa.it/ หรือ http://retis.sssup.it/?q=arte
สำหรับการติดตั้งและซอร์สโค้ดฉบับเต็ม สามารถดูได้ที่ GitHub: https://github.com/melvin-mancini/Multitasking-RealTime-Arduino-System
ทำความรู้จักกับ ARTe (Arduino Real-Time extension)
ARTe คือส่วนขยายของ Arduino Framework ที่ช่วยให้รองรับการทำงานแบบ Multitasking และการจัดลำดับงานแบบแทรกกลาง (Preemptive Scheduling) โดยใช้ Kernel ของ ERIKA Enterprise ซึ่งเป็น Open-source RTOS ระดับมาตรฐานอุตสาหกรรม
ฟีเจอร์เด่นของ ARTe:
- Concurrent Loops: ผู้ใช้สามารถสร้าง
loop()หลายตัวให้ทำงานขนานกันได้ โดยกำหนดความถี่ (Rate) ในการทำงานที่แตกต่างกัน - Real-Time Scheduling: ระบบจะรับประกันว่างานที่มีความสำคัญสูงกว่าจะได้รับการประมวลผลตามเวลาที่กำหนด
- Compatibility: รองรับบอร์ดประมวลผลยอดนิยมอย่าง Arduino UNO และ Arduino DUE
- Low Overhead: จากการทดสอบพบว่า ARTe มีผลกระทบต่อหน่วยความจำ (Footprint) และการประมวลผล (Runtime Overhead) น้อยมากจนแทบไม่มีผลต่อประสิทธิภาพโดยรวม
หมายเหตุ: ปัจจุบัน ARTe รองรับการพัฒนาบนระบบปฏิบัติการ Windows เท่านั้น โดยโปรเจกต์นี้พัฒนาบน Windows 8.1
รายละเอียดโปรเจกต์และการทำงานของระบบ
ในระบบนี้ เราได้แบ่งการทำงานออกเป็น 3 Task (กระบวนการ) หลักที่ทำงานแบบ Periodic (ทำงานซ้ำตามรอบเวลา) โดยมีรายละเอียดลอจิกดังนี้:
1. Task วัดระยะทางด้วย Ultrasonic (Loop 1 - ทุก 3 วินาที)
ใช้เซนเซอร์ HC-SR04 ทำงานโดยส่งคลื่นอัลตราโซนิกออกไปและวัดระยะเวลาที่สะท้อนกลับมา
- Engineering Logic: ระบบจะส่งสัญญาณ Pulse ขนาด 10 ไมโครวินาทีไปยังขา Trigger เพื่อกระตุ้นเซนเซอร์ จากนั้นใช้ฟังก์ชัน
pulseIn()เพื่ออ่านค่าเวลาที่คลื่นเดินทาง (Duration) - การคำนวณ: ใช้สูตร $Distance = \frac{Duration}{29} / 2$ (เนื่องจากความเร็วเสียงคือ 340 m/s หรือประมาณ 29 ไมโครวินาทีต่อเซนติเมตร และต้องหาร 2 เพราะเป็นระยะไป-กลับ)
- Alarm: หากตรวจพบสิ่งกีดขวางในระยะน้อยกว่า 10 ซม. ระบบจะสั่งให้ LED แจ้งเตือนสว่างขึ้นทันที
2. Task ควบคุมไฟสถานะ (Loop 2 - ทุก 7 วินาที)
เป็นการทำงานเพื่อแสดงสถานะว่าระบบยังคงทำงานอยู่ (Heartbeat)
- Code Logic: เมื่อถึงรอบการทำงาน ระบบจะวนลูป 5 ครั้งเพื่อสั่งให้ LED กระพริบ (ติด 500ms / ดับ 500ms) ซึ่งใช้เวลารวมประมาณ 5 วินาทีในแต่ละรอบการทำงาน
3. Task ตรวจวัดอุณหภูมิ (Loop 3 - ทุก 11 วินาที)
ใช้เซนเซอร์ LM35 ซึ่งให้เอาต์พุตเป็นแรงดันไฟฟ้าแบบ Analog ที่แปรผันตามอุณหภูมิ (10mV ต่อ 1 องศาเซลเซียส)
- Precision Engineering: ในโค้ดมีการใช้
analogReference(INTERNAL)เพื่อเปลี่ยนแรงดันอ้างอิงเป็น 1.1V ช่วยให้การอ่านค่าจาก LM35 มีความละเอียด (Resolution) สูงขึ้น - Data Processing: เพื่อความแม่นยำ ระบบจะทำการอ่านค่า 3 ครั้ง (Sampling) ทุกๆ 500ms แล้วนำมาหาค่าเฉลี่ย หากอุณหภูมิเฉลี่ยสูงกว่า 23 องศาเซลเซียส LED เตือนความร้อนจะสว่างขึ้น
อุปกรณ์ที่ต้องใช้ (Hardware Components)
- Arduino Uno - บอร์ดประมวลผลหลัก
- HC-SR04 - เซนเซอร์วัดระยะทาง (Ultrasonic Sensor)
- LM35 - เซนเซอร์วัดอุณหภูมิความแม่นยำสูง
- LEDs - สำหรับแสดงสถานะ Alarm และสถานะการทำงาน
- Resistors - ตัวต้านทานสำหรับ LED (แนะนำ 220-330 โอห์ม)
- Jumper Wires & Breadboard - สำหรับเชื่อมต่อวงจร
ผังการต่อวงจร (Circuit Diagram)
เพื่อให้การประกอบวงจรเป็นไปอย่างถูกต้อง คุณสามารถดูแผนผังการต่อสายได้จากรูปภาพด้านล่างนี้ (สร้างด้วย Fritzing):

ขั้นตอนการติดตั้งและเริ่มใช้งาน
การติดตั้ง ARTe
- ดาวน์โหลดเครื่องมือพัฒนา ARTe จากเว็บไซต์ http://retis.sssup.it/?q=arte
- ติดตั้งโปรแกรม ซึ่งจะมีหน้าตาคล้ายกับ Arduino IDE เดิมแต่มีเมนูเสริมสำหรับ RTOS
- เปิดการใช้งานโดยไปที่เมนู Tools -> ARTℇ แล้วเลือก Enable
การคอมไพล์และอัปโหลด
- เชื่อมต่อ Arduino Uno เข้ากับคอมพิวเตอร์
- เปิดไฟล์
src.inoผ่านตัวแก้ไขของ ARTe - ตรวจสอบพอร์ตและบอร์ดให้ถูกต้อง จากนั้นกด Upload ระบบจะทำการคอมไพล์ Kernel ของ ERIKA และโค้ดส่วนของผู้ใช้เข้าด้วยกันโดยอัตโนมัติ
การแก้ไขปัญหา (Troubleshooting)
ปัญหาเกี่ยวกับไลบรารี DigitalToggle
เนื่องจาก ARTe มีการปรับโครงสร้างภายในเพื่อรองรับ Multitasking ไลบรารีบางตัวอย่าง DigitalToggle อาจเกิด Error ตอนคอมไพล์ ให้แก้ไขดังนี้:
- ดาวน์โหลดไลบรารีจาก Arduino Playground
- แตกไฟล์ ZIP แล้วเปิดไฟล์
DigitalToggle.h - เปลี่ยนบรรทัด
#include <pins_arduino.h>ให้เป็น#include "Arduino.h" - บันทึกไฟล์และบีบอัดเป็น ZIP อีกครั้งเพื่อทำการ Import เข้า ARTe IDE
วิเคราะห์ซอร์สโค้ด (Code Analysis)
จาก Source Code ที่ให้มา เราจะเห็นโครงสร้างที่เป็นระเบียบและการใช้คำสั่งเฉพาะของ ARTe:
void loop1(3000) { // ทำงานทุก 3,000 ms
// Logic วัดระยะทาง
...
}
void loop2(7000) { // ทำงานทุก 7,000 ms
// Logic ไฟกระพริบ
...
}
void loop3(11000) { // ทำงานทุก 11,000 ms
// Logic วัดอุณหภูมิและหาค่าเฉลี่ย
...
}
จุดเด่นเชิงวิศวกรรม:
- Determinism: การกำหนดค่าตัวเลขในวงเล็บหลัง
loopเช่นloop1(3000)คือการบอก RTOS ให้จองรอบเวลาที่แน่นอนให้กับงานนั้นๆ ทำให้เรามั่นใจได้ว่าเซนเซอร์จะถูกอ่านค่าตามเวลาที่วางแผนไว้ - Resource Sharing: แม้จะมีการใช้
Serial.printในทุก Loop แต่ระบบจัดการของ ERIKA/ARTe จะช่วยดูแลไม่ให้เกิดการขัดแย้งของข้อมูล (Mutual Exclusion) ในการเข้าถึง Serial Buffer - Power Efficiency: การใช้ RTOS ช่วยให้ CPU สามารถจัดการลำดับความสำคัญได้ดีกว่าการเขียน
if(millis())ซ้อนกันหลายชั้น ทำให้ระบบมีความเสถียรและตอบสนองได้ทันท่วงที (Responsive)