Bài 14. Điều khiển động cơ servo

Trong bài học này, chúng ta sẽ tìm hiểu cách sử dụng Arduino để điều khiển chuyển động của động cơ servo.

Đầu tiên chúng ta sẽ điều khiển động cơ servo tự động quay và đảo chiều, sau đó chúng ta sẽ thêm vào biến trở để điều khiển vị trí của servo.

Linh kiện cần thiết

STT Tên linh kiện SL Hình ảnh
1 Board Arduino Uno R3 1
2 Dây nguồn USB 1
3 Breadboard mini 1
4 Dây căm breadboard 1
5 Động cơ servo 1
6 Biến trở 10 kΩ 1
7 Tụ điện 100 µF 1

Sơ đồ đấu dây chương trình ‘Sweep’

Trong ví dụ này, đơn giản chỉ kết nối động cơ servo vào Arduino.

Động cơ servo có ba dây. Màu sắc của các dây sẽ khác nhau, nhưng thông thường dây đỏ là 5V, dây GND sẽ có màu đen hoặc nâu. Dây còn lại là dây điều khiển, thường có màu cam hoặc vàng. Dây điều khiển trong ví dụ này được kết nối vào chân số 9 của Arduino.

Nếu động cơ servo không hoạt động tốt

Động cơ servo của bạn có thể không hoạt động được, nguyên nhân có nhân có thể do Arduino đang được cấp nguồn từ cổng USB của máy tính. Vì động cơ bước cần dòng lớn, đặc biệt khi bắt đầu khởi động, có thể làm giảm điện thế trên Arduino, khiến nó tự khởi động lại.

Nếu điều này xảy ra, bạn có thể khắc phục bằng cách thêm một tụ điện có giá trị lớn (470 uF hoặc lớn hơn) giữa chân GND và 5V trên breadboard.

Tụ điện đóng vai trò như một vật trữ điện cho động cơ sử dụng, do đó khi động cơ khởi động nó sẽ được cấp nguồn từ cả tụ điện và Arduino.

Chân dài của tụ điện là chân dương và được kết nối vào 5V. Chân âm thường đường đánh dấu bằng kí hiệu ‘-‘ trên thân của tụ điện.

Code Arduino cho chương trình ‘Sweep’

Hãy nạp đoạn chương trình sau vào Arduino. Bạn sẽ thấy động cơ lập tức quay theo một chiều, sau đó quay ngược trở lại. Đoạn sketch này dựa trên sketch của ví dụ ‘sweep’ mà bạn có thể tìm thấy trong thư mục ‘servo’ của Arduino Examples.

/*
Lesson 14. Sweep
*/

#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);
  }
}

Động cơ servo được điều khiển bởi một loạt các xung và để đơn giản khi sử dụng, một thư viện Arduino được tạo ra để bạn có thể dễ dàng điều khiển động cơ theo các góc mong muốn.

Các lệnh để sử dụng cho servo là các lệnh tích hợp vào Arduino, nhưng bởi vì không phải tất cả các dự án đều sử dụng servo, do đó các lệnh này được đưa vào một thư viện. Nếu bạn dự định sử dụng servo, bạn phải khai báo với Arduino IDE bằng lệnh sau:

#include <Servo.h>

Chúng ta có thể sử dụng một biến ‘servoPin’ để định nghĩa chân dùng để điều khiển servo.

Dòng lệnh:

Servo servo;  

dùng để định nghĩa một biến ‘servo’ có kiểu ‘Servo’. Đây là kiểu do thư viện trên cung cấp, giống như kiểu ‘int’ hay ‘float’, kiểu này đại diện cho một servo. Bạn có thể khai báo tới 8 servo theo cách này, nếu có hai servo, chúng ta có thể khai báo như sau:

Servo servo1;  
Servo servo2;

Trong hàm ‘setup’, chúng ta cân liên kết biến ‘servo’ với chân mà chúng ta sẽ dùng để điều khiển servo đó, sử dụng lệnh sau:

servo.attach(servoPin);

Biến ‘angle’ được dùng để lưu giá trị góc quay hiện tại của servo bằng độ. Trong hàm ‘loop’, chúng ta sử dụng hai vòng lặp ‘for’ để tăng góc quay theo một chiều và sau đó giảm xuống khi nó đạt giá trị 180 độ.

Câu lệnh sau:

servo.write(angle);

sẽ báo cho servo cập nhật lại vị trí góc mới theo biến ‘angle’.

Sơ đồ đấu dây cho chương trình ‘Knob’

Bước tiếp theo của chúng ta là thêm một biến trở để chúng ta có thể điều khiển góc quay của servo thông qua việc điều chỉnh góc quay của biến trở.

Bạn chỉ cần thêm biến trở vào và nối chân từ chân ra tín hiệu của biến trở đến chân A0 của Arduino.

Code Arduino cho chương trình ‘Knob’

Code để làm servo thực hiện góc quay theo vị trí của biến trở đơn giản hơn ví dụ trên.

/*
Adafruit Arduino - Lesson 14. Knob
*/
 
#include <Servo.h> 
 
int potPin = 0;  
int servoPin = 9;
Servo servo; 
 
void setup() 
{ 
  servo.attach(servoPin);  
} 
 
void loop() 
{ 
  int reading = analogRead(potPin);     // 0 to 1023
  int angle = reading / 6;              // 0 to 180-ish
  servo.write(angle);  
}

Trong code này, có một biến thứ hai là ‘potPin’.

Để đặt vị trí của servo, chúng ta sẽ đọc giá trị analog từ chân A0. Giá trị này sẽ nằm trong khoảng từ 0 đến 1023. Vì servo chỉ có thể quay một góc 180 độ, do đó chúng ta cần phải giảm khoảng giá trị này xuống. Chia giá trị đọc được từ biến trở cho 6, chúng ta sẽ nhận được giá trị góc quay của servo trong khoảng từ 0 đến 170.

Động cơ servo

Vị trí góc của động cơ servo được thiết lập bởi chiều rộng của xung. Servo nhận xung trong khoảng 20 mili giây. Nếu xung mức cao trong khoảng 1 mili giây, góc của servo là 0, nếu 1.5 mili giấy, servo sẽ nằm ở vị trí giữa và nếu là 2 mili giây thì sẽ là 180 độ.

Vị trí cuối của servo có thể khác nhau và nhiều servo chỉ có thể quay khoảng 170 độ. Bạn có thể mua động cơ servo ‘liên tục’ có thể quay một góc đủ 360 độ.

Mở rộng

Mở sketch ‘sweep’ và thử giảm thời gian delay từ 15 mili giây xuống 5 mili giây. Hãy theo dõi tốc độ xoay của servo.

Thử hiệu chỉnh sketch ‘knob’, thay vì nhận góc servo từ vị trí của biến trở, nó sẽ nhận giá trị góc thông qua Serial Monitor, do đó bạn có thể điều khiển servo từ máy tính của bạn.

Gợi ý: để sketch của bạn có thể đọc được số góc từ Serial Monitor, bạn có thể dùng hàm Serial.parseInt(). Hàm này sẽ đọc số được nhập từ Serial Monitor.

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Website này sử dụng Akismet để hạn chế spam. Tìm hiểu bình luận của bạn được duyệt như thế nào.