fbpx

Động cơ Servo hoạt động | điều khiển Servo bằng Arduino

Trong hướng dẫn này, chúng ta sẽ tìm hiểu cách thức hoạt động của động cơ servo và cách điều khiển động cơ servo bằng trình điều khiển PWM Arduino và PCA9685. Bạn có thể xem video sau hoặc đọc hướng dẫn dưới đây.

Giới thiệu tổng quan về động cơ servo


Có nhiều loại động cơ servo và tính năng chính của chúng là khả năng điều khiển chính xác vị trí của trục. Động cơ servo là một hệ thống vòng kín sử dụng phản hồi vị trí để điều khiển chuyển động và vị trí cuối cùng của nó.

Hệ thống vòng kín
Hệ thống vòng kín

Trong công nghiệp động cơ servo là loại cảm biến phản hồi vị trí, thường là một bộ code hóa có độ chính xác cao, trong khi trong các động cơ RC hoặc nhỏ hơn, cảm biến vị trí thường là một chiết áp đơn giản. Vị trí thực tế được tìm thấy bởi các thiết bị này được đưa trở lại bộ phát hiện lỗi nơi nó được so sánh với vị trí đích. Sau đó, theo lỗi, bộ điều khiển sửa vị trí thực tế của động cơ để khớp với vị trí đích.

Hệ thống vòng kín Servo
Hệ thống vòng kín Servo

Trong hướng dẫn này, chúng tôi sẽ xem xét chi tiết về các động cơ servo thường gặp. Chúng tôi sẽ giải thích cách các servo này hoạt động và cách điểu khiển chúng bằng Arduino.

động cơ servo

Động cơ thường dùng là bộ truyền động kích thước nhỏ được sử dụng để điều khiển xe ô tô, thuyền, máy bay, v.v. Chúng cũng được sử dụng bởi các sinh viên kỹ thuật để chế tạo robot, tạo ra cánh tay robot, robot lấy cảm hứng sinh học, robot hình người, v.v.

robot
Ứng dụng động cơ Servo Robot cánh tay Hexapod Robot hình người

 

Cách thức hoạt động của Servo RC / cổ điển


Bên trong một servo cổ diển có bốn thành phần chính, động cơ DC, hộp số, biến trở và mạch điều khiển. Động cơ DC có tốc độ cao và mô-men xoắn thấp nhưng hộp số giảm tốc độ xuống khoảng 60 vòng / phút, đồng thời tăng mô-men xoắn.

cách động cơ servo hoạt động
Cách thức hoạt động của Servo bên trong các thành phần Mạch điều khiển chiết áp động cơ DC

Chiết áp được gắn trên bánh răng cuối cùng hoặc trục đầu ra, do đó động cơ cũng quay chiết áp, tạo ra một điện áp liên quan đến góc tuyệt đối của trục đầu ra. Trong mạch điều khiển, điện áp chiết áp này được so sánh với điện áp đến từ đường tín hiệu. Nếu cần, bộ điều khiển kích hoạt mạch cầu H tích hợp cho phép động cơ quay theo hai hướng cho đến khi hai tín hiệu đạt mức chênh lệch bằng không.

Một động cơ servo được điều khiển bằng cách gửi một loạt các xung qua đường tín hiệu. Tần số của tín hiệu điều khiển phải là 50Hz hoặc một chu kỳ xung là 20ms. Độ rộng của xung xác định vị trí góc của servo và các loại servo này thường có thể xoay 180 độ (chúng có giới hạn vật lý khi di chuyển).

tín hiệu
Tín hiệu điều khiển động cơ RC Servo

Nói chung các xung có tại 1ms tương ứng với vị trí 0 độ, 1,5ms đến 90 độ và 2ms đến 180 độ. Mặc dù thời gian tối thiểu và tối đa của các xung đôi khi có thể thay đổi theo các loại khác nhau và chúng có thể là 0,5ms cho 0 độ và 2,5ms cho vị trí 180 độ.

 

Điều khiển động cơ Arduino Servo


Chúng ta hãy kiểm tra những thông tin trên và làm một ví dụ thực tế về điều khiển một servo cổ điển bằng Arduino. Tôi sẽ sử dụng MG996R, một động cơ servo mô-men xoắn cao có bánh răng kim loại với mô-men xoắn 10 kg-cm. Mô-men xoắn cao có dòng ổn định của servo là 2.5A. Dòng điện chạy từ 500mA đến 900mA và điện áp hoạt động từ 4,8 đến 7,2V.

Arduino Servo MG996R

Điều khiển động cơ Arduino Servo MG996R

Xếp hạng hiện tại cho thấy rằng chúng tôi không thể kết nối trực tiếp servo này với Arduino, nên chúng tôi phải sử dụng nguồn điện riêng cho nó. Đây là sơ đồ mạch cho ví dụ này.

điều khiển Arduino

Sơ đồ mạch điều khiển Arduino

Chúng ta chỉ cần kết nối chân điều khiển của servo với bất kỳ chân kỹ thuật số nào của board Arduino, kết nối Ground và dây dương với nguồn điện 5V bên ngoài, đồng thời kết nối ground của Arduino với chân GND của servo.

 

