Điện tử

Code điều khiển 2 servo bằng Arduino

Trong hướng dẫn Code điều khiển 2 servo bằng Arduino , chúng ta sẽ xem xét cách hoạt động của động cơ servo và cách sử dụng Arduino để điều khiển chúng. Chúng tôi cũng sẽ xem xét hai chương trình ví dụ bạn có thể chạy trên Arduino. Chương trình đầu tiên sẽ chỉ cho bạn cách điều khiển hướng và vị trí của một servo bằng cách sử dụng hai nút nhấn. Chương trình thứ hai sẽ hướng dẫn bạn cách sử dụng chiết áp để điều khiển vị trí của servo.

Code điều khiển 2 servo bằng Arduino
Code điều khiển 2 servo bằng Arduino

Một trong những ứng dụng đầu tiên của động cơ servo là điều khiển cơ cấu lái của máy bay RC, ô tô và thuyền. Ngày nay, bạn có thể tìm thấy chúng trong robot, thiết bị công nghiệp và nhiều dự án Arduino khác nhau. Động cơ servo có khả năng điều khiển chính xác chuyển động quay của trục động cơ. Chúng cho phép bạn đặt góc quay chính xác bằng Code hoặc bằng các đầu vào như cần điều khiển, nút nhấn hoặc chiết áp. Hãy tham khảo với CDK nhé !

Servo hoạt động như thế nào ?

Servos là động cơ điện một chiều được giảm tốc độ để giảm tốc độ và tăng mô-men xoắn của động cơ. Họ cũng đã tích hợp sẵn các mạch điều khiển góc quay từng độ một và giữ vị trí đó cho đến khi nhận được đầu vào khác. Servos sẽ quay một số độ nhất định tùy thuộc vào độ rộng của các xung điện được cung cấp bởi Arduino:

Servo hoạt động như thế nào ?
Servo hoạt động như thế nào ?

Servo mong đợi một xung sau mỗi 20 ms. Đối với hầu hết các servo, xung 1 ms dẫn đến xoay 0 độ, xung 1,5 ms dẫn đến xoay 90 độ và xung 2 ms dẫn đến xoay 180 độ.

Sơ đồ điều khiển 2 servo bằng arduino

Bây giờ chúng ta hãy xem cách sử dụng Arduino để điều khiển động cơ servo. Đây là những thành phần bạn sẽ cần để thiết lập các dự án ví dụ được thảo luận bên dưới:

Sơ đồ điều khiển 2 servo bằng arduino
Sơ đồ điều khiển 2 servo bằng arduino
  • Arduino Uno
  • SG90 Micro Servo
  • Chiết áp 10K
  • Điện trở
  • Tụ điện
  • Giá đỡ pin AA 4X

Tùy thuộc vào servo bạn sử dụng (đặc biệt là loại lớn hơn), bạn nên sử dụng nguồn điện DC riêng để cấp nguồn cho nó. Nếu không, dòng điện do servo rút ra có thể làm hỏng Arduino của bạn.

Sơ đồ mạch điều khiển từ xa xe đồ chơi 12V

Code điều khiển 2 servo bằng Arduino

Chúng tôi sẽ sử dụng thư viện Servo tích hợp của Arduino để lập trình servo. Thư viện này được bao gồm với Arduino IDE, vì vậy không cần cài đặt nó.

Code điều khiển 2 servo bằng Arduino
Code điều khiển 2 servo bằng Arduino

Khi bạn đã kết nối các bộ phận theo sơ đồ đấu dây ở trên, hãy mở Arduino IDE và tải Code này lên bảng:

#include <Servo.h>
Servo servo1;
int servoPin = 9;

void setup(){
  servo1.attach(servoPin);
}

void loop(){
  servo1.write(0);
  delay(1000);
  servo1.write(90);
  delay(1000);
  servo1.write(180);
  delay(1000);
}

Mô tơ servo phải di chuyển về 0 độ, tạm dừng trong một giây, sau đó di chuyển đến 90 độ, tạm dừng trong một giây, sau đó di chuyển sang 180 độ, tạm dừng trong một giây, sau đó bắt đầu lại.

Trên dòng đầu tiên, chúng tôi bao gồm thư viện Servo với #include <Servo.h>. Trên dòng tiếp theo, chúng tôi tạo một đối tượng được gọi servo1để tham chiếu đến động cơ servo cụ thể trong toàn bộ Code. Trên dòng tiếp theo, chúng tôi khai báo một biến pin được gọi serverPinvà đặt nó bằng chân 9 của Arduino.

