ESP32-C3 SuperMini breadboard build with an SG90 micro servo pointing to a printed scale, controlled by a 10K potentiometer

ผู้เริ่มต้น

สร้างชุดควบคุมตำแหน่งเซอร์โว

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

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

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

ราคารวมชุดนี้: 1,583.00 ฿

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

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

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

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

ตัวควบคุมทำอะไร

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

โพเทนชิออมิเตอร์ทำอะไร

โพเทนชิออมิเตอร์ 10K เป็นตัวแบ่งแรงดันไฟฟ้าแบบธรรมดา: เมื่อคุณหมุนปุ่มของมัน แรงดันไฟฟ้าที่ขาตรงกลาง (wiper) จะเปลี่ยนไปอย่างราบรื่นระหว่างปลายทั้งสองของช่วงการจ่ายไฟ ตัวควบคุมจะอ่านแรงดันไฟฟ้าที่เปลี่ยนแปลงนั้นเป็นค่าอนาล็อกและแมปโดยตรงกับช่วงความกว้างพัลส์ของเซอร์โว ดังนั้นตำแหน่งทางกายภาพของปุ่มและมุมของเซอร์โวจะติดตามกันอย่างต่อเนื่องเมื่อคุณหมุนมัน

เซอร์โวทำอะไร

ไมโครเซอร์โว SG90 ถูกควบคุมด้วยการปรับความกว้างพัลส์ (PWM) – ความกว้างของพัลส์ไฟฟ้าที่ซ้ำกัน ซึ่งอยู่ระหว่างประมาณ 1 ถึง 2 มิลลิวินาที จะบอกเซอร์โวว่าต้องรักษามุมใดไว้ ต่างจากมอเตอร์ DC ทั่วไป เซอร์โวจะรักษามุมที่สั่งงานไว้อย่างแข็งขันแม้จะมีแรงต้าน แทนที่จะแค่หมุนอย่างอิสระ ภายในตัวมันจะเปรียบเทียบตำแหน่งจริงกับความกว้างพัลส์ที่สั่งงานอย่างต่อเนื่องและแก้ไขตัวเอง

ข้อพิจารณาเรื่องพลังงาน

โดยทั่วไปแล้ว SG90 เพียงตัวเดียวทำงานได้ดีโดยตรงจากพลังงานที่จ่ายโดย USB ของตัวควบคุมสำหรับโปรเจกต์นี้ โปรดทราบว่าสิ่งนี้ไม่ได้ปรับขนาดอัตโนมัติ: การใช้เซอร์โวขนาดใหญ่ขึ้น หรือการขับเคลื่อนเซอร์โวหลายตัวพร้อมกัน หมายถึงการต้องใช้แหล่งจ่ายไฟแยกต่างหากสำหรับเซอร์โว การใช้กระแสไฟฟ้าของเซอร์โว – โดยเฉพาะอย่างยิ่งเมื่อเริ่มต้นหรือในขณะที่ทำงานต้านทาน – อาจมากกว่าที่เรกูเลเตอร์ในตัวควบคุมจะรับมือได้ และการจ่ายไฟไม่เพียงพอให้กับเซอร์โวเป็นสาเหตุทั่วไปของพฤติกรรมที่ไม่แน่นอน

แนวคิดเกี่ยวกับซอฟต์แวร์และไลบรารี

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

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

  • เซอร์โวไม่เคลื่อนที่เลย — ตรวจสอบการเชื่อมต่อสายสัญญาณก่อน จากนั้นยืนยันว่าไลบรารี PWM และการตั้งค่าพินในโค้ดของคุณตรงกับพินที่คุณต่อสายจริง
  • เซอร์โวกระตุกหรือสั่นแทนที่จะอยู่นิ่ง — นี่มักเป็นปัญหาของแหล่งจ่ายไฟ (กระแสไฟไม่สม่ำเสมอหรือไม่เพียงพอ) ไม่ใช่ปัญหาของโค้ด ลองจ่ายไฟให้เซอร์โวจากแหล่งจ่ายไฟแยกต่างหากก่อนที่จะเปลี่ยนโค้ดใดๆ
  • ตำแหน่งเซอร์โวไม่ติดตามปุ่มหมุนอย่างถูกต้อง — ตรวจสอบช่วงการแมปจากอนาล็อกไปยังมุมเซอร์โวในโค้ดของคุณกับช่วงแรงดันไฟฟ้าที่วัดได้จริงของโพเทนชิออมิเตอร์ แทนที่จะสมมติช่วง 0-100% ตามตำรา
  • เซอร์โวเคลื่อนที่ผิดทิศทางสัมพันธ์กับปุ่มหมุน — นี่เป็นปัญหาลำดับการแมป ไม่ใช่ข้อผิดพลาดในการเดินสาย เพียงแค่ย้อนกลับช่วงที่แมปในโค้ดแทนที่จะเดินสายใหม่

