ผมสร้างโปรเจกต์นี้ขึ้นมาเพื่อเรียนรู้เรื่อง Computer Vision ครับ และก็คงเพราะผมอยากท้าทายเท้าตัวเองด้วยแหละ (ฮา)
ถ้าอยากเห็นตอนทดสอบสุดท้าย จัดไปดูในวิดีโอด้านล่างนี้ได้เลย แล้วเดี๋ยวผมจะเล่ารายละเอียดการสร้างให้ฟังต่อข้างล่าง
ภาพรวมโปรเจกต์
"Lego Caltrop Deployer" หรือ "เครื่องยิงเลโก้ทิ่มเท้า" นี่เป็นโปรเจกต์ที่ทั้งฮาและโหดในเชิงเทคนิค เน้นไปที่ Computer Vision (CV) และ Mechanical Engineering เป้าหมายคือติดตามเท้ามนุษย์แบบเรียลไทม์ แล้วยิงเลโก้ออกไปขวางทางเดินซะเลย แม้จะดูเหมือนการท้าทายความเจ็บปวดของเท้า แต่มันสาธิตแนวคิดวิศวะที่สำคัญหลายอย่าง: การติดตามวัตถุแบบเรียลไทม์ ด้วย OpenCV, การสื่อสารแบบ Serial ระหว่าง Python กับ Arduino, และ กลไกการยิงแบบคัสตอม ที่ใช้เกียร์พิมพ์ 3D กับเซอร์โวแรงบิดสูง
ผมเริ่มต้นด้วยการออกแบบ CAD เหมือนโปรเจกต์อื่นๆ ของผม และได้แบบประกอบใน SolidWorks ออกมาดังนี้:

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

