กลับไปหน้ารวมไฟล์
rubiks-cube-solver-robot-6233e2.md

แรงขับในการทำโปรเจคนี้ของพี่คือ:

  • รูบิคอยู่ในหมวดของเล่น "ขายดีเว่อร์" ขายไปแล้วกว่า 350 ล้านลูก
  • เวลาที่มนุษย์ใช้แก้ลดลงจาก 22 วินาทีในปี 1982 เหลือแค่ 3.47 วินาทีในปี 2018
  • นักคณิตศาสตร์ระดับเทพๆ อย่าง Kociemba, Rokiki และ Fridrich ยังหลงใหลของเล่นชิ้นนี้เลยนะ – ตอนเป็นผู้ใหญ่แล้วด้วย!!!
  • มีคนแก้รูบิคแบบปิดตาได้ด้วยนะ – 48 ลูกในเวลาไม่ถึงชั่วโมง
  • พี่อยากรู้เรื่อง OpenCV กับ Python เลยเลือกเจอเรื่องนี้แหละ เป็น Challenge ดี
  • ช่วงโรคระบาด พี่ต้องมีโปรเจคไว้รักษาสมดุลจิตใจและให้สมองได้เรียนรู้สิ่งใหม่ๆ เป็นกลไกจัดการเวลาว่างน่ะ ฮ่าๆ

แนวคิด (Conceptualization):

พี่เอาแบบของ Matt2uy มา แล้วมาปรับปรุงส่วนการจดจำภาพและอัลกอริทึมการแก้ โดยนำ Herbert Kociemba algorithm มาใช้

ขั้นตอนการพัฒนา

มันเป็นกระบวนการที่ใช้สัญชาตญาณและสังเกตการณ์กลไก – ลองผิดลองถูก – สร้างมา 4 โมเดลจนเจอตัวที่แม่นยำและทำซ้ำได้ดีที่สุด

แนวคิดคือการสร้างความรู้บนพื้นฐานความรู้ที่มีอยู่แล้ว ดังนั้น Instructables, youtube, github เป็นแหล่งความรู้สำคัญมาก

ผลลัพธ์

หลังจากปรับนู่นนี่นิดหน่อย พี่ประหยัดเวลาได้ประมาณ 20-24 นาทีในการแก้ – เวลาเฉลี่ยตอนนี้อยู่ที่ 6 ถึง 8 นาที .

ถ้าน้องอยากได้ความเร็วสูงสุด ไปดูโปรเจคอื่นของพี่ได้นะ ส่วนอันนี้เน้นไปที่กลยุทธ์การแก้ปัญหา การเรียนรู้ และความอดทนมากกว่า

วิดีโอนี้สรุปภาพรวมสิ่งที่พี่ทำไว้:

Rubik´s cube solver Robot - ใช้เวลาแก้ 6-8 นาที

กระบวนการทำงาน:

โมดูลโปรแกรม Python จะจับภาพลูกบาศก์ จากนั้นโมดูลอื่นจะประมวลผลสกัดสีของแต่ละสติกเกอร์ และสุดท้ายลูกบาศก์จะถูกแก้ด้วยอัลกอริทึม Kociemba จากนั้นคำตอบจะถูกส่งไปยัง Arduino ผ่านพอร์ตอนุกรม พอรหัส Arduino ได้รับคำตอบ มันก็จะเริ่มประมวลผลการเคลื่อนไหว หลังจาก 6-8 นาที กระบวนการก็เสร็จสิ้น และหุ่นยนต์จะแสดงหน้าทุกด้านของลูกบาศก์ที่แก้แล้ว

Algorithmic Kinematics: The Python and Arduino Pipeline

