บทเรียนที่ 89: การใช้ Continuous หรือ 360 Servo motor| คอร์ส Arduino ทีละขั้นตอน
คุณเคยต้องการที่จะหมุนมอเตอร์ไปในทิศทางใดทิศทางหนึ่งได้นานเท่าที่ต้องการ แทนที่จะเพียงแค่กวาดไปมาเหมือนเซอร์โวมาตรฐานหรือไม่? นี่คือสิ่งที่เซอร์โวมอเตอร์แบบต่อเนื่องหรือ 360 องศานำเสนอ แตกต่างจากเซอร์โวมาตรฐานที่เคลื่อนที่ไปยังมุมที่กำหนด (โดยทั่วไปคือ 0 ถึง 180 องศา) เซอร์โวแบบต่อเนื่องจะหมุน endlessly ในทิศทางตามเข็มนาฬิกาหรือทวนเข็มนาฬิกา ทำให้เหมาะสำหรับการสร้างหุ่นยนต์ขนาดเล็ก แพลตฟอร์มกล้อง หรือโปรเจกต์ใดๆ ที่ต้องการการควบคุมการหมุนอย่างต่อเนื่อง
ในโปรเจกต์นี้ เราจะสร้างระบบควบคุมสำหรับเซอร์โว 360 องศาโดยใช้เพียงปุ่มกดสามปุ่ม คุณจะสามารถสั่งให้เซอร์โวหมุนตามเข็มนาฬิกา ทวนเข็มนาฬิกา หรือหยุดได้ทุกเมื่อ คู่มือนี้จะพาคุณผ่านการเดินสายไฟ อธิบายส่วนของโค้ดที่ผู้ใช้สามารถปรับแต่งได้ และแสดงการสาธิตสดของระบบที่ทำงาน
นี่คือแนวคิดเชิงปฏิบัติบางประการสำหรับการใช้เซอร์โวแบบต่อเนื่องในโปรเจกต์ของคุณเอง:
- สร้างหุ่นยนต์สองล้อขนาดเล็ก: ใช้เซอร์โวแบบต่อเนื่องสองตัวเพื่อขับเคลื่อนล้อ ทำให้สามารถเคลื่อนที่ไปข้างหน้า ถอยหลัง และเลี้ยวได้
- สร้างขายึดกล้องแบบแพนและเอียง: ใช้เซอร์โวแบบต่อเนื่องหนึ่งตัวสำหรับการแพนกล้องรักษาความปลอดภัยหรือกล้องสัตว์ป่าอย่างช้าๆ ไม่รู้จบ
- ทำให้สายพานลำเลียงเป็นอัตโนมัติ: ควบคุมระบบสายพานขนาดเล็กสำหรับการคัดแยกหรือจ่ายสินค้า
- ออกแบบแท่นแสดงสินค้าหมุนได้: โชว์โมเดล 3 มิติหรือผลิตภัณฑ์บนแพลตฟอร์มที่หมุนอย่างต่อเนื่อง
ฮาร์ดแวร์ที่ต้องใช้
- บอร์ด Arduino (Uno, Nano ฯลฯ)
- เซอร์โวมอเตอร์แบบต่อเนื่อง (360 องศา) (เช่น FS90R, DS04-NFC)
- ปุ่มกด 3 ตัว
- สายจัมเปอร์
- เบรดบอร์ด
คู่มือการเดินสายไฟ
การเดินสายไฟสำหรับโปรเจกต์นี้ตรงไปตรงมา เซอร์โวมอเตอร์มีสายสามเส้น: โดยทั่วไปสายสีเข้มสำหรับกราวด์ (GND) สายกลาง (มักเป็นสีแดง) สำหรับไฟเลี้ยง (5V) และสายสีอ่อน (สีส้ม สีเหลือง หรือสีขาว) สำหรับสัญญาณ ดังที่แสดงในวิดีโอ เซอร์โวถูกเดินสายเข้ากับ Arduino ดังนี้:
- กราวด์เซอร์โว (สายสีเข้ม): เชื่อมต่อกับ GND ของ Arduino
- ไฟเลี้ยงเซอร์โว (สายกลาง/สีแดง): เชื่อมต่อกับ 5V ของ Arduino
- สัญญาณเซอร์โว (สายสีอ่อน): เชื่อมต่อกับพิน 9 ของ Arduino
สำหรับปุ่มกดสามปุ่ม แต่ละปุ่มมีสองด้าน ด้านหนึ่งของปุ่มทั้งหมดเชื่อมต่อเข้าด้วยกันแล้วต่อกับ GND ของ Arduino อีกด้านหนึ่งของแต่ละปุ่มเชื่อมต่อกับดิจิทัลพินแยกต่างหาก ดังที่อธิบายด้านล่าง (ในวิดีโอที่ 03:40):
- ปุ่มตามเข็มนาฬิกา (CW): เชื่อมต่อกับพิน 2 ของ Arduino
- ปุ่มหยุด: เชื่อมต่อกับพิน 3 ของ Arduino
- ปุ่มทวนเข็มนาฬิกา (CCW): เชื่อมต่อกับพิน 4 ของ Arduino

