โฉมหน้าโปรเจกต์หุ่นยนต์อัจฉริยะที่หันหัวตามใบหน้าคนได้แบบเรียลไทม์ ด้วยบอร์ด Arduino UNO Q
สวัสดีชาว Maker สาย AI ทุกคนครับ! 🚀 ใครที่เคยทำหุ่นยนต์หลบสิ่งกีดขวางหรือเดินตามเส้น คงจะรู้สึกว่ามันเบสิกไปแล้วใช่ไหมครับ? วันนี้เราจะพาข้ามขั้นไปเล่นกับ Computer Vision และ Machine Learning แบบง่ายๆ ด้วยโปรเจกต์ หุ่นยนต์ตามติดหน้าคน (Face-following robot) ที่เราขยับหน้าไปทางไหน มันก็จะหันล้อตามไปทางนั้นทันที!
ความเจ๋งของโปรเจกต์นี้คือเราไม่ต้องพึ่งพาราซเบอร์รี่พาย (Raspberry Pi) ตัวใหญ่ๆ เลยครับ แต่เราจะจบงานด้วยบอร์ดรุ่นใหม่ล่าสุดจากค่ายสีฟ้าอย่าง Arduino UNO Q ซึ่งมีสมองกลแบบแบ่งแยกหน้าที่ (Split architecture) ทำให้มันสามารถประมวลผล AI หนักๆ และขับมอเตอร์ไปพร้อมๆ กันได้อย่างลื่นไหล ในระดับ 10-15 FPS เลยทีเดียว!
เคล็ดลับความเทพของบอร์ด Arduino UNO Q 🧠
ทำไมบอร์ดนี้ถึงทำ AI พร้อมคุมมอเตอร์ได้ลื่นไหล? คำตอบอยู่ที่การออกแบบสถาปัตยกรรมภายในครับ:
-
สมองซีกซ้าย (MPU - Qualcomm, Linux): ทำหน้าที่รันโค้ด Python, รับภาพจากกล้อง, และประมวลผลโมเดล AI จับใบหน้าด้วย Edge Impulse (งานใช้สมองเยอะ)
-
สมองซีกขวา (MCU - STM32, Zephyr RTOS): ทำหน้าที่รับคำสั่งแล้วคุมสัญญาณ PWM เพื่อขับมอเตอร์แบบเป๊ะๆ ไม่มีกระตุก (งานเรียลไทม์)
สมองทั้งสองส่วนนี้คุยกันผ่านโปรโตคอล Bridge RPC ซึ่งช่วยลดความหน่วง (Latency) เหลือแค่ 8 มิลลิวินาที ทำให้หุ่นยนต์หันตามหน้าเราได้แบบไม่สะดุดเลยครับ!
💡 Maker's Tip: การทำหุ่นยนต์ให้วิ่งตามหน้าคนได้ โครงสร้างตัวหุ่น (Chassis) ควรเป็นแบบ Differential-drive (ล้อซ้าย-ขวาหมุนอิสระ) และใช้มอเตอร์เซอร์โวแบบหมุนต่อเนื่อง (Continuous-rotation servos) เพราะจะควบคุมง่ายและไม่ต้องต่อสายไฟให้ยุ่งยากครับ
หากเพื่อนๆ อยากประกอบหุ่นแบบนี้ แวะมาช้อป บอร์ดพัฒนา Arduino, เซอร์โวมอเตอร์, หรือเซนเซอร์ต่างๆ ได้ที่ Globalbyte Shop เลยครับ! และถ้าใครอยากได้โครงหุ่นเท่ๆ แบบในรูป ทางเรามี บริการรับปริ้นท์ 3D (3D Printing Service) ไว้คอยซัพพอร์ตด้วยนะ ส่งไฟล์ Fusion 360 มาให้เราปริ้นท์ได้เลย ทัก LINE OA มาคุยกันครับ!
ซอฟต์แวร์ล้ำๆ ทำงานผ่าน Web UI 📱
อีกหนึ่งความว้าวคือเราไม่ต้องมานั่งเสียบสายโหลดโค้ดใหม่ทุกครั้งที่อยากปรับความเร็วหุ่นครับ เพราะโปรเจกต์นี้เขาใช้แพลตฟอร์ม Arduino App Lab ในการรันระบบ ซึ่งมันจะสร้าง Web Dashboard ให้เราเปิดผ่านบราวเซอร์ (Web UI) ขึ้นมามอนิเตอร์ภาพจากกล้อง และใช้ Slider ปรับค่าจูนพวงมาลัย (Steering parameters) ได้แบบสดๆ เลย!
วิดีโอสาธิตการทำงานสุดเจ๋ง 🎬
โครงสร้างระบบ (Architecture Overview) 🗺️
ผังการทำงานที่แยกหน้าที่ระหว่าง MPU (รัน AI) และ MCU (คุมมอเตอร์) ผ่าน Bridge RPC
การต่อสายวงจร (Wiring) 🔌
ต่อสายเซอร์โวเข้าขา D3 และ D6 พร้อมคร่อมคาปาซิเตอร์ (100 uF) กันไฟตก ส่วนกล้องเว็บแคมต่อเข้าพอร์ต USB ตรงๆ เลย
หน้าตา Dashboard ควบคุมหุ่นผ่านหน้าเว็บ 🌐
เราสามารถจูนความเร็วและดูมุมกล้องของหุ่นยนต์ได้แบบ Real-time!
ตัวอย่างโค้ด (Arduino Sketch ฝั่งคุมมอเตอร์) 💻
โค้ดฝั่ง Arduino นั้นสั้นมากๆ เพราะมันแค่รอรับค่าสัญญาณ (Pulse width) ผ่านคำสั่ง Bridge.provide_safe แล้วส่งต่อให้เซอร์โวทำงานครับ:
#include <Arduino_RouterBridge.h>
#include <Servo.h>
Servo leftServo;
Servo rightServo;
bool set_wheel_pwm(int left_us, int right_us) {
uint32_t left = clamp_pulse_us(left_us);
uint32_t right = clamp_pulse_us(right_us);
// อินเวิร์สสัญญาณล้อขวา เพราะเราติดมอเตอร์กลับด้าน
right = apply_invert(right, true);
leftServo.writeMicroseconds(left); // ขา D3
rightServo.writeMicroseconds(right); // ขา D6
return true;
}
void setup() {
Bridge.begin();
leftServo.attach(3);
rightServo.attach(6);
leftServo.writeMicroseconds(1500); // 1500 us = หยุดนิ่ง
rightServo.writeMicroseconds(1500);
// สร้าง endpoint ให้ Python (MPU) เรียกใช้คำสั่งคุมมอเตอร์
Bridge.provide_safe("set_wheel_pwm", set_wheel_pwm);
}
void loop() {} // วนลูปเปล่าๆ ปล่อยให้ Bridge จัดการคิวงาน
ตัวอย่างโค้ด (Python ฝั่งคำนวณการหันพวงมาลัย) 🐍
เมื่อ AI เจอกล่องจับใบหน้า (Bounding box) มันจะหาจุดศูนย์กลาง แล้วคำนวณว่าหุ่นต้องเลี้ยวซ้ายหรือขวาด้วยโค้ด Python สั้นๆ นี้ครับ:
# คำนวณความคลาดเคลื่อนจากกึ่งกลางจอ (Heading error)
heading_error = (target_cx - 0.5) * 2.0
if abs(heading_error) < CENTER_DEADBAND:
heading_error = 0.0
# สร้างเส้นโค้งการเลี้ยวให้สมูท
shaped = math.copysign(abs(heading_error) ** STEER_CURVE, heading_error)
turn = clamp(STEER_SIGN * STEER_GAIN * shaped, -MAX_TURN_SPEED, MAX_TURN_SPEED)
# แปลงเป็นความเร็วล้อซ้าย-ขวา
left_us = speed_to_pulse(turn) # 1500 + turn
right_us = speed_to_pulse(-turn) # 1500 - turn
📚 แหล่งข้อมูลอ้างอิงและดาวน์โหลดโค้ด:
*คำเตือนและข้อแนะนำ: เนื้อหาบทความนี้สรุปและแปลมาจากโปรเจกต์ต่างประเทศ การทำงานของแพลตฟอร์ม
Arduino App Lab และโมเดล AI อาจมีการเปลี่ยนแปลง แนะนำให้ศึกษาโค้ดโครงสร้าง
app.yaml และ
sketch.yaml จากต้นฉบับอย่างละเอียดก่อนลงมือทำครับ