Góc STEM Học Sinh 3 Bài 1:Chế tạo Xe Robot Dò Line

Góc STEM Học Sinh 3 Bài 1: Chế tạo Xe Robot Dò Line (Line Follower) Cơ bản với Arduino

Góc STEM – Khơi dậy đam mê kỹ sư nhí (Dành cho tuổi 9 – 15)

Chào mừng các bậc phụ huynh và các kỹ sư nhí quay trở lại với chuyên mục STEM trên banhangdientu.com!

Các bé có bao giờ thấy những chiếc xe tự hành trong nhà kho của Amazon hay Shopee tự động chạy dọc theo những vạch kẻ trên sàn nhà để phân loại hàng hóa chưa? Chúng làm điều đó bằng công nghệ gì?

Hôm nay, chúng ta sẽ cùng nhau chế tạo một chiếc xe robot tương tự: Xe dò line (Line Follower Robot). Chiếc xe này sẽ tự động nhận diện và bám theo một vạch kẻ màu đen trên nền trắng nhờ vào “đôi mắt” hồng ngoại và “bộ não” Arduino.

Phần 1: Nguyên lý Khoa học – Đôi mắt Hồng ngoại hoạt động ra sao?

Để xe chạy đúng đường, nó phải phân biệt được đâu là vạch đen và đâu là nền trắng. Chúng ta sẽ sử dụng Module Cảm biến Hồng ngoại (IR Sensor), phổ biến nhất là loại TCRT5000.

Mỗi module cảm biến này bao gồm 2 bóng đèn nhỏ đứng cạnh nhau:

  • Bóng phát (Màu trong suốt/Xanh trong): Liên tục phát ra tia sáng hồng ngoại (loại ánh sáng mà mắt người không nhìn thấy được) xuống mặt đất.
  • Bóng thu (Màu đen): Đóng vai trò như một camera, chờ nhận lại tia sáng hồng ngoại phản xạ ngược lên.

Bí mật của màu sắc và ánh sáng:

  • Khi gặp nền Trắng: Màu trắng có đặc tính phản xạ ánh sáng rất tốt. Tia hồng ngoại chiếu xuống nền trắng sẽ bật ngược lại, bóng thu nhận được tín hiệu và báo về cho Arduino là mức Thấp (LOW).
  • Khi gặp vạch Đen: Màu đen có đặc tính hấp thụ ánh sáng. Tia hồng ngoại chiếu xuống sẽ bị hút sạch, không có tia nào phản xạ bật lên. Bóng thu không nhận được ánh sáng sẽ báo về Arduino là mức Cao (HIGH).

Nhờ đặc tính vật lý này, Arduino có thể biết chính xác xe đang nằm trên nền trắng hay đang đè lên vạch đen!

Phần 2: Chuẩn bị Vật tư (Danh sách Linh kiện)

Để chế tạo xe robot hoàn chỉnh, chúng ta cần một hệ thống gồm Não bộ, Mắt, Cơ bắp và Hệ thống cung cấp năng lượng:

  • Não bộ: 1x Bo mạch Arduino UNO R3.
  • Mắt: 2x Module Cảm biến hồng ngoại dò line (TCRT5000). Đặt ở phía trước xe (Mắt Trái và Mắt Phải).
  • Cơ bắp: 1x Khung xe mica 2 bánh (2WD Smart Car Chassis). Bộ này thường đi kèm sẵn 2 động cơ giảm tốc DC màu vàng và 1 bánh xe mắt trâu xoay tự do phía trước.
  • Hệ thống mạch máu (Module L298N): Đây là chi tiết cực kỳ quan trọng. Bo mạch Arduino rất yếu, không thể tự mình cấp điện cho động cơ bánh xe. Chúng ta phải dùng mạch điều khiển động cơ L298N (Mạch cầu H) làm trạm trung chuyển để bơm dòng điện lớn cho xe chạy.
  • Nguồn điện: 2x Viên pin sạc 18650 (3.7V/viên) và đế đựng pin. Tổng điện áp là 7.4V, đủ mạnh để kéo hệ thống.
  • Dây cắm testboard các loại.

Phần 3: Sơ đồ Lắp ráp và Đấu nối Phần cứng

Việc đấu nối cần sự kiên nhẫn và chính xác. Phụ huynh hãy hướng dẫn các bé nối dây theo đúng nguyên tắc sau:

1. Nguồn điện tổng (Bắt buộc đấu đúng cực để tránh chập cháy):

  • Nối cực Dương (+) của hộp pin 7.4V vào chân 12V của module L298N.
  • Nối cực Âm (-) của hộp pin vào chân GND của module L298N.
  • Lấy một sợi dây, nối từ chân GND của L298N sang chân GND của Arduino (để đồng bộ tín hiệu).
  • Lấy một sợi dây, nối từ chân 5V của L298N sang chân 5V của Arduino (Dùng L298N cấp nguồn ngược lại cho não bộ Arduino).

