Tìm kiếm mã

Bài 18/31: Sử dụng động cơ Servo với Arduino Bộ kit Arduino của SunFounder

Bài 18/31: Sử dụng động cơ Servo với Arduino Bộ kit Arduino của SunFounder

Động cơ servo là những "con ngựa thồ" trong vô số dự án robot và điều khiển từ xa, cung cấp khả năng điều khiển góc chính xác cho mọi thứ từ cơ cấu lái đến cánh tay robot. Hướng dẫn này, dựa trên Bài 18 của khóa học SunFounder Arduino Kit, sẽ hướng dẫn bạn những kiến thức cơ bản về cách sử dụng động cơ servo với Arduino. Bạn sẽ học cách kết nối phần cứng và điều khiển vị trí của động cơ bằng hai phương pháp khác nhau: chuyển động quét đơn giản và vị trí điều khiển bằng núm xoay. Kiến thức bạn thu được ở đây rất thực tế và có thể áp dụng cho nhiều dự án khác nhau, bao gồm:

  • Chế tạo cánh tay robot có thể kẹp và di chuyển vật thể một cách chính xác.
  • Tạo ô tô hoặc thuyền điều khiển từ xa có servo để lái.
  • Phát triển bộ theo dõi năng lượng mặt trời để tối đa hóa việc thu năng lượng.
  • Lắp ráp giá đỡ camera xoay nghiêng để giám sát hoặc chụp ảnh.
  • Tự động hóa các bề mặt điều khiển của mô hình máy bay, như bánh lái hoặc cánh liệng.

Tổng quan về phần cứng

Trước khi đi sâu vào mã, điều cần thiết là phải hiểu về động cơ servo. Như đã trình bày trong video, động cơ servo không quay liên tục như động cơ DC tiêu chuẩn. Thay vào đó, nó quay đến một vị trí góc cụ thể, thường là từ 0 đến 180 độ. Điều này làm cho nó trở nên lý tưởng cho các ứng dụng đòi hỏi chuyển động chính xác. Video nêu bật một số ví dụ, từ việc lái ô tô RC đến điều khiển các khớp phức tạp của cánh tay robot (trong video ở phút 00:06).

Servo có nhiều kích cỡ khác nhau, với kích thước vật lý và mô-men xoắn quyết định giá thành và ứng dụng của chúng. Một servo siêu nhỏ là hoàn hảo cho các mô hình nhẹ, trong khi một servo lớn hơn, mạnh hơn là cần thiết cho các nhiệm vụ nặng hơn như lái một "chiếc xe rất mạnh hoặc dày" (trong video ở phút 01:59).

Hầu hết các servo sở thích đều có ba dây được đặt trong một đầu nối tiêu chuẩn. Video giải thích một lựa chọn thiết kế thông minh: dây ở giữa luôn là dây nguồn (VCC), thường là 5V. Đây là một tính năng an toàn giúp bảo vệ thiết bị khỏi đảo cực nếu đầu nối được cắm ngược (trong video ở phút 03:27). Hai dây còn lại dành cho nối đất (GND) và tín hiệu điều khiển.

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

Servo-wiring_bb
Servo-pot_wiring

Việc nối servo với Arduino của bạn rất đơn giản. Video cung cấp một minh họa rõ ràng về các kết nối (trong video ở phút 04:48). Ba chân trên đầu nối servo được kết nối với Arduino như sau:

  • Dây tín hiệu (thường màu cam hoặc vàng): Kết nối dây này với một chân PWM kỹ thuật số trên Arduino. Ví dụ sử dụng chân 9.
  • Dây nguồn (thường màu đỏ): Kết nối dây này với chân 5V trên Arduino.
  • Dây nối đất (thường màu nâu hoặc đen): Kết nối dây này với một trong các chân GND trên Arduino.

Trong video, người thuyết trình sử dụng dây nhảy đực-đực DuPont để kết nối đầu nối cái trên servo với các chân cắm của Arduino (trong video ở phút 05:23).

Chương trình 1: Điều khiển động cơ Servo (Sweep)

Chương trình đầu tiên này là ví dụ "quét" kinh điển. Nó được thiết kế để thể hiện toàn bộ phạm vi chuyển động của servo bằng cách di chuyển nó qua lại giữa 0 và 180 độ. Đây là một cách tuyệt vời để xác minh rằng hệ thống dây điện của bạn được kết nối đúng và để thấy servo của bạn hoạt động. Video trình bày việc tải mã này lên và quan sát servo quét qua lại (trong video ở phút 09:21).

Để điều khiển servo, mã trước tiên bao gồm thư viện Servo.h tích hợp, giúp đơn giản hóa quá trình tạo ra các tín hiệu điều khiển cần thiết. Sau đó, bạn tạo một đối tượng servo và đặt tên cho nó, như myservo. Trong hàm setup(), bạn gắn đối tượng này vào một chân cụ thể bằng cách sử dụng myservo.attach(9), cho Arduino biết rằng dây tín hiệu của servo được kết nối với chân 9.

Điều kỳ diệu xảy ra trong hàm loop(), sử dụng hai vòng lặp for để di chuyển servo. Vòng lặp đầu tiên tăng biến vị trí pos từ 0 đến 180, di chuyển servo một độ mỗi lần. Vòng lặp thứ hai làm ngược lại, giảm pos từ 180 về 0. Phần quan trọng là delay(15) ở cuối mỗi lần lặp của vòng lặp. Khoảng dừng này cho servo đủ thời gian để di chuyển vật lý đến vị trí mới trước khi lệnh tiếp theo được gửi đi. Nếu không có độ trễ này, servo sẽ không thể theo kịp và sẽ bị kẹt hoặc rung lắc (trong video ở phút 12:31).