คำอธิบายโค้ด
โค้ดถูกออกแบบให้ปรับแต่งได้ง่าย ส่วนที่สำคัญที่สุดที่คุณต้องปรับคืออาร์เรย์ sc[] ซึ่งเก็บค่า PWM เฉพาะที่ส่งไปยังเซอร์โวเพื่อควบคุมการทำงาน ค่าเหล่านี้ไม่เป็นสากลและต้องปรับเทียบสำหรับเซอร์โวมอเตอร์เฉพาะของคุณ (ในวิดีโอที่ 12:23)
int sc[]={106, 58, 0};// คำสั่งเซอร์โวเรียงตามลำดับ
//CCW, STOP,CW
อาร์เรย์นี้คือหัวใจของการปรับเทียบ ค่าถูกใช้ในลำดับนี้:
- sc[0] = 106: ค่านี้ถูกส่งเพื่อให้เซอร์โวหมุนทวนเข็มนาฬิกา
- sc[1] = 58: นี่คือค่า "หยุด" เนื่องจากวงจรภายใน ค่าที่แน่นอนที่ทำให้มอเตอร์หยุดจึงแตกต่างกัน คุณอาจพบว่าเซอร์โวของคุณหมุนช้าๆ แม้เมื่อส่งคำสั่งนี้ และคุณจะต้องปรับตัวเลขนี้เล็กน้อยเพื่อหาค่า "หยุดสนิท" ที่แท้จริงสำหรับมอเตอร์ของคุณ
- sc[2] = 0: ค่านี้ทำให้เซอร์โวหมุนตามเข็มนาฬิกาด้วยความเร็วสูงสุด
คุณสามารถปรับค่าในอาร์เรย์ sc[] เพื่อเปลี่ยนความเร็วของการหมุน ตัวอย่างเช่น การตั้ง sc[0] เป็น 70 จะทำให้การหมุนทวนเข็มนาฬิกาช้าลง ยิ่งค่าใกล้กับค่า "หยุด" (58) มากเท่าไร มอเตอร์จะหมุนช้าลงในทิศทางนั้น ค่าที่ห่างจาก 58 มากขึ้นจะเพิ่มความเร็วจนถึงขีดจำกัดสูงสุด
นอกจากนี้ยังมีตัวแปรสำคัญอื่นๆ ที่คุณอาจต้องแก้ไข servoPin ถูกตั้งเป็น 9 ซึ่งต้องเป็นพินที่รองรับ PWM บน Arduino ของคุณ พินปุ่มถูกกำหนดไว้ที่ด้านบนของโค้ดและสามารถเปลี่ยนได้หากจำเป็น
int servoPin = 9;// พินนี้ต้องเป็นหนึ่งในพินที่มี ~ (PWM)
#define STOPpin 3 // พินปุ่มกดสำหรับ STOP
#define CWpin 2 // ปุ่มกดสำหรับ CW
#define CCWpin 4 // ปุ่มกดสำหรับ CCW
สุดท้าย อาร์เรย์ scText[] เก็บสตริงที่พิมพ์ไปยัง Serial Monitor สำหรับการดีบัก คุณสามารถเปลี่ยนได้หากต้องการแสดงข้อความที่แตกต่างออกไป
วิธีใช้โค้ด
อัปโหลดโค้ดที่ให้ไว้ไปยังบอร์ด Arduino ของคุณ เปิด Serial Monitor (ตั้งค่าเป็น 9600 baud) เพื่อดูข้อความสถานะ ตอนนี้คุณสามารถควบคุมเซอร์โวด้วยปุ่มสามปุ่ม:
- กดปุ่ม CW ค้างไว้: เซอร์โวจะเริ่มหมุนตามเข็มนาฬิกา Serial Monitor จะแสดง "CW" และค่าที่ส่ง
- กดปุ่ม CCW ค้างไว้: เซอร์โวจะเริ่มหมุนทวนเข็มนาฬิกา Serial Monitor จะแสดง "CCW" และค่าที่ส่ง
- กดปุ่มหยุด: เซอร์โวจะพยายามหยุด Serial Monitor จะแสดง "Stop"
หากเซอร์โวของคุณไม่หยุดสนิทเมื่อกดปุ่ม Stop คุณจะต้องปรับเทียบค่า sc[1] ในอาร์เรย์ sc[] ลองเปลี่ยนค่าเล็กน้อย (เช่น จาก 58 เป็น 54 หรือ 52) แล้วอัปโหลดโค้ดใหม่จนกว่ามอเตอร์จะหยุดนิ่งสนิท
การสาธิตสด
ในวิดีโอ ผู้นำเสนอสาธิตระบบทั้งหมด คุณจะเห็นเซอร์โวหมุนทั้งสองทิศทางตามการกดปุ่ม ผลลัพธ์จาก Serial Monitor ก็แสดงเช่นกัน โดยแสดงสถานะปัจจุบัน ("CW", "Stop" หรือ "CCW") และค่าที่ส่งไปยังเซอร์โวโดยเฉพาะ นี่เป็นเครื่องมือที่ดีสำหรับการดีบักและค้นหาค่าการปรับเทียบที่สมบูรณ์แบบสำหรับมอเตอร์เฉพาะของคุณ การสาธิตยังแสดงให้เห็นว่าการปรับค่าในอาร์เรย์ sc[] ส่งผลโดยตรงต่อความเร็วมอเตอร์ ตั้งแต่การเคลื่อนที่ช้า ๆ ไปจนถึงความเร็วสูงสุด
บทสรุป
โปรเจกต์นี้เป็นวิธีที่ง่ายและมีประสิทธิภาพในการควบคุมมอเตอร์เซอร์โวแบบหมุนต่อเนื่อง โดยการเข้าใจกระบวนการปรับเทียบค่า "หยุด" คุณจะสามารถควบคุมได้อย่างแม่นยำในโปรเจกต์หุ่นยนต์และระบบอัตโนมัติของคุณเอง
บทในวิดีโอ
- [00:05] แนะนำมอเตอร์เซอร์โวแบบหมุนต่อเนื่อง
- [02:02] ภาพรวมฮาร์ดแวร์ของเซอร์โว
- [02:40] แผนผังการเดินสายไฟและการเชื่อมต่อ
- [05:07] คำอธิบายโค้ด: ตัวแปรและการตั้งค่า
- [08:03] คำอธิบายโค้ด: ตรรกะลูปหลัก
- [09:56] ฟังก์ชัน servoCommand()
- [10:54] การสาธิตสดและผลลัพธ์จาก Serial Monitor
- [12:23] การปรับเทียบความเร็วเซอร์โวและค่าหยุด
++
/*
* S05-13 Servo with 3 push buttons
* Demonstration of Controlling a Continuous Servo (360 servo)
* This code allows you to control a 360-degree servo using push buttons
*
* Modified by Ahmad Shamshiri for Robojax Robojax.com
* on Jan 17, 2019 at 22:42 in Ajax, Ontario, Canada
Watch the video instruction for this sketch: https://youtu.be/hVe4TSRV4ww
Watch Introduction to 360 Servo video with code: https://youtu.be/b_xvu6wWafA
You can get the wiring diagram from my Arduino Course at Udemy.com
Learn Arduino step by step with all libraries, codes, and wiring diagrams all in one place
visit my course now http://robojax.com/L/?id=62
If you found this tutorial helpful, please support me so I can continue creating
content like this.
or make a donation using PayPal http://robojax.com/L/?id=64
Original code by BARRAGAN <http://barraganstudio.com>
*
* Code is available at http://robojax.com/learn/arduino
* This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.
* This code has been downloaded from Robojax.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#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 one of those with PWM ~
#define STOPpin 3 // push button pin for STOP
#define CWpin 2 // push button for CW
#define CCWpin 4 // push button for CCW
int sc[]={106, 58, 0};// servo commands are in order
//CCW, STOP,CW
String scText[]={"CCW","Stop","CW"};// define texts for 3 actions
int statusText;
int CWBS, CCWBS, SBS;
//CW button status (CWBS)
//CCW button status (CCWBS)
//stop button status (SBS)
void setup() {
Serial.begin(9600);
pinMode(STOPpin,INPUT_PULLUP);// set pin for push button STOP
pinMode(CCWpin,INPUT_PULLUP);// set pin for push button CCW
pinMode(CWpin,INPUT_PULLUP);// set pin for push button CW
myservo.attach(servoPin); // attaches the servo on pin 9 to the servo object
myservo.write(sc[1]);// send STOP command
statusText=1;// initial value is STOP
}
void loop() {
CCWBS = digitalRead(CCWpin);// read status of button CCW
SBS = digitalRead(STOPpin);// read status of button STOP
CWBS = digitalRead(CWpin);// read status of button CW
if(CCWBS ==LOW)
{
servoCommand(0);
}else if(SBS ==LOW)
{
servoCommand(1);
}else if(CWBS ==LOW)
{
servoCommand(2);
}
Serial.println(scText[statusText]);
delay(50);
}// loop
void servoCommand(int n)
{
statusText = n;
myservo.write(sc[n]);
Serial.print("Going to ");
Serial.print(scText[n]);
Serial.print( "(");
Serial.print(sc[n]);
Serial.println(")");
}
สิ่งที่คุณอาจต้องการ
-
อเมซอน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