Học

Control a servo motor with an Arduino and a potentiometer

Cơ bản

Hoặc xem mọi bài học.

  • 503linh kiện trên bàn làm mạch
  • 44bo mạch đang chạy
  • 1.00xthời gian thực, trên mọi bo mạch
Arduino Uno: servo theo biến trở trượtlive0.000 s 0.00x
Nhấp để mở trong trình soạn thảo
Ví dụ servo: một biến trở trượt ở A0 đặt góc quay của servo ở chân 9. Mở trong trình soạn thảo để kéo thanh trượt.

Servo là cách dễ nhất để Arduino di chuyển một thứ tới đúng một góc: ba dây, một chân tín hiệu, và một con số từ 0 đến 180. Mạch ở trên là một servo kiểu SG90 ở chân 9 của Arduino Uno, với một biến trở trượt ở A0 quyết định cần servo chỉ về đâu. Nó đang chạy trong trình duyệt của bạn trên một ATmega328P mô phỏng.

Mở nó trong trình soạn thảo và kéo thanh trượt khi mạch đang chạy: cần servo di chuyển tới góc mới với tốc độ của một SG90 thật, và Serial Monitor in ra giá trị đọc và góc mỗi khi chúng thay đổi.

What you need

  • Một Arduino Uno
  • Một servo SG90 (hoặc tương tự)
  • Một biến trở 10 k (ở đây là biến trở trượt; biến trở xoay nối dây y như vậy)
  • Một breadboard và dây cắm

Wiring

Linh kiện và chânNối tớiGhi chú
Dây nâu của servo (GND)GND
Dây đỏ của servo (VCC)5 VDưới 4 V servo hoàn toàn không chuyển động
Dây cam của servo (tín hiệu)Chân 9Chân digital nào cũng được
Đầu 1 của biến trở5 V
Đầu 3 của biến trởGND
Chân giữa của biến trởA0Đọc từ 0 đến 1023 trên toàn hành trình

Servo thật sự nghe theo cái gì

Dây tín hiệu của servo không nhận PWM theo kiểu LED nhận. Chu kỳ làm việc chẳng có ý nghĩa gì với nó. Thứ nó đo là độ rộng của mỗi xung: theo các con số của thư viện Servo, 544 micro giây đưa cần servo về một đầu, 2400 micro giây về đầu kia và 1472 micro giây ở giữa, lặp lại khoảng năm mươi lần mỗi giây. Servo giữ vị trí theo lệnh cuối cùng nó nhận được và di chuyển tới đó với tốc độ riêng, khoảng một phần mười giây cho sáu mươi độ.

Đó cũng là lý do bạn không thể điều khiển servo bằng analogWrite() trên Uno. PWM của Uno chạy ở khoảng 490 hoặc 980 hertz, quá nhanh để servo đọc ra độ rộng xung. Thư viện Servo tự tạo xung.

Giải thích code

Sketch đọc biến trở bốn lần và lấy trung bình, để cần servo không bị giật theo bit cuối cùng đầy nhiễu của bộ chuyển đổi. map() biến 0 đến 1023 thành 0 đến 180 độ, write() gửi xung tương ứng, và vòng lặp chờ 20 mili giây, đúng bằng chu kỳ khung của servo. Góc chỉ được in ra khi nó thay đổi, nên Serial Monitor đọc lên như một câu văn chứ không phải một thác số.

Vòng lặp, trích từ ví dụ servo (đã rút gọn)
void loop() {
  long sum = 0;
  for (int i = 0; i < 4; i++) {
    sum += analogRead(FADER);
  }
  int reading = (int)(sum / 4);
  int angle = (int)map(reading, 0, 1023, 0, 180);

  horn.write(angle);
  delay(20);
}

Làm điều tương tự với thư viện Servo

Ví dụ có sẵn dùng header servo riêng của Mokxi, nhưng các lệnh của thư viện Arduino Servo biên dịch được nguyên vẹn, trên mọi bo mạch biên dịch trong trình duyệt. Sketch sweep kinh điển bên dưới chạy mà không cần sửa, với độ rộng xung của thư viện gốc: attach(pin) dùng 544 đến 2400 micro giây, write(90) gửi 1472, và attach(pin, min, max) đặt một khoảng khác. Có một khác biệt nhỏ đáng biết: mỗi lệnh write() gửi một xung chứ không khởi động một timer, nên sketch cần servo giữ vị trí khi có tải thì phải gọi refresh() từ loop().

