Hướng dẫn sử dụng động cơ Servo SG90 với Arduino
Động cơ Servo SG90 Arduino là một loại động cơ có kích thước khá nhỏ, giá thành thấp và được sử dụng rộng rãi trong lập trình Arduino. Nó được sử dụng trong một số dự án mình đã triển khai như: Robot dò line tránh vật cản, cánh tay Robot 4 bậc…
Trong bài viết hôm nay bạn sẽ học được gì? Sẽ nắm rõ hơn về cấu tạo cũng như nguyên lý hoạt động của động cơ Servo SG90. Qua đó sẽ thực hành bằng những chương trình đơn giản như quay động cơ một góc 180 độ và điều khiển góc quay thông qua một biến trở.
Để tạo động lực cho Team Arduino KIT ra nhiều bài viết chất lượng hơn, các bạn có thể ủng hộ mình bằng cách Donate qua MoMo, Ngân hàng, Paypal…Nhấn vào link bên dưới nhé.
Xem ngay: Động cơ RC Servo là gì?
Tổng quan về động cơ Servo
Cấu tạo bên trong động cơ Servo SG90 Arduino bao gồm:
Động cơ DC: Động cơ DC chịu trách nhiệm tạo ra chuyển động quay của trục đầu ra. Điện áp được cấp vào động cơ để tạo ra xoắn (lực) xoay.
Hệ thống điều khiển: Hệ thống điều khiển bao gồm bộ điều khiển và mạch phản hồi. Bộ điều khiển nhận tín hiệu điều khiển từ nguồn điều khiển (như Arduino) và điều chỉnh tín hiệu đầu vào để kiểm soát chuyển động của động cơ. Mạch phản hồi (potentiometer) được gắn kết với trục đầu ra để cung cấp thông tin về vị trí hiện tại của động cơ.
Hệ thống giảm tốc: Động cơ Servo SG90 thường đi kèm với hệ thống giảm tốc để tăng lực xoắn và giảm tốc độ quay của động cơ. Hệ thống giảm tốc giúp đạt được độ chính xác cao hơn trong việc điều chỉnh vị trí.
Động cơ Servo SG90 hoạt động như thế nào?
Quá trình hoạt động của động cơ Servo SG90 như sau:
Nhận tín hiệu điều khiển: Tín hiệu điều khiển PWM (Pulse Width Modulation) được cung cấp từ nguồn điều khiển, như Arduino. Tín hiệu này có thể được điều chỉnh trong khoảng từ 1 ms đến 2 ms và có chu kỳ là 20 ms.
Điều chỉnh vị trí: Bộ điều khiển nhận tín hiệu điều khiển và so sánh nó với vị trí hiện tại của động cơ được xác định bởi mạch phản hồi. Dựa trên sự khác biệt giữa vị trí yêu cầu và vị trí hiện tại, bộ điều khiển điều chỉnh tín hiệu điều khiển để tạo ra chuyển động quay của động cơ.
Phản hồi vị trí: Mạch phản hồi (potentiometer) gửi thông tin về vị trí hiện tại của động cơ cho bộ điều khiển. Bộ điều khiển sử dụng thông tin này để đảm bảo rằng động cơ đạt được vị trí yêu cầu và duy trì nó trong quá trình hoạt động.
Điều chỉnh liên tục: Quá trình điều chỉnh vị trí và phản hồi được thực hiện liên tục để duy trì độ chính xác và ổn định của vị trí đầu ra của động cơ.
Sơ đồ chân động cơ Servo SG90 Arduino
- 5V: Chân dương dùng để cấp nguồn cho động cơ servo.
- GND: Chân âm nối đất.
- Control: Chân tín hiệu điều khiển để điều chỉnh vị trí của động cơ. Tín hiệu điều khiển được gửi dưới dạng xung PWM.
Các linh kiện cần thiết cho dự án
TÊN LINH KIỆN | SỐ LƯỢNG | NƠI BÁN |
Arduino Uno R3 | 1 | Shopee | Cytron |
Động cơ Servo SG90 | 1 | Shopee | Cytron |
Biến trở 10K | 1 | Shopee | Cytron |
Dây cắm | 10-20 | Shopee | Cytron |
Breadboard | 1 | Shopee | Cytron |
Sơ đồ đấu nối động cơ Servo với Arduino Uno
Code Servo SG90 Arduino 1 – Sweep
Mình sẽ sử dụng một ví dụ mẫu có trên Arduino IDE, chương trình Sweep sẽ thực hiện quá trình quét từ góc 0 đến 180 độ và sau đó quét lại từ 180 đến 0 độ.
#include <Servo.h> int servoPin = 9; Servo servo; int angle = 0; // servo position in degrees void setup() { servo.attach(servoPin); } void loop() { // scan from 0 to 180 degrees for(angle = 0; angle < 180; angle++) { servo.write(angle); delay(15); } // now scan back from 180 to 0 degrees for(angle = 180; angle > 0; angle--) { servo.write(angle); delay(15); } }
Giải thích Code
#include <Servo.h>
Khai báo thư viện Servo vào chương trình Arduino.
int servoPin = 9;
Khai báo biến servoPin
và gán giá trị là số chân kết nối với động cơ Servo trên Arduino.
Servo servo;
Khai báo một đối tượng servo từ lớp Servo, sẽ được sử dụng để điều khiển động cơ Servo.
int angle = 0; // servo position in degrees
Khai báo biến angle
để lưu giữ góc quay hiện tại của động cơ Servo.
void setup() { servo.attach(servoPin); }
Hàm setup()
được gọi một lần khi Arduino khởi động. Trong hàm này, gắn đối tượng servo với chân servoPin bằng cách sử dụng phương thức attach().
void loop() { // scan from 0 to 180 degrees for(angle = 0; angle < 180; angle++) { servo.write(angle); delay(15); } // now scan back from 180 to 0 degrees for(angle = 180; angle > 0; angle--) { servo.write(angle); delay(15); } }
Hàm loop()
được thực thi liên tục sau khi Arduino khởi động. Trong hàm này, sẽ thực hiện quá trình quét từ góc 0 đến 180 độ và sau đó quét lại từ 180 đến 0 độ.
Các vấn đề thường gặp
Một vấn đề hay thường gặp ở động cơ Servo SG90 là khi sử dụng nguồn chung với Arduino, lúc khởi động hay bị Reset, lý do đơn giản là vì SG90 tiêu thụ điện năng khá lớn. Để giải quyết vấn đề này, các bạn cần mắc thêm một con tụ hóa (Tụ phân cực) ở đầu vào nguồn cấp. Sử dụng tụ có giá trị từ (470µF – 1000µF)
Code Arduino 2 – Điều khiển Servo bằng biến trở
Trong ví dụ này mình sẽ dùng một biến trở để điều khiển động cơ Servo SG90, chuẩn bị một biến trở 10K và đấu nối vào chân A0 trên mạch Arduino.
Sơ đồ đấu nối
Code
#include <Servo.h> int potPin = 0; int servoPin = 9; Servo servo; void setup() { servo.attach(servoPin); } void loop() { int reading = analogRead(potPin); int angle = map(reading, 0, 1023, 0, 180); servo.write(angle); }
Giải thích Code
int potPin = 0;
Khai báo biến potPin và gán giá trị là số chân kết nối với cảm biến potentiometer trên Arduino. Ở đây mình dùng chân A0.
int reading = analogRead(potPin);
Đọc giá trị từ cảm biến potentiometer thông qua chân potPin và lưu trữ giá trị đọc vào biến reading.
int angle = map(reading, 0, 1023, 0, 180);
Sử dụng hàm map()
để chuyển đổi giá trị đọc từ cảm biến potentiometer (nằm trong khoảng 0 đến 1023) thành một giá trị góc tương ứng (nằm trong khoảng 0 đến 180). Kết quả được lưu trữ trong biến angle.
servo.write(angle);
Gửi giá trị góc angle tới động cơ Servo bằng cách sử dụng phương thức write(). Động cơ Servo sẽ quay đến góc tương ứng với giá trị góc angle.