4-DOF acrylic robotic arm kit with SG90 servos, breadboard and ESP32-S3, mid-motion gripping an object

ขั้นสูง

สร้างแขนกลขนาดเล็ก

หุ่นยนต์แอคชูเอเตอร์การเคลื่อนไหว

ข้อต่อ 4 จุด, เซอร์โว 4 ตัว, งานประกอบที่น่าพึงพอใจอย่างแท้จริง – แขนกลที่สอนการประกอบชิ้นส่วนจริง ไม่ใช่แค่การต่อสายไฟ

รวมชิ้นส่วนจริง 5 รายการ

ราคารวมชุดนี้: 2,086.00 ฿

ยังไม่รวมส่วนลดคำสั่งซื้อที่คุณอาจได้รับตอนชำระเงิน

สิ่งที่คุณต้องใช้

เป้าหมายของโปรเจกต์

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

สิ่งที่คอนโทรลเลอร์ทำ

การสร้างนี้ใช้ ESP32-S3 โดยเฉพาะ ไม่ใช่ ESP32-C3 ที่มีขนาดเล็กกว่าที่ใช้ในส่วนอื่น ๆ ในแคตตาล็อก ช่องสัญญาณเซอร์โวที่ควบคุมได้อย่างอิสระสี่ช่องต้องการ GPIO ที่ใช้งานได้มากกว่าที่บอร์ด C3 ขนาดเล็กสามารถรองรับได้อย่างสบาย ดังนั้น S3 จึงเป็นบอร์ดที่เหมาะสมสำหรับโปรเจกต์นี้ แทนที่จะเป็นการอัปเกรดแบบสุ่ม

สิ่งที่เซอร์โวทำ

ข้อต่อทั้งสี่ของแขนแต่ละข้อถูกขับเคลื่อนโดยเซอร์โวงานอดิเรกขนาดเล็กของตัวเอง: หนึ่งตัวสำหรับการหมุนฐาน หนึ่งตัวสำหรับไหล่ หนึ่งตัวสำหรับข้อศอก และหนึ่งตัวสำหรับที่จับ เซอร์โวแต่ละตัวถูกควบคุมอย่างอิสระผ่านสัญญาณ PWM ของตัวเอง — ความกว้างของพัลส์ที่ส่งไปยังเซอร์โวที่กำหนดจะบอกให้มันรักษามุมใด และช่องสัญญาณทั้งสี่จะไม่รบกวนกันในโค้ด ตราบใดที่แต่ละตัวเชื่อมต่อกับพินสัญญาณของตัวเอง

สิ่งที่โครงแขนหุ่นยนต์ทำ

รายการโครงแขนหุ่นยนต์ 4DOF ได้รวมเซอร์โวที่เข้ากันได้กับ SG90 ของตัวเองไว้ในแต่ละข้อต่อแล้ว คุณไม่จำเป็นต้องซื้อผลิตภัณฑ์เซอร์โวแบบสแตนด์อโลนแยกต่างหากสำหรับการสร้างนี้ — โครงจะมาพร้อมกับแอคทูเอเตอร์ที่จำเป็น และการเพิ่มอีกก็จะซ้ำซ้อน

กำลังไฟและการดึงกระแส

นี่คือข้อจำกัดทางวิศวกรรมที่แท้จริงของการสร้างนี้ และเป็นปัญหาด้านพลังงาน ไม่ใช่ปัญหาด้านโค้ด เซอร์โวสี่ตัวที่เคลื่อนที่พร้อมกันสามารถดึงกระแสได้มากกว่าที่พอร์ต USB เพียงอย่างเดียวสามารถจ่ายได้อย่างสบาย การจ่ายไฟทั้งหมดจาก USB ใช้ได้ดีสำหรับการทดสอบข้อต่อเดียวแบบเบา ๆ แต่เมื่อคุณเคลื่อนที่ข้อต่อหลายตัวพร้อมกัน การดึงกระแสรวมกันนั้นอาจทำให้บอร์ดหยุดทำงานหรือกระตุ้นการรีเซ็ตที่ไม่คาดคิดได้ วางแผนที่จะใช้แหล่งจ่ายไฟ 5V แยกต่างหากสำหรับเซอร์โวเองทันทีที่คุณก้าวข้ามการทดสอบข้อต่อเดียวขั้นพื้นฐาน โดยมีกราวด์ร่วมกันระหว่างแหล่งจ่ายนั้นกับ ESP32-S3

