เมื่อเน็ตหลุด แขนกล myPalletizer 260 จะทำหน้าที่สวมบทเกมเมอร์กด Spacebar แทนคุณเอง!
สวัสดีชาว Maker ทุกคนครับ! เราทุกคนน่าจะเคยเจอปัญหานี้... ตอนที่ Wi-Fi หลุด หน้าจอ "No Internet" โผล่ขึ้นมา และจู่ๆ เจ้าไดโนเสาร์ T-Rex พิกเซลก็กลายเป็นเพื่อนแก้เบื่อเพียงคนเดียวของคุณ [cite: 1] ปกติเราก็นั่งกด Spacebar เล่นรอเน็ตมาใช่ไหมครับ?
แต่สำหรับโปรเจกต์นี้ ผู้พัฒนาเกิดปิ๊งไอเดียว่า "ทำไมเราต้องมานั่งกดกระโดดหลบกระบองเพชรเอง ในเมื่อเรามีแขนกลหุ่นยนต์วางอยู่บนโต๊ะล่ะ!?" [cite: 1] โปรเจกต์ Over-engineer สุดมันส์ที่ใช้แขนกล myPalletizer 260 M5 ร่วมกับระบบ Computer Vision จึงถือกำเนิดขึ้นครับ [cite: 1]
ฮาร์ดแวร์ที่ต้องใช้ (Hardware Components) [cite: 1]
- แขนกล Elephant Robotics myPalletizer 260 M5 (แขนกล 4-DOF) [cite: 1]
- หัวจับ (End Effector) แบบ Cylinder [cite: 1]
- คอมพิวเตอร์ (MacBook หรือ PC) [cite: 1]
- Python 3.x สำหรับเขียนโปรแกรม [cite: 1]
💡 Maker's Tip: โปรเจกต์ที่ผสมผสานระหว่างซอฟต์แวร์วิเคราะห์ภาพ (Computer Vision) และฮาร์ดแวร์ เป็นจุดเริ่มต้นที่ดีในการเรียนรู้ระบบ Robotics ครับ!
หากเพื่อนๆ คนไหนกำลังคันไม้คันมือ อยากลองสร้างหุ่นยนต์ หรือกำลังมองหา บอร์ดไมโครคอนโทรลเลอร์ เซนเซอร์ หรืออุปกรณ์หุ่นยนต์ ไปดัดแปลงเล่น แวะมาช้อปปิ้งของแท้พร้อมส่งได้ที่ Globalbyte เลยครับ มีครบทุกความต้องการ!
Step 1: พัฒนา "สมอง" ด้วยซอฟต์แวร์ก่อน [cite: 1]
ก่อนจะให้แขนกลมากระแทกคีย์บอร์ด เราต้องทำ "สมอง" ให้มันมองเห็นเกมก่อนครับ ผู้พัฒนาเริ่มเขียนโค้ดจับภาพหน้าจอด้วย Python แต่พบว่าโมดูลมาตรฐานอย่าง PIL (Pillow) ทำงานช้าเกินไปสำหรับเกมที่ต้องตอบสนองระดับมิลลิวินาที [cite: 1] เขาเลยเปลี่ยนมาใช้ mss ซึ่งเป็นโมดูลแคปจอที่ทำงานได้รวดเร็วมาก [cite: 1]
Step 2: กลยุทธ์วิเคราะห์ภาพ "Search Beam" [cite: 1]
เพื่อให้บอททำงานไวขึ้น เราไม่จำเป็นต้องประมวลผลทั้งหน้าจอครับ แค่สร้าง "เส้นจับสัญญาณ (Beam)" ไว้หน้าตัวไดโนเสาร์ก็พอ [cite: 1] โดยแบ่งเป็น 2 เส้นคือ:
-
The Cactus Beam: เส้นจับสัญญาณระดับต่ำ เอาไว้ดักจับกระบองเพชร [cite: 1]
-
The Bird Beam: เส้นจับสัญญาณระดับสูง เอาไว้ดักจับนก [cite: 1]
การมี 2 เส้นช่วยให้บอทแยกแยะได้ว่า นกตัวไหนบินสูงจนวิ่งลอดใต้ท้องได้ (ไม่ต้องโดด) และนกตัวไหนบินต่ำจนต้องกระโดดหลบครับ [cite: 1]
Step 3: เอาตัวรอดในโหมดกลางคืน (Night Shift) [cite: 1]
ใครเล่นบ่อยๆ จะรู้ว่าพอคะแนนถึง 700 เกมจะเปลี่ยนเป็น "โหมดกลางคืน" (จอสีดำ อุปสรรคสีขาว) ซึ่งทำให้บอทรุ่นแรกที่ดักจับ "พิกเซลสีดำ" ตาบอดสนิท! [cite: 1]
วิธีแก้ปัญหาคือเปลี่ยนตรรกะใหม่ ให้บอทเช็ค "ความต่างของสี (Contrast)" แทนครับ ถ้าพิกเซลตรงหน้ามีสี "ไม่เหมือน" กับสีพื้นหลัง (ไม่ว่าพื้นหลังจะขาวหรือดำ) บอทก็จะรู้ทันทีว่ามีอุปสรรคขวางอยู่ ทำให้บอททำงานได้ตลอดเวลาอย่างชาญฉลาด [cite: 1]
Step 4: เชื่อมสมองกลเข้ากับแขนหุ่นยนต์ [cite: 1]
ตอนนี้เราได้โค้ดบอทที่สมบูรณ์แล้ว ก็ถึงเวลาสั่งงานแขนกล myPalletizer 260 M5 กันครับ [cite: 1] วิธีหาพิกัดแกน Z สำหรับการกดปุ่ม Spacebar ก็ง่ายมากๆ:
- ขยับหัวหุ่นยนต์มาวางบนปุ่ม Spacebar [cite: 1]
- ปล่อยให้หุ่นยนต์ทิ้งน้ำหนักลงมาทับปุ่ม (Gravity-assisted) แล้วจดค่าพิกัดแกน Z ไว้เป็น
Z_PRESSED [cite: 1]
- ยกแขนขึ้นนิดหน่อยจนปุ่มเด้งกลับ แล้วจดค่าไว้เป็น
Z_RELEASED [cite: 1]
แค่นี้พอโปรแกรมเจอกระบองเพชร มันก็จะสั่งให้แขนกลพุ่งไปที่พิกัด Z_PRESSED แล้วเด้งกลับมาที่ Z_RELEASED ทันทีครับ! [cite: 1]
Step 5: ปัญหาการกดเบิ้ล (The Double-Tap Dilemma) [cite: 1]
ปัญหาตลกร้ายที่เจอคือ "แขนกลเร็วกว่าตัวเกม" ครับ! โปรแกรมจับภาพทำงานหลายสิบครั้งต่อวินาที พอแขนกลกดกระโดดปุ๊บ ภาพในเกมยังกระโดดไม่พ้นกระบองเพชรดี บอทก็เห็นกระบองเพชรตัวเดิมแล้วสั่ง "กดกระโดดซ้ำ" อีกรอบจนรวนไปหมด [cite: 1]
วิธีแก้ปัญหาแบบคลาสสิกของโปรแกรมเมอร์ก็คือการใส่คำสั่งหน่วงเวลา time.sleep() ลงไปเล็กน้อยครับ เพื่อให้ไดโนเสาร์กระโดดเคลียร์อุปสรรคให้พ้นก่อน บอทถึงจะเริ่มสแกนอุปสรรคตัวต่อไป [cite: 1]
mc.send_coords(Z_PRESSED, 60)
time.sleep(0.1)
mc.send_coords(Z_RELEASED, 60)
# หน่วงเวลาเล็กน้อยเพื่อป้องกันแขนกลรวน
# หรือกดกระโดดซ้ำบนกระบองเพชรต้นเดิม
time.sleep(0.3)
มีอะไรน่าพึงพอใจไปกว่าการได้เห็นแขนกลราคาหมื่นกว่าบาท นั่งจิ้มคีย์บอร์ดเล่นเกมไดโนเสาร์ฟรีๆ ให้เราดูอีกล่ะครับ 😆 จากโปรเจกต์แก้เบื่อตอนเน็ตหลุด กลายมาเป็นโปรเจกต์ Full-stack Robotics ที่รวมทั้งระบบ Computer Vision และ Hardware Integration เข้าไว้ด้วยกันได้อย่างลงตัว [cite: 1]
การตั้งค่า Search Beam 2 ระดับเพื่อจับภาพกระบองเพชรและนก
แขนกล myPalletizer 260 M5 ทำหน้าที่กดปุ่ม Spacebar
*คำเตือน: เนื้อหานี้เป็นการสรุปและเรียบเรียงจากบทความเทคโนโลยีต้นฉบับภาษาอังกฤษ ข้อมูลฉบับภาษาไทยอาจมีความคลาดเคลื่อนบางประการจากการตีความหรือย่อเนื้อหา การสั่งงานแขนกลและเขียนโปรแกรมอัตโนมัติควรทำความเข้าใจ API ของฮาร์ดแวร์อย่างละเอียดเพื่อป้องกันความเสียหายต่ออุปกรณ์ สามารถตรวจสอบโค้ดและข้อมูลต้นฉบับได้ที่
เว็บไซต์ต้นฉบับ ก่อนลงมือทำ