2. Đấu nối Động cơ DC:

  • Nối 2 dây của Động cơ bên Trái vào cổng OUT1 và OUT2 trên L298N.
  • Nối 2 dây của Động cơ bên Phải vào cổng OUT3 và OUT4 trên L298N.

3. Đấu nối Tín hiệu điều khiển (Từ Arduino sang L298N):

  • Chân IN1IN2 (điều khiển bánh trái) nối vào chân số 45 trên Arduino.
  • Chân IN3IN4 (điều khiển bánh phải) nối vào chân số 67 trên Arduino.

4. Đấu nối Cảm biến Hồng ngoại (Mắt Trái & Mắt Phải):

  • Cấp nguồn cho 2 cảm biến: Chân VCC nối với 3.3V hoặc 5V trên Arduino, chân GND nối vào GND.
  • Chân Tín hiệu (OUT/D0) của Mắt Trái nối vào chân số 2 của Arduino.
  • Chân Tín hiệu (OUT/D0) của Mắt Phải nối vào chân số 3 của Arduino.

Phần 4: Tư duy Thuật toán – Xe sẽ chạy như thế nào?

Thuật toán dò line dựa trên việc đặt vạch đen nằm lọt thỏm vào giữa hai mắt hồng ngoại. Các kỹ sư nhí hãy lập trình dựa trên bảng chân lý sau:

Tín hiệu Mắt TráiTín hiệu Mắt PhảiTình trạng thực tếHành động của Robot
TrắngTrắngXe đang đi đúng giữa làn đườngCho 2 bánh chạy thẳng tiến
ĐenTrắngXe bị lệch sang phải (mắt trái đè vạch)Dừng bánh trái, chạy bánh phải để Rẽ Trái
TrắngĐenXe bị lệch sang trái (mắt phải đè vạch)Dừng bánh phải, chạy bánh trái để Rẽ Phải
ĐenĐenĐến điểm dừng hoặc vạch cắt ngangDừng cả 2 bánh

Phần 5: Code Lập trình Arduino (Ngôn ngữ C++)

Dưới đây là đoạn code điều khiển cơ bản bám sát bảng thuật toán ở Phần 4.

C++

// Khai báo chân Cảm biến
const int sensorLeft = 2;
const int sensorRight = 3;

// Khai báo chân điều khiển Động cơ Trái (L298N IN1, IN2)
const int motorLeftF = 4; // Tiến
const int motorLeftB = 5; // Lùi

// Khai báo chân điều khiển Động cơ Phải (L298N IN3, IN4)
const int motorRightF = 6; // Tiến
const int motorRightB = 7; // Lùi

void setup() {
  // Cài đặt cảm biến là thiết bị Nhập
  pinMode(sensorLeft, INPUT);
  pinMode(sensorRight, INPUT);

  // Cài đặt động cơ là thiết bị Xuất
  pinMode(motorLeftF, OUTPUT);
  pinMode(motorLeftB, OUTPUT);
  pinMode(motorRightF, OUTPUT);
  pinMode(motorRightB, OUTPUT);
}

void loop() {
  // Đọc tín hiệu từ mắt hồng ngoại (Mức HIGH thường là gặp vạch Đen)
  int valLeft = digitalRead(sensorLeft);
  int valRight = digitalRead(sensorRight);

  // 1. Cả 2 mắt đều gặp Trắng -> Chạy Thẳng
  if (valLeft == LOW && valRight == LOW) {
    digitalWrite(motorLeftF, HIGH);
    digitalWrite(motorLeftB, LOW);
    digitalWrite(motorRightF, HIGH);
    digitalWrite(motorRightB, LOW);
  }
  
  // 2. Mắt Trái gặp vạch Đen -> Cua Trái
  else if (valLeft == HIGH && valRight == LOW) {
    digitalWrite(motorLeftF, LOW);  // Dừng bánh trái
    digitalWrite(motorLeftB, LOW);
    digitalWrite(motorRightF, HIGH); // Chạy bánh phải
    digitalWrite(motorRightB, LOW);
  }
  
  // 3. Mắt Phải gặp vạch Đen -> Cua Phải
  else if (valLeft == LOW && valRight == HIGH) {
    digitalWrite(motorLeftF, HIGH); // Chạy bánh trái
    digitalWrite(motorLeftB, LOW);
    digitalWrite(motorRightF, LOW);  // Dừng bánh phải
    digitalWrite(motorRightB, LOW);
  }
  
  // 4. Cả 2 mắt gặp Đen -> Dừng lại
  else if (valLeft == HIGH && valRight == HIGH) {
    digitalWrite(motorLeftF, LOW);
    digitalWrite(motorLeftB, LOW);
    digitalWrite(motorRightF, LOW);
    digitalWrite(motorRightB, LOW);
  }
}