แนวคิดซอฟต์แวร์และไลบรารี

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

การทดสอบและการแก้ไขปัญหา

  • ข้อต่อหนึ่งไม่เคลื่อนที่เลย: ตรวจสอบสายสัญญาณของเซอร์โวนั้นโดยเฉพาะ และยืนยันว่าการกำหนดพินในโค้ดของคุณตรงกับวิธีการต่อสายของคุณ — นี่คือปัญหาที่พบบ่อยที่สุดในการสร้างเซอร์โวสี่ตัว
  • แขนทั้งหมดหรือคอนโทรลเลอร์เองรีเซ็ตเมื่อข้อต่อหลายตัวเคลื่อนที่พร้อมกัน: นี่คือปัญหาด้านพลังงานและกระแสไฟฟ้า ไม่ใช่ข้อผิดพลาดในโค้ด เพิ่มแหล่งจ่ายไฟ 5V โดยเฉพาะสำหรับเซอร์โว แทนที่จะพยายามแก้ไขข้อบกพร่องในซอฟต์แวร์
  • การเคลื่อนไหวดูหยาบกระด้างหรือกระโดดไปยังตำแหน่งใหม่ทันที: คุณกำลังสั่งเซอร์โวโดยตรงไปยังมุมเป้าหมาย เพิ่มการปรับมุมทีละน้อยในโค้ดแทนที่จะกระโดดไปที่นั่นโดยตรง
  • ที่จับปิดแน่นเกินไปหรือไม่ไกลพอ: ตรวจสอบช่วงมุมที่คุณกำลังสั่งการเทียบกับขีดจำกัดทางกลของเซอร์โวที่จับก่อนที่จะสันนิษฐานว่าเป็นข้อผิดพลาดในการเดินสาย

การอัปเกรดทางเลือกในอนาคต: Inverse Kinematics

เมื่อการควบคุมข้อต่อแต่ละข้อมีความเสถียร ขั้นตอนต่อไปตามธรรมชาติคือ Inverse Kinematics — การสั่งให้ที่จับไปยังตำแหน่ง X/Y/Z เป้าหมาย และให้โค้ดคำนวณมุมข้อต่อทั้งสี่ที่จำเป็นในการไปถึงที่นั่น แทนที่จะตั้งค่าแต่ละข้อต่อด้วยตนเอง นี่เป็นปัญหาซอฟต์แวร์ที่ยากกว่าสิ่งอื่นใดในการสร้างนี้อย่างแท้จริง และเป็นเหตุผลที่ดีที่จะรักษาการประกอบกลไกให้เชื่อถือได้ก่อน

การเดินสาย

  • สัญญาณเซอร์โวฐาน → GPIO4 (`SERVO_BASE_PIN`) บน ESP32-S3
  • สัญญาณเซอร์โวไหล่ → GPIO5 (`SERVO_SHOULDER_PIN`)
  • สัญญาณเซอร์โวข้อศอก → GPIO6 (`SERVO_ELBOW_PIN`)
  • สัญญาณเซอร์โวที่จับ → GPIO7 (`SERVO_GRIPPER_PIN`)
  • สาย V+ ของเซอร์โวทั้ง 4 เส้น → แหล่งจ่ายไฟ 5V ภายนอก (ไม่ใช่พิน 5V/USB ของ ESP32-S3)
  • สาย GND ของเซอร์โวทั้ง 4 เส้น → GND ของแหล่งจ่ายไฟภายนอก และ GND นั้นเชื่อมต่อกับ ESP32-S3 GND (จำเป็นต้องมีกราวด์ร่วม/ทั่วไป)