มนุษย์แก้รูบิคได้ด้วยการจดจำรูปแบบทางกายภาพ แต่การทำให้เครื่องจักรทำแบบเดียวกันได้นั้นต้องอาศัยความซับซ้อนทางคณิตศาสตร์ระดับจักรวาล ที่รวมเอา Optical Engineering ระดับสูง, เมทริกซ์การแก้ปัญหาด้วยอัลกอริทึม Kociemba และกลไกที่ต้องซิงค์กันอย่างน่ากลัว! หุ่นยนต์แก้รูบิค นี้ทำงานในรูปแบบ Master-Slave Architecture แบบครบวงจร! PC หรือ Raspberry Pi จะจับภาพสถานะสีของทั้ง 54 ช่องผ่านกล้องเว็บแคม จากนั้นก็สร้างชุดคำสั่งการเคลื่อนไหวที่ถูกออปติไมซ์แล้ว (ประมาณ 20 ท่า เช่น U2 R' F B') แล้วก็ยิงข้อมูลทั้งหมดนี้ผ่าน Serial ไปยัง Arduino Uno ที่ทำหน้าที่เป็น Slave! จากนั้นเจ้า Uno ก็จะถอดรหัสคำสั่งและสั่งการมอเตอร์สเตปเปอร์/เซอร์โวแรงบิดสูง 4-6 ตัว ให้ขยับแก้ลูกบาศก์จนเสร็จสิ้นภายในเวลาไม่กี่วินาที! จัดไปวัยรุ่น!

กระบวนการวิเคราะห์ภาพด้วย Python OpenCV

ก่อนที่มอเตอร์จะหมุนได้ หุ่นยนต์ต้องจำสภาพที่สลับของลูกบิดให้แม่นยำก่อน

  1. แขนกลของหุ่นยนต์จะหมุนลูกบิดอย่างละเอียด เพื่อนำทั้ง 6 หน้า มาให้ กล้อง USB ที่ติดตั้งอยู่กับที่จับภาพ
  2. OpenCV (Python) จะสแกนภาพอย่างหนักหน่วง เพื่อสร้าง Region of Interest (ROI) ที่ชัดเจน 9 จุดต่อหน้า
  3. ค่า RGB ที่แปรปรวนสุดๆ จะถูกแปลงเป็นระบบสี HSV (Hue, Saturation, Value) เพื่อประเมินสี "ส้ม" ได้อย่างแม่นยำ แม้จะอยู่ในสภาพแสงในห้องที่ห่วยแตกก็ตาม!
  4. มันจะรวบรวมสตริงสียาวเหยียด เช่น "UUUURRRRRFFFDDD..." แล้วโยนเข้าไปในไลบรารี Kociemba ตัวหนักของ Python เพื่อคำนวณเส้นทางการแก้ (solve path) แบบคณิตศาสตร์ได้ในทันที!

การควบคุมชุดสเต็ปเปอร์มอเตอร์ (โค้ด Arduino)

การแยกวิเคราะห์สตริงคำสั่งแก้ เช่น "R2 L' F" ต้องการให้ Arduino จับคู่กับการเคลื่อนไหวทางกลไกที่แน่นอน โดยใช้เฟรมเวิร์ก <AccelStepper.h>!

  • R2 หมายถึง หน้าขวาต้องหมุน 180 องศา อย่างรุนแรง
  • L' หมายถึง หน้าซ้ายต้องหมุน 90 องศา ทวนเข็ม อย่างดุดัน!
void executeMove(String currentMove) {
  if (currentMove == "R") {
    // หมุนตามเข็ม 90 องศาบนสเต็ปเปอร์ขวา! (สมมติ 200 สเต็ป/รอบ)
    stepperR.moveTo(stepperR.currentPosition() + 50); 
    while (stepperR.distanceToGo() != 0) {
      stepperR.run(); // เร่งความเร็วแบบไม่บล็อกอย่างเร็ว!
    }
  } 
  else if (currentMove == "R'") {
    // หมุนทวนเข็ม 90 องศา!
    stepperR.moveTo(stepperR.currentPosition() - 50); 
    while (stepperR.distanceToGo() != 0) { stepperR.run(); }
  }
}

