Hardware Layer trong kiến trúc AMR: kiểm kê I/O vật lý
Atlasbot · 22/8/2026 · 11 phút đọc
Chuyên mục Hardware AMR đã học từng linh kiện riêng lẻ — Motor, Encoder, LiDAR, IMU, Bumper. Bài này đặt chúng đúng vị trí trong mô hình 5 tầng đã học ở bài Kiến trúc AMR: tất cả linh kiện đó, cùng đoạn code tối thiểu đọc/ghi trực tiếp chúng, hợp thành Hardware Layer.
Khái niệm chính
Hardware Layer gồm 2 nhóm linh kiện vật lý, nối trực tiếp vào MCU:
- Cảm biến (input) — Encoder, IMU, LiDAR, Camera, Bumper — đã học chi tiết ở chuyên mục Hardware AMR
- Cơ cấu chấp hành (output) — Motor + Motor Driver, relay E-Stop, đèn/còi báo hiệu
Ranh giới quan trọng cần nhớ: Hardware Layer chỉ đọc/ghi tín hiệu thô (mức điện áp, xung PWM, xung digital) — nó không diễn giải, không parse thành message có ý nghĩa. Việc diễn giải đó là trách nhiệm của Driver Layer (đã học ở bài trước), không phải Hardware Layer.
Nguyên lý hoạt động
Ở đúng tầng này, MCU chỉ thực hiện các thao tác cấp thấp nhất: đọc mức điện áp trên một chân GPIO, đếm xung ngắt từ encoder, xuất giá trị duty cycle PWM cho driver động cơ. Không có logic điều khiển, không có phân tích dữ liệu — những việc đó thuộc về Driver Layer (dịch dữ liệu sang message ROS2) hoặc các tầng cao hơn.
Điểm dễ nhầm lẫn: rất nhiều thao tác ở tầng này thực chất liên quan tới cấu hình phần cứng của chính MCU — chọn đúng chân hỗ trợ ngắt (interrupt) cho encoder, chọn đúng chân hỗ trợ PWM phần cứng cho driver động cơ, cấu hình đúng tốc độ bus I2C/SPI cho IMU/LiDAR. Đây là lý do việc chọn MCU (STM32/ESP32...) không chỉ dựa vào tốc độ xử lý mà còn phải xét kỹ số lượng và loại chân ngoại vi có sẵn.
Kiến thức kỹ thuật
Công thức
Ngân sách chân I/O cần cho một AMR điển hình — tính tổng trước khi chọn MCU, tránh tình huống thiết kế xong mới phát hiện không đủ chân:
Số chân ngắt (interrupt) cần = Số bánh × 2 (mỗi encoder quadrature cần 2 kênh A/B)
VD: Differential Drive (2 bánh) → cần 4 chân hỗ trợ ngắt
Mecanum Drive (4 bánh) → cần 8 chân hỗ trợ ngắt
Số chân PWM cần = Số bánh (mỗi driver động cơ cần tối thiểu 1 kênh PWM tốc độ,
cộng thêm 1-2 chân digital điều khiển chiều tuỳ loại driver)
Thông số
| Linh kiện | Loại kết nối cần | Số lượng chân điển hình |
|---|---|---|
| Encoder (mỗi bánh) | 2 chân hỗ trợ ngắt (kênh A, B) | 2 × số bánh |
| IMU | I2C (2 chân, dùng chung bus được) | 2 (dùng chung với các thiết bị I2C khác) |
| LiDAR | UART riêng (2 chân) hoặc USB | 2 (hoặc 0 nếu qua USB trực tiếp lên SBC) |
| Motor Driver (mỗi bánh) | 1 PWM + 1-2 digital điều khiển chiều | 2-3 × số bánh |
| Bumper/E-Stop | Digital input, thường cần ngắt ưu tiên cao | 1 mỗi cảm biến |
Ứng dụng thực tế
Trong kiến trúc thực tế của dự án Atlas A2 (đã nhắc ở nhiều bài trong chuyên mục Hardware AMR), ESP32 đảm nhiệm đúng vai trò Hardware Layer này — đọc encoder qua ngắt, đọc tín hiệu bumper/E-Stop ưu tiên cao, xuất PWM cho driver TSDA-C12D điều khiển động cơ TODE brushless. Việc chọn ESP32 thay vì một MCU rẻ hơn (như Arduino Uno cơ bản, ít chân ngắt) phần lớn xuất phát từ đúng bài toán ngân sách chân I/O này — số lượng cảm biến + cơ cấu chấp hành cần đọc/ghi đồng thời vượt quá khả năng của các MCU cấp thấp hơn.
Ví dụ thực tế
Kịch bản: AMR Mecanum Drive (4 bánh), có IMU, LiDAR qua USB riêng lên SBC
(không qua MCU), 2 cảm biến bumper, 1 nút E-Stop
Tính ngân sách chân cần cho MCU:
- Encoder: 4 bánh × 2 kênh = 8 chân hỗ trợ ngắt
- IMU (I2C): 2 chân (SDA, SCL)
- LiDAR: 0 chân MCU (kết nối thẳng USB lên SBC, không qua MCU)
- Motor Driver: 4 bánh × 3 chân (1 PWM + 2 chiều) = 12 chân
- Bumper: 2 chân ngắt ưu tiên cao
- E-Stop: 1 chân ngắt ưu tiên cao nhất
Tổng: 8 + 2 + 12 + 2 + 1 = 25 chân, trong đó 11 chân cần hỗ trợ ngắt
→ ESP32 (34 GPIO khả dụng, hầu hết hỗ trợ ngắt) đáp ứng thoải mái
→ Arduino Uno (chỉ 2 chân ngắt ngoài thực) hoàn toàn không đủ cho cấu hình này
Lỗi thường gặp
- Không kiểm tra chân có thực sự hỗ trợ ngắt trước khi thiết kế mạch — không phải mọi GPIO đều hỗ trợ ngắt phần cứng, gán nhầm chân encoder vào chân không hỗ trợ khiến phải đọc bằng polling (tốn CPU, dễ bỏ sót xung ở tốc độ cao).
- Dùng chung bus I2C cho thiết bị có địa chỉ trùng nhau — 2 IMU cùng loại có cùng địa chỉ I2C mặc định sẽ xung đột nếu không cấu hình lại địa chỉ hoặc dùng multiplexer.
- Nhét logic xử lý vào Hardware Layer thay vì chỉ đọc/ghi thô — vi phạm ranh giới với Driver Layer, khiến code khó tách rời khi cần thay đổi giao thức giao tiếp phía trên.
- Bỏ qua yêu cầu ưu tiên ngắt cho tín hiệu an toàn (bumper/E-Stop) — nếu ngắt của bumper cùng mức ưu tiên với ngắt encoder tần số cao, tín hiệu an toàn có thể bị trễ xử lý trong tình huống nhiều ngắt xảy ra đồng thời.
Kết luận
Hardware Layer là nơi mọi tầng phần mềm phía trên phụ thuộc vào, nhưng bản thân nó chỉ nên chứa thao tác đọc/ghi tín hiệu thô đơn giản nhất — không logic, không diễn giải. Tính đúng ngân sách chân I/O trước khi chọn MCU tránh được việc phải thiết kế lại phần cứng giữa chừng dự án. Bài tiếp theo trong chuyên mục — Driver Layer — đã có sẵn, đi sâu vào cách dữ liệu thô từ tầng này được dịch thành message ROS2 có ý nghĩa.