GLOBALBYTE PROJECTS / ROBOTICS / EMBEDDED VISION
Face-Tracking Gimbal: สร้างกล้องตามใบหน้าด้วย XIAO 2 บอร์ด
กล้องที่ขยับตามใบหน้าของเราได้โดยอัตโนมัติ ไม่จำเป็นต้องเริ่มต้นจากกล้องสำเร็จรูปเสมอไป โปรเจกต์ Face-Tracking Gimbal ของ Zeller นำชุดมอเตอร์จาก reCamera Gimbal กลับมาใช้กับบอร์ด XIAO สองตัว เพื่อสร้างกล้อง Pan-Tilt ที่ตรวจจับใบหน้า และปรับทิศทางตามตำแหน่งของใบหน้าได้
- ใช้ XIAO ESP32S3 Sense ตรวจจับใบหน้าจากกล้อง
- ใช้ XIAO STM32C5 ควบคุมมอเตอร์ Yaw และ Pitch ผ่าน CAN Bus
- บอร์ดทั้งสองสื่อสารกันด้วย UART
- สามารถดูภาพสดและสั่งกล้องผ่าน Web Interface ด้วย Wi-Fi
- มี Source Code บน GitHub, วิดีโอสาธิต และไฟล์ตัวเรือน 3D
Face-Tracking Gimbal คืออะไร?
Face-Tracking Gimbal เป็นระบบกล้องที่สามารถ ปรับทิศทางตามตำแหน่งใบหน้าที่ตรวจจับได้ โดยโปรเจกต์นี้ใช้กลไก Pan-Tilt สองแกน ได้แก่ Yaw สำหรับหมุนซ้ายขวา และ Pitch สำหรับก้มเงย
เมื่อกล้องตรวจพบบริเวณที่มีใบหน้า โปรแกรมจะคำนวณตำแหน่งที่ต้องการให้กล้องหันไป จากนั้นส่งคำสั่งให้มอเตอร์ปรับมุม เพื่อให้ใบหน้าอยู่ใกล้บริเวณเป้าหมายในภาพ
จุดน่าสนใจคือการแยกงานประมวลผลภาพ กับงานควบคุมมอเตอร์ออกจากกัน แทนการให้บอร์ดเพียงตัวเดียวทำทุกอย่าง
ดู Project Preview จาก Hackster
กรอบนี้แสดง Project Preview จาก Hackster หากระบบของ Shopify ไม่รองรับการฝัง สามารถ เปิดดูโปรเจกต์และรูปภาพต้นฉบับบน Hackster.io แทนได้
จุดเริ่มต้น: นำมอเตอร์ reCamera Gimbal กลับมาใช้ใหม่
Zeller เล่าว่าได้รับแรงบันดาลใจจากกล้อง Pan-Tilt และมีชุดมอเตอร์จาก reCamera Gimbal อยู่แล้ว แต่ไม่มี Controller จึงตัดสินใจนำชิ้นส่วนเดิม มาต่อยอดเป็นโปรเจกต์ Face Tracking
มอเตอร์ BLDC ในชุดที่ผู้สร้างมี มาพร้อมวงจรขับมอเตอร์อยู่แล้ว จึงไม่จำเป็นต้องสร้าง Motor Driver ขึ้นใหม่ แต่ต้องใช้บอร์ดที่สามารถส่งคำสั่ง ผ่าน CAN Bus ไปยังมอเตอร์ได้
ผู้สร้างเลือก XIAO STM32C5 เป็นบอร์ดควบคุมมอเตอร์ เพราะรองรับ CAN และมี CAN Transceiver บนบอร์ด ส่วนงานรับภาพและตรวจจับใบหน้า เลือกใช้ XIAO ESP32S3 Sense ซึ่งมาพร้อมกล้องและ Wi-Fi
แนวทางนี้เป็นตัวอย่างการ Reuse Hardware โดยนำอุปกรณ์เดิมมาใช้งานร่วมกับ Firmware ใหม่ และจัดสรรหน้าที่ของ Microcontroller ให้เหมาะสม
Hardware ที่ใช้ใน Face-Tracking Gimbal
| อุปกรณ์ | หน้าที่ในโปรเจกต์ |
|---|---|
| XIAO ESP32S3 Sense | กล้อง, Face Detection, Wi-Fi และ Web UI |
| XIAO STM32C5 | UART, CAN Motor Control และ Telemetry |
| LK3008 Motor | มอเตอร์ในรายการอุปกรณ์ Hackster สำหรับระบบสองแกน |
| LK3506 Motor | มอเตอร์ในรายการอุปกรณ์ Hackster สำหรับระบบสองแกน |
| XT30 (2+2) Power Separation Board | อะแดปเตอร์สำหรับการเชื่อมต่อไฟเลี้ยงและ CAN ของชุดมอเตอร์ |
| XT30 (2+2) Cable | สายเชื่อมต่อที่อยู่ในรายการ Hardware |
| 12V DC และ 5V DC | แหล่งจ่ายไฟมอเตอร์และบอร์ด XIAO ตามลำดับ |
| 3D Printed Shell | ตัวเรือนสำหรับยึดกลไกและกล้อง |
หมายเหตุ: Hackster ใช้ชื่อมอเตอร์ LK3008 / LK3506 ขณะที่ README บน GitHub ระบุ MS3008 / MS3506 จึงควรตรวจหมายเลขรุ่นและความเข้ากันได้ ก่อนเลือกซื้อหรือประกอบตาม
XIAO ESP32S3 Sense: ฝั่งตรวจจับใบหน้า
ผู้สร้างพัฒนาฝั่งนี้ด้วย ESP-IDF และใช้งานร่วมกับกล้อง OV2640 สำหรับจับภาพ ประมวลผล Face Detection และส่งภาพจากกล้องไปยัง Web Interface ผ่าน Wi-Fi
ระบบสามารถแสดงกรอบ Bounding Box บริเวณใบหน้าที่ตรวจจับได้ และใช้ตำแหน่งในภาพคำนวณมุมเป้าหมายของ Gimbal
XIAO STM32C5: ฝั่งควบคุมมอเตอร์
STM32C5 ไม่ได้ประมวลผลภาพโดยตรง แต่รับคำสั่งมุมเป้าหมายจาก ESP32S3 ผ่าน UART แล้วส่งคำสั่งให้มอเตอร์ผ่าน CAN Bus พร้อมอ่านสถานะของมอเตอร์กลับมา
ซอฟต์แวร์ฝั่งนี้ใช้ PlatformIO ร่วมกับ Zephyr RTOS โดย Repository มีเฟิร์มแวร์สำหรับบอร์ดดังกล่าว
Architecture: สองบอร์ดทำงานร่วมกันอย่างไร?
ขั้นตอนการทำงาน
- กล้อง OV2640 จับภาพแล้วส่งให้ ESP32S3
- โปรแกรมทำ Face Detection เพื่อหาตำแหน่งใบหน้าในภาพ
- ESP32S3 คำนวณมุมเป้าหมายและส่งให้ STM32C5 ผ่าน UART
- STM32C5 ส่งคำสั่งไปยังมอเตอร์ผ่าน CAN Bus
- STM32C5 อ่านมุมจริงและสถานะมอเตอร์กลับมาส่งให้ ESP32S3
- หน้าเว็บแสดงทั้งภาพกล้องและข้อมูลตำแหน่งมอเตอร์
ตาม GitHub README ระบบเลือกกรอบใบหน้าที่ใหญ่ที่สุด เมื่อพบหลายใบหน้า และใช้ข้อมูลตำแหน่งดังกล่าวเป็นเป้าหมาย สำหรับการติดตามใน AUTO Mode
UART, CAN และไฟเลี้ยงที่ต้องตรวจสอบ
ข้อมูลด้านล่างเป็นการต่อ UART ตามที่ผู้สร้างระบุใน GitHub README สำหรับชุด XIAO ESP32S3 Sense และ XIAO STM32C5
| ESP32S3 Sense | STM32C5 | หน้าที่ |
|---|---|---|
| D6 / GPIO43 TX | D7 / PA10 RX | ส่ง Target Angle จาก ESP32S3 |
| D7 / GPIO44 RX | D6 / PA9 TX | รับข้อมูล Motor Telemetry |
| GND | GND | Signal Ground ร่วมกัน |
UART ใช้ค่า 115200 8N1 โดย TX และ RX ต้องต่อไขว้กัน ไม่ใช่ต่อ TX ไป TX
การเชื่อมต่อ CAN ของมอเตอร์
เฟิร์มแวร์ใน Repository ใช้ Classic CAN ในการสั่งงานมอเตอร์ โดย README ระบุ CAN ID 0x141 สำหรับ Yaw และ 0x142 สำหรับ Pitch
รายละเอียดสำคัญคือ CAN Transceiver มีขา STB สำหรับควบคุม Standby โดยเฟิร์มแวร์กำหนดให้ PB14 อยู่ในสถานะ Low ก่อนใช้งาน Transceiver
- ต้นฉบับใช้แหล่งจ่าย 12V DC สำหรับมอเตอร์ และ 5V DC สำหรับบอร์ด XIAO
- ห้ามจ่ายไฟ 12V เข้าขา 3.3V หรือ 5V ของบอร์ดโดยตรง
- ต้องตรวจ Signal Ground ร่วมกันตามแผนการต่อจริง
- ต้องตรวจ CAN Termination ให้ตรงกับตำแหน่งปลายบัส เพราะ XIAO STM32C5 มีตัวต้านทาน 120Ω ที่เปิดใช้งานโดยค่าเริ่มต้น
- ห้ามต่อ UART เข้าขา CANH/CANL โดยตรง
- ระวังชิ้นส่วนหมุน สายไฟ และจุดที่อาจหนีบมือขณะทดลอง
อ่านรายละเอียดเพิ่มเติมได้จาก คู่มือ XIAO STM32C5 CAN FD ของ Seeed Studio
Software: จาก Face Detection ไปสู่การสั่งมอเตอร์
ฝั่ง ESP32S3
เฟิร์มแวร์ ESP32S3 ใช้ ESP-IDF ร่วมกับ ESP-DL สำหรับการตรวจจับใบหน้า กล้องจับภาพและส่ง MJPEG Stream ผ่าน Wi-Fi พร้อมแสดง Web Interface สำหรับควบคุม
ฝั่ง STM32C5
STM32C5 ใช้ PlatformIO และ Zephyr RTOS สำหรับรับ Target Angle ผ่าน UART ควบคุมมอเตอร์ผ่าน CAN อ่าน Motor Feedback และส่งข้อมูลกลับไปยัง ESP32S3
Web Interface ควบคุมอะไรได้บ้าง?
| Function | การทำงาน |
|---|---|
| AUTO | เปิด Face Tracking อัตโนมัติ |
| MAN | เข้าสู่การควบคุมด้วยมือ |
| CENTER | สั่งให้กล้องกลับมุมกลางที่เฟิร์มแวร์กำหนด |
| CAL | ร้องขอการ Calibration ตามขั้นตอนที่ผู้สร้างกำหนด |
| Joystick | ปรับมุมกล้องด้วยมือ |
| Angle Sliders | กำหนดมุมเป้าหมายจากหน้าเว็บ |
| Telemetry | แสดงมุมจริงและสถานะมอเตอร์ที่ส่งกลับมา |
ตาม GitHub README ระบบมีการส่ง Motor Angle Telemetry ที่ 20 Hz อย่างไรก็ตาม อัตราการอัปเดตมุมมอเตอร์ไม่ใช่สิ่งเดียวกับ อัตราเฟรมของกล้องหรือความเร็วตรวจจับใบหน้า และไม่ควรนำมาอ้างเป็นค่า FPS ของ Face Detection
วิดีโอสาธิต Face-Tracking Gimbal ทำงานจริง
วิดีโอ xiao gimbal แสดงการทำงานของโปรเจกต์ ช่วยให้เห็นการเคลื่อนที่ของกลไก Pan-Tilt ประกอบกับหลักการ Face Tracking ที่อธิบายไว้ข้างต้น
วิดีโออ้างอิง: xiao gimbal จาก YouTube หากตัวเล่นไม่แสดงใน Shopify สามารถ รับชมวิดีโอ xiao gimbal บน YouTube ได้โดยตรง
วิธีเริ่มทดสอบต้นแบบตาม GitHub
ผู้สร้างเผยแพร่ขั้นตอน Build และ Flash ใน GitHub README พร้อมโครงสร้างซอร์สแยกสำหรับ ESP32S3 และ STM32C5
- ตรวจ Hardware และจุดยึดกลไกของมอเตอร์ก่อนจ่ายไฟ
- ตรวจไฟเลี้ยง Ground และ CAN Termination
- Flash Firmware ให้ ESP32S3 และ STM32C5 ตามคู่มือต้นฉบับ
- ตรวจว่าระบบมอเตอร์ตอบกลับตาม CAN ID ที่กำหนด
- ตรวจการสื่อสาร UART ระหว่างบอร์ดทั้งสอง
- เปิด Web Interface และทดสอบภาพกล้อง
- ทดลองควบคุมแบบ Manual ก่อนเปิด AUTO Tracking
ค่าเริ่มต้นของโปรเจกต์ที่ระบุใน README
| รายการ | ค่าที่ผู้สร้างระบุ |
|---|---|
| Wi-Fi Access Point | Gimbal-ReCamera |
| Web Interface | http://192.168.4.1 |
| UART | 115200 8N1 |
| CAN Bitrate | 1 Mbit/s |
| Center Yaw | 180° |
| Center Pitch | 90° |
ข้อมูลเหล่านี้เป็นค่าของต้นแบบผู้สร้าง ไม่ใช่ค่ามาตรฐานสำหรับมอเตอร์หรือกลไกทุกชุด หากเปลี่ยน Motor, Encoder, Housing หรือทิศทางการประกอบ ต้องตรวจ Configuration และ Calibration ให้ตรงกับ Hardware
สำหรับคำสั่ง Build และ Flash แบบเต็ม แนะนำอ่าน คู่มือ Build and Flash ของผู้สร้างบน GitHub โดยตรง เพื่อให้ตรงกับเวอร์ชัน Firmware ล่าสุดของ Repository
3D Shell และภาพตัวเรือนของโปรเจกต์
ผู้สร้างใช้ Housing เดิมของ reCamera Gimbal ที่เข้ากับมอเตอร์ที่มีอยู่ และเผยแพร่ไฟล์ 3D สำหรับใช้งานกับชุดกลไกนี้
หากใช้มอเตอร์อื่น ผู้สร้างระบุว่าสามารถ วัดขนาดชิ้นส่วนและออกแบบ Housing ใหม่ได้ แต่ต้องตรวจขนาดจริงและการประกอบ ไม่ควรถือว่าไฟล์ตัวเรือนนี้รองรับมอเตอร์ทุกแบบ
รายการรูปภาพต้นฉบับที่พบใน Hackster
ระบบอ่านหน้า Hackster พบชื่อไฟล์รูปภาพ ต่อไปนี้ในเนื้อหา Hardware และ 3D Shell แต่ยังไม่สามารถยืนยัน Direct Image URL แบบเต็มสำหรับฝังลงใน Shopify ได้ทั้งหมด จึงไม่สร้าง URL ขึ้นเอง
Source Code และไฟล์ดาวน์โหลดที่เกี่ยวข้อง
ผู้สร้างเผยแพร่ Source Code สำหรับระบบกล้องและระบบควบคุมมอเตอร์ บน GitHub โดยแยกเป็นสองส่วนหลัก
ตัวอย่าง Code จาก Repository
ตัวอย่างต่อไปนี้นำมาจาก robot_camera/src/main.cpp ของผู้สร้าง เป็นฟังก์ชันคำนวณ CRC-16 ที่ใช้กับข้อมูลของระบบ ไม่ใช่ Firmware ฉบับเต็มสำหรับ Flash ลงบอร์ด
static uint16_t crc16(const uint8_t *p, size_t n)
{
uint16_t c = 0xffff;
while (n--)
{
c ^= (uint16_t)*p++ << 8;
for (int i = 0; i < 8; i++)
c = (c & 0x8000) ? (c << 1) ^ 0x1021 : c << 1;
}
return c;
}
สามารถดาวน์โหลด Firmware ฉบับเต็ม จาก GitHub ของผู้สร้างได้โดยตรง โดยควรตรวจ README และ Version ของ Dependencies ก่อนทำตามคำสั่ง Build
FAQ: คำถามที่พบบ่อยเกี่ยวกับ Face-Tracking Gimbal
1. Face-Tracking Gimbal ทำอะไรได้?
เป็นระบบกล้องที่ตรวจจับตำแหน่งใบหน้า แล้วปรับมุม Gimbal สองแกนเพื่อติดตามใบหน้า พร้อมดูภาพและควบคุมผ่าน Web Interface
2. ต้องใช้ Microcontroller สองตัวหรือไม่?
ต้นแบบของ Zeller ใช้ XIAO ESP32S3 Sense สำหรับประมวลผลภาพ และ XIAO STM32C5 สำหรับควบคุมมอเตอร์ ส่วนการใช้บอร์ดอื่น Source ไม่ได้ยืนยันความเข้ากันได้
3. ทำไมต้องใช้ CAN Bus?
มอเตอร์ในชุดของผู้สร้างมีวงจรขับในตัว และรับคำสั่งผ่าน CAN Bus จึงเลือก STM32C5 ที่รองรับการสื่อสารลักษณะนี้
4. UART ทำหน้าที่อะไร?
ใช้รับส่งคำสั่ง Target Angle และข้อมูล Telemetry ระหว่าง XIAO ทั้งสองบอร์ด
5. ถ้ามีหลายใบหน้า กล้องติดตามใคร?
README ระบุว่า Firmware เลือก กรอบใบหน้าที่ใหญ่ที่สุดในภาพ
6. ใช้ Servo SG90 แทนมอเตอร์เดิมได้หรือไม่?
Source ไม่ได้ระบุวิธีดัดแปลงให้ใช้ SG90 เพราะระบบต้นฉบับควบคุมมอเตอร์ผ่าน CAN Bus ไม่ใช่ระบบ Servo PWM แบบทั่วไป
7. XIAO ESP32S3 Sense ทุกตัวใช้ OV2640 หรือไม่?
ไม่ใช่ Seeed Studio มีการเปลี่ยน Camera Revision เป็น OV3660 และ OV5640 ในบางล็อต จึงต้องตรวจรุ่นกล้องและ Firmware ก่อนนำมาใช้งานกับโปรเจกต์นี้
8. สามารถดูภาพจากมือถือได้ไหม?
ได้ตามต้นแบบ ผู้สร้างใช้ Wi-Fi และหน้า Web Interface สำหรับแสดง Video Stream และปรับมุมกล้อง
9. ดาวน์โหลด Source Code ได้จากที่ไหน?
ดาวน์โหลดได้จาก GitHub Repository ของผู้สร้าง ซึ่งแยกโฟลเดอร์สำหรับ ESP32S3 และ STM32C5
10. มีไฟล์ 3D Printing ให้ดาวน์โหลดไหม?
มีไฟล์ .3mf ที่แนบไว้ใน Hackster แต่ Source ไม่ได้ระบุ Print Settings ที่เหมาะสมสำหรับทุกเครื่องพิมพ์
11. Face Tracking มีความแม่นยำเท่าไร?
Source ไม่ได้ให้ผลการทดสอบอิสระ ด้านความแม่นยำ ระยะตรวจจับ หรือ Latency ของระบบประกอบทั้งหมด จึงไม่สามารถสรุปตัวเลขเหล่านี้ได้
12. โปรเจกต์นี้เหมาะกับผู้เริ่มต้นไหม?
Hackster จัดระดับ Intermediate เนื่องจากต้องทำงานกับทั้ง Embedded Software, UART, CAN Bus, Camera และการประกอบกลไก
สรุป: เมื่อ Embedded Vision กับ Motor Control ทำงานร่วมกัน
Face-Tracking Gimbal ของ Zeller เป็นตัวอย่างที่น่าสนใจของการนำชิ้นส่วนเก่า มาต่อยอดด้วย Microcontroller สองตัว และออกแบบให้แต่ละบอร์ดรับหน้าที่ต่างกัน
ESP32S3 รับผิดชอบการมองเห็นและคำนวณตำแหน่ง ส่วน STM32C5 รับผิดชอบการควบคุมมอเตอร์ ผ่าน CAN Bus โดยมี UART เป็นช่องทางสื่อสาร ระหว่างระบบทั้งสอง
โปรเจกต์นี้จึงเหมาะสำหรับศึกษา Computer Vision, Embedded Systems, Motor Control และการออกแบบกลไก โดยสามารถเรียนรู้จาก Source Code วิดีโอสาธิต และไฟล์ 3D ที่ผู้สร้างเปิดเผยไว้
หากต้องการทำตามทั้งหมด ควรอ่าน บทความ Face-Tracking Gimbal ของ Zeller ควบคู่กับ GitHub Repository ต้นฉบับ เพื่อให้ข้อมูล Wiring, Version และ Configuration ตรงกับชุด Hardware ที่ใช้จริง
References / แหล่งข้อมูลต้นฉบับ
ต่อยอดโปรเจกต์ Maker กับ GlobalByte
สนใจพัฒนาโปรเจกต์ Embedded Vision, กล้อง AI หรือระบบควบคุมมอเตอร์? สามารถสอบถามทีม GlobalByte เกี่ยวกับ Development Board, Camera Module, Maker Accessories หรือบริการ 3D Printing เพื่อเลือกแนวทางให้เหมาะกับงานของคุณ