Tổng kết

Sau khi nạp code, các bé hãy dùng băng keo đen dán thành một vòng đua khép kín trên nền gạch màu sáng. Đặt xe lên và bật công tắc. Nếu chiếc xe lắc lư nhẹ liên tục sang hai bên để bám theo vạch đen tiến về phía trước, xin chúc mừng, dự án xe tự hành đã thành công rực rỡ!

Nguồn tài liệu tham khảo cho dự án:

Nâng cấp Xe Robot Dò Line với Thuật toán PID – Vào cua mượt mà như xe đua

Ở phần trước, chúng ta đã chế tạo thành công chiếc xe dò line cơ bản. Tuy nhiên, nếu quan sát kỹ, các bé sẽ thấy chiếc xe chạy khá “giật cục”, đầu xe liên tục lắc lư sang trái rồi sang phải một cách thô kệch. Lý do là vì bộ não Arduino của chúng ta chỉ đang dùng hệ thống điều khiển Bật/Tắt (Bang-Bang Control): Động cơ chỉ có 2 trạng thái là chạy tối đa 100% công suất hoặc dừng lại hẳn (0%).

Hôm nay, chúng ta sẽ “dạy” cho bộ não Arduino một phép thuật toán học của các kỹ sư chuyên nghiệp: Thuật toán PID. Khối óc này sẽ giúp chiếc xe lướt đi êm ái, tăng giảm tốc độ nhịp nhàng và ôm cua mượt mà như một chiếc xe đua F1!

Phần 1: Chìa khóa thay đổi tốc độ – Xung PWM (Pulse Width Modulation)

Trước khi học thuật toán, chúng ta cần biết cách “đạp ga” và “hãm phanh” cho động cơ điện.

Arduino không thể xuất ra dòng điện 2V, 3V hay 4V. Nó chỉ có thể xuất ra mức 0V (Tắt) hoặc 5V (Bật). Để giả lập các mức điện áp trung gian, các kỹ sư dùng kỹ thuật Băm xung (PWM).

Thay vì bật điện liên tục, Arduino sẽ bật/tắt dòng điện cực kỳ nhanh (hàng ngàn lần mỗi giây).

  • Nếu bật 50% thời gian và tắt 50% thời gian, động cơ sẽ chạy với 50% tốc độ cực đại.
  • Trên Arduino, giá trị PWM được chia từ 0 (Dừng hẳn) đến 255 (Chạy tối đa). Nhờ PWM, chúng ta không phải dừng hẳn một bánh xe để rẽ nữa, mà chỉ cần giảm tốc độ của bánh đó xuống một chút, xe sẽ ôm cua một cách vòng cung tuyệt đẹp!

Phần 2: Giải mã Thuật toán PID (Proportional – Integral – Derivative)

PID là một hệ thống tự động điều chỉnh liên tục để sửa chữa “Sai số” (Error). Sai số ở đây chính là Khoảng cách từ tâm chiếc xe đến vạch đen. PID gồm 3 thành phần (3 người thợ) cùng làm việc với nhau:

1. Khâu P (Proportional – Tỉ lệ): “Người cầm vô lăng”

  • Nhiệm vụ: Phản ứng ngay lập tức dựa trên độ lớn của Sai số.
  • Nguyên lý: Nếu xe bị lệch khỏi vạch đen một chút xíu, Khâu P sẽ bẻ lái một chút. Nếu xe bị văng ra quá xa, Khâu P sẽ bẻ lái cực gắt để ép xe quay lại.
  • Khuyết điểm: Nếu chỉ dùng một mình P, khi xe quay lại đúng vạch, nó đang có quán tính lớn nên sẽ bị văng “lố” sang bờ bên kia, tạo ra hiện tượng rung lắc tuần hoàn.

2. Khâu D (Derivative – Đạo hàm): “Người đạp phanh”

  • Nhiệm vụ: Dự đoán tương lai để chống lại sự văng lố của Khâu P.
  • Nguyên lý: Đạo hàm là tốc độ thay đổi. Khâu D sẽ tính toán xem chiếc xe đang lao về phía vạch đen nhanh mức nào. Nếu xe đang lao vào vạch quá nhanh, Khâu D sẽ tự động “đạp phanh” (giảm lực bẻ lái của P) từ xa để chiếc xe đi vào tâm vạch một cách từ từ và êm ái.

