Xe dò line tránh vật cản arduino ( tự lắp)
Thương hiệu : Khác
520,000đ
Bộ xe dò line tránh vật cản arduino bao gồm các linh kiện như sau :

-
- Mạch chủ arduino
- Module l298N
- 2 viên pin + kèm đế pin 18650 có nắp kèm công tắc đóng mở ( mua thêm bộ sạc pin Tại Đây )
- Bộ khung xe 2 bánh
- 3 module dò line đơn
- cảm biến siêu âm + đế gắn
- servo sg90
- dây cắm jumper kết nối
Hướng dẫn đi dây :
Bảng nối dây tóm tắt
| Thiết bị | Chân Arduino | Nguồn |
|---|---|---|
| TCRT Left ( chân digital) | D2 ( nằm ở vòng tròn xanh lá trong hình) | 5V, GND |
| TCRT Mid ( chân digital) | D7 ( nằm ở vòng tròn xanh lá trong hình) | 5V, GND |
| TCRT Right ( chân digital) | D8 ( nằm ở vòng tròn xanh lá trong hình) | 5V, GND |
| HC-SR04 TRIG | D3 ( nằm ở vòng tròn xanh lá trong hình) | 5V, GND |
| HC-SR04 ECHO | D4 ( nằm ở vòng tròn xanh lá trong hình) | 5V, GND |
| Servo SG90 | D11 ( nằm ở vòng tròn xanh lá trong hình) | 5V, GND |
| L298N IN1 | D5 ( nằm ở vòng tròn xanh lá trong hình) | - |
| L298N IN2 | D6 ( nằm ở vòng tròn xanh lá trong hình) | - |
| L298N IN3 | D9 ( nằm ở vòng tròn xanh lá trong hình) | - |
| L298N IN4 | D10 ( nằm ở vòng tròn xanh lá trong hình) | - |
| ENA / ENB | 5V hoặc PWM | - |
| Arduino Vcc | 5V (L298N/UBEC) | - |
| Arduino GND | GND chung | - |


