Arduino Cơ cấu chấp hành có phản hồi

Trong một bài hướng dẫn trước, chúng ta đã học về Arduino - Thiết bị chấp hành. Trong bài hướng dẫn này, chúng ta sẽ tìm hiểu về bộ truyền động tuyến tính có phản hồi (hay còn được gọi là bộ truyền động tuyến tính có phản hồi). Phản hồi từ bộ truyền động tuyến tính cung cấp thông tin để xác định vị trí của hành trình của nó, và từ đó điều khiển vị trí. Cụ thể, chúng ta sẽ tìm hiểu:

Phần cứng cần chuẩn bị

1×Arduino Uno R3
1×USB 2.0 cable type A/B (for USB-A PC)
1×USB 2.0 cable type C/B (for USB-C PC)
1×12V Linear Actuator with Feedback
1×L298N Motor Driver Module
1×12V Power Adapter
1×DC Power Jack
1×dây jumper
1×(Khuyến nghị) Screw Terminal Block Shield for Arduino Uno
1×(Khuyến nghị) Breadboard Shield for Arduino Uno
1×(Khuyến nghị) Enclosure for Arduino Uno
1×(Khuyến nghị) Prototyping Base Plate & Breadboard Kit for Arduino UNO

Or you can buy the following kits:

1×DIYables STEM V3 Starter Kit (Arduino included)
1×DIYables Sensor Kit (30 sensors/displays)
1×DIYables Sensor Kit (18 sensors/displays)

Về Bộ Truyền Động Tuyến Tính Có Phản Hồi

Một động cơ truyền động tuyến tính có phản hồi là một động cơ truyền động tuyến tính có tín hiệu phản hồi cho phép xác định vị trí của nó và điều khiển nó. Tín hiệu phản hồi là một biến trở (potentiometer) phát ra giá trị điện áp tỷ lệ với vị trí của hành trình.

Sơ đồ chân của bộ truyền động tuyến tính có phản hồi

Một động cơ tuyến tính có phản hồi gồm 5 dây:

  • Dây dương của bộ truyền động tuyến tính: Dây này được dùng để điều khiển bộ truyền động tuyến tính bằng cách sử dụng điện áp cao (12V, 24V, 48V...).
  • Dây dương của bộ truyền động tuyến tính: Dây này được dùng để điều khiển bộ truyền động tuyến tính bằng cách sử dụng điện áp cao (12V, 24V, 48V...).
  • Dây 5V: Dây này được dùng cho biến trở phản hồi. Nối dây này với nguồn 5V hoặc 3.3V.
  • Dây GND: Dây này dùng cho biến trở phản hồi. Nối dây này với GND.
  • Dây biến trở: (còn được gọi là dây phản hồi, hoặc dây ra) Dây này xuất ra giá trị điện áp tỷ lệ với vị trí hành trình.
cấu hình chân của động cơ tuyến tính có phản hồi

Cách hoạt động

Nếu chúng ta cấp điện áp cao cho hai dây dương và dây âm, độ dịch chuyển của bộ truyền động sẽ được kéo dài hoặc rút lại. Cụ thể, nếu chúng ta kết nối:

  • Kết nối 12V với dây dương và GND với dây âm, tương ứng: động cơ tuyến tính ở tốc độ tối đa kéo dài cho đến khi đạt giới hạn.
  • Kết nối 12V với dây âm và GND với dây dương, tương ứng: động cơ tuyến tính ở tốc độ tối đa thu hồi cho đến khi đạt giới hạn.
  • Trong khi đang mở rộng hoặc thu hồi, nếu ta ngắt nguồn cho động cơ tuyến tính (GND nối tới cả hai dây dương và dây âm), động cơ tuyến tính sẽ ngừng mở rộng/thu hồi.

※ Lưu ý:

  • Giá trị điện áp để điều khiển bộ truyền động phụ thuộc vào thông số kỹ thuật của nó. Đọc bảng đặc tả kỹ thuật (datasheet) hoặc sách hướng dẫn để biết giá trị điện áp tương ứng.
  • Bộ truyền động có thể giữ vị trí ngay cả khi ngừng cấp nguồn trong khi mang tải.

