ผมทำโปรเจกต์นี้ขึ้นมาเพื่อเรียนรู้เรื่อง Computer Vision ครับ
ตอนนี้โปรเจกต์ก็ทำงานได้ในระดับเวอร์ชันเริ่มต้นแล้ว แต่ผมอาจจะกลับมาพัฒนามันต่อในอนาคต ถ้าอยากเห็นการทดสอบสุดท้าย ลองดูวิดีโอนี้ แล้วด้านล่างผมจะลงรายละเอียดเกี่ยวกับขั้นตอนการสร้างให้อีกที
Machine Vision: The OpenCV Autonomous Nerf Turret
Autonomous OpenCV Turret นี่แหละตัวดี! มันพาเราข้ามจากโลกของ Arduino เบสิกๆ ไปสู่การประมวลผลภาพด้วย Python AI บน PC หรือ Raspberry Pi โดยใช้ Arduino เป็นแค่ตัวสั่งงานมอเตอร์เฉยๆ
ผมเริ่มจากสร้างต้นแบบเพื่อทดสอบการติดตามใบหน้าโดยยังไม่ติดปืนเนิร์ฟก่อน ทั้งเพื่อให้มันเบาและประกอบง่ายขึ้น และที่สำคัญ...ผมจะได้ไม่โดนลูกเนิร์ฟยิงใส่ตัวตลอดตอนกำลังเขียนโค้ดนั่นแหละ
การตั้งค่าทดสอบประกอบด้วยเซอร์โวสองตัว สำหรับหมุนแนวนอน (pan) และแนวตั้ง (tilt) พร้อมกับเว็บแคมที่ติดตั้งอยู่ด้านบน ตามภาพด้านล่างเลย:

การตรวจจับใบหน้าด้วย Python
Arduino ประมวลผลวิดีโอไม่ได้นะครับ ต้องให้เว็บแคมของ PC เป็นคนจัดการภาพแทน
- OpenCV (Python): สคริปต์ Python จะดึงภาพจากเว็บแคมความละเอียด 1080p มา แล้วใช้ไลบรารี
Haar Cascade Classifierซึ่งถูกเทรนมาให้ตรวจจับใบหน้าคนโดยเฉพาะ - The Bounding Box: พอมีใครเดินเข้ามาในเฟรม Python จะวาดกรอบสี่เหลี่ยมสีเขียวติดตามรอบใบหน้า แล้วคำนวณหาพิกัด X/Y ตรงกลางของกรอบนั้น (เช่น
X: 450, Y: 300) - Serial Comm: สคริปต์ Python จะส่งคำสั่งทันทีผ่านสาย USB ไปหา Arduino ว่า:
X450Y300\n
เว็บแคมจะต่อกับคอมที่รันสคริปต์ Python กับ OpenCV อยู่ สคริปต์จะตรวจจับใบหน้า แล้วส่งพิกัดของใบหน้าในภาพไปให้ Arduino ซึ่งจะขยับเซอร์โว pan/tilt เพื่อให้จุดกึ่งกลางใบหน้า (จุดสีเขียว) มาอยู่ตรงกลางภาพ (สี่เหลี่ยมสีขาว) พอดี สำหรับส่วนนี้ผมใช้ไกด์จาก Shubham Santosh เป็นหลัก ขอบคุณเขามากๆ ที่ช่วยงานไปครึ่งโปรเจกต์เลย!

การแปลงพิกัดไปยังเซอร์โว
Arduino รออยู่แล้วน้อง
- ขั้นตอนแยกข้อมูล (Parsing): มันอ่านสตริงที่ส่งมา แล้วดึงค่า 450 กับ 300 ออกมา
- ขั้นตอนแมปพิกัด (Mapping): มันแปลงค่าจากความละเอียดจอใหญ่ยักษ์ (1920x1080) ให้เข้ากับขีดจำกัดการหมุน 180 องศาจริงๆ ของ เซอร์โว MG996R ตัว Pan กับ Tilt
- ขั้นตอนยิง (Fire Sequence):
If(Abs(targetX - currentX) < 10)(แปลว่า ปากกระบอกปืนเล็งตรงกลางหน้าพอดี) Arduino จะสั่งให้รีเลย์แบบสตาร์ทเครื่องยนต์ทำงาน- รีเลย์จะปล่อยไฟ 12V เข้าไปในกลไกยิงของ Nerf blaster ที่เราปรับแต่งซะใหม่จนสุดโต่ง ทำให้มันยิงลูกดอกโฟมออกมาเป็นชุด!
หลังจากนั้น พี่ก็ออกแบบและพิมพ์ขาตั้งสองแกนที่ใหญ่และแข็งแรงขึ้นสำหรับปืน Nerf พร้อมกับกลไกยิงที่ทำงานอัตโนมัติเมื่อใบหน้าอยู่ตรงกลางจอ (มันยิงใส่หน้าพี่เลยอะ น้อง ขอโทษทีที่ลืมใส่แว่นตานะ!)

อุปกรณ์สำคัญที่ต้องมี (จัดไปวัยรุ่น)
- คอมพิวเตอร์ที่รัน Python 3 และ OpenCV
- ปืน Nerf แบบมอเตอร์ (เช่น Stryfe หรือ Nemesis)
- ขาตั้งป้อมปืน Pan/Tilt ขนาดใหญ่ยักษ์
- Arduino Mega: สำหรับแยกข้อมูลสตริงจาก Serial ที่วิ่งเร็วสุดๆ และขับเซอร์โวหลายตัวพร้อมกัน
- โมดูลรีเลย์ / MOSFET: สำหรับควบคุมโซลินอยด์ยิง
- (หมายเหตุ: ใส่แว่นตานะน้อง ทุกครั้งที่ทดสอบอุปกรณ์ยิงอัตโนมัติ ห้ามช็อตนะตัวนี้)
และหลังจากนั้น สิ่งที่เหลือก็คือ... ทดสอบมันซะ!

มันทำงานได้นะ แม้ว่าตอนนี้การเคลื่อนไหวจะกระตุกๆ ไปหน่อย และอาจจะต้องเพิ่มฟีเจอร์ให้มันสแกนหาห้องถ้าไม่เจอหน้าใคร
อยากเห็นตอนทดสอบ (และพี่โดนยิงใส่หน้า) ไปดูในวิดีโอทดสอบได้เลย สู้งานนะน้อง