ค้นหาโค้ด

บทเรียนที่ 86: ควบคุมตำแหน่งของมอเตอร์เซอร์โวโดยใช้โพเทนชิโอมิเตอร์

บทเรียนที่ 86: ควบคุมตำแหน่งของมอเตอร์เซอร์โวโดยใช้โพเทนชิโอมิเตอร์

จินตนาการถึงการหมุนปุ่มเพียงปุ่มเดียว แล้วมองแขนกลค่อยๆ ขยับตามการเคลื่อนไหวของคุณอย่างแม่นยำ นั่นคือความมหัศจรรย์ของการผสานโพเทนชิโอมิเตอร์เข้ากับเซอร์โวมอเตอร์ โปรเจกต์นี้เป็นส่วนหนึ่งของคอร์ส Arduino Step by Step โดย Robojax สาธิตแนวคิดพื้นฐานและมีประโยชน์อย่างยิ่งในงานอิเล็กทรอนิกส์ นั่นคือการแปลงสัญญาณอนาล็อกให้เป็นการเคลื่อนไหวทางกายภาพที่แม่นยำ คุณจะได้เรียนรู้วิธีอ่านแรงดันไฟฟ้าที่แปรผันจากโพเทนชิโอมิเตอร์ แปลงค่านั้นให้เป็นช่วงมุม และสั่งให้เซอร์โวมอเตอร์หมุนไปยังตำแหน่งที่แน่นอนนั้น นี่คือประตูสู่การสร้างโปรเจกต์ที่ใช้งานง่ายและโต้ตอบได้ ซึ่งการควบคุมด้วยมือผสานกับระบบอัตโนมัติ
การประยุกต์ใช้ทักษะนี้มีมากมายและใช้งานได้จริง นี่คือแนวคิดบางส่วนที่จะสร้างแรงบันดาลใจให้คุณ:
  • การควบคุมแขนกล: ใช้โพเทนชิโอมิเตอร์เพื่อจัดตำแหน่งข้อต่อแต่ละข้อของแขนกลด้วยมือ สำหรับการหยิบและวางที่แม่นยำ
  • ระบบแพนและเอียงกล้อง: สร้างฐานกล้องที่ควบคุมระยะไกลสำหรับไทม์แลปส์หรือการเฝ้าระวัง แพนและเอียงได้อย่างนุ่มนวลด้วยการหมุนปุ่ม
  • การจำลองเกจวัดอนาล็อก: สร้างเกจวัดบนแผงหน้าปัดจริง (เช่น มาตรวัดความเร็วหรือปุ่มอุณหภูมิ) ที่ขยับตามข้อมูลเซนเซอร์ โดยใช้โพเทนชิโอมิเตอร์เป็นเครื่องมือควบคุมด้วยมือหรือปรับเทียบ
  • งานศิลปะจัดวางแบบโต้ตอบ: สร้างประติมากรรมแบบไคเนติกที่ตอบสนองต่ออินพุตของผู้ชม โดยการหมุนปุ่มจะเปลี่ยนตำแหน่งของชิ้นส่วนที่เคลื่อนไหว
  • การบังคับเลี้ยวของรถจำลอง: ควบคุมมุมเลี้ยวของรถจำลองหรือเรือจำลองจากระยะไกล ให้ความรู้สึกเป็นอนาล็อกและเป็นธรรมชาติมากกว่าปุ่มดิจิทัล
คู่มือนี้สร้างจากวิดีโอสอน Lesson 86: Control position of a servo motor using potentiometer โดย Robojax (ในวิดีโอที่ 00:00) ซึ่งจะพาคุณผ่านกระบวนการทั้งหมด ตั้งแต่การทำความเข้าใจการเดินสายไฟไปจนถึงการอธิบายโค้ดที่ทำให้ทุกอย่างทำงานได้ เริ่มกันเลย

ฮาร์ดแวร์และอุปกรณ์

เพื่อทำตามโปรเจกต์นี้ คุณจะต้องมีอุปกรณ์ดังต่อไปนี้:
  • บอร์ด Arduino (เช่น Uno, Nano)
  • เซอร์โวมอเตอร์มาตรฐาน (เช่น SG90 หรือ MG996R)
  • โพเทนชิโอมิเตอร์ (ตัวต้านทานปรับค่าได้ โดยทั่วไปคือ 10kΩ)
  • สายจัมเปอร์
  • เบรดบอร์ด (ไม่บังคับ เพื่อการเชื่อมต่อที่ง่ายขึ้น)

