Arduino Line-Following Car Code
1:29
Cpp
// Định nghĩa chân động cơ (sử dụng module L298) const int ENA = 5; // Chân PWM cho động cơ trái const int IN1 = 4; // Chân điều khiển động cơ trái const int IN2 = 3; // Chân điều khiển động cơ trái const int ENB = 6; // Chân PWM cho động cơ phải const int IN3 = 7; // Chân điều khiển động cơ phải const int IN4 = 8; // Chân điều khiển động cơ phải // Định nghĩa chân cảm biến hồng ngoại const int sensorTrai = A0; // Cảm biến bên trái const int sensorGiuaTrai= A1; // Cảm biến giữa bên trái const int sensorGiuaPhai= A2; // Cảm biến giữa bên phải const int sensorPhai = A3; // Cảm biến bên phải // Thông số hiệu chỉnh const int nguong = 500; // Giá trị ngưỡng xác định phát hiện đường (hiệu chỉnh theo điều kiện thực tế) const int tocDo = 200; // Tốc độ động cơ cơ bản (từ 0 đến 255) void setup() { // Cài đặt chân động cơ làm OUTPUT pinMode(ENA, OUTPUT); pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT); pinMode(ENB, OUTPUT); pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT); // Các chân cảm biến đã mặc định là INPUT // Mở kênh Serial để tiện theo dõi giá trị cảm biến khi hiệu chỉnh Serial.begin(9600); } void loop() { // Đọc giá trị cảm biến từ các chân A0-A3 int giaTriTrai = analogRead(sensorTrai); int giaTriGiuaTrai= analogRead(sensorGiuaTrai); int giaTriGiuaPhai= analogRead(sensorGiuaPhai); int giaTriPhai = analogRead(sensorPhai); // In giá trị cảm biến ra Serial Monitor để tiện hiệu chuẩn Serial.print("Trai: "); Serial.print(giaTriTrai); Serial.print(" | GiuaTrai: "); Serial.print(giaTriGiuaTrai); Serial.print(" | GiuaPhai: "); Serial.print(giaTriGiuaPhai); Serial.print(" | Phai: "); Serial.println(giaTriPhai); // Xác định cảm biến có phát hiện đường hay không (giá trị thấp hơn ngưỡng cho thấy phát hiện đường) bool phatHienTrai = (giaTriTrai đi thẳng if(phatHienGiuaTrai && phatHienGiuaPhai && !phatHienTrai && !phatHienPhai) { diThang(); } // Nếu cảm biến bên trái (Trai hoặc GiuaTrai) phát hiện đường -> rẽ trái else if(phatHienTrai || phatHienGiuaTrai) { reTrai(); } // Nếu cảm biến bên phải (Phai hoặc GiuaPhai) phát hiện đường -> rẽ phải else if(phatHienPhai || phatHienGiuaPhai) { rePhai(); } // Trường hợp không phát hiện đường -> dừng xe hoặc thực hiện tìm kiếm else { dungXe(); } delay(50); // Trễ 50ms giữa các vòng lặp để ổn định đọc giá trị } // Hàm đi thẳng void diThang() { // Cung cấp tín hiệu cho cả 2 động cơ quay cùng hướng với tốc độ bằng nhau digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW); analogWrite(ENA, tocDo); analogWrite(ENB, tocDo); } // Hàm rẽ trái void reTrai() { // Giảm tốc độ động cơ trái để xe rẽ trái digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW); analogWrite(ENA, tocDo/2); // Giảm tốc độ cho động cơ trái analogWrite(ENB, tocDo); // Giữ tốc độ cho động cơ phải } // Hàm rẽ phải void rePhai() { // Giảm tốc độ động cơ phải để xe rẽ phải digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW); analogWrite(ENA, tocDo); // Giữ tốc độ cho động cơ trái analogWrite(ENB, tocDo/2); // Giảm tốc độ cho động cơ phải } // Hàm dừng xe void dungXe() { analogWrite(ENA, 0); analogWrite(ENB, 0); }
nguong.nguong) và cảm biến mép (Trai và Phai) không phát hiện, xe sẽ đi thẳng.dungXe() sẽ dừng xe.nguong sao cho phù hợp với điều kiện ánh sáng và bề mặt của đường đi.tocDo cũng có thể được điều chỉnh tùy theo yêu cầu về phản hồi và tốc độ của xe.Ready.
Reviews
Properties
Properties describe core aspects of the project.
Pricing & Availability
Distributor | Qty 1 |
|---|
Assets
No assets added.
Controls
Welcome 👋
Flux helps you build PCBs faster with an AI teammate!
Create your account to collaborate, stay updated, fork your own version, and get instant answers from our AI agent.