3. Khâu I (Integral – Tích phân): “Người sửa lỗi tích lũy”

  • Nhiệm vụ: Ghi nhớ và cộng dồn các sai số nhỏ trong quá khứ.
  • Nguyên lý: Đôi khi, xe chạy trên một đoạn đường hơi nghiêng, khiến nó luôn bị lệch khỏi tâm một vài milimet. Khâu P thấy sai số quá nhỏ nên không thèm sửa. Lúc này, Khâu I sẽ cộng dồn các sai số nhỏ này theo thời gian, cho đến khi nó đủ lớn, I sẽ ra lệnh bẻ lái một lần để đưa xe về độ chính xác tuyệt đối.

Tóm tắt công thức điều khiển: Lực bẻ lái (PID Value) = (Kp * Sai số) + (Ki * Tích phân sai số) + (Kd * Tốc độ thay đổi sai số) (Trong đó Kp, Ki, Kd là 3 hệ số mà chúng ta sẽ phải tự điều chỉnh bằng tay cho phù hợp với trọng lượng của từng chiếc xe).

Phần 3: Nâng cấp Phần cứng (Thêm mắt cho Robot)

Để thuật toán PID tính toán được mức độ lệch nhiều hay lệch ít (Sai số), 2 mắt hồng ngoại ở Bài 2 là không đủ. Chúng ta cần thay thế bằng một Module cảm biến dò line 5 kênh (5 mắt).

  • Nếu mắt chính giữa (Mắt số 3) thấy vạch đen: Lỗi = 0 (Hoàn hảo).
  • Nếu mắt số 2 thấy vạch đen: Lỗi = -1 (Lệch nhẹ sang phải).
  • Nếu mắt số 1 (ngoài cùng) thấy vạch đen: Lỗi = -2 (Lệch nặng sang phải). Tương tự cho bên trái với Lỗi = 1 và Lỗi = 2. Càng nhiều mắt, xe đo đạc càng mịn!

Phần 4: Cấu trúc Code PID trên Arduino (Ngôn ngữ C++)

Dưới đây là phần khung logic (Pseudo-code kết hợp C++) của thuật toán PID để các kỹ sư nhí tham khảo và đưa vào dự án thực tế:

C++

// Khai báo các hệ số PID (Cần tinh chỉnh thực tế trên từng xe)
float Kp = 25.0; 
float Ki = 0.0; // Xe dò line cơ bản thường đặt Ki = 0
float Kd = 15.0;

int P, I, D;
int error = 0;
int previous_error = 0;
int PID_value = 0;

// Tốc độ mặc định của xe (0 - 255)
int base_speed = 120; 

void calculate_PID() {
  // 1. Tính toán khâu P (Sai số hiện tại)
  P = error;
  
  // 2. Tính toán khâu I (Cộng dồn sai số quá khứ)
  I = I + error;
  
  // 3. Tính toán khâu D (Tốc độ thay đổi sai số so với vòng lặp trước)
  D = error - previous_error;
  
  // 4. Lắp vào công thức tổng PID
  PID_value = (Kp * P) + (Ki * I) + (Kd * D);
  
  // Lưu lại sai số hiện tại cho vòng lặp tương lai
  previous_error = error;
}

void motor_control() {
  // 5. Kết hợp giá trị PID vào tốc độ động cơ
  int left_motor_speed = base_speed + PID_value;
  int right_motor_speed = base_speed - PID_value;

  // 6. Giới hạn tốc độ không vượt quá vạch 0 và 255
  if (left_motor_speed > 255) left_motor_speed = 255;
  if (left_motor_speed < 0) left_motor_speed = 0;
  
  if (right_motor_speed > 255) right_motor_speed = 255;
  if (right_motor_speed < 0) right_motor_speed = 0;

  // 7. Gửi xung PWM ra chân EN của L298N để điều khiển tốc độ (analogWrite)
  analogWrite(ENA_pin, left_motor_speed);
  analogWrite(ENB_pin, right_motor_speed);
}

Tổng kết và Góc thử thách Kỹ sư (Tuning PID)

Việc viết code PID không khó, phần khó nhất và thú vị nhất đối với một kỹ sư điều khiển tự động là Tinh chỉnh hệ số (PID Tuning):

  1. Ban đầu, hãy đặt Ki = 0 và Kd = 0. Chỉ tăng dần Kp cho đến khi xe bám được vạch nhưng bị lắc lư liên tục.
  2. Bắt đầu tăng dần Kd lên để giảm độ lắc, giúp xe ổn định lại khi vào cua.

Mỗi chiếc xe có trọng lượng, loại động cơ và ma sát lốp khác nhau nên bộ số Kp, Ki, Kd của mỗi xe là độc nhất. Chúc các gia đình có những buổi tinh chỉnh xe đầy tiếng cười và tạo ra được một cỗ máy đua hoàn hảo nhất!

Nguồn tài liệu tham khảo cho chuyên ngành Điều khiển tự động:


Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Chia sẻ bài viết này

Share Facebook