ลงลึกกันแบบช่างๆ
- กระบวนการ Computer Vision (OpenCV & Python):
- ความท้าทายของการติดตาม: พอประกอบฮาร์ดแวร์เสร็จ ก็ต้องมาคิดต่อว่าจะให้มันตามเท้าฉันยังไง ตัวฉันเองเคยทำปืนเนิร์ฟติดตามใบหน้ามาแล้วนะ (แล้วมันยิงกลับมาที่หน้าฉันเองด้วย) แต่ที่น่าแปลกใจคือ การใช้ haarcascades แบบที่ใช้ติดตามหน้านั้น กลับใช้ติดตามเท้าได้ยากโคตรๆ อย่างแรกเลยคือฉันหา haarcascade สำหรับติดตามขาได้อย่างเดียว ซึ่งมันค่อนข้างจะจุกจิกมากกว่า ฉันว่าเพราะขามีลักษณะเด่นน้อยกว่าน่ะแหละ สุดท้ายเลยต้องลงทุนใส่ถุงเท้าสีแดง แล้วใช้การตรวจจับสีใน OpenCV มาช่วยติดตามแทน (รู้ว่างี่เง่านะ แต่อย่างน้อยก็ไม่ต้องเอาเท้าเปล่ามาอวดคนในเน็ต)
- การสร้างมาสก์สี: ด้วยการกำหนดช่วงของ HUE, SATURATION, และ VALUE สำหรับสีที่ต้องการ (เช่น ถุงเท้าสีแดง) สคริปต์ Python จะสร้างไบนารี่มาสก์ขึ้นมา จากนั้นก็ทำ Contour Analysis เพื่อหา "ก้อน" ที่ใหญ่ที่สุด และคำนวณหา จุดศูนย์กลาง (Centroid) ของมัน (พิกัด X, Y)
- การคำนวณความคลาดเคลื่อน: สคริปต์จะเปรียบเทียบพิกัดจุดศูนย์กลางกับจุดกึ่งกลางภาพ ถ้าเท้าอยู่ทางซ้ายของจุดกึ่งกลาง มันก็จะส่งคำสั่งผ่าน Serial ไปที่ Arduino ให้ป้อมปืนหมุนทวนเข็มนาฬิกา
- จลนศาสตร์ป้อมปืนและตรรกะการยิง:
- ฐานหมุน MG996R: เพราะน้ำหนักของแม็กกาซีนเลโก้และชุดกลไกยิง เลยต้องใช้ เซอร์โว MG996R เกียร์โลหะ แรงบิดสูงสำหรับแกนแนวนอน (Pan) เพื่อให้การเคลื่อนไหวลื่น ไม่กระตุก
- กลไกยิงแบบเป็นจังหวะ: นี่คือการออกแบบกลไก "One-Shot" ที่สุดเจ๋ง ใช้หลักการของมอเตอร์หมุนต่อเนื่องกับ Spur Gear ที่มีส่วนฟันหายไป ขณะที่เฟืองหมุน มันจะดึง Rack Gear กลับ (โดยมียางรัดช่วยสร้างแรงดึง) พอหมุนไปถึงส่วนที่ฟันหาย Rack ก็จะถูกปล่อยทันที แล้วดีดไปข้างหน้าเพื่อยิงอิฐเลโก้ก้อนล่างสุดออกจากห้องยิง
- โปรโตคอลการสื่อสารแบบ Serial:
- สคริปต์ Python ทำหน้าที่เป็น "ผู้ควบคุม" ส่งสตริงที่จัดรูปแบบแล้ว (เช่น
X120Y45F1\n) ผ่านพอร์ต USB Serial - Arduino UNO จะทำการแยกวิเคราะห์สตริงนี้ โดยแมปพิกัดแกน X ไปเป็นความกว้างพัลส์ PWM ไมโครวินาที 500-2500 สำหรับเซอร์โว และตรวจสอบแฟล็ก "Fire" (F) เพื่อเริ่มต้นการหมุนของเฟืองยิง
- สคริปต์ Python ทำหน้าที่เป็น "ผู้ควบคุม" ส่งสตริงที่จัดรูปแบบแล้ว (เช่น
วิศวกรรมและการสร้างต้นแบบ
- การออกแบบด้วย CAD (SolidWorks): ชิ้นส่วนทั้งหมดถูกออกแบบใน SolidWorks เพื่อให้ได้ความเผื่อ (Tolerance) ที่แม่นยำสำหรับระบบยิงแบบ Rack-and-Pinion การพิมพ์ 3D ช่วยให้สามารถปรับเปลี่ยนแบบได้รวดเร็ว เมื่อพบว่าเซอร์โว SG90 กับตัวโครงสีเทาในแบบแรกนั้นพอดีกันไม่ค่อยดี
- ความปลอดภัยและลูปการตอบสนอง: ซอฟต์แวร์มีอัลกอริทึม "ล็อกศูนย์กลาง" ป้อมปืนจะยิงก็ต่อเมื่อจุดศูนย์กลางของเท้าที่ติดตามอยู่ภายใน "โซนตาย" (Dead-Zone) ที่กำหนด (แสดงด้วยแถบสีขาวในมุมมอง CV) เพื่อป้องกันการยิงกระสุนฟรีเวลาที่เป้าหมายเคลื่อนไหวเร็วเกินกว่าที่มอเตอร์หมุนจะตามทัน
- โครงสร้างทางกายภาพ: "แม็กกาซีน" ใช้การป้อนกระสุนด้วยแรงโน้มถ่วง อิฐเลโก้เรียงซ้อนกันในแนวตั้ง และจะตกลงไปใน "ลำกล้อง" ทันทีที่ Rack ยิงเสร็จและกลับมาที่ตำแหน่งพัก ทำให้สามารถยิงต่อเนื่องได้เร็ว
ยังไงซะ น้องก็เห็นการติดตามเท้าแบบเรียลไทม์ด้านล่างได้เลย หลังจากนั้นโค้ด Arduino ก็ตรงไปตรงมามาก ฉันแค่ส่งพิกัดจุดศูนย์กลางของเท้า (สี่เหลี่ยมสีเขียว) จากสคริปต์ Python ไปให้ แล้วเซอร์โวก็ขยับให้จุดนั้นมาอยู่ภายในจุดกึ่งกลางภาพ (แถบสีขาว) พออยู่ในโซนแล้ว มันก็จะยิง

สรุปคือมันทำงานได้นะ แย่สุดๆ แต่อะ ฉันว่าการเอาเวลาไปพัฒนาหุ่นยนต์โง่ๆ แบบนี้ต่อ อาจไม่ใช่ไอเดียที่ดีที่สุดสำหรับฉันแล้วมั้ง
ขอบคุณที่อ่านกันจนจบนะวัยรุ่น!