กลับไปหน้ารวมไฟล์
ball-balancing-robot-opencv-arduino-pid.md

ชื่อโปรเจกต์: โรบอทปรับสมดุลลูกบอล | การตรวจจับวัตถุด้วย Arduino ผ่าน OpenCV

Computer Vision ทางจลนศาสตร์: เมทริกซ์การปรับสมดุลลูกบอล

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

obstacle_avoiding_logic_diagram_1772704609938.png

การ Thresholding ภาพด้วย Python OpenCV (เอนจินการมองเห็น)

โปรเซสเซอร์ของ Arduino มีประสิทธิภาพไม่เพียงพอที่จะวิเคราะห์วิดีโอ งานหนักทั้งหมดจะทำโดย Python บน PC หรือ Raspberry Pi!

  1. OpenCV จะจับภาพจาก USB webcam!
  2. มันจะแปลงภาพไปยังปริภูมิสี HSV (Hue, Saturation, Value)
  3. ภาพจะถูก "Masked" เพื่อแยกเฉพาะพิกเซลลูกปิงปองสีส้มสว่าง, และแปลงส่วนที่เหลือทั้งหมดให้เป็นสีดำสนิท!
  4. มันจะเรียกใช้ 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 ที่ไร้ที่ติ)

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

title: "Ball Balancing Robot | Arduino Object Detection Via OpenCV"
description: "PID computer vision! Fuse extreme kinematic mathematics with advanced Python OpenCV pixel analysis to aggressively calculate continuous Cartesian vector compensation, forcing an Arduino to balance a physical ping-pong ball on an actuated tilting plane."
category: "Robotics & Automation"
difficulty: "Advanced"