Trong phần thiết lập, chúng tôi khởi tạo servo với attach()chức năng. Hàm attach()nhận một tham số – chân cắm mà servo được kết nối với. Vì vậy, chúng tôi có servo1.attach(servoPin).

Để di chuyển servo, hãy sử dụng write()hàm có góc quay làm đối số. Góc tính bằng độ, từ 0 độ đến 180 độ. Góc thay đổi độ rộng xung được gửi đến động cơ servo, sau đó xác định số lượng vòng quay. Chúng tôi đang gọi hàm thông qua servo1đối tượng, vì vậy chúng tôi sử dụng servo1.write(angle), với 0 độ, 90 độ và 180 độ.

Phân tích hàm writeMicroseconds()

Chức write()năng này sẽ hoạt động với hầu hết các Servos, nhưng không phải tất cả. Một số động cơ servo có phạm vi 180 độ, một số có phạm vi 90 độ và một số có bất kỳ vị trí nào ở giữa. Sử dụng write()chức năng chỉ cho phép tối đa 180 bước. Tuy nhiên, có một chức năng cho phép lên đến 1000 bước, được gọi là writeMicroseconds(). Nếu bạn muốn kiểm soát chính xác hơn servo của mình, bạn có thể muốn sử dụng writeMicroseconds()chức năng này thay vì write().

Bản phác thảo dưới đây trình bày cách sử dụng writeMicroseconds()hàm:

#include <Servo.h>
Servo servo1;
int servoPin = 9;

void setup(){
  servo1.attach(servoPin);
}

void loop(){
  servo1.writeMicroseconds(1000);
  delay(1000);
  servo1.writeMicroseconds(1500);
  delay(1000);
  servo1.writeMicroseconds(2000);
  delay(1000);
}

Trong bản Code phác thảo này, chúng tôi đã thay thế mỗi write()chức năng bằng một writeMicroseconds()chức năng. Thay đổi các giá trị góc từ (0, 90, 180) độ thành (1000, 1500, 2000) micro giây. Tải lên và chạy chương trình bằng cách sử dụng cùng một thiết lập phần cứng. Đối với động cơ servo có phạm vi lên đến 180, các giá trị sẽ là 1000 micro giây = 0 độ, 1500 micro giây = 90 độ và 2000 micro giây = 180 độ.

Tùy thuộc vào động cơ servo bạn đang sử dụng, bạn có thể nhận thấy sự khác biệt. Điều thú vị là trong quá trình thiết lập của tôi, trong khi theo dõi các xung trên máy hiện sóng, tôi nhận thấy rằng khi sử dụng servo1.write(0);, độ rộng xung chỉ khoảng 700 micro giây, không phải 1000, đó là cách hàm sẽ hoạt động khi được đặt ở 0 độ. Nhưng khi sử dụng servo1.writeMicroseconds(1000);đầu ra chính xác là 1000 micro giây.

Code điều khiển servo bằng Arduino với nút bấm

Xây dựng mạch của bạn như được hiển thị trong sơ đồ ở trên, sau đó tải lên Code hiển thị bên dưới.

Code điều khiển servo bằng Arduino với nút bấm
Code điều khiển servo bằng Arduino với nút bấm
#include<Servo.h>
int pos = 90;
int pin4 = 4;
int pin3 = 3;
int LedHi = 5;
int LedLow = 6;
Servo servo1;

void setup() {
  pinMode(LedHi, OUTPUT);
  pinMode(LedLow, OUTPUT);
  pinMode(pin4, INPUT);
  pinMode(pin3, INPUT);
  Serial.begin(9600);
  servo1.attach(9);
}

void loop() {
  while (digitalRead(pin3) == HIGH && pos < 180) {
    digitalWrite(LedLow, LOW);
    pos++;
    servo1.write(pos);
    Serial.print("Degrees rotation= ");
    Serial.println(pos);
    if (pos == 180) {
      Serial.print("Reached top end ");
      digitalWrite(LedHi, HIGH);
    }
    delay(10);
  }

  while (digitalRead(pin4) == HIGH && pos > 0) {
    digitalWrite(LedHi, LOW);
    pos--;
    servo1.write(pos);
    Serial.print("Degrees rotation= ");
    Serial.println(pos);
    if (pos == 0) {
      Serial.print("Reached low end ");
      digitalWrite(LedLow, HIGH);
    }
    delay(10);
  }
}

