กลับไปหน้ารวมไฟล์
robot-that-makes-you-stand-on-lego-using-opencv-c24b84.md

ผมสร้างโปรเจกต์นี้ขึ้นมาเพื่อเรียนรู้เรื่อง Computer Vision ครับ และก็คงเพราะผมอยากท้าทายเท้าตัวเองด้วยแหละ (ฮา)

ถ้าอยากเห็นตอนทดสอบสุดท้าย จัดไปดูในวิดีโอด้านล่างนี้ได้เลย แล้วเดี๋ยวผมจะเล่ารายละเอียดการสร้างให้ฟังต่อข้างล่าง

ภาพรวมโปรเจกต์

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

ผมเริ่มต้นด้วยการออกแบบ CAD เหมือนโปรเจกต์อื่นๆ ของผม และได้แบบประกอบใน SolidWorks ออกมาดังนี้:

CAD assembly Printed parts

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

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

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

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

Fully assembled (with camera mounted on front) Rack gear fully within chamber (you can see the section of missing teeth on the spur gear which will allow the rack to fire back in) Spur gear pulled back (at this point a lego brick would drop into the chamber

ลงลึกกันแบบช่างๆ

  • กระบวนการ 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) เพื่อเริ่มต้นการหมุนของเฟืองยิง

วิศวกรรมและการสร้างต้นแบบ

  • การออกแบบด้วย CAD (SolidWorks): ชิ้นส่วนทั้งหมดถูกออกแบบใน SolidWorks เพื่อให้ได้ความเผื่อ (Tolerance) ที่แม่นยำสำหรับระบบยิงแบบ Rack-and-Pinion การพิมพ์ 3D ช่วยให้สามารถปรับเปลี่ยนแบบได้รวดเร็ว เมื่อพบว่าเซอร์โว SG90 กับตัวโครงสีเทาในแบบแรกนั้นพอดีกันไม่ค่อยดี
  • ความปลอดภัยและลูปการตอบสนอง: ซอฟต์แวร์มีอัลกอริทึม "ล็อกศูนย์กลาง" ป้อมปืนจะยิงก็ต่อเมื่อจุดศูนย์กลางของเท้าที่ติดตามอยู่ภายใน "โซนตาย" (Dead-Zone) ที่กำหนด (แสดงด้วยแถบสีขาวในมุมมอง CV) เพื่อป้องกันการยิงกระสุนฟรีเวลาที่เป้าหมายเคลื่อนไหวเร็วเกินกว่าที่มอเตอร์หมุนจะตามทัน
  • โครงสร้างทางกายภาพ: "แม็กกาซีน" ใช้การป้อนกระสุนด้วยแรงโน้มถ่วง อิฐเลโก้เรียงซ้อนกันในแนวตั้ง และจะตกลงไปใน "ลำกล้อง" ทันทีที่ Rack ยิงเสร็จและกลับมาที่ตำแหน่งพัก ทำให้สามารถยิงต่อเนื่องได้เร็ว

ยังไงซะ น้องก็เห็นการติดตามเท้าแบบเรียลไทม์ด้านล่างได้เลย หลังจากนั้นโค้ด Arduino ก็ตรงไปตรงมามาก ฉันแค่ส่งพิกัดจุดศูนย์กลางของเท้า (สี่เหลี่ยมสีเขียว) จากสคริปต์ Python ไปให้ แล้วเซอร์โวก็ขยับให้จุดนั้นมาอยู่ภายในจุดกึ่งกลางภาพ (แถบสีขาว) พออยู่ในโซนแล้ว มันก็จะยิง

Webcam view of the foot tracking

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

ขอบคุณที่อ่านกันจนจบนะวัยรุ่น!

ข้อมูล Frontmatter ดั้งเดิม

apps:
  - "1x Arduino IDE"
  - "1x OpenCV"
author: "adambeedle"
category: "Gadgets, Games & Toys"
components:
  - "1x SG90 Micro-servo motor"
  - "1x Arduino UNO"
  - "1x MG996R"
description: "พี่จัดให้! หุ่นยนต์อัตโนมัติตึงๆ ที่ตามจับสีแล้วบังคับให้ยืนบนเลโก้ งานง่ายแต่หล่อด้วย Arduino กับ OpenCV"
difficulty: "Intermediate"
documentationLinks: []
downloadableFiles: []
encryptedPayload: "U2FsdGVkX1+t/NBpHaWuVs74QGAPI1Lnt4C6otBiqYIx2ot8mellupbegziwN0ZDoFfv+A6YS2T1Zwo5zsyF6wXY8iVhNok4dLCMWkSNjLU="
heroImage: "https://cdn.jsdelivr.net/gh/bigboxthailand/arduino-assets@main/images/projects/robot-that-makes-you-stand-on-lego-using-opencv-c24b84_cover.jpg"
lang: "en"
likes: 4
passwordHash: "694e3423cade85647cafbb89a895aad998d84519390854ac41cd2ce490f2d041"
price: 1499
seoDescription: "Build a colour tracking full-auto robot with Arduino and OpenCV that makes you stand on lego bricks."
tags:
  - "tracking"
  - "security"
  - "robots"
title: "Robot that makes you stand on lego, using OpenCV"
tools: []
videoLinks:
  - "https://www.youtube.com/embed/I6gpKFjL6_8"
views: 5346