Search Code

Bài 85: Giới thiệu về Động cơ Servo | Khóa học Arduino Từng Bước

Bài 85: Giới thiệu về Động cơ Servo | Khóa học Arduino Từng Bước

Hướng dẫn dự án này giới thiệu cho bạn về thế giới động cơ servo quay liên tục, còn được gọi là servo 360 độ. Không giống như servo tiêu chuẩn di chuyển đến một góc cụ thể (như 0 đến 180 độ), các động cơ này quay liên tục theo cả hai hướng. Điều này khiến chúng trở nên lý tưởng để chế tạo robot nhỏ, bánh xích xe tăng hoặc bất kỳ dự án nào cần động cơ truyền động đơn giản, giá rẻ. Hướng dẫn này sẽ chỉ cho bạn cách điều khiển một động cơ servo bằng Arduino và một vài nút nhấn, giúp bạn điều khiển trực tiếp hướng và tốc độ của nó.

Dưới đây là một vài ứng dụng thực tế cho servo 360 độ:

  • Chế tạo một chiếc xe robot hai bánh nhỏ.
  • Tạo giá đỡ camera xoay nghiêng có thể xoay vô tận.
  • Dẫn động một băng chuyền hoặc tời nhỏ.
  • Chế tạo một nền tảng quét radar hoặc cảm biến đơn giản.

Phần cứng và Linh kiện

Đối với dự án này, bạn sẽ cần các linh kiện sau:

  • Bo mạch Arduino (ví dụ: Uno)
  • Động cơ servo quay liên tục (ví dụ: FS90R hoặc tương tự)
  • Ba nút nhấn
  • Dây cắm jumper
  • Breadboard (tùy chọn, để dễ dàng đi dây hơn)

Hướng dẫn Đi dây

Việc đi dây cho dự án này khá đơn giản. Động cơ servo có ba dây: thường là màu nâu (mass), màu đỏ (nguồn) và màu cam hoặc vàng (tín hiệu). Các nút nhấn được nối theo một cấu hình đơn giản.

Dưới đây là chi tiết các kết nối:

  • Động cơ Servo:
    • Dây nâu (Mass) kết nối với chân GND của Arduino.
    • Dây đỏ (Nguồn) kết nối với chân 5V của Arduino.
    • Dây cam/vàng (Tín hiệu) kết nối với chân 9 của Arduino.
  • Các Nút Nhấn:
    • Một bên của mỗi nút được kết nối với chân GND của Arduino.
    • Bên còn lại của nút "Ngược chiều kim đồng hồ" kết nối với chân 2.
    • Bên còn lại của nút "Dừng" kết nối với chân 3.
    • Bên còn lại của nút "Cùng chiều kim đồng hồ" kết nối với chân 4.

Trong video, người sáng tạo nhấn mạnh rằng dây tín hiệu của servo phải được kết nối với chân hỗ trợ PWM trên Arduino, thường được đánh dấu bằng ký hiệu dấu ngã (~). Chân 9 là một trong những chân này. Các nút nhấn sử dụng điện trở kéo lên nội bộ của Arduino, giúp đơn giản hóa việc đi dây bằng cách loại bỏ nhu cầu sử dụng điện trở ngoài (trong video tại 07:02).

Giải thích Mã

Mã được thiết kế để đọc trạng thái của ba nút nhấn và gửi lệnh tương ứng đến động cơ servo. Hãy cùng phân tích các phần có thể tùy chỉnh bởi người dùng.

Cấu hình Chân và Lệnh

Ở đầu mã, bạn sẽ tìm thấy các định nghĩa cho chân và các giá trị điều khiển servo. Đây là nơi bạn có thể tùy chỉnh hành vi của dự án.


const int servoPin = 9;    // Chân PWM cho tín hiệu servo
const int stopPin = 3;     // Chân cho nút dừng
const int cwPin = 4;       // Chân cho nút cùng chiều kim đồng hồ
const int ccwPin = 2;      // Chân cho nút ngược chiều kim đồng hồ

Các hằng số này xác định chân Arduino nào được kết nối với các nút và servo. Nếu bạn sử dụng các chân khác cho nút của mình, bạn sẽ thay đổi các số ở đây. servoPin phải là chân hỗ trợ PWM.


