บทเรียนที่ 86: ควบคุมตำแหน่งของมอเตอร์เซอร์โวโดยใช้โพเทนชิโอมิเตอร์
จินตนาการถึงการหมุนปุ่มเพียงปุ่มเดียว แล้วมองแขนกลค่อยๆ ขยับตามการเคลื่อนไหวของคุณอย่างแม่นยำ นั่นคือความมหัศจรรย์ของการผสานโพเทนชิโอมิเตอร์เข้ากับเซอร์โวมอเตอร์ โปรเจกต์นี้เป็นส่วนหนึ่งของคอร์ส Arduino Step by Step โดย Robojax สาธิตแนวคิดพื้นฐานและมีประโยชน์อย่างยิ่งในงานอิเล็กทรอนิกส์ นั่นคือการแปลงสัญญาณอนาล็อกให้เป็นการเคลื่อนไหวทางกายภาพที่แม่นยำ คุณจะได้เรียนรู้วิธีอ่านแรงดันไฟฟ้าที่แปรผันจากโพเทนชิโอมิเตอร์ แปลงค่านั้นให้เป็นช่วงมุม และสั่งให้เซอร์โวมอเตอร์หมุนไปยังตำแหน่งที่แน่นอนนั้น นี่คือประตูสู่การสร้างโปรเจกต์ที่ใช้งานง่ายและโต้ตอบได้ ซึ่งการควบคุมด้วยมือผสานกับระบบอัตโนมัติ
- การควบคุมแขนกล: ใช้โพเทนชิโอมิเตอร์เพื่อจัดตำแหน่งข้อต่อแต่ละข้อของแขนกลด้วยมือ สำหรับการหยิบและวางที่แม่นยำ
- ระบบแพนและเอียงกล้อง: สร้างฐานกล้องที่ควบคุมระยะไกลสำหรับไทม์แลปส์หรือการเฝ้าระวัง แพนและเอียงได้อย่างนุ่มนวลด้วยการหมุนปุ่ม
- การจำลองเกจวัดอนาล็อก: สร้างเกจวัดบนแผงหน้าปัดจริง (เช่น มาตรวัดความเร็วหรือปุ่มอุณหภูมิ) ที่ขยับตามข้อมูลเซนเซอร์ โดยใช้โพเทนชิโอมิเตอร์เป็นเครื่องมือควบคุมด้วยมือหรือปรับเทียบ
- งานศิลปะจัดวางแบบโต้ตอบ: สร้างประติมากรรมแบบไคเนติกที่ตอบสนองต่ออินพุตของผู้ชม โดยการหมุนปุ่มจะเปลี่ยนตำแหน่งของชิ้นส่วนที่เคลื่อนไหว
- การบังคับเลี้ยวของรถจำลอง: ควบคุมมุมเลี้ยวของรถจำลองหรือเรือจำลองจากระยะไกล ให้ความรู้สึกเป็นอนาล็อกและเป็นธรรมชาติมากกว่าปุ่มดิจิทัล
ฮาร์ดแวร์และอุปกรณ์
เพื่อทำตามโปรเจกต์นี้ คุณจะต้องมีอุปกรณ์ดังต่อไปนี้:- บอร์ด Arduino (เช่น Uno, Nano)
- เซอร์โวมอเตอร์มาตรฐาน (เช่น SG90 หรือ MG996R)
- โพเทนชิโอมิเตอร์ (ตัวต้านทานปรับค่าได้ โดยทั่วไปคือ 10kΩ)
- สายจัมเปอร์
- เบรดบอร์ด (ไม่บังคับ เพื่อการเชื่อมต่อที่ง่ายขึ้น)
ทำความเข้าใจการเดินสายไฟ
การเดินสายไฟสำหรับโปรเจกต์นี้ง่ายมาก สิ่งสำคัญคือการจ่ายไฟและการเชื่อมต่อสัญญาณที่ถูกต้องสำหรับทั้งเซอร์โวและโพเทนชิโอมิเตอร์ เซอร์โวเป็นอุปกรณ์ที่กินไฟสูง ดังนั้นจึงรับไฟจากพิน 5V ของ Arduino โดยตรง โพเทนชิโอมิเตอร์ทำหน้าที่เป็นตัวแบ่งแรงดันไฟฟ้า และเราอ่านแรงดันไฟฟ้าที่ขาหัวเข็ม (ขากลาง) เพื่อกำหนดตำแหน่งของมัน (ในวิดีโอที่ 01:05) เคล็ดลับที่ชาญฉลาดอย่างหนึ่งที่โปรเจกต์นี้ใช้คือการสร้างแหล่งจ่ายไฟ 5V เพิ่มเติมบนพินดิจิทัลเพื่อจ่ายไฟให้โพเทนชิโอมิเตอร์ เนื่องจากบอร์ด Arduino บางรุ่นมีพิน 5V เฉพาะเพียงพินเดียว ทำได้ในโค้ดโดยการตั้งค่าพินดิจิทัล (พิน 8) เป็นHIGH ซึ่งจะจ่ายไฟ 5V ออกมา (ในวิดีโอที่ 00:39)
นี่คือแผนผังการเดินสายไฟที่กล่าวถึงในวิดีโอ:
- เซอร์โวมอเตอร์:
- ไฟ (สายสีแดง) → พิน 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] การปรับความเร็วการตอบสนองของเซอร์โว
/*
* 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
}
สิ่งที่คุณอาจต้องการ
-
อเมซอน
-
อเมซอน
-
อีเบย์
-
อาลีเอ็กซ์เพรสPurchase SG90 servo motor 180 or 360 from AliExpresss.click.aliexpress.com
แหล่งข้อมูลและเอกสารอ้างอิง
ไฟล์📁
ไฟล์อื่น ๆ
-
SG90 Seroo มอเตอร์ แผ่นข้อมูล
robojax-servo-SG90_datasheet.pdf0.12 MB