Code điều khiển động cơ Servo từ Arduino


Bây giờ chúng ta hãy xem code Arduino để điều khiển động cơ servo. Code rất đơn giản. Chúng ta chỉ cần xác định chân mà servo được kết nối, xác định chân đó là đầu ra và trong phần vòng lặp tạo ra các xung với chu kỳ và tần số cụ thể như chúng ta đã giải thích ở trên.

#define servoPin 9

void setup() {
  pinMode(servoPin, OUTPUT);
}

void loop() {
   // A pulse each 20ms
    digitalWrite(servoPin, HIGH);
    delayMicroseconds(1450); // Duration of the pusle in microseconds
    digitalWrite(servoPin, LOW);
    delayMicroseconds(18550); // 20ms - duration of the pusle
    // Pulses duration: 600 - 0deg; 1450 - 90deg; 2300 - 180deg
}

Sau một số thử nghiệm, tôi đã đưa ra các giá trị sau trong khoảng thời gian các xung hoạt động với servo. Các xung có thời lượng 0,6ms tương ứng với vị trí 0 độ, 1,45ms đến 90 độ và 2,3ms đến 180 độ.

Tôi đã kết nối một thiết bị đo vạn năng nối tiếp với servo để kiểm tra dòng điện. Mức dòng điện tối đa mà tôi nhận thấy là lên tới 0,63A. Vâng, bởi vì đây không phải là bản gốc TowerPro MG996R, mà là bản sao rẻ hơn, rõ ràng có hiệu suất kém hơn.

Động cơ Servo MG996R

Tuy nhiên, chúng ta hãy xem một cách thuận tiện hơn để điều khiển các servo bằng Arduino. Đó là sử dụng thư viện Arduino Arduino.

#include <Servo.h>

Servo myservo;  // create servo object to control a servo

void setup() {
  myservo.attach(9,600,2300);  // (pin, min, max)
}

void loop() {
  myservo.write(0);  // tell servo to go to a particular angle
  delay(1000);
  
  myservo.write(90);              
  delay(500); 
  
  myservo.write(135);              
  delay(500);
  
  myservo.write(180);              
  delay(1500);                     
}

Ở đây chúng ta chỉ cần nạp thư viện, xác định đối tượng servo và sử dụng hàm attach() xác định chân mà servo được kết nối cũng như xác định giá trị tối thiểu và tối đa của thời lượng xung. Sau đó, bằng cách sử dụng hàm write (), chúng ta chỉ cần đặt vị trí của servo từ 0 đến 180 độ. Với thư viện này, chúng ta có thể điều khiển tới 12 servo cùng lúc hoặc 48 servo bằng cách sử dụng board Arduino Mega.

 

Trình điều khiển PWM / Servo Arduino và PCA9685


Ngoài ra còn có một cách khác để điều khiển servo bằng Arduino và đó là sử dụng trình điều khiển servo PCA9685. Đây là trình điều khiển servo và servo 16 kênh 12 bit, giao tiếp với Arduino bằng bus I2C. Nó có một đồng hồ tích hợp để có thể chạy 16 động cơ cùng lúc, hoặc độc lập với Arduino.

Servo Arduino và PCA9685
Trình điều khiển Servo Arduino và PCA9685

Chúng ta có thể xâu chuỗi lên tới 62 trình điều khiển này trên cùng một bus I2C. Vì vậy, về mặt lý thuyết, chúng ta có thể điều khiển tới 992 động cơ chỉ bằng hai chân I2C từ board Arduino. 6 chân chọn địa chỉ được sử dụng để đặt địa chỉ I2C khác nhau cho mỗi trình điều khiển bổ sung. Chúng ta chỉ cần kết nối các miếng hàn theo bảng này.

Board I2CAddress
Địa chỉ PCA9685 Chọn Chân Board I2CAddress

Đây là sơ đồ mạch và chúng ta có thể nhận thấy rằng chúng ta cần một nguồn cung cấp điện riêng cho các servo.

Sơ đồ mạch Arduino và PCA9685
Sơ đồ mạch Arduino và PCA9685

Các linh kiện cần thiết

  • Động cơ Servo MG996R
  • Trình điều khiển Servo PCA9685 PWM
  • Board Arduino
  • Nguồn cung cấp điện 5V- 6A DC

Bây giờ hãy xem code Arduino. Để điều khiển trình điều khiển servo này, chúng ta sẽ sử dụng thư viện PCA9685 có thể tải xuống từ GitHub .

Code Arduino PCA9685


#include <Wire.h>
#include "PCA9685.h"

PCA9685 driver;

// PCA9685 outputs = 12-bit = 4096 steps
// 2.5% of 20ms = 0.5ms ; 12.5% of 20ms = 2.5ms
// 2.5% of 4096 = 102 steps; 12.5% of 4096 = 512 steps
PCA9685_ServoEvaluator pwmServo(102, 470); // (-90deg, +90deg)

