Điều khiển động cơ DC với L298N
1. Mục tiêu bài học #
Sau bài này, bạn sẽ có thể:
- Điều khiển động cơ quay tiến/lùi
- Điều chỉnh tốc độ động cơ bằng PWM
- Điều khiển xe robot tiến, lùi, rẽ trái, rẽ phải
- Hiểu nguyên lý hoạt động của mạch L298N
2. Mạch cầu H L298N là gì #
L298N là module điều khiển động cơ DC rất phổ biến trong các dự án robot Arduino.
Arduino không thể cấp đủ dòng điện để chạy trực tiếp động cơ, nên cần L298N để:
- Cấp nguồn cho động cơ
- Đảo chiều quay
- Điều chỉnh tốc độ
3. Các chân quan trọng trên L298N #
| Chân | Chức năng |
| ENA | Điều chỉnh tốc độ động cơ A |
| IN1, IN2 | Điều khiển chiều quay động cơ A |
| ENB | Điều chỉnh tốc độ động cơ B |
| IN3, IN4 | Điều khiển chiều quay động cơ B |
| OUT1, OUT2 | Kết nối động cơ A |
| OUT3, OUT4 | Kết nối động cơ B |
| 12V | Nguồn động cơ |
| GND | GND |
| 5V | Nguồn ra 5V |
4. Sơ đồ kết nối #
5. Nguyên lý điều khiển động cơ #
6. Code test động cơ #
// Motor trái
#define ENA 5
#define IN1 0
#define IN2 1
// Motor phải
#define ENB 6
#define IN3 4
#define IN4 7
void setup() {
pinMode(ENA, OUTPUT);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(ENB, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
}
void loop() {
// Tiến
forward();
delay(2000);
// Dừng
stopMotor();
delay(1000);
// Lùi
backward();
delay(2000);
// Dừng
stopMotor();
delay(1000);
}
void forward() {
analogWrite(ENA, 150);
analogWrite(ENB, 150);
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
}
void backward() {
analogWrite(ENA, 150);
analogWrite(ENB, 150);
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
}
void stopMotor() {
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
}7. Điều chỉnh tốc độ động cơ #
analogWrite(ENA, 255);
analogWrite(ENB, 255);
Giá trị PWM
| PWM | Tốc độ |
| 0 | Dừng |
| 100 | Chậm |
| 150 | Trung bình |
| 255 | Tối đa |
8. Code điều khiển xe robot #
// Motor trái
#define ENA 5
#define IN1 0
#define IN2 1
// Motor phải
#define ENB 6
#define IN3 4
#define IN4 7
void setup() {
pinMode(ENA, OUTPUT);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(ENB, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
}
void loop() {
forward();
delay(2000);
backward();
delay(2000);
turnLeft();
delay(1000);
turnRight();
delay(1000);
stopMotor();
delay(2000);
}
void forward() {
analogWrite(ENA, 150);
analogWrite(ENB, 150);
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
}
void backward() {
analogWrite(ENA, 150);
analogWrite(ENB, 150);
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
}
void turnLeft() {
analogWrite(ENA, 0);
analogWrite(ENB, 150);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
}
void turnRight() {
analogWrite(ENA, 150);
analogWrite(ENB, 0);
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
}
void stopMotor() {
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
}9. Giải thích #
10. Các lỗi thường gặp #
Động cơ không quay
Nguyên nhân:
- Chưa cấp nguồn pin cho L298N
- GND Arduino và L298N chưa nối chung
- Dây động cơ cắm sai
Động cơ chỉ quay một chiều
Nguyên nhân:
- Sai chân IN1/IN2
- Code điều khiển chiều quay bị sai
Xe quay lệch
Nguyên nhân:
- Hai động cơ không đều tốc độ
- Pin yếu
- Bánh xe ma sát khác nhau
Có thể khắc phục bằng cách chỉnh PWM riêng cho từng bánh:
analogWrite(ENA, 140);
analogWrite(ENB, 150);
11. Một số biến thể #
12. Tổng kết #
Sau bài này bạn đã biết:
- Điều khiển động cơ DC bằng L298N
- Điều chỉnh tốc độ bằng PWM
- Điều khiển chiều quay
- Điều khiển xe robot cơ bản
Cập nhật vào Tháng 5 29, 2026