ทำความเข้าใจการเดินสายไฟ

การเดินสายไฟสำหรับโปรเจกต์นี้ง่ายมาก สิ่งสำคัญคือการจ่ายไฟและการเชื่อมต่อสัญญาณที่ถูกต้องสำหรับทั้งเซอร์โวและโพเทนชิโอมิเตอร์ เซอร์โวเป็นอุปกรณ์ที่กินไฟสูง ดังนั้นจึงรับไฟจากพิน 5V ของ Arduino โดยตรง โพเทนชิโอมิเตอร์ทำหน้าที่เป็นตัวแบ่งแรงดันไฟฟ้า และเราอ่านแรงดันไฟฟ้าที่ขาหัวเข็ม (ขากลาง) เพื่อกำหนดตำแหน่งของมัน (ในวิดีโอที่ 01:05) เคล็ดลับที่ชาญฉลาดอย่างหนึ่งที่โปรเจกต์นี้ใช้คือการสร้างแหล่งจ่ายไฟ 5V เพิ่มเติมบนพินดิจิทัลเพื่อจ่ายไฟให้โพเทนชิโอมิเตอร์ เนื่องจากบอร์ด Arduino บางรุ่นมีพิน 5V เฉพาะเพียงพินเดียว ทำได้ในโค้ดโดยการตั้งค่าพินดิจิทัล (พิน 8) เป็น HIGH ซึ่งจะจ่ายไฟ 5V ออกมา (ในวิดีโอที่ 00:39) นี่คือแผนผังการเดินสายไฟที่กล่าวถึงในวิดีโอ:
Arduino wiring or servo motor with pot
การเดินสายไฟ Arduino สำหรับเซอร์โวมอเตอร์กับโพเทนชิโอมิเตอร์
มาดูรายละเอียดการเชื่อมต่อกัน:
  • เซอร์โวมอเตอร์:
    • ไฟ (สายสีแดง) → พิน 5V ของ Arduino
    • กราวด์ (สายสีน้ำตาล/ดำ) → พิน GND ของ Arduino
    • สัญญาณ (สายสีส้ม/เหลือง) → พิน 3 ของ Arduino (พินที่รองรับ PWM)
  • โพเทนชิโอมิเตอร์:
    • ขาซ้าย → พิน GND ของ Arduino
    • ขากลาง (หัวเข็ม) → พินอนาล็อก A0 ของ Arduino
    • ขาขวา → พิน 8 ของ Arduino (กำหนดเป็น VCC2 ในโค้ด)

คำอธิบายโค้ด

โค้ดสำหรับโปรเจกต์นี้เรียบง่ายและสวยงาม มันใช้ฟังก์ชันหลักของ Arduino ไม่กี่อย่างเพื่ออ่านค่าโพเทนชิโอมิเตอร์และควบคุมเซอร์โว มาดูส่วนที่ผู้ใช้ปรับแต่งได้ ซึ่งคุณสามารถแก้ไขได้สำหรับโปรเจกต์ของคุณเอง (ในวิดีโอที่ 03:00) ที่ด้านบนของสเก็ตช์ คุณจะกำหนดพินและสร้างออบเจกต์เซอร์โว นี่คือตัวแปรหลักที่คุณจะเปลี่ยนตามการเดินสายไฟของคุณ:
#include <Servo.h>

Servo myservo;  // สร้างออบเจกต์เซอร์โวเพื่อควบคุมเซอร์โว