// Second Servo
// PCA9685_ServoEvaluator pwmServo2(102, 310, 505); // (0deg, 90deg, 180deg)


void setup() {
  Wire.begin();                 // Wire must be started first
  Wire.setClock(400000);        // Supported baud rates are 100kHz, 400kHz, and 1000kHz
  driver.resetDevices();        // Software resets all PCA9685 devices on Wire line

  driver.init(B000000);         // Address pins A5-A0 set to B000000
  driver.setPWMFrequency(50);   // Set frequency to 50Hz
}
void loop() {
  driver.setChannelPWM(0, pwmServo.pwmForAngle(-90));
  delay(1000);
  driver.setChannelPWM(0, pwmServo.pwmForAngle(0));
  delay(1000);
  driver.setChannelPWM(0, pwmServo.pwmForAngle(90));
  delay(1000);
}

Trước tiên chúng ta cần bao gồm các thư viện và xác định đối tượng PCA9685. Sau đó, sử dụng đối tượng Servo_Evaluator xác định chu kỳ xung hoặc đầu ra PWM của trình điều khiển. Lưu ý rằng các đầu ra là 12 bit, độ phân giải 4096 bước. Vì vậy, thời gian xung tối thiểu là 0,5ms hoặc 0 độ sẽ tương ứng với 102 bước và thời lượng xung tối đa là 2,5ms hoặc 180 độ ở vị trí 512 bước. Nhưng như đã giải thích trước đó, các giá trị này sẽ được điều chỉnh theo động cơ servo của bạn. Trong trường hợp của tôi, giá trị từ 102 đến 470 tương ứng với vị trí 0 đến 180 độ.

Trong phần thiết lập, chúng ta cần xác định tốc độ xung I2C, đặt địa chỉ trình điều khiển và đặt tần số thành 50Hz.

Trong phần vòng lặp, sử dụng các hàm setChannelPWM () và pwmForAngle (), chúng ta chỉ cần đặt servo theo góc mong muốn.

Tôi đã kết nối một servo thứ hai với trình điều khiển và như tôi dự đoán, nó không ở vị trí giống như ban đầu, và đó là vì các động cơ mà tôi đang sử dụng là bản sao rẻ tiền và chúng không đáng tin cậy. Tuy nhiên, đây không phải là vấn đề lớn vì sử dụng phiên bản Servo_Evaluator, chúng ta có thể đặt các cài đặt đầu ra khác nhau cho mỗi servo. Chúng ta cũng có thể điều chỉnh vị trí 90 độ trong trường hợp nó không bắt đầu ở giữa. Theo cách đó, tất cả các servo sẽ hoạt động như nhau và vị trí góc chính xác.

 

Điều khiển nhiều servo với trình điều khiển PCA9685


Chúng ta sẽ tới một ví dụ nữa điều khiển nhiều servo với nhiều trình điều khiển PCA9685.

Điều khiển 22 động cơ Servo với Arduino và PCA9685

Với mục đích đó, chúng ta cần kết nối các trình điều khiển với nhau và kết nối địa chỉ phù hợp chọn miếng hàn. Đây là sơ đồ mạch:

Bây giờ chúng ta hãy xem code Arduino

#include <Wire.h>
#include "PCA9685.h"

PCA9685 driver;

// PCA9685 outputs = 12-bit = 4096 steps
// 2.5% of 20ms = 0.5ms ; 12.5% of 20ms = 2.5ms
// 2.5% of 4096 = 102 steps; 12.5% of 4096 = 512 steps
PCA9685_ServoEvaluator pwmServo(102, 470); // (-90deg, +90deg)

// Second Servo
PCA9685_ServoEvaluator pwmServo2(102, 310, 505); // (0deg, 90deg, 180deg)


void setup() {
  Wire.begin();                 // Wire must be started first
  Wire.setClock(400000);        // Supported baud rates are 100kHz, 400kHz, and 1000kHz
  driver.resetDevices();        // Software resets all PCA9685 devices on Wire line

  driver.init(B000000);         // Address pins A5-A0 set to B000000
  driver.setPWMFrequency(50);   // Set frequency to 50Hz
}
void loop() {
  driver.setChannelPWM(0, pwmServo.pwmForAngle(-90));
  delay(1000);
  driver.setChannelPWM(0, pwmServo.pwmForAngle(0));
  delay(1000);
  driver.setChannelPWM(0, pwmServo.pwmForAngle(90));
  delay(1000);
}

Vì vậy, chúng ta nên tạo đối tượng PCA9685 riêng cho từng trình điều khiển, xác định địa chỉ cho từng trình điều khiển cũng như đặt tần số thành 50Hz. Bây giờ chỉ cần sử dụng các hàm setChannelPWM () và pwmForAngle (), chúng ta có thể đặt bất kỳ servo nào ở bất kỳ trình điều khiển nào để định vị bất kỳ góc nào chúng ta muốn.

Dịch từ: https://howtomechatronics.com/how-it-works/how-servo-motors-work-how-to-control-servos-using-arduino/

One thought on “Module rơle với Arduino

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 *