Giá trị điện áp trên dây biến trở tỉ lệ với vị trí hành trình của bộ truyền động. Bằng cách đo điện áp này, ta có thể biết vị trí hành trình.

Sơ đồ nối dây

Vui lòng tháo toàn bộ ba jumper trên mô-đun L298N trước khi kết nối dây.

sơ đồ nối dây cho động cơ tuyến tính Arduino và bộ điều khiển l298n.

This image is created using Fritzing. Click to enlarge image

Cách điều khiển mở rộng và rút lại của một bộ truyền động tuyến tính

Xem hướng dẫn Arduino - Thiết bị chấp hành

Cách xác định vị trí của bộ truyền động tuyến tính

Dưới đây là cách xác định vị trí hành trình của một bộ truyền động tuyến tính.

Hiệu chuẩn

  • Xác định chiều dài hành trình của bộ truyền động (đơn vị mm) bằng cách đo (bằng thước) hoặc đọc bảng dữ liệu
  • Xác định các giá trị đầu ra khi bộ truyền động tuyến tính được kéo dài tối đa và thu lại tối đa bằng cách chạy mã dưới đây
/* * Mã Arduino này được phát triển bởi newbiely.vn * Mã Arduino này được cung cấp để sử dụng công khai, không có ràng buộc. * Để xem hướng dẫn chi tiết và sơ đồ kết nối, vui lòng truy cập: * https://newbiely.vn/tutorials/arduino/arduino-actuator-with-feedback */ // the code for getting the feedback when the actuator fully extended and retracted #define ENA_PIN 9 // the Arduino pin connected to the EN1 pin L298N #define IN1_PIN 6 // the Arduino pin connected to the IN1 pin L298N #define IN2_PIN 5 // the Arduino pin connected to the IN2 pin L298N #define POTENTIOMETER_PIN A0 // the Arduino pin connected to the potentiometer of the actuator void setup() { Serial.begin(9600); // initialize digital pins as outputs. pinMode(ENA_PIN, OUTPUT); pinMode(IN1_PIN, OUTPUT); pinMode(IN2_PIN, OUTPUT); digitalWrite(ENA_PIN, HIGH); } void loop() { // extend the actuator digitalWrite(IN1_PIN, HIGH); digitalWrite(IN2_PIN, LOW); delay(20000); // wait for actuator fully extends. It will stop extending automatically when reaching the limit // read the analog in value: int POTENTIOMETER_MAX = analogRead(POTENTIOMETER_PIN); Serial.print("POTENTIOMETER_MAX = "); Serial.println(POTENTIOMETER_MAX); // retracts the actuator digitalWrite(IN1_PIN, LOW); digitalWrite(IN2_PIN, HIGH); delay(20000); // wait for actuator fully extends. It will stop retracting automatically when reaching the limit int POTENTIOMETER_MIN = analogRead(POTENTIOMETER_PIN); Serial.print("POTENTIOMETER_MIN = "); Serial.println(POTENTIOMETER_MIN); }
  • Bạn sẽ thấy nhật ký trên Serial Monitor như ví dụ dưới đây.
