ค้นหาโค้ด

บทเรียนที่ 85: ความรู้เบื้องต้นเกี่ยวกับเซอร์โวมอเตอร์ | คอร์สเรียน Arduino ทีละขั้นตอน

บทเรียนที่ 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] การปรับความเร็วเซอร์โวและค่าหยุด

ภาพ

SG90 Mini Servo Motor
SG90 Mini Servo Motor
SG90_servo_motor-1
SG90_servo_motor-1
115-Arduino code to control continuous 360° servo from serial monitor command
ภาษา: C++
/* 
 *  
 *  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); 
                }
                  
                 
        }

  
}
893-Arduino code to control continuous 360° servo from serial monitor command (Code 2)
ภาษา: C++
/* 
 *  
 *  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 

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

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

ไฟล์📁

ไฟล์อื่น ๆ