Search Code

Bài 86: Điều khiển vị trí của động cơ servo sử dụng chiết áp

Bài 86: Điều khiển vị trí của động cơ servo sử dụng chiết áp

Hãy tưởng tượng việc xoay một núm vặn đơn giản và quan sát một cánh tay cơ khí di chuyển chính xác theo từng chuyển động của bạn. Đó chính là sự kỳ diệu khi kết hợp một chiết áp với một động cơ servo. Dự án này, một phần của Khóa học Arduino Từng bước của Robojax, trình bày một khái niệm cơ bản và cực kỳ hữu ích trong điện tử: chuyển đổi đầu vào tương tự thành chuyển động vật lý chính xác. Bạn sẽ học cách đọc điện áp thay đổi từ chiết áp, ánh xạ giá trị đó sang một phạm vi góc và điều khiển động cơ servo quay đến vị trí chính xác đó. Đây là cánh cửa để bạn xây dựng các dự án trực quan và tương tác, nơi điều khiển thủ công kết hợp với tự động hóa.

Các ứng dụng của kỹ năng này rất rộng lớn và thực tế. Dưới đây là một vài ý tưởng để truyền cảm hứng cho bạn:

  • Điều khiển cánh tay robot: Sử dụng chiết áp để định vị thủ công từng khớp của cánh tay robot cho các thao tác gắp và đặt chính xác.
  • Hệ thống xoay và nghiêng camera: Xây dựng một giá đỡ camera điều khiển từ xa cho các cảnh quay tua nhanh hoặc giám sát, xoay và nghiêng mượt mà chỉ bằng một cái xoay núm.
  • Bản sao đồng hồ tương tự: Tạo một đồng hồ bảng điều khiển vật lý (như đồng hồ tốc độ hoặc núm nhiệt độ) di chuyển dựa trên dữ liệu cảm biến, với chiết áp đóng vai trò là công cụ ghi đè thủ công hoặc hiệu chuẩn.
  • Tác phẩm nghệ thuật tương tác: Tạo các tác phẩm điêu khắc động học phản hồi theo đầu vào của người xem, nơi xoay núm làm thay đổi vị trí của các bộ phận chuyển động.
  • Điều khiển lái xe mô hình: Điều khiển góc lái của ô tô hoặc thuyền mô hình từ xa, mang lại cảm giác tương tự và trực quan hơn so với các nút bấm kỹ thuật số.

Hướng dẫn này dựa trên video hướng dẫn Bài 86: Điều khiển vị trí của động cơ servo bằng chiết áp của Robojax (trong video ở phút 00:00). Video hướng dẫn bạn qua toàn bộ quá trình, từ việc hiểu cách đấu dây đến giải thích mã khiến mọi thứ hoạt động. Hãy bắt đầu.

Phần cứng và Linh kiện

Để thực hiện theo dự án này, bạn sẽ cần các linh kiện sau:

  • Một bo mạch Arduino (ví dụ: Uno, Nano)
  • Một động cơ servo tiêu chuẩn (ví dụ: SG90 hoặc MG996R)
  • Một chiết áp (biến trở, thường là 10kΩ)
  • Dây jumper
  • Một breadboard (tùy chọn, để kết nối dễ dàng hơn)

Hiểu về cách đấu dây

Cách đấu dây cho dự án này khá đơn giản. Điều quan trọng là cung cấp đúng nguồn điện và kết nối tín hiệu cho cả servo và chiết áp. Servo là thiết bị tiêu thụ nhiều điện năng, vì vậy nó nhận nguồn trực tiếp từ chân 5V của Arduino. Chiết áp hoạt động như một bộ chia điện áp và chúng ta đọc điện áp tại chân trượt (chân giữa) để xác định vị trí của nó. (trong video ở phút 01:05)

Một mẹo thông minh mà dự án này sử dụng là tạo thêm một nguồn 5V trên một chân kỹ thuật số để cấp nguồn cho chiết áp, vì một số bo mạch Arduino chỉ có một chân 5V chuyên dụng. Điều này được thực hiện trong mã bằng cách đặt một chân kỹ thuật số (chân 8) ở mức HIGH, đầu ra 5V. (trong video ở phút 00:39)

Dưới đây là sơ đồ đấu dây được đề cập trong video:

Sơ đồ đấu dây Arduino cho động cơ servo với chiết áp
Sơ đồ đấu dây Arduino cho động cơ servo với chiết áp