int potpin = A0;  // พินอนาล็อกที่ใช้เชื่อมต่อโพเทนชิโอมิเตอร์
int servoPin = 3; // กำหนดพินดิจิทัล (ที่มี PWM) สำหรับเซอร์โว ใช้ได้เฉพาะพิน 3, 5, 6, 9, 10, 11
int VCC2 = 8;// กำหนด VCC เพิ่มเติมสำหรับโพเทนชิโอมิเตอร์
int val;    // ตัวแปรสำหรับอ่านค่าจากพินอนาล็อก
นี่คือสิ่งที่แต่ละส่วนทำ:
  • Servo myservo;: บรรทัดนี้สร้างออบเจกต์ชื่อ myservo ซึ่งเราจะใช้ควบคุมเซอร์โวมอเตอร์เฉพาะของเรา คุณสามารถเปลี่ยนชื่อได้ แต่ต้องใช้ชื่อเดียวกันในโค้ดส่วนหลัง
  • int potpin = A0;: กำหนดว่าพินอนาล็อกใดที่ขาหัวเข็มของโพเทนชิโอมิเตอร์เชื่อมต่ออยู่ หากคุณย้ายสายไปยังพินอนาล็อกอื่น คุณต้องอัปเดตตัวเลขนี้
  • int servoPin = 3;: ตั้งค่าพินดิจิทัลสำหรับสายสัญญาณของเซอร์โว สิ่งสำคัญคือต้องใช้พินที่รองรับ PWM (โดยปกติจะมีเครื่องหมาย '~' บนบอร์ด) หมายเหตุในคอมเมนต์ระบุพินที่ใช้ได้สำหรับ Arduino ส่วนใหญ่
  • int VCC2 = 8;: นี่คือพินที่เราใช้เป็นแหล่งจ่ายไฟ 5V สำรองสำหรับโพเทนชิโอมิเตอร์ หากบอร์ดของคุณมีพิน 5V หลายพิน คุณสามารถเชื่อมต่อโดยตรงและลบส่วนนี้ของโค้ดออกได้

ในฟังก์ชัน setup() โค้ดจะเริ่มต้นเซอร์โวและตั้งค่าพินพลังงานเสริม ฟังก์ชัน myservo.attach(servoPin) มีความสำคัญเนื่องจากบอกให้ Arduino ทราบว่าพินใดเชื่อมต่อกับสายสัญญาณของเซอร์โว

void setup() {
  Serial.begin(9600);          //  ตั้งค่าซีเรียล
  myservo.attach(servoPin);  // เชื่อมต่อเซอร์โวเข้ากับพิน 3 เข้ากับออบเจกต์เซอร์โว

  pinMode(VCC2, OUTPUT);// ตั้งค่าพิน 8 เป็นเอาต์พุต
  digitalWrite(VCC2, HIGH);// ตั้งค่าพิน 8 เป็น HIGH เพื่อให้ทำหน้าที่เป็นพิน 5V
}

ตรรกะหลักอยู่ในฟังก์ชัน loop() โดยจะอ่านค่าจากโพเทนชิโอมิเตอร์ ปรับขนาดให้เป็นมุม และสั่งให้เซอร์โวเคลื่อนที่ ฟังก์ชันสำคัญสองฟังก์ชันที่นี่คือ analogRead() และ map() (ในวิดีโอที่ 04:27)

void loop() {
  val = analogRead(potpin);            // อ่านค่าจากโพเทนชิโอมิเตอร์ (ค่าระหว่าง 0 ถึง 1023)
  val = map(val, 0, 1023, 0, 180);     // ปรับขนาดเพื่อใช้กับเซอร์โว (ค่าระหว่าง 0 ถึง 180)
  myservo.write(val);                  // กำหนดตำแหน่งเซอร์โวตามค่าที่ปรับขนาดแล้ว
  Serial.print(val);
  Serial.println();
  delay(50);                           // รอให้เซอร์โวเคลื่อนที่ไปถึงตำแหน่ง
}

นี่คือวิธีการทำงาน:

  • analogRead(potpin): ฟังก์ชันนี้อ่านแรงดันไฟฟ้าจากขาหมุนของโพเทนชิโอมิเตอร์และส่งคืนค่าระหว่าง 0 (0V) ถึง 1023 (5V)
  • map(val, 0, 1023, 0, 180): นี่คือกุญแจสำคัญของทั้งโปรเจกต์ โดยนำค่าดิบจากโพเทนชิโอมิเตอร์ (0 ถึง 1023) มาปรับเป็นมุมเซอร์โว (0 ถึง 180 องศา) ตามสัดส่วน ตัวอย่างเช่น หากโพเทนชิโอมิเตอร์อ่านค่าได้ 511 (ประมาณครึ่งหนึ่ง) ฟังก์ชัน map() จะส่งคืนค่า 90 ทำให้เซอร์โวเคลื่อนที่ไปยังตำแหน่งกึ่งกลาง
  • myservo.write(val): ฟังก์ชันนี้รับค่ามุมที่คำนวณได้ (เก็บอยู่ใน val) และสั่งให้เซอร์โวหมุนไปยังตำแหน่งนั้น
  • delay(50): เพิ่มการหยุดชั่วคราวเล็กน้อยที่ส่วนท้ายของแต่ละลูป เพื่อควบคุมอัตราการอัปเดต การหน่วงที่มากขึ้น (เช่น 200ms) จะทำให้เซอร์โวเคลื่อนที่เป็นขั้น ๆ ในขณะที่การหน่วงที่น้อยลง (เช่น 50ms) จะทำให้การเคลื่อนที่ราบรื่นมาก คุณสามารถปรับค่านี้เพื่อเปลี่ยนความไวในการตอบสนองได้ (ในวิดีโอที่ 07:26)

