Hướng dẫn dùng LoRa SX1278 (Ra-02) với ESP32: nối dây SPI, gửi và nhận gói tin đầu tiên
Hướng dẫn nối module LoRa SX1278 Ra-02 433 MHz với ESP32 qua SPI, cài thư viện LoRa trên Arduino IDE, viết chương trình gửi và nhận gói tin, đọc RSSI, SNR và xử lý lỗi thường gặp.
LoRa là kỹ thuật truyền vô tuyến tầm xa, tiêu thụ ít điện, hợp với các ứng dụng gửi lượng dữ liệu nhỏ như số đo cảm biến, trạng thái thiết bị ở nơi không có Wi-Fi. Bài viết hướng dẫn nối module LoRa SX1278 (loại Ra-02, băng 433 MHz) với ESP32 qua giao tiếp SPI, cài thư viện trên Arduino IDE rồi cho hai mạch gửi và nhận gói tin đầu tiên, có đọc cường độ tín hiệu RSSI và SNR.
1. LoRa là gì?
- LoRa dùng kỹ thuật trải phổ chirp: mỗi ký hiệu là một tín hiệu quét tần số. Nhờ vậy máy thu tách được tín hiệu rất yếu, kể cả khi yếu hơn mức nhiễu nền.
- Cái giá phải trả là tốc độ: ở băng thông 125 kHz, tốc độ chỉ từ khoảng 0,3 đến 5,5 kbit/s tùy cấu hình.
- Bài này dùng LoRa kiểu điểm nối điểm: hai mạch tự gửi cho nhau. Đây không phải LoRaWAN, là giao thức mạng xây trên LoRa và cần gateway cùng máy chủ mạng riêng.
2. Tìm hiểu module LoRa SX1278
| Thông số | Giá trị |
|---|---|
| Chip thu phát | Semtech SX1278 |
| Băng tần | Dải 433 MHz |
| Điện áp nguồn | 3,3 V. Không cấp 5 V và không nối chân tín hiệu vào mức 5 V |
| Giao tiếp | SPI: MOSI, MISO, SCK, NSS; thêm chân RST và các chân DIO báo sự kiện |
| Dòng tiêu thụ | Khoảng 10 đến 12 mA khi thu, khoảng 100 mA khi phát công suất lớn |
| Anten | Cổng IPEX, dùng anten 433 MHz |
| Chân hàn | Khoảng cách 2 mm, không cắm thẳng lên breadboard được |
Số liệu trên lấy theo tài liệu của chip SX1278; khi dùng module cụ thể nên kiểm tra thông tin in trên mạch và tài liệu đi kèm.
Lưu ý về quy định vô tuyến: thiết bị phát sóng phải tuân theo quy định về băng tần và công suất phát của nơi sử dụng. Trước khi dùng ngoài phạm vi thử nghiệm, cần kiểm tra quy định hiện hành về thiết bị vô tuyến cự ly ngắn được miễn giấy phép và đặt công suất phát trong giới hạn cho phép.
3. Chuẩn bị
- Hai mạch ESP32 DevKit V1 30 chân (hoặc bản dùng chip CH340).
- Hai module LoRa SX1278 loại Ra-02 băng 433 MHz, mỗi module một anten 433 MHz.
- Breadboard, dây cắm test board và hai cáp USB có truyền dữ liệu.
- Arduino IDE 2.x với gói esp32 by Espressif Systems (bài dùng phiên bản 3.3.10).
4. Sơ đồ nối dây
| Module LoRa | ESP32 DevKit V1 | Chức năng |
|---|---|---|
| 3.3V | 3V3 | Nguồn 3,3 V |
| GND | GND | Mass chung |
| MOSI | D23 (GPIO23) | Dữ liệu từ ESP32 sang module |
| MISO | D19 (GPIO19) | Dữ liệu từ module về ESP32 |
| SCK | D18 (GPIO18) | Xung nhịp SPI |
| NSS | D5 (GPIO5) | Chọn chip |
| RST | D4 (GPIO4) | Khởi động lại module |
| DIO0 | RX2 (GPIO16) | Báo đã phát xong hoặc đã nhận gói |
Hai mạch nối giống hệt nhau. Luôn gắn anten trước khi cấp nguồn: phát sóng khi không có anten có thể làm hỏng tầng công suất của module. Nếu mạch tự khởi động lại lúc phát, thêm một tụ 100 µF giữa 3.3V và GND ngay sát module.
5. Cài thư viện LoRa
- Mở Tools > Manage Libraries.
- Tìm LoRa, chọn thư viện của tác giả Sandeep Mistry rồi bấm Install.
Bài dùng thư viện LoRa phiên bản 0.8.0. Thư viện hỗ trợ các chip SX1276, SX1277, SX1278 và SX1279.
6. Chương trình cho mạch gửi
/*
PYWORLD.VN - LoRa SX1278 với ESP32: mạch GỬI
Cứ 5 giây gửi một gói tin có số đếm tăng dần
Nối dây: NSS = D5, SCK = D18, MISO = D19, MOSI = D23, RST = D4, DIO0 = RX2 (GPIO16), nguồn 3V3
Thư viện: LoRa (Sandeep Mistry)
*/
#include <SPI.h>
#include <LoRa.h>
#define LORA_NSS 5
#define LORA_RST 4
#define LORA_DIO0 16
const long TAN_SO_HZ = 433E6; // Module Ra-02 dùng băng 433 MHz
const int TU_DONG_BO = 0xF3; // Hai mạch phải đặt giống nhau; không dùng 0x34 (dành cho LoRaWAN)
const unsigned long CHU_KY_GUI_MS = 5000;
unsigned long soDem = 0;
unsigned long lanGuiTruoc = 0;
void setup() {
Serial.begin(115200);
LoRa.setPins(LORA_NSS, LORA_RST, LORA_DIO0);
if (!LoRa.begin(TAN_SO_HZ)) {
Serial.println("Khong tim thay module LoRa, kiem tra day noi va nguon 3V3");
while (true) {
delay(1000);
}
}
LoRa.setSyncWord(TU_DONG_BO);
LoRa.enableCrc(); // Thêm mã kiểm tra để mạch nhận loại gói bị lỗi
Serial.println("LoRa san sang, bat dau gui");
}
void loop() {
if (millis() - lanGuiTruoc < CHU_KY_GUI_MS) {
return;
}
lanGuiTruoc = millis();
soDem++;
unsigned long batDau = millis();
LoRa.beginPacket();
LoRa.print("PYWORLD ");
LoRa.print(soDem);
LoRa.endPacket(); // Hàm chờ tới khi phát xong
Serial.printf("Da gui: PYWORLD %lu (mat %lu ms)\n", soDem, millis() - batDau);
}
7. Chương trình cho mạch nhận
/*
PYWORLD.VN - LoRa SX1278 với ESP32: mạch NHẬN
In nội dung gói tin, cường độ tín hiệu (RSSI) và tỉ số tín hiệu trên nhiễu (SNR)
Nối dây: NSS = D5, SCK = D18, MISO = D19, MOSI = D23, RST = D4, DIO0 = RX2 (GPIO16), nguồn 3V3
Thư viện: LoRa (Sandeep Mistry)
*/
#include <SPI.h>
#include <LoRa.h>
#define LORA_NSS 5
#define LORA_RST 4
#define LORA_DIO0 16
const long TAN_SO_HZ = 433E6;
const int TU_DONG_BO = 0xF3; // Phải giống mạch gửi
void setup() {
Serial.begin(115200);
LoRa.setPins(LORA_NSS, LORA_RST, LORA_DIO0);
if (!LoRa.begin(TAN_SO_HZ)) {
Serial.println("Khong tim thay module LoRa, kiem tra day noi va nguon 3V3");
while (true) {
delay(1000);
}
}
LoRa.setSyncWord(TU_DONG_BO);
LoRa.enableCrc();
Serial.println("LoRa san sang, dang cho goi tin");
}
void loop() {
int kichThuoc = LoRa.parsePacket(); // 0 khi chưa có gói mới
if (kichThuoc == 0) {
return;
}
String noiDung;
while (LoRa.available()) {
noiDung += (char)LoRa.read();
}
Serial.printf("Nhan %d byte: %s | RSSI %d dBm | SNR %.1f dB\n",
kichThuoc, noiDung.c_str(), LoRa.packetRssi(), LoRa.packetSnr());
}
8. Kết quả mong đợi
- Mạch gửi in một dòng mỗi 5 giây; mạch nhận in đúng nội dung đó kèm RSSI và SNR.
- RSSI là cường độ tín hiệu thu được, đơn vị dBm, càng gần 0 càng mạnh. LoRa vẫn nhận được ở mức rất thấp, dưới -110 dBm.
- SNR là tỉ số tín hiệu trên nhiễu, đơn vị dB. LoRa giải mã được cả khi SNR âm; SNR càng thấp thì gói càng dễ lỗi.
- Khi hai mạch đặt sát nhau (dưới nửa mét), tín hiệu quá mạnh có thể làm mạch nhận đọc sai. Nên để cách nhau vài mét khi thử.
9. Giải thích các lệnh chính
LoRa.setPins(NSS, RST, DIO0): khai báo ba chân điều khiển. Các chân SPI còn lại dùng mặc định của ESP32 (SCK 18, MISO 19, MOSI 23).LoRa.begin(433E6): khởi động module ở tần số 433 MHz, trả về 0 nếu không đọc được chip. Sau lệnh này thư viện đặt sẵn SF7, băng thông 125 kHz, tỉ lệ mã 4/5 và công suất 17 dBm.LoRa.setSyncWord(0xF3): từ đồng bộ. Hai mạch khác từ đồng bộ sẽ không nhận gói của nhau, nhờ đó tách được các nhóm thiết bị ở cùng tần số. Giá trị 0x34 dành cho LoRaWAN, không nên dùng.LoRa.enableCrc(): thêm mã kiểm tra vào gói; mạch nhận tự bỏ gói sai mã.LoRa.beginPacket(),LoRa.print(),LoRa.endPacket(): mở gói, ghi dữ liệu, phát đi.endPacket()chờ đến khi phát xong.LoRa.parsePacket(): kiểm tra có gói mới không, trả về số byte. Sau đó dùngLoRa.available()vàLoRa.read()để đọc từng byte.LoRa.packetRssi(),LoRa.packetSnr(): RSSI và SNR của gói vừa nhận.
10. Xử lý lỗi thường gặp
| Hiện tượng | Nguyên nhân thường gặp | Cách xử lý |
|---|---|---|
Serial in Khong tim thay module LoRa | Nối sai dây SPI, NSS hoặc RST; module chưa có nguồn 3,3 V; mối hàn chân 2 mm không tiếp xúc | Dò lại từng dây theo bảng nối dây; đo điện áp giữa 3.3V và GND của module |
| Mạch gửi báo đã gửi nhưng mạch nhận không in gì | Hai mạch khác tần số, khác từ đồng bộ hoặc chưa gắn anten | Kiểm tra TAN_SO_HZ, TU_DONG_BO ở hai chương trình; gắn anten cho cả hai |
| Mạch khởi động lại mỗi lần phát | Nguồn 3,3 V sụt áp khi module phát | Thêm tụ 100 µF sát module; dùng cáp USB tốt; giảm công suất bằng LoRa.setTxPower() |
| Nhận được nhưng nội dung là ký tự lạ | Hai mạch đặt quá sát nhau hoặc chưa bật CRC | Đặt cách nhau vài mét; giữ lệnh LoRa.enableCrc() ở cả hai mạch |
Lỗi biên dịch LoRa.h: No such file or directory | Chưa cài thư viện hoặc cài nhầm thư viện khác tên gần giống | Cài đúng thư viện LoRa của Sandeep Mistry |
| Không nạp được chương trình sau khi nối module | Dây nối nhầm sang chân khởi động của ESP32 | Nối đúng các chân trong bảng; tháo module ra, nạp thử để khoanh vùng |
11. Xem thêm
- Dùng module thẻ nhớ Micro SD với ESP32: một ví dụ khác về giao tiếp SPI trên ESP32.
- Deep Sleep trên ESP32: nền tảng để làm node LoRa chạy pin.
- Dùng MQTT với ESP32: dùng khi làm gateway đưa dữ liệu LoRa lên mạng.
- Các mạch ESP32 tại PYWORLD: danh mục ESP32.
Xem thêm