Hãy phân tích các kết nối:

  • Động cơ Servo:
    • Nguồn (dây Đỏ) → Chân 5V của Arduino
    • Nối đất (dây Nâu/Đen) → Chân GND của Arduino
    • Tín hiệu (dây Cam/Vàng) → Chân 3 của Arduino (chân hỗ trợ PWM)
  • Chiết áp:
    • Chân Trái → Chân GND của Arduino
    • Chân Giữa (Chân trượt) → Chân tương tự A0 của Arduino
    • Chân Phải → Chân 8 của Arduino (được định nghĩa là VCC2 trong mã)

Giải thích mã

Mã cho dự án này rất đơn giản và thanh lịch. Nó sử dụng một vài hàm Arduino chính để đọc chiết áp và điều khiển servo. Hãy tập trung vào các phần có thể tùy chỉnh mà bạn có thể điều chỉnh cho các dự án của riêng mình. (trong video ở phút 03:00)

Ở đầu chương trình, bạn sẽ định nghĩa các chân và tạo đối tượng servo. Đây là các biến chính bạn sẽ thay đổi dựa trên cách đấu dây của mình:

#include <Servo.h>

Servo myservo;  // tạo đối tượng servo để điều khiển một servo

int potpin = A0;  // chân tương tự dùng để kết nối chiết áp
int servoPin = 3; // định nghĩa chân kỹ thuật số (có PWM) cho servo. Chỉ có thể dùng chân 3, 5, 6, 9, 10, 11
int VCC2 = 8;// định nghĩa VCC phụ cho chiết áp
int val;    // biến để đọc giá trị từ chân tương tự

Dưới đây là chức năng của từng phần:

  • Servo myservo;: Dòng này tạo một đối tượng có tên myservo mà chúng ta sẽ sử dụng để điều khiển động cơ servo cụ thể của mình. Bạn có thể đổi tên, nhưng phải sử dụng cùng tên đó ở phần sau của mã.
  • int potpin = A0;: Dòng này định nghĩa chân tương tự mà chân trượt của chiết áp được kết nối. Nếu bạn chuyển dây sang một chân tương tự khác, bạn phải cập nhật số này.
  • int servoPin = 3;: Dòng này đặt chân kỹ thuật số cho dây tín hiệu của servo. Điều quan trọng là phải sử dụng chân hỗ trợ PWM (thường được đánh dấu bằng '~' trên bo mạch). Chú thích liệt kê các chân hợp lệ cho hầu hết các Arduino.
  • int VCC2 = 8;: Đây là chân chúng ta sử dụng làm nguồn 5V phụ cho chiết áp. Nếu bo mạch của bạn có nhiều chân 5V, bạn có thể kết nối trực tiếp và xóa phần này của mã.

Trong hàm setup(), mã khởi tạo servo và thiết lập chân nguồn phụ. Hàm myservo.attach(servoPin) rất quan trọng vì nó cho Arduino biết chân nào được kết nối với dây tín hiệu của servo.

void setup() {
  Serial.begin(9600);          //  thiết lập serial
  myservo.attach(servoPin);  // gắn servo vào chân 3 cho đối tượng servo

  pinMode(VCC2, OUTPUT);// đặt chân 8 làm đầu ra
  digitalWrite(VCC2, HIGH);// đặt chân 8 ở mức CAO để nó hoạt động như chân 5V
}

Logic cốt lõi nằm trong hàm loop(). Nó đọc giá trị của chiết áp, chuyển đổi tỷ lệ thành góc, và ra lệnh cho servo di chuyển. Hai hàm quan trọng ở đây là analogRead()map(). (trong video tại 04:27)

void loop() {
  val = analogRead(potpin);            // đọc giá trị của chiết áp (giá trị từ 0 đến 1023)
  val = map(val, 0, 1023, 0, 180);     // chuyển đổi tỷ lệ để dùng với servo (giá trị từ 0 đến 180)
  myservo.write(val);                  // đặt vị trí servo theo giá trị đã chuyển đổi
  Serial.print(val);
  Serial.println();
  delay(50);                           // chờ servo đến vị trí đó
}

