Bài 29/31: Xe-7 Điều khiển Xe thông minh SunFounder bằng Bộ điều khiển từ xa | Robojax
Trong bài học này, chúng ta sẽ biến chiếc xe thông minh SunFounder của bạn thành một chiếc xe điều khiển từ xa bằng điều khiển hồng ngoại (IR). Thay vì dựa vào kết nối có dây hoặc ứng dụng điện thoại thông minh, bạn sẽ học cách ánh xạ các nút trên điều khiển hồng ngoại tiêu chuẩn để điều khiển chuyển động của xe—tiến, lùi, rẽ, và thậm chí cả di chuyển chéo—cũng như điều chỉnh tốc độ ngay lập tức. Dự án này là bước tiếp theo hoàn hảo sau khi học những kiến thức cơ bản về điều khiển động cơ và truyền thông hồng ngoại, vì nó kết hợp cả hai thành một hệ thống tương tác duy nhất.
Giá trị thực tế ở đây nằm ở việc hiểu cách tạo ra một giao diện điều khiển mạnh mẽ, thân thiện với người dùng cho nền tảng robot. Các nguyên tắc bạn học được có thể áp dụng trực tiếp cho nhiều dự án, chẳng hạn như:
- Chế tạo robot điều khiển từ xa cho các tác vụ tự động hóa trong nhà, như robot giao hàng nhỏ.
- Tạo ra một chiếc xe có thể lập trình cho các cuộc thi robot giáo dục.
- Phát triển điều khiển từ xa tùy chỉnh cho thanh trượt máy ảnh hoặc cơ cấu pan-tilt.
- Tạo nguyên mẫu giao diện người dùng cho một hệ thống tự động lớn hơn, phức tạp hơn.
Phần cứng và Linh kiện
Dự án này được xây dựng dựa trên bộ kit SunFounder 3-trong-1 Arduino. Để thực hiện theo, bạn sẽ cần các linh kiện được liệt kê bên dưới. Việc đấu dây khá đơn giản, mở rộng từ các bài học trước trong khóa học.
- Bộ kit SunFounder 3-trong-1 Arduino: Bao gồm khung xe thông minh, bo mạch điều khiển động cơ và bo mạch Arduino.
- Điều khiển hồng ngoại: Điều khiển tiêu chuẩn đi kèm với bộ kit.
- Mô-đun thu hồng ngoại: Cảm biến sẽ giải mã tín hiệu từ điều khiển.
- LED và điện trở 330-ohm: Được sử dụng làm chỉ báo trực quan để xác nhận rằng một phím đã được nhấn. (trong video tại 04:08)
- Dây nối: Để thực hiện các kết nối cần thiết trên bảng mạch.
Hướng dẫn Đấu dây
Trước khi đi sâu vào mã, hãy đảm bảo phần cứng được kết nối chính xác. Việc đấu dây cho bộ thu hồng ngoại và bộ điều khiển động cơ nhất quán với các bài học trước trong loạt bài này. Để làm cho dự án tương tác hơn, chúng ta cũng sẽ kết nối một LED ngoài với chân 13 làm chỉ báo phản hồi trực quan.
Dưới đây là hướng dẫn từng bước cho các kết nối:
- Bộ thu hồng ngoại: Bộ thu hồng ngoại có ba chân. Chân dương kết nối với thanh 5V trên bảng mạch. Chân đất kết nối với thanh GND. Chân tín hiệu, là chân cuối cùng, kết nối với chân kỹ thuật số 11 trên bo mạch Arduino của bạn. (trong video tại 05:29)
- LED ngoài: Kết nối một chân của điện trở 330-ohm với chân kỹ thuật số 13 trên Arduino. Kết nối chân còn lại của điện trở với chân dài hơn (cực dương) của LED. Chân ngắn hơn (cực âm) của LED nên được kết nối với thanh GND trên bảng mạch. (trong video tại 04:08)
- Bộ điều khiển động cơ: Bốn chân cho bộ điều khiển động cơ (A_1B, A_1A, B_1B, B_1A) được kết nối với các chân 5, 6, 9 và 10 trên Arduino, tương ứng. Thiết lập này đã được đề cập trong các bài học trước. (trong video tại 06:44)
Để tham khảo trực quan về các kết nối này, vui lòng xem sơ đồ đấu dây bên dưới.
Giải thích Mã
Mã cho dự án này được thiết kế để trực quan. Nó sử dụng thư viện IRremote để xử lý tác vụ phức tạp là giải mã tín hiệu hồng ngoại. Hãy phân tích các phần có thể tùy chỉnh mà bạn có thể muốn điều chỉnh cho các dự án của riêng mình.
Ở đầu chương trình, bạn sẽ tìm thấy các định nghĩa chân. Đây là những thứ đầu tiên bạn nên kiểm tra nếu bạn đã đấu dây các linh kiện của mình vào các chân khác với các chân được sử dụng trong ví dụ này.
const int IR_RECEIVE_PIN = 12; // Xác định số chân cho cảm biến hồng ngoại
const int A_1B = 5;
const int A_1A = 6;
const int B_1B = 9;
const int B_1A = 10;
IR_RECEIVE_PIN: Hằng số này xác định chân kỹ thuật số được kết nối với chân tín hiệu của bộ thu hồng ngoại của bạn. Nếu bạn kết nối nó với một chân khác, bạn sẽ thay đổi số ở đây.A_1B,A_1A,B_1B,B_1A: Các hằng số này ánh xạ tới bốn chân điều khiển trên bộ điều khiển động cơ của bạn. Chúng điều khiển tốc độ và hướng của động cơ trái và phải.
Tiếp theo, bạn sẽ tìm thấy một biến quan trọng điều khiển hành vi của xe.
int speed = 150;
speed: Biến này đặt tốc độ ban đầu của xe. Giá trị có thể nằm trong khoảng từ 0 đến 255. Trong dự án này, bạn có thể thay đổi nó bằng các phím "+" và "-" trên điều khiển. Mã cũng bao gồm logic để ngăn tốc độ vượt quá 255 hoặc giảm xuống dưới 0. (trong video tại 09:22)
Logic cốt lõi của điều khiển từ xa được xử lý trong hàm loop(). Khi một phím được nhấn, hàm decodeKeyValue() dịch mã hồng ngoại thô thành một chuỗi đơn giản như "2" cho tiến hoặc "+" cho tăng tốc. Điều này làm cho các câu lệnh if theo sau rất dễ đọc và dễ sửa đổi. (trong video tại 07:58)
Các hàm tùy chỉnh như moveForward(), turnRight() và moveLeft() là nơi điều khiển động cơ. Mỗi hàm nhận giá trị speed hiện tại làm đối số. Ví dụ: moveForward(speed) sẽ điều khiển cả hai động cơ tiến về phía trước ở tốc độ đã chỉ định. Sự khác biệt chính giữa "quay" và "di chuyển" là khi quay, cả hai bánh xe xoay ngược chiều nhau, khiến xe xoay tại chỗ, trong khi di chuyển chỉ xoay một bánh xe, khiến xe đi theo vòng cung quanh bánh xe đứng yên. (trong video tại 10:14)
Trình Diễn Dự Án Trực Tiếp
Khi mã đã được tải lên và xe đã được bật nguồn, điều khiển từ xa trở thành giao diện chính của bạn. Phần trình diễn trong video nêu bật một số hành vi chính:
- Điều Khiển Tốc Độ: Nhấn phím "+" sẽ tăng tốc độ thêm 50, trong khi phím "-" sẽ giảm tốc độ. Tốc độ được giới hạn tối đa ở 255 và tối thiểu ở 0 để bảo vệ động cơ. (trong video tại 11:56)
- Chuyển Động Tạm Thời: Khi bạn nhấn một phím điều hướng như "2" (tiến) hoặc "8" (lùi), xe sẽ di chuyển trong một giây rồi tự động dừng lại. Đây là tính năng an toàn được tích hợp trong mã. (trong video tại 13:09)
- Quay và Điều Hướng: Các phím được bố trí theo hình chữ thập trên điều khiển hoạt động như một cần điều khiển. Nhấn "4" hoặc "6" sẽ quay xe sang trái hoặc phải tại chỗ. Nhấn các phím chéo như "1" hoặc "3" sẽ thực hiện "di chuyển trái" hoặc "di chuyển phải," tức là một cú quay gắt hơn khi một bánh xe đứng yên. (trong video tại 16:42)
Một điều bạn có thể nhận thấy là xe không phải lúc nào cũng chạy theo một đường thẳng hoàn hảo. Điều này thường do sự khác biệt nhỏ giữa các động cơ hoặc độ căng khi lắp ráp xe, đây là đặc điểm phổ biến và bình thường của các bộ kit này. (trong video tại 15:14)
Các Chương
- [00:00] Giới thiệu về Điều Khiển Từ Xa Hồng Ngoại cho Xe Thông Minh
- [01:15] Điều Kiện Tiên Quyết và Các Bài Học Trước Cần Thiết
- [01:56] Tổng Quan về Tài Liệu Dự Án
- [02:29] Hiểu Về Các Chức Năng Phím của Điều Khiển Từ Xa
- [03:29] Hướng Dẫn Đấu Dây Từng Bước cho Bộ Thu Hồng Ngoại và LED
- [05:51] Mở và Tải Mã Dự Án
- [07:41] Giải Thích Mã: Vòng Lặp, Giải Mã Phím và Các Hành Động
- [09:22] Giới Hạn Tốc Độ và Các Tính Năng An Toàn trong Mã
- [10:08] Giải Thích Các Hàm Chuyển Động của Động Cơ
- [11:49] Trình Diễn Trực Tiếp: Kiểm Tra Điều Khiển Tốc Độ và LED Nhấp Nháy
- [13:27] Trình Diễn Trực Tiếp: Tiến, Lùi và Quay
- [14:31] Trình Diễn Toàn Bộ Xe với Nguồn Điện và Chuyển Động
/*
Lesson 29/31: Car-7 Controlling SunFounder Smart Car using Remote Controller
Get this code and watch video Download and resource page https://robojax.com/RJT612
*/
#include <IRremote.h>
const int IR_RECEIVE_PIN = 12; // Define the pin number for the IR Sensor
const int A_1B = 5;
const int A_1A = 6;
const int B_1B = 9;
const int B_1A = 10;
int speed = 150;
void setup() {
Serial.begin(9600);
//motor
pinMode(A_1B, OUTPUT);
pinMode(A_1A, OUTPUT);
pinMode(B_1B, OUTPUT);
pinMode(B_1A, OUTPUT);
//IR remote
IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK); // Start the IR receiver // Start the receiver
Serial.println("REMOTE CONTROL START");
}
void loop() {
if (IrReceiver.decode()) {
// Serial.println(results.value,HEX);
String key = decodeKeyValue(IrReceiver.decodedIRData.command);
if (key != "ERROR") {
Serial.println(key);
if (key == "+") {
speed += 50;
} else if (key == "-") {
speed -= 50;
} else if (key == "2") {
moveForward(speed);
delay(1000);
} else if (key == "1") {
moveLeft(speed);
} else if (key == "3") {
moveRight(speed);
} else if (key == "4") {
turnLeft(speed);
} else if (key == "6") {
turnRight(speed);
} else if (key == "7") {
backLeft(speed);
} else if (key == "9") {
backRight(speed);
} else if (key == "8") {
moveBackward(speed);
delay(1000);
}
if (speed >= 255) {
speed = 255;
}
if (speed <= 0) {
speed = 0;
}
delay(500);
stopMove();
}
IrReceiver.resume(); // Enable receiving of the next value
}
}
void moveForward(int speed) {
analogWrite(A_1B, 0);
analogWrite(A_1A, speed);
analogWrite(B_1B, speed);
analogWrite(B_1A, 0);
}
void moveBackward(int speed) {
analogWrite(A_1B, speed);
analogWrite(A_1A, 0);
analogWrite(B_1B, 0);
analogWrite(B_1A, speed);
}
void turnRight(int speed) {
analogWrite(A_1B, speed);
analogWrite(A_1A, 0);
analogWrite(B_1B, speed);
analogWrite(B_1A, 0);
}
void turnLeft(int speed) {
analogWrite(A_1B, 0);
analogWrite(A_1A, speed);
analogWrite(B_1B, 0);
analogWrite(B_1A, speed);
}
void moveLeft(int speed) {
analogWrite(A_1B, 0);
analogWrite(A_1A, speed);
analogWrite(B_1B, 0);
analogWrite(B_1A, 0);
}
void moveRight(int speed) {
analogWrite(A_1B, 0);
analogWrite(A_1A, 0);
analogWrite(B_1B, speed);
analogWrite(B_1A, 0);
}
void backLeft(int speed) {
analogWrite(A_1B, speed);
analogWrite(A_1A, 0);
analogWrite(B_1B, 0);
analogWrite(B_1A, 0);
}
void backRight(int speed) {
analogWrite(A_1B, 0);
analogWrite(A_1A, 0);
analogWrite(B_1B, 0);
analogWrite(B_1A, speed);
}
void stopMove() {
analogWrite(A_1B, 0);
analogWrite(A_1A, 0);
analogWrite(B_1B, 0);
analogWrite(B_1A, 0);
}
String decodeKeyValue(long result)
{
switch(result){
case 0x16:
return "0";
case 0xC:
return "1";
case 0x18:
return "2";
case 0x5E:
return "3";
case 0x8:
return "4";
case 0x1C:
return "5";
case 0x5A:
return "6";
case 0x42:
return "7";
case 0x52:
return "8";
case 0x4A:
return "9";
case 0x9:
return "+";
case 0x15:
return "-";
case 0x7:
return "EQ";
case 0xD:
return "U/SD";
case 0x19:
return "CYCLE";
case 0x44:
return "PLAY/PAUSE";
case 0x43:
return "FORWARD";
case 0x40:
return "BACKWARD";
case 0x45:
return "POWER";
case 0x47:
return "MUTE";
case 0x46:
return "MODE";
case 0x0:
return "ERROR";
default :
return "ERROR";
}
}
Common Course Links
Common Course Files
Nghĩ bạn có thể cần
-
AmazonSunFounder Arduino Learning Kit on AliExpresss.click.aliexpress.com
-
Amazon
-
Amazon
-
Amazon
-
Amazon
Tài nguyên & tài liệu tham khảo
-
Bên ngoàiPurchase SunFounder's 3-in-1 Smart car learning kitsunfounder.com
Tập tin📁
Thư viện Arduino (tệp nén)
-
SunFounder's 3-in-1 Smart Car learning kit source code
3in1-kit-main-v2.zip12.80 MB