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

ฮาร์ดแวร์และอุปกรณ์
สำหรับโปรเจกต์นี้ คุณจะต้องมีอุปกรณ์ดังต่อไปนี้:
- บอร์ด Arduino (เช่น Uno)
- เซอร์โวมอเตอร์แบบหมุนต่อเนื่อง (เช่น FS90R หรือรุ่นใกล้เคียง)
- ปุ่มกดสามปุ่ม
- สายจัมเปอร์
- เบรดบอร์ด (ไม่บังคับ เพื่อความสะดวกในการเดินสายไฟ)
คู่มือการเดินสายไฟ
การเดินสายไฟสำหรับโปรเจกต์นี้ง่ายมาก เซอร์โวมอเตอร์มีสายสามเส้น โดยทั่วไปคือ สีน้ำตาล (กราวด์) สีแดง (ไฟเลี้ยง) และสีส้มหรือสีเหลือง (สัญญาณ) ปุ่มกดจะต่อในรูปแบบที่ง่าย
นี่คือรายละเอียดของการเชื่อมต่อ:
- เซอร์โวมอเตอร์:
- สายสีน้ำตาล (กราวด์) เชื่อมต่อกับพิน GND ของ Arduino
- สายสีแดง (ไฟเลี้ยง) เชื่อมต่อกับพิน 5V ของ Arduino
- สายสีส้ม/เหลือง (สัญญาณ) เชื่อมต่อกับพิน 9 ของ Arduino
- ปุ่มกด:
- ด้านหนึ่งของแต่ละปุ่มเชื่อมต่อกับพิน GND ของ Arduino
- อีกด้านหนึ่งของปุ่ม "ทวนเข็มนาฬิกา" เชื่อมต่อกับพิน 2
- อีกด้านหนึ่งของปุ่ม "หยุด" เชื่อมต่อกับพิน 3
- อีกด้านหนึ่งของปุ่ม "ตามเข็มนาฬิกา" เชื่อมต่อกับพิน 4
ในวิดีโอ ผู้สร้างเน้นว่าสายสัญญาณของเซอร์โวต้องเชื่อมต่อกับพินที่รองรับ PWM บน Arduino ซึ่งมักจะมีเครื่องหมายทิลเดอ (~) กำกับอยู่ พิน 9 เป็นหนึ่งในพินเหล่านี้ ปุ่มกดใช้ตัวต้านทานแบบดึงขึ้นภายในของ Arduino ซึ่งช่วยให้การเดินสายไฟง่ายขึ้นโดยไม่ต้องใช้ตัวต้านทานภายนอก (ในวิดีโอที่ 07:02)
คำอธิบายโค้ด
โค้ดถูกออกแบบมาเพื่ออ่านสถานะของปุ่มกดสามปุ่มและส่งคำสั่งที่เกี่ยวข้องไปยังเซอร์โวมอเตอร์ มาดูส่วนที่ผู้ใช้สามารถปรับแต่งได้
การกำหนดค่าพินและคำสั่ง
ที่ด้านบนของโค้ด คุณจะพบการกำหนดค่าพินและค่าควบคุมเซอร์โว นี่คือจุดที่คุณสามารถปรับแต่งพฤติกรรมของโปรเจกต์ได้
const int servoPin = 9; // พิน PWM สำหรับสัญญาณเซอร์โว
const int stopPin = 3; // พินสำหรับปุ่มหยุด
const int cwPin = 4; // พินสำหรับปุ่มตามเข็มนาฬิกา
const int ccwPin = 2; // พินสำหรับปุ่มทวนเข็มนาฬิกา
ค่าคงที่เหล่านี้กำหนดว่าพินใดของ Arduino ที่เชื่อมต่อกับปุ่มและเซอร์โว หากคุณใช้พินอื่นสำหรับปุ่มของคุณ คุณจะต้องเปลี่ยนตัวเลขที่นี่ servoPin ต้องเป็นพินที่รองรับ PWM
const int csServoCommand[3] = {106, 52, 0}; // {ทวนเข็มนาฬิกา, หยุด, ตามเข็มนาฬิกา}
const String csServoCommandText[3] = {"ทวนเข็มนาฬิกา", "หยุด", "ตามเข็มนาฬิกา"};
นี่คือส่วนที่สำคัญที่สุดที่ต้องทำความเข้าใจและปรับแต่ง อาร์เรย์ csServoCommand เก็บค่าที่ส่งไปยังเซอร์โว สำหรับเซอร์โวแบบหมุนต่อเนื่อง ค่าเหล่านี้ไม่ได้หมายถึงมุม แต่หมายถึงความเร็วและทิศทาง
- 106 คือค่าสำหรับการหมุนทวนเข็มนาฬิกาด้วยความเร็วเต็มที่
- 52 คือค่าสำหรับการหยุดโดยสมบูรณ์
- 0 คือค่าสำหรับการหมุนตามเข็มนาฬิกาด้วยความเร็วเต็มที่
ค่าเหล่านี้ไม่ใช่ค่าสากล เนื่องจากความแตกต่างในการผลิต ค่า "หยุด" (52) อาจต้องปรับแต่ง หากเซอร์โวของคุณค่อยๆ เลื่อนเมื่อคุณกดปุ่มหยุด คุณจะต้องปรับค่านี้ให้ละเอียด วิดีโอสาธิตกระบวนการนี้ โดยแสดงให้เห็นว่าการเปลี่ยนค่าเป็น 54 หรือ 51 อาจส่งผลต่อพฤติกรรมของมอเตอร์ได้อย่างไร (ในวิดีโอที่ 13:45)
คุณยังสามารถปรับค่าสำหรับการหมุนเพื่อเปลี่ยนความเร็วของมอเตอร์ได้ เช่น การตั้งค่าทวนเข็มนาฬิกาเป็น 70 จะทำให้หมุนช้าลงเมื่อเทียบกับ 106 (ในวิดีโอที่ 12:23)
อาร์เรย์ csServoCommandText เก็บข้อความสตริงที่พิมพ์ไปยัง Serial Monitor เพื่อแสดงสถานะคำสั่งปัจจุบัน
ฟังก์ชันที่กำหนดเอง: servoCommand()
โค้ดใช้ฟังก์ชันที่กำหนดเองเพื่อจัดการตรรกะของคำสั่ง ฟังก์ชันนี้รับตัวเลข (0, 1 หรือ 2) เป็นอาร์กิวเมนต์ อัปเดตข้อความสถานะ และส่งคำสั่งที่เกี่ยวข้องไปยังเซอร์โว
void servoCommand(int n) {
statusText = csServoCommandText[n];
myservo.write(csServoCommand[n]);
Serial.println(csServoCommandText[n]);
Serial.println(csServoCommand[n]);
}
ฟังก์ชันนี้ถูกเรียกจากลูปหลักเมื่อมีการกดปุ่ม ฟังก์ชันนี้รวมตรรกะสำหรับการอัปเดตการแสดงผลและการควบคุมเซอร์โวไว้ที่จุดเดียว ทำให้โค้ดสะอาดและง่ายต่อการแก้ไข
โปรเจกต์จริงและการสาธิต
ในวิดีโอ ผู้สร้างสาธิตโปรเจกต์การทำงานจริง การกดปุ่ม "ตามเข็มนาฬิกา" จะส่งค่า 0 ไปยังเซอร์โว ทำให้หมุนในทิศทางหนึ่ง การกดปุ่ม "ทวนเข็มนาฬิกา" จะส่งค่า 106 ทำให้หมุนไปอีกทิศทางหนึ่ง ปุ่ม "หยุด" จะส่งค่า 52 ซึ่งควรจะหยุดมอเตอร์
Serial Monitor ใช้สำหรับแสดงสถานะปัจจุบันและค่าที่แน่นอนที่ส่งไปยังเซอร์โว ซึ่งมีค่าอย่างยิ่งสำหรับการดีบักและการหาค่า "หยุด" ที่สมบูรณ์แบบสำหรับมอเตอร์เฉพาะของคุณ ดังที่ได้กล่าวไว้ในวิดีโอ คำสั่งหยุดอาจไม่สมบูรณ์แบบเนื่องจากวงจรภายในของเซอร์โว และคุณอาจเห็นการเคลื่อนที่ช้า ๆ หรือการสั่นสะเทือน นี่คือลักษณะทั่วไปของเซอร์โวแบบหมุนต่อเนื่องราคาถูก และสามารถลดลงได้โดยการปรับค่าหยุดในโค้ด (ในวิดีโอที่ 01:15)
บทต่างๆ
- [00:05] แนะนำมอเตอร์เซอร์โวแบบหมุน 360 องศา
- [02:02] ภาพรวมของชิ้นส่วนและฮาร์ดแวร์
- [02:40] แผนผังการเดินสายไฟและการเชื่อมต่อโดยละเอียด
- [05:07] คำอธิบายโค้ด: ค่าคงที่ อาร์เรย์ และการตั้งค่า
- [09:56] คำอธิบายโค้ด: ฟังก์ชัน servoCommand
- [10:54] การสาธิตสดและผลลัพธ์จาก Serial Monitor
- [12:23] การปรับความเร็วเซอร์โวและค่าหยุด
/*
*
* Demonstration of Controlling Continuous Servo (360 servo)
* This code allows you to control a 360-degree servo by a command from the Serial Monitor.
* this 350 servo motor is a just for fun. it can't be used for real application where you need exact positioning. get stepper motor or expensive servo motor.
📚⬇️ Download and resource page https://robojax.com/RJT762
*
* Modified by Ahmad Shamshiri for Robojax.com
* on Sunday, July 1, 2018, at 11:09 AM in Ajax, Ontario, Canada
* Watch a video instruction of this project: https://youtu.be/b_xvu6wWafA
* Get this code from Robojax.com
*
Original code by BARRAGAN <http://barraganstudio.com>
This example code is in the public domain.
Modified 8 Nov 2013
by Scott Fitzgerald
http://www.arduino.cc/en/Tutorial/Sweep
*/
#include <Servo.h>
Servo myservo; // create servo object to control a servo
// twelve servo objects can be created on most boards
int pos = 0; // variable to store the servo position
int incomingByte = 0; // for incoming serial data
void setup() {
Serial.begin(9600);
myservo.attach(9); // attaches the servo on pin 9 to the servo object
}
void loop() {
// send data only when you receive data:
if (Serial.available() > 0) {
// read the incoming byte:
incomingByte = Serial.read();
// say what you got:
Serial.print("received: ");
Serial.print (incomingByte);
if(incomingByte == 108){
Serial.println(" sent 0 Rotating CW ");
myservo.write(0);
}else if(incomingByte == 114){
Serial.println(" sent 180 Rotating CCW ");
myservo.write(180);
}else if(incomingByte == 60){
Serial.println(" sent Stopped ");
myservo.write(60);
}else{
Serial.println(" moving Randomly");
myservo.write(incomingByte);
}
}
}
/*
*
* Demonstration of Controlling Continuous Servo (360 servo)
360 Servo -2
* This code allows you to control a 360-degree servo by a command from the Serial Monitor.
* this 350 servo motor is a just for fun. it can't be used for real application where you need exact positioning. get stepper motor or expensive servo motor.
📚⬇️ Download and resource page https://robojax.com/RJT762
*
* Modified by Ahmad Shamshiri for Robojax.com
* on Sunday, July 1, 2018, at 11:09 AM in Ajax, Ontario, Canada
* Watch a video instruction of this project: https://youtu.be/b_xvu6wWafA
* Get this code from Robojax.com
*
Original code by BARRAGAN <http://barraganstudio.com>
This example code is in the public domain.
Modified 8 Nov 2013
by Scott Fitzgerald
http://www.arduino.cc/en/Tutorial/Sweep
*/
#include <Servo.h>
Servo myservo; // create servo object to control a servo
// twelve servo objects can be created on most boards
int servoPin = 9;// this pin must be of those with PWM ~
int pos = 0; // variable to store the servo position
int incomingByte = 0; // for incoming serial data
int CWBS, CCWBS, SBS;
void setup() {
Serial.begin(9600);
pinMode(2,INPUT_PULLUP);// set pin for push button STOP
pinMode(3,INPUT_PULLUP);// set pin for push button CCW
pinMode(4,INPUT_PULLUP);// set pin for push button CW
myservo.attach(servoPin); // attaches the servo on pin 9 to the servo object
}
void loop() {
CCWBS = digitalRead(2);// read status of button CCW
SBS = digitalRead(3);// read status of button STOP
CWBS = digitalRead(4);// read status of button CW
if(CCWBS == LOW){
Serial.println(" sent 0 Rotaing CW ");
myservo.write(0);
}else if(CWBS == LOW){
Serial.println(" sent 180 Rotaing CCW ");
myservo.write(180);
}else if(SBS == LOW){
Serial.println(" sent Stopped ");
myservo.write(60);
}else{
Serial.println(" moving Random");
myservo.write(48);
}
}// loop
สิ่งที่คุณอาจต้องการ
-
อเมซอน360 Degree Servo motor on Amazonlink.amazon
-
อเมซอน
-
อีเบย์360 Degree Servo motor on eBayebay.us
-
อาลีเอ็กซ์เพรส360 Degree Servo motor on AliExpresss.click.aliexpress.com
-
อาลีเอ็กซ์เพรส360 Degree Servo motor on AliExpress-2s.click.aliexpress.com
แหล่งข้อมูลและเอกสารอ้างอิง
ไฟล์📁
ไฟล์อื่น ๆ
-
SG90 Seroo มอเตอร์ แผ่นข้อมูล
robojax-servo-SG90_datasheet.pdf0.12 MB