ชื่อโปรเจกต์: โรบอทปรับสมดุลลูกบอล | การตรวจจับวัตถุด้วย Arduino ผ่าน OpenCV
Computer Vision ทางจลนศาสตร์: เมทริกซ์การปรับสมดุลลูกบอล
การปรับสมดุลลูกปิงปองทรงกลมบนแผ่นกระจกแบนจำเป็นต้องใช้ความเร็วในการตอบสนองที่มนุษย์ไม่สามารถทำได้ โรบอทปรับสมดุลลูกบอล นี้ละทิ้งเซ็นเซอร์ฮาร์ดแวร์ทั้งหมดเพื่อใช้การวัดและส่งข้อมูลทางแสงเชิงคำนวณแทน! กล้อง USB ความเร็วสูงจะจับภาพบนกระดาน โดยวิเคราะห์พิกเซลสีของลูกบอลด้วย Python โดยใช้ OpenCV ในเครื่อง มันจะค้นหาพิกัด Cartesian X/Y ที่แน่นอน, คำนวณมุม Tilt/Pan ที่จำเป็นแบบไดนามิกโดยใช้อัลกอริทึม PID (Proportional-Integral-Derivative) ที่แม่นยำ, และส่งคำสั่งฮาร์ดแวร์ Serial ไปยัง Arduino เพื่อควบคุม Servo Motors ขนาดใหญ่สองตัวอย่างรวดเร็วเพื่อคืนสมดุล!

การ Thresholding ภาพด้วย Python OpenCV (เอนจินการมองเห็น)
โปรเซสเซอร์ของ Arduino มีประสิทธิภาพไม่เพียงพอที่จะวิเคราะห์วิดีโอ งานหนักทั้งหมดจะทำโดย Python บน PC หรือ Raspberry Pi!
- OpenCV จะจับภาพจาก USB webcam!
- มันจะแปลงภาพไปยังปริภูมิสี HSV (Hue, Saturation, Value)
- ภาพจะถูก "Masked" เพื่อแยกเฉพาะพิกเซลลูกปิงปองสีส้มสว่าง, และแปลงส่วนที่เหลือทั้งหมดให้เป็นสีดำสนิท!
- มันจะเรียกใช้
cv2.moments()เพื่อคำนวณจุดศูนย์กลางมวล 2D (Center of Mass) ของก้อนสีส้มอย่างแม่นยำทางคณิตศาสตร์!
# The Python OpenCV Center-Finding Algorithm!
mask = cv2.inRange(hsv_frame, orange_lower, orange_upper)
M = cv2.moments(mask)
if M["m00"] != 0:
cX = int(M["m10"] / M["m00"]) # Calculate absolute X Coordinate
cY = int(M["m01"] / M["m00"]) # Calculate absolute Y Coordinate
# Calculate the PID Error from the exact Center of the physical glass!
errorX = CenterX - cX
# Run PID Math and send exact Servo Angle to Arduino via Serial!
ser.write(f"X{servoAngleX}Y{servoAngleY}\n".encode())
การทำงานของ Proportional-Integral-Derivative (PID)
หาก Arduino เพียงแค่ขยับ Servo ไปทางซ้ายสุดเมื่อลูกบอลกลิ้งไปทางขวา ลูกบอลจะพุ่งออกจากโต๊ะทันทีอย่างรุนแรง!
- คุณต้องปรับจูน PID Controller!
Proportional (P): ขยับระนาบตามระยะห่างของลูกบอลจากจุดศูนย์กลางอย่างแม่นยำDerivative (D): หากลูกบอลกำลังเคลื่อนที่เข้าหาขอบด้วยความเร็วสูงมาก ให้เอียงระนาบ อย่างรุนแรง แต่เนิ่นๆ เพื่อทำหน้าที่เป็นเบรกทางกายภาพ!Integral (I): หากลูกบอลหยุดนิ่งนอกศูนย์กลางเล็กน้อยอย่างต่อเนื่องเนื่องจากความเอียงของโต๊ะ ให้ค่อยๆ เพิ่มมุมเพื่อบังคับให้มันกลับสู่ตำแหน่งศูนย์กลางที่แท้จริง!
ฮาร์ดแวร์ควบคุมโรบอท
- A Laptop or Raspberry Pi 4 (จำเป็นอย่างยิ่งสำหรับการรันเมทริกซ์ภาพฮาร์ดแวร์ Python OpenCV ที่ซับซ้อน)
- USB Webcam (ติดตั้งอยู่เหนือระนาบและหันลงมาด้านล่าง โดยควรมีความสามารถ 60FPS เพื่อลดความหน่วงในการติดตามให้น้อยที่สุด)
- Arduino Uno / Nano (ทำหน้าที่เป็นเพียงตัวควบคุมมอเตอร์แบบ Slave ที่รับคำสั่ง Serial)
- 2x Fast Micro Servos (SG90 or MG90S) ติดตั้งในข้อต่อ Gimbal แบบสองแกนที่พิมพ์ 3D เอง
- A flat transparent Acrylic Plate or White Glass (ตัดกันอย่างชัดเจนกับลูกบอลสีส้ม เพื่อการทำ OpenCV optical thresholding ที่ไร้ที่ติ)