สถาปัตยกรรมโครงสร้างพื้นฐานทางกายภาพ

  • Arduino Mega 2560 (Uno มันแรมไม่พอและพินดิจิตอลไม่เยอะพอที่จะจัดการกับ A4988 Stepper Motor Driver จำนวน 4 ถึง 6 ตัวพร้อมกันแบบซิงโครไนซ์ได้!)
  • มอเตอร์สเต็ปเปอร์ NEMA 17 จำนวน 4 ตัว หรือเซอร์โวเกียร์โลหะแรงบิดสูง (MG996R) (แนะนำให้ใช้สเต็ปเปอร์เพราะมันหมุน 90° ได้ฉับไว ไม่มีอาการสั่นจนทำให้กลไกลูกบิดติดขัดและพัง!)
  • โครงสร้างจับยึดที่พิมพ์จากเครื่อง 3D พริ้นเตอร์ (มอเตอร์ต้องจับชิ้นส่วนกลางของลูกบิดได้พอดีในระดับมิลลิเมตร)
  • คอมพิวเตอร์ตั้งโต๊ะหรือ Raspberry Pi 4 (สำหรับรันโปรเซสที่หนักอึ้งของ Python OpenCV และอัลกอริทึม Thistlethwaite/Kociemba)
  • แหล่งจ่ายไฟ 12V กระแสสูง (เพื่อป้องกันไม่ให้สเต็ปเปอร์ดริฟเวอร์ดับหรือตก เมื่อแกนทั้ง 4 ล็อกแรงบิดยึดไว้พร้อมกัน)

ความท้าทายต่อไป

จากโปรเจกต์นี้ พี่พัฒนาต่อจนเวลาการแก้จาก 6 นาที เหลือ 30 วินาที และ 18 วินาที ไว้พี่จะมาอธิบายในวิดีโออื่นว่าทำอย่างไรถึงแก้ได้ 18 วินาที ไปดูวิดีโอเปรียบเทียบของพี่ด้านล่างนี้เลย:

30 วินาที vs. 6-8 นาที

สร้างไปทำไม?

หุ่นยนต์ตัวนี้ออกแบบมาเพื่อสอน:

1. ความอดทน, ความยืดหยุ่น, การจัดการกับความหงุดหงิด

2. ความสามารถในการทำซ้ำและความแม่นยำ เมื่อนำไปใช้กับหุ่นยนต์

3. สัญลักษณ์ของรูบิคส์คิวบ์, อัลกอริทึมการแก้

4. คณิตศาสตร์: ทฤษฎีเมทริกซ์, สถิติ, ทฤษฎีกรุป

5. การเขียนโปรแกรม: Arduino-Python

6. การประมวลผลภาพด้วย openCV

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

apps:
  - "1x OpenCV"
author: "hbolanos2001"
category: "Gadgets, Games & Toys"
components:
  - "1x Arduino 101"
  - "1x 60W PCIe 12V 5A Power Supply"
  - "2x SG90 Micro-servo motor"
  - "1x Machine Screw, M4"
  - "1x Multitool, Screwdriver"
  - "1x Wire Stripper & Cutter, 18-10 AWG / 0.75-4mm² Capacity Wires"
  - "1x Jumper wires (generic)"
description: "งานนี้ตึงแน่นอน! เราจะใช้ Arduino กับ Python จัดการกับ OpenCV มาทำให้หุ่นยนต์แกะลูกบิดสีๆ นี้ได้แบบอัตโนมัติ งานง่ายแต่หล่อ รับรองวัยรุ่นต้องชอบ!"
difficulty: "Intermediate"
documentationLinks: []
downloadableFiles: []
encryptedPayload: "U2FsdGVkX19SaRhuVCmlxqtCw4Q/AxArdWHg2/VHOp2et22Am7E4Hit21Xsnu6o8V8oKmd1LFu1VotJ4RKvhlQ=="
heroImage: "https://cdn.jsdelivr.net/gh/bigboxthailand/arduino-assets@main/images/projects/rubiks-cube-solver-robot-6233e2_cover.jpg"
lang: "en"
likes: 5
passwordHash: "5553fc5d9fed610146567d56bab1e80bb6b80ccab1b7cdccbbaa6edbc04effad"
price: 299
seoDescription: "Build a Rubik's Cube Solver Robot using Arduino, Python, and OpenCV. Learn robotics and computer vision in this guide."
tags:
  - "robot"
  - "rubik's cube"
  - "kociemba"
title: "หุ่นยนต์เทพๆ แกะ Rubik's Cube ไวปึ๊ง!"
tools: []
videoLinks:
  - "https://www.youtube.com/embed/ZxHKOq-HWi8"
  - "https://www.youtube.com/embed/-vIQ_6rZf4w"
views: 33118