Trong hướng dẫn này, chúng ta sẽ điều khiển một động cơ Servo bằng Arduino Uno. Động cơ Servo được sử dụng khi cần có sự di chuyển chính xác trục hoặc vị trí. Loại động cơ này không phù hợp cho các ứng dụng tốc độ cao. Nó chỉ phù hợp với các ứng dụng có tốc độ thấp, mô-men xoắn trung bình và đòi hỏi vị trí chính xác. Những động cơ này thường được sử dụng trong các máy cánh tay robot, điều khiển bay và hệ thống điều khiển.
Chuẩn bị
Phần cứng
Linh kiện | Số lượng |
Arduino Uno | 1 |
Động cơ servo SG90 | 1 |
Tụ điện 100 μF | 1 |
Biến trở 10kΩ | 1 |
Breadboard | 1 |
Dây cắm Breadboard |
Phần mềm: Arduino IDE
Giới thiệu động cơ Servo
Động cơ Servo là động cơ tốc độ thấp, mô-men xoắn cao với nhiều hình dạng và kích cỡ khác nhau. Không giống như động cơ DC và động cơ bước, động cơ Servo thường không quay tròn đủ 360 độ. Thay vào đó nó được giới hạn trong một phạm vi 180, 270 hoặc 90 độ.
Khác với động cơ thông thường ta chỉ cần cấp nguồn cho động cơ là có thể vận hành được. Động cơ servo yêu cầu ta phải cấp nguồn (2 dây) và nhận điều khiển từ mạch chính (1 dây), mỗi dây thường được đánh màu như sau:
- Đỏ: nhận điện nguồn, tuỳ vào loại động cơ mà giá trị này có thể khác nhau
- Đen/Nâu: nối với cực âm của mạch
- Vàng/Cam: nhận tín hiệu từ mạch điều khiển
Động cơ servo là sự kết hợp của động cơ DC, hệ thống điều khiển vị trí, bánh răng. Vị trí của trục của động cơ DC được điều chỉnh bởi các thiết bị điện tử điều khiển trong servo, dựa trên tỷ số nhiệm vụ (duty ratio) của tín hiệu PWM ở chân SIGNAL.
Nói một cách đơn giản điện tử điều khiển điều chỉnh vị trí trục bằng cách điều khiển động cơ DC. Dữ liệu liên quan đến vị trí của trục được gửi qua chân SIGNAL. Dữ liệu vị trí để điều khiển phải được gửi dưới dạng tín hiệu PWM thông qua chân tín hiệu (SIGNAL) của động cơ servo.
Tần số của tín hiệu PWM (Pulse Width Modulated) có thể thay đổi tùy theo loại mô tơ servo. Điều quan trọng ở đây là hệ số nhiệm vụ (DUTY RATIO) của tín hiệu PWM. Dựa trên hệ số nhiệm vụ này, các thiết bị điện tử điều khiển điều chỉnh trục.
Trong một mô tơ servo analog thông thường, tín hiệu PWM với khoảng thời gian 20 ms được sử dụng để điều khiển động cơ. Tín hiệu 20 ms có tần số 50 Hz.
Chiều rộng của xung được thay đổi giữa 1 và 2 ms để điều khiển vị trí trục động cơ.
- Độ rộng xung 1ms sẽ làm cho trục servo dừng ở vị trí 0 độ.
- Độ rộng xung 1,5ms sẽ khiến trục servo được đặt ở vị trí 90 độ, vị trí chính giữa hành trình của nó.
- Độ rộng xung 2ms sẽ khiến trục servo nằm ở vị trí 180 độ.
Thay đổi độ rộng xung giữa 1ms và 2ms sẽ di chuyển trục servo thay đổi từ 0 độ đến 180 độ. Bạn có thể đặt trục động cơ ở bất kỳ góc độ nào mà bạn mong muốn bằng cách điều chỉnh độ rộng xung cho phù hợp.
Thí nghiệm 1
Sơ đồ mạch
Chương trình
#include <Servo.h> //khai báo thư viện servo
Servo myservo; //khai báo đối tượng myservo để điều khiển servo
int servoPin = 9; //khai báo chân điều khiển servo
int angle = 0; //đặt vị trí ban đầu của servo theo độ
void setup() {
myservo.attach(servoPin); // cho biết động cơ servo được gắn vào servoPin
}
void loop() {
for (angle = 0; angle <= 180; angle += 1) { //đi từ 0 độ đến 180 độ mỗi bước là 1 độ
myservo.write(angle); // làm cho servo đi đến vị trí trong biến ‘angle’
delay(15); // đợi 15ms để servo đạt được vị trí đó
}
for (angle = 180; angle >= 0; angle -= 1) { // đi từ 180 độ đến 0 độ mỗi bước là 1 độ
myservo.write(angle); // làm cho servo đi đến vị trí trong biến ‘angle’
delay(15); // đợi 15ms để servo đạt được vị trí đó
}
}
Thí nghiệm 2
Sơ đồ mạch
Chương trình
#include <Servo.h> //khai báo thư viện servo
Servo servo; //khởi tạo thư viện servo
int servoPin = 9; //điểu khiển servo qua chân số 9 của Arduino
int potPin = 0; // chân analog được kết nối với biến trở
int val; // biến để đọc giá trị analog từ chân analog
int angle; // biến cho góc mà chúng ta sẽ tính toán
void setup() {
servo.attach(servoPin); // cho biết động cơ servo được gắn vào servoPin
}
void loop() {
val = analogRead(potPin); // đọc giá trị của biến trở (giá trị từ 0 đến 1023)
angle = map(val, 0, 1023, 0, 180); // chuyển giá trị analog (0-1023) đọc được từ biến trở sang số đo độ (0-180 độ)
// dùng để điều khiển góc quay cho servo
servo.write(angle); // cho servo quay một góc là angle độ
delay(15); //
}