Giới thiệu series “Lập trình ESP32 38 Pin & NRF: Truyền thông không dây”
Trong series này, chúng ta sẽ cùng xây dựng từng bước một hệ thống IoT dùng ESP32 DevKit 38 pin kết hợp với module NRF24L01 để:
- Tạo mạng cảm biến không dây nhiều node.
- Xây bộ điều khiển từ xa cho robot, xe, thiết bị.
- Xây gateway ESP32 nhận dữ liệu NRF rồi đẩy lên MQTT / IoTLabs Cloud.
Ở Phần 3, chúng ta tập trung vào: làm quen module NRF24L01 và hiểu cách giao tiếp SPI với ESP32.
1. Mục tiêu bài học
Sau khi đọc xong bài này, bạn sẽ:
- Hiểu NRF24L01 là gì và ứng dụng trong các dự án IoT, robot.
- Nắm được giao tiếp SPI cơ bản giữa ESP32 và NRF24L01.
- Biết ý nghĩa từng chân trên module NRF24L01.
- Biết cách mapping chân NRF24L01 ↔ ESP32 DevKit 38 pin.
- Kết nối đúng phần cứng để sẵn sàng cho bước tiếp theo: gửi “Hello World” không dây giữa 2 board.
2. NRF24L01 là gì?
NRF24L01 là một IC thu–phát RF tần số 2.4GHz của Nordic Semiconductor, rất phổ biến trong các dự án:
- Bộ điều khiển từ xa: xe điều khiển, robot, tay cầm.
- Mạng cảm biến không dây (nhiều node gửi về một gateway).
- Hệ thống truyền dữ liệu khoảng cách ngắn đến trung bình (trong phòng, trong nhà, xưởng nhỏ).
2.1. Ưu điểm của NRF24L01
- Giá rẻ, dễ mua trên các sàn thương mại.
- Tiêu thụ ít điện năng, phù hợp cho các module ngoại vi dùng pin.
- Hỗ trợ nhiều “pipe” (đường truyền logic), cho phép nhiều node cảm biến cùng gửi về 1 gateway.
- Giao tiếp qua SPI, được hỗ trợ tốt trong Arduino / ESP32 với thư viện RF24.
2.2. Các biến thể NRF24L01 phổ biến
Trên thị trường thường có hai loại module chính:
- NRF24L01 thường (không PA/LNA):
- Kích thước nhỏ, màu xanh lá.
- Anten in trực tiếp trên PCB.
- Khoảng cách truyền phù hợp cho môi trường trong phòng, nhà, lớp học.
- NRF24L01 + PA + LNA (có anten ngoài):
- Có anten rời, kích thước lớn hơn.
- Công suất phát mạnh hơn, tầm xa hơn.
- Đòi hỏi nguồn ổn định hơn, thường kén nguồn.
Trong series “Lập trình ESP32 38 Pin & NRF”, chúng ta ưu tiên dùng loại thường 8 chân để đơn giản hóa phần phần cứng.
3. Ôn lại giao tiếp SPI trên ESP32
SPI (Serial Peripheral Interface) là chuẩn giao tiếp nối tiếp tốc độ cao, được sử dụng rộng rãi với:
- Bộ nhớ flash, màn hình OLED/TFT, cảm biến tốc độ cao,
- Module RF như NRF24L01.
3.1. Các đường tín hiệu chính trong SPI
SPI gồm các đường chính:
- SCK (Serial Clock): xung clock do ESP32 phát ra.
- MOSI (Master Out, Slave In): dữ liệu từ ESP32 → NRF.
- MISO (Master In, Slave Out): dữ liệu từ NRF → ESP32.
- CS / CSN / SS (Chip Select): chọn thiết bị slave đang được giao tiếp (mức LOW là chọn).
Trên ESP32, các chân SPI có thể gán linh hoạt bằng phần mềm, nhưng có một nhóm chân khuyến nghị thường dùng cho bus VSPI:
- VSPI (thường dùng):
- SCK → GPIO 18
- MISO → GPIO 19
- MOSI → GPIO 23
- CS → GPIO 5 (có thể đổi sang chân khác nếu cần)
Ngoài các đường SPI tiêu chuẩn, NRF24L01 còn dùng thêm 2 chân điều khiển quan trọng:
- CE (Chip Enable): bật/tắt chế độ TX/RX của NRF.
- IRQ: chân ngắt báo các sự kiện (nhận dữ liệu, gửi xong, v.v.). Trong giai đoạn cơ bản có thể bỏ trống.
4. Chân của module NRF24L01 (loại 8 chân)
Với module NRF24L01 loại thường 8 chân, chúng ta có sơ đồ chân như sau:
| Chân NRF24L01 | Tên | Chức năng |
|---|---|---|
| 1 | GND | Mass, nối GND chung với ESP32 |
| 2 | VCC | Nguồn 3.3V (tuyệt đối không cấp 5V) |
| 3 | CE | Bật/tắt chế độ TX/RX |
| 4 | CSN (CS) | Chip Select (CS), active LOW |
| 5 | SCK | Clock SPI (do ESP32 phát) |
| 6 | MOSI | Dữ liệu từ ESP32 → NRF |
| 7 | MISO | Dữ liệu từ NRF → ESP32 |
| 8 | IRQ | Ngắt báo sự kiện (có thể bỏ trống ban đầu) |
🔴 Lưu ý quan trọng về nguồn
- VCC chỉ 3.3V, nếu cấp 5V module có thể hỏng ngay.
- NRF24L01 rất nhạy với nhiễu nguồn, nên luôn khuyến khích gắn tụ lọc 10µF – 47µF giữa VCC và GND để hệ thống chạy ổn định.
5. Mapping chân NRF24L01 với ESP32 DevKit 38 pin
Dưới đây là gợi ý mapping sử dụng bus VSPI trên ESP32 – cấu hình phổ biến, dễ nhớ và tương thích với nhiều ví dụ thư viện:
| NRF24L01 | ESP32 DevKit 38-pin | Ghi chú |
|---|---|---|
| GND | GND | GND chung |
| VCC | 3V3 | Chỉ cấp 3.3V, không dùng 5V |
| CE | GPIO 4 | Chân CE (có thể đổi sang chân khác) |
| CSN (CS) | GPIO 5 | Chân Chip Select |
| SCK | GPIO 18 | VSPI SCK |
| MOSI | GPIO 23 | VSPI MOSI |
| MISO | GPIO 19 | VSPI MISO |
| IRQ | (Không nối / GPIO 16) | Có thể tạm thời bỏ trống nếu chưa dùng |
Để thuận tiện khi lập trình, bạn nên định nghĩa các chân ở đầu file:
#define PIN_NRF_CE 4
#define PIN_NRF_CSN 5
#define PIN_NRF_SCK 18
#define PIN_NRF_MISO 19
#define PIN_NRF_MOSI 23
Nhờ vậy, nếu sau này đổi sang một board ESP32 khác (ví dụ ESP32-S3, ESP32-C3), bạn chỉ cần sửa lại các #define mà không phải sửa toàn bộ code.
6. Lưu ý khi kết nối thực tế NRF24L01 với ESP32
Để hệ thống NRF24L01 hoạt động ổn định với ESP32 38 pin, bạn cần chú ý một số điểm sau:
6.1. Nguồn 3.3V phải ổn định
- Với 1 module NRF24L01 loại thường, bạn có thể lấy nguồn từ chân 3V3 của ESP32.
- Nếu dùng nhiều module NRF, hoặc loại NRF24L01 + PA + LNA, bạn nên dùng nguồn 3.3V riêng với IC ổn áp (ví dụ AMS1117-3.3), cấp đủ dòng và có tụ lọc.
6.2. Gắn tụ lọc nguồn cho NRF24L01
- Hàn một tụ 10µF – 47µF giữa VCC và GND ngay sát module NRF.
- Điều này giúp giảm tình trạng mất kết nối ngẫu nhiên do sụt áp hoặc nhiễu khi NRF phát sóng.
6.3. Dây nối càng ngắn càng tốt
- NRF24L01 không thích dây Dupont quá dài, đặc biệt là các đường SPI.
- Cố gắng để module gần board ESP32, độ dài dây nối nên < 10cm để tín hiệu ổn định.
6.4. Hạn chế nhiễu điện từ
- Tránh đặt module NRF quá gần dây nguồn AC, relay, motor hoặc các phần tử công suất lớn.
- Nếu thiết kế hộp hoặc vỏ, chú ý không che anten bằng kim loại.
6.5. Khoảng cách khi thử nghiệm
- Khi test lần đầu, nên để 2 bộ ESP32 + NRF24L01 cách nhau khoảng 1–2m.
- Nếu để quá sát, đôi khi tín hiệu lại kém ổn định do công suất phát và phản xạ sóng.
7. Code mẫu kiểm tra kết nối NRF24L01 với ESP32
Ở phần này, mục tiêu là:
- Kiểm tra xem ESP32 đã giao tiếp được với NRF24L01 chưa.
- Dùng hàm
radio.begin()để xác nhận module hoạt động. - In cấu hình chi tiết của NRF24L01 ra Serial bằng
radio.printDetails().
7.1. Cài đặt thư viện RF24
Trong Arduino IDE, bạn thực hiện:
- Vào Tools → Manage Libraries….
- Gõ từ khóa “RF24”.
- Chọn thư viện “RF24 by TMRh20” và nhấn Install.
7.2. Code ví dụ: kiểm tra radio.begin()
#include <Arduino.h>
#include <SPI.h>
#include <RF24.h>
// Mapping chân như đã thiết kế
#define PIN_NRF_CE 4
#define PIN_NRF_CSN 5
RF24 radio(PIN_NRF_CE, PIN_NRF_CSN); // CE, CSN
void setup() {
Serial.begin(115200);
delay(1000);
Serial.println();
Serial.println(F("=== Kiem tra ket noi NRF24L01 voi ESP32 ==="));
// Khoi tao radio
if (!radio.begin()) {
Serial.println(F("Loi: Khong tim thay NRF24L01. Kiem tra lai day noi va nguon!"));
while (1) {
delay(1000);
}
}
Serial.println(F("OK: NRF24L01 da san sang!"));
// Tùy chọn: in thông tin cau hinh chip ra Serial (debug)
radio.printDetails();
}
void loop() {
// Tam thoi chua gui/nhan gi, chi de do
}
7.3. Giải thích nhanh code
RF24 radio(PIN_NRF_CE, PIN_NRF_CSN);- Khai báo đối tượng
radiodùng 2 chân CE và CSN.
- Khai báo đối tượng
radio.begin():- Trả về
falsenếu ESP32 không giao tiếp được với NRF24L01. - Thường lỗi do: sai dây SCK/MOSI/MISO, sai CE/CSN, thiếu nguồn 3.3V hoặc không chung GND.
- Trả về
radio.printDetails();:- In ra toàn bộ cấu hình hiện tại của NRF24L01: kênh, tốc độ, địa chỉ pipe,…
- Nếu hàm này in được thông tin ra Serial → gần như chắc chắn module hoạt động bình thường.
8. Bài tập thực hành sau khi đọc bài 3
Để hiểu sâu hơn và sẵn sàng cho các phần tiếp theo, bạn có thể làm thêm một số bài tập nhỏ:
8.1. Thử đổi chân CE/CSN
- Đổi CE sang GPIO 17, CSN sang GPIO 16 (hoặc chân khác bạn muốn).
- Cập nhật lại giá trị trong
#define. - Upload lại chương trình và kiểm tra
radio.begin()vẫn hoạt động.
8.2. Mô phỏng lỗi dây nối
- Thử cố ý rút một đường SPI, ví dụ MISO.
- Quan sát xem chương trình có còn in được “NRF24L01 da san sang” hay không.
- Sau đó cắm lại và kiểm tra.
Việc “cố ý tạo lỗi” giúp bạn nhận diện triệu chứng thực tế khi lắp mạch sai.
8.3. Tách file cấu hình chân riêng
- Tạo một file
pins_nrf24_esp32.hchỉ chứa các dòng#definecho chân NRF. - Trong các file code khác, bạn chỉ cần
#include "pins_nrf24_esp32.h". - Khi đổi board hoặc đổi layout, bạn chỉ sửa 1 file duy nhất.
9. Kết luận và chuẩn bị cho Phần 4
Trong Phần 3 của series “Lập trình ESP32 38 Pin & NRF”, bạn đã:
- Hiểu khái niệm và ưu điểm của module NRF24L01 trong các dự án IoT.
- Nắm được các đường tín hiệu SPI (SCK, MOSI, MISO, CS) và các chân điều khiển CE, IRQ.
- Biết cách mapping chân NRF24L01 ↔ ESP32 DevKit 38 pin một cách rõ ràng.
- Kết nối phần cứng và dùng code mẫu để kiểm tra module NRF24L01 đã hoạt động.
Ở Phần 4, chúng ta sẽ bắt đầu phần thú vị hơn:
Lập trình ESP32 38 Pin & NRF – Phần 4: Gửi “Hello World” không dây giữa 2 bộ ESP32 + NRF24L01
Bạn sẽ:
- Cấu hình một bộ làm TX (bộ phát) và một bộ làm RX (bộ nhận).
- Thiết lập địa chỉ pipe, kênh RF, tốc độ truyền.
- Gửi và hiển thị chuỗi “Hello World” qua đường không dây, xem kết quả trực tiếp trên Serial Monitor.
Hẹn gặp bạn ở Phần 4!



Leave a Reply