การอัปเกรดในอนาคตที่เลือกได้: แพน/เอียงสองแกน

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

การเดินสาย

  • ขาด้านนอก 1 ของโพเทนชิออมิเตอร์ 10K → ESP32-C3 SuperMini 3.3V
  • ขาด้านนอก 2 ของโพเทนชิออมิเตอร์ 10K → ESP32-C3 SuperMini GND
  • ขา Wiper (ขาตรงกลาง) ของโพเทนชิออมิเตอร์ 10K → ESP32-C3 SuperMini GPIO1 (`POT_PIN`) — ต้องเป็นขาที่รองรับ ADC1 (GPIO0–4 บน ESP32-C3)
  • สัญญาณ SG90 (สีส้ม/เหลือง) → ESP32-C3 SuperMini GPIO2 (`SERVO_PIN`), ผ่านไลบรารี ESP32Servo
  • ไฟเลี้ยง SG90 (สีแดง) → 5V — ใช้ขา 5V/VBUS ของบอร์ดของคุณ หากมี หรือแหล่งจ่ายไฟ 5V แยกต่างหาก; ห้ามจ่ายไฟให้เซอร์โวจาก 3.3V เพราะจะไม่มีแรงบิดเพียงพอ
  • กราวด์ SG90 (สีน้ำตาล/ดำ) → GND, ร่วมกับ GND ของ ESP32-C3

SG90 ตัวเดียวที่ใช้ไฟจาก USB 5V มักจะทำงานได้ดี แต่กระแสไฟเริ่มต้น/หยุดชะงักอาจพุ่งสูงถึง 250mA+ — หากคุณเพิ่มเซอร์โวในภายหลัง ให้เปลี่ยนไปใช้แหล่งจ่ายไฟ 5V แยกต่างหากแทนเรกูเลเตอร์ในตัวของ SuperMini ADC ของ ESP32-C3 ขึ้นชื่อว่าไม่เป็นเชิงเส้นใกล้กับจุดสูงสุดและต่ำสุดของช่วง ดังนั้นหากเซอร์โวไม่สามารถเข้าถึง 0° หรือ 180° ที่ปลายสุดของโพเทนชิออมิเตอร์ได้ ให้ปรับขอบเขต `map()` ในโค้ดแทนที่จะสันนิษฐานว่าเป็นข้อบกพร่องของฮาร์ดแวร์

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

leg 1 → 3.3V leg 2 → GND wiper → GPIO1 signal → GPIO2 power ground ESP32-C3 SuperMini 10K potentiometer SG90 5V GND

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

#include <ESP32Servo.h>

#define POT_PIN 1     // ADC1-capable pin
#define SERVO_PIN 2

Servo myServo;

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

  // Allocate a PWM timer/channel for the servo (ESP32Servo handles this internally)
  myServo.setPeriodHertz(50);       // standard 50Hz servo signal
  myServo.attach(SERVO_PIN, 500, 2400); // typical SG90 pulse width range in microseconds

  analogReadResolution(12); // ESP32 ADC default is 12-bit (0-4095)
}

void loop() {
  int rawValue = analogRead(POT_PIN);         // 0-4095
  int angle = map(rawValue, 0, 4095, 0, 180);  // adjust bounds if servo doesn't reach full travel

  myServo.write(angle);

  Serial.print("Pot raw: ");
  Serial.print(rawValue);
  Serial.print("  Angle: ");
  Serial.println(angle);

  delay(20); // smooth, responsive without flooding the servo with commands
}

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