Cách nối dây nguồn pin vào L298 , arduino, cảm biến dò line đơn ,động cơ vàng, động cơ servo
Nối cực dương của nguồn pin vào +12V của L298N
Nối tất cả cực âm của nguồn pin ,GND của Arduino , GND của 3 cảm biến đơn dò line,GND của Servo,GND của cảm biến siêu âm vào GND của L298N.
Nối chung Vin arduino,VCC của 3 cảm biến dò line, VCC của cảm biến siêu âm,VCC của servo vào +5V của module L298N.
Nối các chân digital của cảm biến dò line giống như bảng ở trên.
nối các chân trigger và chân echo của cảm biến siêu âm như bảng ở trên.
Ghi chú quan trọng
Cảm biến TCRT5000 thường xuất LOW khi gặp line đen → code này đã set theo nguyên tắc đó.
Nếu cảm biến của bạn ra tín hiệu ngược (HIGH khi gặp line) → chỉ cần đảo lại logic LOW ↔ HIGH.( nếu không biết đảo thì yên tâm, mình đã làm sẵn code số 2 cho bạn .)
Lưu ý chỉ nạp 1 đoạn code…số 1 hoặc số 2….không nạp cả 2 đoạn .
Code số 1 :
#include <Servo.h>
// ==== Cảm biến line ====
#define S_LEFT 2
#define S_MID 7
#define S_RIGHT 8
// ==== HC-SR04 ====
#define TRIG 3
#define ECHO 4
// ==== Servo ====
#define SERVO_PIN 11
Servo myServo;
// ==== Động cơ (L298N) ====
#define IN1 5 // Motor trái
#define IN2 6
#define IN3 9 // Motor phải
#define IN4 10
// ==== Hàm điều khiển động cơ ====
void motorStop() {
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
}
void motorForward() {
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
}
void motorBackward() {
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
}
void motorLeft() {
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
}
void motorRight() {
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
}
// ==== Đo khoảng cách ====
long getDistance() {
digitalWrite(TRIG, LOW);
delayMicroseconds(2);
digitalWrite(TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG, LOW);
long duration = pulseIn(ECHO, HIGH, 20000); // timeout 20ms
long distance = duration * 0.034 / 2; // cm
return distance;
}
void setup() {
// Motor
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
// Line sensor
pinMode(S_LEFT, INPUT);
pinMode(S_MID, INPUT);
pinMode(S_RIGHT, INPUT);
// HC-SR04
pinMode(TRIG, OUTPUT);
pinMode(ECHO, INPUT);
// Servo
myServo.attach(SERVO_PIN);
myServo.write(90); // nhìn thẳng khi khởi động
Serial.begin(9600);
}
void loop() {
// Đọc cảm biến line
int left = digitalRead(S_LEFT);
int mid = digitalRead(S_MID);
int right = digitalRead(S_RIGHT);
// Đọc khoảng cách phía trước
long dist = getDistance();
Serial.print("Khoang cach: ");
Serial.println(dist);
// ==== Tránh vật cản ====
if (dist > 0 && dist < 15) { // Nếu có vật cản gần
motorStop();
delay(300);
// Quét bên trái
myServo.write(150);
delay(500);
long distLeft = getDistance();
// Quét bên phải
myServo.write(30);
delay(500);
long distRight = getDistance();
// Trả servo về giữa
myServo.write(90);
// Chọn hướng trống hơn
if (distLeft > distRight) {
motorLeft();
delay(600);
} else {
motorRight();
delay(600);
}
}
// ==== Dò line ====
else {
if (mid == LOW && left == HIGH && right == HIGH) {
motorForward(); // vạch ở giữa -> đi thẳng
}
else if (left == LOW) {
motorLeft(); // lệch trái
delay(100);
}
else if (right == LOW) {
motorRight(); // lệch phải
delay(100);
}
else {
motorStop(); // mất line -> dừng lại
}
}
}
Code số 2:
#include <Servo.h>
// ==== Cảm biến line ====
#define S_LEFT 2
#define S_MID 7
#define S_RIGHT 8
// ==== HC-SR04 ====
#define TRIG 3
#define ECHO 4
// ==== Servo ====
#define SERVO_PIN 11
Servo myServo;
// ==== Động cơ (L298N) ====
#define IN1 5 // Motor trái
#define IN2 6
#define IN3 9 // Motor phải
#define IN4 10
// ==== Hàm điều khiển động cơ ====
void motorStop() {
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
}
void motorForward() {
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
}
void motorBackward() {
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
}
void motorLeft() {
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
}
void motorRight() {
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
}
// ==== Đo khoảng cách ====
long getDistance() {
digitalWrite(TRIG, LOW);
delayMicroseconds(2);
digitalWrite(TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG, LOW);
long duration = pulseIn(ECHO, HIGH, 20000); // timeout 20ms
long distance = duration * 0.034 / 2; // cm
return distance;
}
void setup() {
// Motor
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
// Line sensor
pinMode(S_LEFT, INPUT);
pinMode(S_MID, INPUT);
pinMode(S_RIGHT, INPUT);
// HC-SR04
pinMode(TRIG, OUTPUT);
pinMode(ECHO, INPUT);
// Servo
myServo.attach(SERVO_PIN);
myServo.write(90); // nhìn thẳng khi khởi động
Serial.begin(9600);
}
void loop() {
// Đọc cảm biến line
int left = digitalRead(S_LEFT);
int mid = digitalRead(S_MID);
int right = digitalRead(S_RIGHT);
// Đọc khoảng cách phía trước
long dist = getDistance();
Serial.print("Khoang cach: ");
Serial.println(dist);
// ==== Tránh vật cản ====
if (dist > 0 && dist < 15) { // Nếu có vật cản gần
motorStop();
delay(300);
// Quét bên trái
myServo.write(150);
delay(500);
long distLeft = getDistance();
// Quét bên phải
myServo.write(30);
delay(500);
long distRight = getDistance();
// Trả servo về giữa
myServo.write(90);
// Chọn hướng trống hơn
if (distLeft > distRight) {
motorLeft();
delay(600);
} else {
motorRight();
delay(600);
}
}
// ==== Dò line (LOW = trắng, HIGH = đen) ====
else {
if (mid == HIGH && left == LOW && right == LOW) {
motorForward(); // vạch đen ở giữa -> đi thẳng
}
else if (left == HIGH) {
motorLeft(); // vạch đen bên trái
delay(100);
}
else if (right == HIGH) {
motorRight(); // vạch đen bên phải
delay(100);
}
else {
motorStop(); // không thấy line -> dừng
}
}
}