Sau khi tải lên Code đã biên dịch, hãy mở Trình theo dõi nối tiếp trên Arduino của bạn. Khi bạn nhấn vào một trong hai nút, servo sẽ tăng hoặc giảm như được hiển thị trên Serial monitor. Ban đầu, Code sẽ đặt servo ở 90 độ. Sử dụng nút kết nối với chốt 3 để tăng góc. Khi bạn đạt đến 180 độ, đầu cao của vòng quay, đèn LED được kết nối với chân 5 sẽ bật. Khi bạn đạt đến mức thấp nhất của phạm vi là 0 độ, đèn LED được kết nối với chân 6 sẽ bật.

Để xác định kết quả của lần nhấn nút, câu lệnh while xác minh nút và góc của trục. while (digitalRead(pin3) == HIGH && pos < 180)xác định rằng nút đã được đẩy (CAO) và góc nhỏ hơn 180, vì vậy chương trình thêm một độ và tiếp tục. Nút thứ hai while (digitalRead(pin4) == HIGH && pos > 0)xác định rằng nút đã được đẩy (CAO) và góc lớn hơn 0. Điều này làm cho góc giảm một và lặp lại. Mức LedHi và LedLow cho các đèn LED được điều khiển bởi một câu lệnh if để kiểm tra góc xem nó là 0 hay 180. Các đèn LED sẽ tắt ngay khi góc thay đổi trong mỗi câu lệnh while .

Code điều khiển servo bằng Arduino với chiết áp

Xây dựng mạch điện như trong sơ đồ bằng cách sử dụng chiết áp 10K để điều khiển động cơ servo. Sau đó tải lên Code bên dưới.

#include <Servo.h>
int LowLed = 5;
int HiLed = 6;
Servo servo1;  
int pot = A0; 
int val;   

void setup() {
  servo1.attach(9);  
  pinMode(LowLed, OUTPUT);
  pinMode(HiLed, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  val = analogRead(pot);            
  val = map(val, 0, 1023, 0, 180);     
  servo1.write(val);                  
  Serial.println(val);
  if (val == 0)
    digitalWrite(LowLed, HIGH);
  if (val == 180)
    digitalWrite(HiLed, HIGH);
  if (val > 0)
    digitalWrite(LowLed, LOW);
  if (val < 180)
    digitalWrite(HiLed, LOW);
  delay(10);
}

Sau khi tải Code lên, hãy mở Serial monitor trên Arduino của bạn. Khi bạn điều chỉnh chiết áp, vòng quay của servo sẽ thay đổi tương ứng. Khi bạn đạt đến giới hạn dưới của phạm vi, đèn LED Thấp sẽ bật và khi bạn đạt đến giới hạn trên, đèn LED Cao sẽ bật.

Code rất đơn giản. Dòng Code đầu tiên trong loop()hàm phải là:

val = analogRead(pot);            
val = map(val, 0, 1023, 0, 180);     
servo1.write(val);  

analogRead()lấy điện áp từ chiết áp như một tín hiệu tương tự. Nó chấp nhận các giá trị của toàn bộ phạm vi đầu vào được chấp nhận trong Arduino (0-5V). Nó nắm bắt nó dưới dạng một số nguyên trong phạm vi (0-1023). Vì vậy, ví dụ, một giá trị DC 0V sẽ được ghi lại là số nguyên 0; giá trị toàn dải 5V sẽ được ghi lại dưới dạng số nguyên 1023 và một nửa dải đầu vào 2,5V sẽ được ghi lại dưới dạng số nguyên 512, một nửa của 1023.

Dòng Code tiếp theo ánh xạ giá trị của val trong phạm vi 0, 1023, thành giá trị 0, 180. val = map(val, 0, 1023, 0, 180);

Dòng Code tiếp theo servo1.write(val);là write()lệnh lấy số nguyên được lưu trữ trong val làm đối số và áp dụng nó cho servo. Servo nhận một xung từ servo1.write(val);và độ rộng xung được xác định bởi giá trị của val . Servo sử dụng độ rộng của xung này để xác định vòng quay của nó.

Video Code điều khiển 2 servo bằng Arduino

CDK - CĐ Văn Hóa Nghệ Thuật Và Du Lịch Nha Trang

Trường Cao đẳng Văn hóa Nghệ thuật & Du lịch Nha Trang CDK chính thức được thành lập. Năm 2005, nhà trường được vinh dự đón nhận phần thưởng cao quý của Nhà nước : Huân chương Lao động Hạng Ba.

Related Articles

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 *

Back to top button