COM6
Send
POTENTIOMETER_MAX = 987 POTENTIOMETER_MIN = 13
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  
  • Ghi lại các giá trị này
  • Nếu các giá trị tối thiểu và tối đa bị hoán đổi, hãy hoán đổi IN1_PIN và IN2_PIN
  • Cập nhật ba giá trị trong đoạn mã dưới đây
  • Mã Arduino tính toán vị trí của bộ truyền động

    /* * Mã Arduino này được phát triển bởi newbiely.vn * Mã Arduino này được cung cấp để sử dụng công khai, không có ràng buộc. * Để xem hướng dẫn chi tiết và sơ đồ kết nối, vui lòng truy cập: * https://newbiely.vn/tutorials/arduino/arduino-actuator-with-feedback */ #define ENA_PIN 9 // the Arduino pin connected to the EN1 pin L298N #define IN1_PIN 6 // the Arduino pin connected to the IN1 pin L298N #define IN2_PIN 5 // the Arduino pin connected to the IN2 pin L298N #define POTENTIOMETER_PIN A0 // the Arduino pin connected to the potentiometer of the actuator #define STROKE_LENGTH 102 // PLEASE UPDATE THIS VALUE (in millimeter) #define POTENTIOMETER_MAX 987 // PLEASE UPDATE THIS VALUE #define POTENTIOMETER_MIN 13 // PLEASE UPDATE THIS VALUE void setup() { Serial.begin(9600); // initialize digital pins as outputs. pinMode(ENA_PIN, OUTPUT); pinMode(IN1_PIN, OUTPUT); pinMode(IN2_PIN, OUTPUT); digitalWrite(ENA_PIN, HIGH); } void loop() { // extend the actuator digitalWrite(IN1_PIN, HIGH); digitalWrite(IN2_PIN, LOW); int potentiometer_value = analogRead(POTENTIOMETER_PIN); int stroke_pos = map(potentiometer_value, POTENTIOMETER_MIN, POTENTIOMETER_MAX, 0, STROKE_LENGTH); Serial.print("The stroke's position = "); Serial.print(stroke_pos); Serial.println(" mm"); }
    • Cập nhật ba giá trị được hiệu chuẩn vào mã nguồn
    • Nạp mã lên Arduino
    • Xem kết quả trên Serial Monitor
    COM6
    Send
    The stroke's position = 2 mm The stroke's position = 35 mm The stroke's position = 43 mm The stroke's position = 60 mm The stroke's position = 68 mm The stroke's position = 79 mm The stroke's position = 83 mm The stroke's position = 96 mm The stroke's position = 100 mm
    Autoscroll Show timestamp
    Clear output
    9600 baud  
    Newline  

    Cách điều khiển một bộ truyền động tuyến tính đến một vị trí xác định

    /* * Mã Arduino này được phát triển bởi newbiely.vn * Mã Arduino này được cung cấp để sử dụng công khai, không có ràng buộc. * Để xem hướng dẫn chi tiết và sơ đồ kết nối, vui lòng truy cập: * https://newbiely.vn/tutorials/arduino/arduino-actuator-with-feedback */ #define ENA_PIN 9 // the Arduino pin connected to the EN1 pin L298N #define IN1_PIN 6 // the Arduino pin connected to the IN1 pin L298N #define IN2_PIN 5 // the Arduino pin connected to the IN2 pin L298N #define POTENTIOMETER_PIN A0 // the Arduino pin connected to the potentiometer of the actuator #define STROKE_LENGTH 102 // PLEASE UPDATE THIS VALUE (in millimeter) #define POTENTIOMETER_MAX 987 // PLEASE UPDATE THIS VALUE #define POTENTIOMETER_MIN 13 // PLEASE UPDATE THIS VALUE #define TOLERANCE 5 // in millimeter int targetPosition_mm = 50; // in millimeter void setup() { Serial.begin(9600); // initialize digital pins as outputs. pinMode(ENA_PIN, OUTPUT); pinMode(IN1_PIN, OUTPUT); pinMode(IN2_PIN, OUTPUT); digitalWrite(ENA_PIN, HIGH); } void loop() { int potentiometer_value = analogRead(POTENTIOMETER_PIN); int stroke_pos = map(potentiometer_value, POTENTIOMETER_MIN, POTENTIOMETER_MAX, 0, STROKE_LENGTH); Serial.print("The stroke's position = "); Serial.print(stroke_pos); Serial.println(" mm"); if (stroke_pos < (targetPosition_mm - TOLERANCE)) ACTUATOR_extend(); else if (stroke_pos > (targetPosition_mm + TOLERANCE)) ACTUATOR_retract(); else ACTUATOR_stop(); } void ACTUATOR_extend() { digitalWrite(IN1_PIN, HIGH); digitalWrite(IN2_PIN, LOW); } void ACTUATOR_retract() { digitalWrite(IN1_PIN, LOW); digitalWrite(IN2_PIN, HIGH); } void ACTUATOR_stop() { digitalWrite(IN1_PIN, LOW); digitalWrite(IN2_PIN, LOW); }

    Video Tutorial

    Việc sản xuất video tốn rất nhiều thời gian. Nếu video hướng dẫn hữu ích cho việc học của bạn, hãy đăng ký kênh YouTube để ủng hộ. Nếu nhu cầu đủ cao, chúng tôi sẽ cố gắng làm thêm nhiều video.

    Tài liệu tham khảo về hàm

    Bài hướng dẫn liên quan