รายการชิ้นส่วนของโปรเจกต์นี้คือชุดโครง 4DOF อะคริลิกเท่านั้น — ไม่รวมไมโครเซอร์โว SG90 ทั้ง 4 ตัว ดังนั้นให้เพิ่มเซอร์โวที่เข้ากันได้กับ SG90 จำนวน 4 ตัวลงในตะกร้าของคุณหากคุณยังไม่มี; ชุดนี้สร้างขึ้นเพื่อให้รองรับพวกมัน เซอร์โว SG90 สี่ตัวภายใต้โหลดสามารถดึงกระแสได้เกินกว่าที่พอร์ต USB หรือพิน 5V บนบอร์ดจะจ่ายได้ ซึ่งทำให้เกิดการหยุดทำงาน/รีเซ็ต ดังนั้นให้ใช้แหล่งจ่ายไฟ 5V แยกต่างหาก (เช่น แหล่งจ่ายไฟ 5V/2A หรือแบตเตอรี่แพ็ค) สำหรับเซอร์โวที่มีกราวด์ร่วมกลับไปยัง ESP32-S3 — ห้ามแชร์เฉพาะสายสัญญาณโดยไม่มีกราวด์ร่วม มิฉะนั้นเซอร์โวจะสั่นหรือตอบสนองไม่ได้

แผนภาพการต่อสาย

signal → GPIO4 signal → GPIO5 signal → GPIO6 signal → GPIO7 GND ESP32-S3 Base servo Shoulder servo Elbow servo Gripper servo external 5V supply All 4 servo V+ wires All 4 servo GND wires external supply

โค้ดเริ่มต้น

#include <ESP32Servo.h>

#define SERVO_BASE_PIN     4  // PWM-capable GPIO - adjust to match your ESP32-S3 board's pinout diagram
#define SERVO_SHOULDER_PIN 5  // PWM-capable GPIO - adjust to match your ESP32-S3 board's pinout diagram
#define SERVO_ELBOW_PIN    6  // PWM-capable GPIO - adjust to match your ESP32-S3 board's pinout diagram
#define SERVO_GRIPPER_PIN  7  // PWM-capable GPIO - adjust to match your ESP32-S3 board's pinout diagram

Servo baseServo;
Servo shoulderServo;
Servo elbowServo;
Servo gripperServo;

// SG90 servos: ~500-2400us pulse width covers their full ~0-180 degree range.
// Adjust these if your specific servos bind or don't reach full travel.
const int SERVO_MIN_US = 500;
const int SERVO_MAX_US = 2400;

struct Pose {
  int base, shoulder, elbow, gripper;
};

// Small demo sequence. Replace with your own poses once you've found safe
// joint limits for your specific frame (mechanical limits vary by build).
Pose poses[] = {
  {90, 90, 90, 90},   // neutral / home position
  {45, 70, 110, 30},  // reach left, open gripper
  {45, 70, 110, 90},  // close gripper
  {135, 70, 110, 90}, // swing right, still holding
  {135, 70, 110, 30}, // release
  {90, 90, 90, 90}    // return home
};
const int NUM_POSES = sizeof(poses) / sizeof(poses[0]);

void moveTo(Pose p) {
  baseServo.write(p.base);
  shoulderServo.write(p.shoulder);
  elbowServo.write(p.elbow);
  gripperServo.write(p.gripper);
}

void setup() {
  Serial.begin(115200);

  // ESP32Servo needs its PWM timers allocated before attaching servos
  ESP32PWM::allocateTimer(0);
  ESP32PWM::allocateTimer(1);
  ESP32PWM::allocateTimer(2);
  ESP32PWM::allocateTimer(3);

  baseServo.setPeriodHertz(50);
  shoulderServo.setPeriodHertz(50);
  elbowServo.setPeriodHertz(50);
  gripperServo.setPeriodHertz(50);

  baseServo.attach(SERVO_BASE_PIN, SERVO_MIN_US, SERVO_MAX_US);
  shoulderServo.attach(SERVO_SHOULDER_PIN, SERVO_MIN_US, SERVO_MAX_US);
  elbowServo.attach(SERVO_ELBOW_PIN, SERVO_MIN_US, SERVO_MAX_US);
  gripperServo.attach(SERVO_GRIPPER_PIN, SERVO_MIN_US, SERVO_MAX_US);

  moveTo(poses[0]); // start at home position
  delay(1000);
}

void loop() {
  for (int i = 0; i < NUM_POSES; i++) {
    moveTo(poses[i]);
    delay(1000); // hold each pose for a second - reduce once movements are confirmed safe
  }
}

ไม่แน่ใจขั้นตอนไหน? ถามเรา