const int csServoCommand[3] = {106, 52, 0};  // {CCW, STOP, CW}
const String csServoCommandText[3] = {"Ngược chiều kim đồng hồ", "Đã dừng", "Cùng chiều kim đồng hồ"};

Đây là phần quan trọng nhất để hiểu và điều chỉnh. Mảng csServoCommand chứa các giá trị được gửi đến servo. Đối với servo liên tục, các giá trị này không biểu thị góc mà biểu thị tốc độ và hướng.

  • 106 là giá trị cho chuyển động quay Ngược chiều kim đồng hồ với tốc độ tối đa.
  • 52 là giá trị để dừng hoàn toàn.
  • 0 là giá trị cho chuyển động quay Cùng chiều kim đồng hồ với tốc độ tối đa.

Các giá trị này không phổ quát. Do sự khác biệt trong sản xuất, giá trị "dừng" (52) có thể cần được điều chỉnh. Nếu servo của bạn trôi chậm khi bạn nhấn nút dừng, bạn sẽ cần tinh chỉnh giá trị này. Video trình diễn quá trình này, cho thấy việc thay đổi giá trị thành 54 hoặc 51 có thể ảnh hưởng đến hành vi của động cơ như thế nào (trong video tại 13:45).

Bạn cũng có thể điều chỉnh các giá trị cho chuyển động quay để thay đổi tốc độ của động cơ. Ví dụ: đặt giá trị ngược chiều kim đồng hồ thành 70 sẽ làm cho nó quay chậm hơn so với ở 106 (trong video tại 12:23).

Mảng csServoCommandText chứa các chuỗi văn bản được in ra Serial Monitor để hiển thị trạng thái lệnh hiện tại.

Hàm Tùy chỉnh: servoCommand()

Mã sử dụng một hàm tùy chỉnh để xử lý logic lệnh. Hàm này nhận một số (0, 1 hoặc 2) làm đối số, cập nhật văn bản trạng thái và gửi lệnh tương ứng đến servo.


void servoCommand(int n) {
  statusText = csServoCommandText[n];
  myservo.write(csServoCommand[n]);
  Serial.println(csServoCommandText[n]);
  Serial.println(csServoCommand[n]);
}

Hàm này được gọi từ vòng lặp chính khi một nút được nhấn. Nó tập trung hóa logic để cập nhật màn hình hiển thị và điều khiển servo, làm cho mã sạch hơn và dễ sửa đổi hơn.

Dự án Trực tiếp và Trình diễn

Trong video, người sáng tạo trình diễn dự án đang hoạt động. Nhấn nút "Cùng chiều kim đồng hồ" sẽ gửi giá trị 0 đến servo, khiến nó quay theo một hướng. Nhấn nút "Ngược chiều kim đồng hồ" sẽ gửi giá trị 106, làm cho nó quay theo hướng ngược lại. Nút "Dừng" gửi 52, sẽ làm dừng động cơ.

Serial Monitor được sử dụng để hiển thị trạng thái hiện tại và giá trị chính xác đang được gửi đến servo. Điều này rất hữu ích cho việc gỡ lỗi và tìm ra giá trị "dừng" hoàn hảo cho động cơ cụ thể của bạn. Như đã lưu ý trong video, lệnh dừng có thể không hoàn hảo do mạch điện bên trong của servo, và bạn có thể thấy hiện tượng trôi chậm hoặc rung nhẹ. Đây là đặc điểm phổ biến của các servo quay liên tục giá rẻ và có thể được giảm thiểu bằng cách tinh chỉnh giá trị dừng trong mã (trong video tại 01:15).

Các chương

  • [00:05] Giới thiệu về động cơ servo 360 độ
  • [02:02] Tổng quan về linh kiện và phần cứng
  • [02:40] Sơ đồ đấu dây chi tiết và các kết nối
  • [05:07] Giải thích mã: hằng số, mảng và thiết lập
  • [09:56] Giải thích mã: hàm servoCommand
  • [10:54] Trình diễn trực tiếp và đầu ra Serial Monitor
  • [12:23] Điều chỉnh tốc độ servo và giá trị dừng

Hình ảnh

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
Ngôn ngữ: 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)
Ngôn ngữ: 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 

Nghĩ bạn có thể cần

Tài nguyên & tài liệu tham khảo

Tập tin📁

Các tập tin khác