Xem danh mục

Đ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ânChứ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, OUT2Kết nối động cơ A
OUT3, OUT4Kết nối động cơ B
12VNguồn động cơ
GNDGND
5VNguồ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

PWMTốc độ
0Dừng
100Chậm
150Trung bình
255Tố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