Ví dụ này hoàn hảo cho việc học, nhưng trong một ứng dụng thực tế, bạn có thể sẽ muốn đặt servo ở một góc cụ thể. Như được hiển thị trong video, bạn có thể sửa đổi mã bằng cách thay thế các vòng lặp for bằng một lệnh duy nhất như myservo.write(90) để di chuyển servo đến 90 độ và giữ nó ở đó (trong video ở phút 10:09).

Chương trình 2: Điều khiển động cơ Servo (Knob)

Chương trình thứ hai này đưa việc điều khiển servo tiến thêm một bước bằng cách giới thiệu một chiết áp (núm xoay) để cung cấp khả năng điều khiển thủ công theo thời gian thực đối với vị trí của servo. Đây là một cách tuyệt vời để hiểu cách đầu vào tương tự có thể được chuyển đổi thành chuyển động vật lý chính xác.

Chương trình này được xây dựng dựa trên chương trình trước bằng cách thêm một chiết áp. Chiết áp là một điện trở biến đổi hoạt động như một bộ chia điện áp tương tự. Khi bạn xoay núm, nó sẽ thay đổi điện áp tại chân đầu ra. Arduino đọc điện áp này bằng bộ chuyển đổi tương tự sang số (ADC) trên một trong các chân analog của nó, chuyển đổi thành giá trị từ 0 đến 1023.

Chìa khóa của chương trình này là hàm map(). Hàm này chia tỷ lệ một số từ dải này sang dải khác. Trong trường hợp này, nó được sử dụng để chuyển đổi giá trị thô của chiết áp (0 đến 1023) thành giá trị phù hợp cho servo (0 đến 180 độ). Mã đọc giá trị của chiết áp bằng analogRead(potpin), chia tỷ lệ bằng map(val, 0, 1023, 0, 180), sau đó gửi giá trị đã chia tỷ lệ đó đến servo bằng myservo.write(val). Điều này tạo ra một liên kết trực tiếp, trong đó xoay núm đến điểm giữa sẽ đặt servo ở góc 90 độ, và cứ thế tiếp tục.

Phương pháp điều khiển này rất trực quan và là nền tảng cho nhiều giao diện người-máy, từ điều khiển từ xa đơn giản đến bộ điều khiển robot phức tạp.

Trình Diễn Dự Án Trực Tiếp

Video cung cấp một buổi trình diễn trực tiếp cả hai chương trình đang hoạt động. Đối với chương trình quét, bạn có thể thấy cánh tay servo di chuyển mượt mà từ 0 đến 180 độ và quay lại. Người thuyết trình cũng cho thấy cách điều chỉnh kích thước bước trong vòng lặp for (ví dụ: từ 1 độ lên 20 độ) và thời gian trễ thay đổi hành vi của servo, làm cho chuyển động nhanh hơn nhưng kém mượt mà hơn (trong video ở phút 11:19).

Đối với chương trình núm xoay, buổi trình diễn cho thấy cách xoay chiết áp điều khiển trực tiếp vị trí của servo theo thời gian thực. Phản hồi trực quan này rất tuyệt vời để hiểu mối quan hệ giữa đầu vào tương tự và đầu ra vật lý.

Các Chương

  • [00:00] Giới thiệu về Động cơ Servo
  • [01:07] Ứng dụng của Động cơ Servo
  • [02:57] Cấu tạo của Động cơ Servo
  • [04:48] Kết nối Servo với Arduino
  • [06:06] Khám phá Mã Ví dụ Quét
  • [09:21] Trình diễn Chương trình Quét
  • [10:04] Đặt Góc Servo Tùy chỉnh
  • [11:19] Sửa đổi Tốc độ Quét và Kích thước Bước
  • [13:15] Ví dụ về Một Động cơ Servo Khác

Hình ảnh

SG90_servo_motor-1
SG90_servo_motor-1
SG90 servo
SG90 servo
Servo-pot_wiring
Servo-pot_wiring
Servo-wiring_bb
Servo-wiring_bb
914-Lesson 18/31: Controlling servo motor (sweep)
Ngôn ngữ: C++
/*
Lesson 18/31: Controlling servo motor (sweep)
Get this code and watch video Download and resource page https://robojax.com/RJT601
YouTube video https://www.youtube.com/watch?v=KAt1WUWpHLQ
 
  
 * 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 download 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 pos = 0;    // variable to store the servo position

void setup() {
  myservo.attach(9);  // attaches the servo on pin 9 to the Servo object
}

void loop() {
  for (pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees
    // in steps of 1 degree
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);                       // waits 15 ms for the servo to reach the position
  }
  for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);                       // waits 15 ms for the servo to reach the position
  }
}
915-Lesson 18/31: Controlling servo motor (knob)
Ngôn ngữ: C++
/*
Lesson 18/31: Controlling servo motor (knob)
Get this code and watch video Download and resource page https://robojax.com/RJT601
YouTube video https://www.youtube.com/watch?v=KAt1WUWpHLQ
 
  
 * 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 download 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

int potpin = 0;  // analog pin used to connect the potentiometer
int val;    // variable to read the value from the analog pin

void setup() {
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
}

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
  delay(15);                           // waits for the servo to get there
}

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

Tập tin📁

Thư viện Arduino (tệp nén)