// Định nghĩa các chân động cơ và cầu H L298N
#define IN1 2
#define IN2 3
#define IN3 4
#define IN4 5
#define ENA 6
#define ENB 7
// Định nghĩa các chân cho cảm biến siêu âm HC-SR04
#define trigPinLeft 8
#define echoPinLeft 9
#define trigPinCenter 10
#define echoPinCenter 11
#define trigPinRight 12
#define echoPinRight 13
// Định nghĩa các chân cho cảm biến hồng ngoại TCRT5000
#define irLeft A0
#define irCenter A1
#define irRight A2
// Định nghĩa chân cho nút khởi động và nút nguồn
#define startButton A4
#define powerButton A5
// Biến lưu trữ trạng thái robot
bool robotRunning = false;
void setup() {
// Khởi tạo các chân đầu vào/ra cho động cơ
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
pinMode(ENA, OUTPUT);
pinMode(ENB, OUTPUT);
// Khởi tạo các chân cảm biến siêu âm
pinMode(trigPinLeft, OUTPUT);
pinMode(echoPinLeft, INPUT);
pinMode(trigPinCenter, OUTPUT);
pinMode(echoPinCenter, INPUT);
pinMode(trigPinRight, OUTPUT);
pinMode(echoPinRight, INPUT);
// Khởi tạo các chân cảm biến hồng ngoại
pinMode(irLeft, INPUT);
pinMode(irCenter, INPUT);
pinMode(irRight, INPUT);
// Khởi tạo các chân cho nút nhấn
pinMode(startButton, INPUT_PULLUP);
pinMode(powerButton, INPUT_PULLUP);
// Khởi tạo động cơ tắt ban đầu
analogWrite(ENA, 0);
analogWrite(ENB, 0);
Serial.begin(9600);
}
void loop() {
// Kiểm tra trạng thái nút nguồn
if (digitalRead(powerButton) == LOW) {
// Nếu nút nguồn bị bấm, khởi động lại robot
robotRunning = !robotRunning;
delay(500); // Tránh việc bị lặp liên tục khi bấm nút
}
// Nếu robot đang hoạt động
if (robotRunning) {
// Đọc giá trị cảm biến hồng ngoại để phát hiện vạch
int irLeftVal = digitalRead(irLeft);
int irCenterVal = digitalRead(irCenter);
int irRightVal = digitalRead(irRight);
// Đọc cảm biến siêu âm để phát hiện đối thủ
float distanceLeft = readUltrasonic(trigPinLeft, echoPinLeft);
float distanceCenter = readUltrasonic(trigPinCenter, echoPinCenter);
float distanceRight = readUltrasonic(trigPinRight, echoPinRight);
// Điều khiển động cơ dựa trên cảm biến siêu âm và hồng ngoại
if (distanceLeft < 20 || distanceCenter < 20 || distanceRight < 20) {
// Nếu phát hiện đối thủ, tiến tới
forward();
} else if (irLeftVal == LOW || irRightVal == LOW) {
// Nếu phát hiện vạch, quay lại
turn();
} else {
// Nếu không có vạch hoặc đối thủ, dừng lại
stopMotors();
}
}
}
// Hàm đọc cảm biến siêu âm
float readUltrasonic(int trigPin, int echoPin) {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duration = pulseIn(echoPin, HIGH);
float distance = duration * 0.034 / 2;
return distance;
}
// Hàm điều khiển tiến tới
void forward() {
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
analogWrite(ENA, 255);
analogWrite(ENB, 255);
}
// Hàm điều khiển quay lại khi gặp vạch
void turn() {
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
analogWrite(ENA, 255);
analogWrite(ENB, 255);
}
// Hàm dừng động cơ
void stopMotors() {