การสาธิตโปรเจกต์จริง

ในวิดีโอ คุณจะเห็นโปรเจกต์ทำงานจริง เมื่อหมุนปุ่มโพเทนชิโอมิเตอร์ แขนของมอเตอร์เซอร์โวจะเคลื่อนที่ตามตำแหน่งอย่างเป็นสัดส่วน จอซีเรียลจะพิมพ์มุมปัจจุบันเพื่อยืนยันว่าการแมปทำงานอย่างถูกต้อง เมื่อโพเทนชิโอมิเตอร์อยู่ที่ตำแหน่งต่ำสุด เซอร์โวจะอยู่ที่ 0 องศา เมื่อคุณหมุนปุ่มไปจนสุด เซอร์โวจะหมุนอย่างราบรื่นไปยัง 180 องศา (ในวิดีโอที่ 06:33)

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

บทต่างๆ

  • [00:00] บทนำและภาพรวมโปรเจกต์
  • [01:05] แผนผังวงจรและไดอะแกรมการเดินสายไฟ
  • [02:07] การสาธิตการเดินสายไฟจริง
  • [03:00] คำอธิบายโค้ด
  • [06:33] การสาธิตและการทดสอบจริง
  • [07:26] การปรับความเร็วการตอบสนองของเซอร์โว

ภาพ

Arduino wiring or servo motor with pot
Arduino wiring or servo motor with pot
SG90_servo_motor-1
SG90_servo_motor-1
SG90_servo_motor-0
SG90_servo_motor-0
892-Lesson 86: Controlling a servo position using a potentiometer (variable resistor)
ภาษา: C++
/*
 * Lesson 88: Controlling Servo motor a with Potentiometer
 * 📚⬇️ Download and resource page https://robojax.com/RJT763
 watch full video tutroial: https://www.youtube.com/watch?v=ntRW77mNFFk
 
 Controlling a servo position using a potentiometer (variable resistor)
 by Michal Rinott <http://people.interaction-ivrea.it/m.rinott>

 modified on 8 Nov 2013
 by Scott Fitzgerald
 http://www.arduino.cc/en/Tutorial/Knob

 Update by Ahmad Shamshiri on Jan 01, 2019  in Ajax, Ontario, Canada


*/

#include <Servo.h>

Servo myservo;  // create servo object to control a servo

int potpin = A0;  // analog pin used to connect the potentiometer
int servoPin = 3; // define a digital pin (with PWM) for servo. Can use only pin 3, 5, 6,9, 10, 11
int VCC2 = 8;// define extra VCC for potentiometer
int val;    // variable to read the value from the analog pin

void setup() {
  //
  Serial.begin(9600);          //  setup serial
  myservo.attach(servoPin);  // attaches the servo on pin 3 to the servo object

  pinMode(VCC2, OUTPUT);// set pin 8 as output
  digitalWrite(VCC2, HIGH);// set pin 8 HIGH so it acts as 5V pin
}

void loop() {
  
  val = analogRead(potpin);            // reads the value of the potentiometer (value between 0 and 1023)
  val = map(val, 0, 1023, 0, 180);     // scale it to use it with the servo (value between 0 and 180)
  myservo.write(val);                  // sets the servo position according to the scaled value
  Serial.print(val);
  Serial.println();
  delay(50);                           // waits for the servo to get there
}
 

สิ่งที่คุณอาจต้องการ

แหล่งข้อมูลและเอกสารอ้างอิง

ไฟล์📁

ไฟล์อื่น ๆ