Đây là cách nó hoạt động:

  • analogRead(potpin): Hàm này đọc điện áp từ chân giữa của chiết áp và trả về giá trị từ 0 (0V) đến 1023 (5V).
  • map(val, 0, 1023, 0, 180): Đây là chìa khóa của toàn bộ dự án. Nó lấy giá trị thô từ chiết áp (0 đến 1023) và chuyển đổi tỷ lệ thành góc servo (0 đến 180 độ). Ví dụ, nếu chiết áp đọc được 511 (khoảng một nửa), hàm map() sẽ trả về 90, đưa servo về vị trí trung tâm.
  • myservo.write(val): Hàm này lấy góc đã tính (hiện được lưu trong val) và yêu cầu servo xoay đến vị trí đó.
  • delay(50): Thao tác này thêm một khoảng dừng ngắn ở cuối mỗi vòng lặp. Nó kiểm soát tốc độ cập nhật. Độ trễ lớn hơn (như 200ms) làm servo di chuyển theo từng bước, trong khi độ trễ nhỏ hơn (như 50ms) làm chuyển động rất mượt mà. Bạn có thể điều chỉnh để thay đổi độ phản hồi. (trong video tại 07:26)

Trình Diễn Dự Án Trực Tiếp

Trong video, bạn có thể thấy dự án hoạt động. Khi núm chiết áp được xoay, cánh tay của động cơ servo di chuyển theo vị trí của nó một cách tương ứng. Màn hình serial in ra góc hiện tại, xác nhận rằng việc chuyển đổi đang hoạt động chính xác. Khi chiết áp ở vị trí tối thiểu, servo ở góc 0 độ. Khi bạn xoay núm đến mức tối đa, servo xoay mượt mà đến 180 độ. (trong video tại 06:33)

Vòng phản hồi thời gian thực này chứng minh sự tích hợp liền mạch giữa cảm biến tương tự với bộ truyền động kỹ thuật số, tạo ra một hệ thống điều khiển phản hồi nhanh và trực quan.

Các Chương

  • [00:00] Giới thiệu và Tổng quan Dự án
  • [01:05] Sơ đồ và Sơ đồ Đấu dây
  • [02:07] Trình Diễn Đấu dây Vật lý
  • [03:00] Giải thích Mã
  • [06:33] Trình Diễn và Kiểm tra Trực tiếp
  • [07:26] Điều chỉnh Tốc độ Phản hồi của Servo

Hình ảnh

Arduino wiring or servo motor with pot
Arduino wiring or servo motor with pot
SG90_servo_motor-1
SG90_servo_motor-1
SG90_servo_motor-0
SG90_servo_motor-0
892-Lesson 86: Controlling a servo position using a potentiometer (variable resistor)
Ngôn ngữ: C++
/*
 * Lesson 88: Controlling Servo motor a with Potentiometer
 * 📚⬇️ Download and resource page https://robojax.com/RJT763
 watch full video tutroial: https://www.youtube.com/watch?v=ntRW77mNFFk
 
 Controlling a servo position using a potentiometer (variable resistor)
 by Michal Rinott <http://people.interaction-ivrea.it/m.rinott>

 modified on 8 Nov 2013
 by Scott Fitzgerald
 http://www.arduino.cc/en/Tutorial/Knob

 Update by Ahmad Shamshiri on Jan 01, 2019  in Ajax, Ontario, Canada


*/

#include <Servo.h>

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

int potpin = A0;  // analog pin used to connect the potentiometer
int servoPin = 3; // define a digital pin (with PWM) for servo. Can use only pin 3, 5, 6,9, 10, 11
int VCC2 = 8;// define extra VCC for potentiometer
int val;    // variable to read the value from the analog pin

void setup() {
  //
  Serial.begin(9600);          //  setup serial
  myservo.attach(servoPin);  // attaches the servo on pin 3 to the servo object

  pinMode(VCC2, OUTPUT);// set pin 8 as output
  digitalWrite(VCC2, HIGH);// set pin 8 HIGH so it acts as 5V pin
}

void loop() {
  
  val = analogRead(potpin);            // reads the value of the potentiometer (value between 0 and 1023)
  val = map(val, 0, 1023, 0, 180);     // scale it to use it with the servo (value between 0 and 180)
  myservo.write(val);                  // sets the servo position according to the scaled value
  Serial.print(val);
  Serial.println();
  delay(50);                           // waits for the servo to get there
}
 

Tài nguyên & tài liệu tham khảo

Tập tin📁

Các tập tin khác