Với bài hướng dẫn ESP32, ESP32Servo.h là cùng lớp đó dưới cái tên mà các bài hướng dẫn ấy dùng.

Sketch sweep của thư viện Servo, khi biên dịch ở đây
#include <Servo.h>

Servo myservo;

void setup() {
  myservo.attach(9);
}

void loop() {
  for (int pos = 0; pos <= 180; pos++) {
    myservo.write(pos);
    delay(15);
  }
}

Thử trong trình soạn thảo

Mở mạch trong trình soạn thảo và đổi lời gọi map() thành map(reading, 0, 1023, 45, 135). Giờ thanh trượt chỉ điều khiển chín mươi độ ở giữa, đó là cách làm cho núm vặn điều chỉnh tinh hơn trên một khoảng nhỏ hơn.

Sau đó chọn servo và xem các thuộc tính của nó: min_pulse, max_pulse, range và speed. Đặt speed thành 60 độ mỗi giây và kéo thanh trượt thật nhanh; giờ cần servo bò theo sau, như một servo lớn, chậm. min_pulse và max_pulse mặc định là 544 và 2400, đúng khoảng của thư viện Servo; một servo được thiết lập bằng attach(pin, 1000, 2000) thì cũng cần đặt 1000 và 2000 ở đó.

Để điều khiển servo thứ hai, kéo một servo nữa lên khung vẽ, nối dây tín hiệu của nó vào chân 10, và thêm một đối tượng Servo thứ hai trong sketch.

Common mistakes

Cấp nguồn servo từ bo mạch và nghĩ là sẽ ổn. Ngoài đời, một SG90 có thể kéo một phần tư ampe khi bị kẹt, đủ để làm sụt áp một Uno chạy bằng USB, và đó là lý do hay gặp nhất khiến dự án servo tự khởi động lại. Trình mô phỏng không mô phỏng dòng điện của nguồn cấp, nên một mạch sẽ bị sụt áp trên bàn của bạn lại chạy êm ở đây. Nếu bạn lắp thật, hãy cho servo một nguồn 5 volt riêng và nối chung GND.

Quên nối chung GND. Tín hiệu được đo so với GND của chính servo, nên nếu hai nguồn không có điểm chung nào thì xung cũng chẳng có nghĩa gì.

Yêu cầu những góc mà servo không với tới. Một xung vượt quá một trong hai đầu khoảng của servo sẽ để cần servo ở đầu đó, y như một SG90 thật gồng lên chống lại điểm chặn cuối. Nếu cần servo dừng trước khi tới 0 hoặc 180, hãy kiểm tra xem khoảng trong attach() có khớp với min_pulse và max_pulse của servo không.

Cập nhật servo trong một vòng lặp liên tục không có delay. Gửi xung nhanh hơn 20 mili giây một lần chẳng được thêm gì, vì servo chỉ cập nhật theo tốc độ khung của riêng nó.

Câu hỏi

Những chân Arduino nào điều khiển được servo?

Chân digital nào cũng được. Thư viện tạo xung bằng phần mềm, nên servo không cần một trong các chân PWM có dấu ngã.

Có điều khiển hai servo cùng lúc được không?

Được. Tạo hai đối tượng Servo trên hai chân và ghi cho từng cái. Khi có hơn một servo thật, hãy cho chúng nguồn riêng, vì dòng điện sẽ cộng dồn.

Vì sao servo của mình bị rung giật?

Thường là vì giá trị đọc mà nó bám theo bị nhiễu. Lấy trung bình vài mẫu analogRead(), như sketch này làm, hoặc bỏ qua các thay đổi một hai độ, sẽ làm nó ổn định. Trên phần cứng thật, nguồn bị sụt áp cũng gây rung giật.

Servo và động cơ bước khác nhau thế nào?

Servo đi tới một góc và giữ ở đó, với bộ phản hồi riêng bên trong, thường trong khoảng 180 độ. Động cơ bước quay theo số bước đếm được, bao xa cũng được, và không hề biết mình đang ở đâu trừ khi bạn đếm. Bài hướng dẫn động cơ bước nói về 28BYJ-48.

Lắp mạch này ngoài đời

Mở trình soạn thảo, đổi một giá trị và xem con số thay đổi theo. Không cần cài gì, không cần tài khoản.