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ì?

So sánh LoRa với Wi-Fi và ESP-NOW về tầm xa thường gặp, tốc độ dữ liệu và loại ứng dụng phù hợp
LoRa đi xa hơn Wi-Fi và ESP-NOW nhưng tốc độ dữ liệu thấp hơn nhiều (hình vẽ minh họa, so sánh tương đối).
  • 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átSemtech SX1278
Băng tầnDải 433 MHz
Điện áp nguồn3,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ếpSPI: 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
AntenCổng IPEX, dùng anten 433 MHz
Chân hànKhoả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ị

4. Sơ đồ nối dây

Sơ đồ nối ESP32 DevKit V1 với module LoRa SX1278: MOSI nối D23, MISO nối D19, SCK nối D18, NSS nối D5, DIO0 nối RX2, RST nối D4, GND và 3.3V
Sơ đồ nối ESP32 với module LoRa SX1278 (hình vẽ minh họa; thứ tự chân trong hình là sơ đồ nguyên lý).
Module LoRaESP32 DevKit V1Chức năng
3.3V3V3Nguồn 3,3 V
GNDGNDMass chung
MOSID23 (GPIO23)Dữ liệu từ ESP32 sang module
MISOD19 (GPIO19)Dữ liệu từ module về ESP32
SCKD18 (GPIO18)Xung nhịp SPI
NSSD5 (GPIO5)Chọn chip
RSTD4 (GPIO4)Khởi động lại module
DIO0RX2 (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

  1. Mở Tools > Manage Libraries.
  2. 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

Hình minh họa Serial Monitor của mạch gửi và mạch nhận LoRa: mạch gửi báo đã gửi PYWORLD 1, mạch nhận in nội dung, RSSI và SNR
Kết quả mong đợi trên Serial Monitor khi hai mạch đặt gần nhau (hình minh họa).
  • 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

Cấu trúc một gói LoRa gồm phần mở đầu, tiêu đề, dữ liệu và CRC, kèm các lệnh gửi và nhận của thư viện LoRa trên ESP32
Cấu trúc gói LoRa và các lệnh gửi, nhận tương ứng (hình vẽ minh họa).
  • 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ùng LoRa.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ượngNguyên nhân thường gặpCách xử lý
Serial in Khong tim thay module LoRaNố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úcDò 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 antenKiể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átNguồn 3,3 V sụt áp khi module phátThê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 directoryChưa cài thư viện hoặc cài nhầm thư viện khác tên gần giốngCài đúng thư viện LoRa của Sandeep Mistry
Không nạp được chương trình sau khi nối moduleDây nối nhầm sang chân khởi động của ESP32Nối đúng các chân trong bảng; tháo module ra, nạp thử để khoanh vùng

11. Xem thêm


Tin tức liên quan

Phased array siêu âm 40 kHz với ESP32 (phần 2): mạch đệm 12 V, đầu thu và quét búp sóng
Phased array siêu âm 40 kHz với ESP32 (phần 2): mạch đệm 12 V, đầu thu và quét búp sóng

Phần 2 của loạt phased array siêu âm: thêm mạch đệm 12 V bằng hai module L298N, lắp mạch thu dùng LM358, đo biên độ 40 kHz bằng ADC của ESP32 và chạy chương trình tự quét góc lái để xem búp sóng.

Phased array siêu âm 40 kHz với ESP32 (phần 1): nguyên lý lái búp sóng và tạo 8 kênh lệch pha
Phased array siêu âm 40 kHz với ESP32 (phần 1): nguyên lý lái búp sóng và tạo 8 kênh lệch pha

Nguyên lý phased array và cách dùng ESP32 tạo 8 kênh xung 40 kHz lệch pha để lái búp sóng siêu âm: công thức độ trễ, giới hạn do khoảng cách đầu phát, cấu hình LEDC với hpoint, sơ đồ nối và code.

Phát hiện chuyển động bằng sóng Wi-Fi (CSI) trên ESP32: không cần cảm biến
Phát hiện chuyển động bằng sóng Wi-Fi (CSI) trên ESP32: không cần cảm biến

Giải thích Wi-Fi CSI và hướng dẫn dùng ESP32 phát hiện người di chuyển trong phòng chỉ bằng sóng Wi-Fi từ router: lấy dữ liệu CSI, tính điểm chuyển động, đặt ngưỡng và xem trên Serial Plotter.

Phát hiện chuyển động bằng cảm biến PIR HC-SR501 với ESP32: tự bật đèn qua relay
Phát hiện chuyển động bằng cảm biến PIR HC-SR501 với ESP32: tự bật đèn qua relay

Hướng dẫn dùng cảm biến chuyển động PIR HC-SR501 với ESP32: nguyên lý, cách chỉnh module, đọc tín hiệu bằng ngắt và ghép relay làm đèn tự bật khi có người, tự tắt sau 60 giây.

Làm gateway LoRa sang MQTT bằng ESP32: node cảm biến chạy pin gửi dữ liệu về broker
Làm gateway LoRa sang MQTT bằng ESP32: node cảm biến chạy pin gửi dữ liệu về broker

Hướng dẫn làm hệ thống LoRa hoàn chỉnh với ESP32 và SX1278: node chạy pin đo điện áp, gửi gói rồi ngủ sâu; gateway nhận gói LoRa và publish dữ liệu JSON lên broker MQTT qua Wi-Fi.

Cấu hình LoRa trên ESP32: SF, băng thông, tỉ lệ mã, công suất và cách thử tầm xa
Cấu hình LoRa trên ESP32: SF, băng thông, tỉ lệ mã, công suất và cách thử tầm xa

Giải thích bốn tham số cấu hình LoRa (SF, băng thông, tỉ lệ mã, công suất), cách tính thời gian phát một gói và hướng dẫn làm bộ thử tầm xa bằng ESP32, SX1278 và màn hình OLED.

ESP-NOW nhiều node với ESP32: nhiều mạch gửi về một trạm thu, hiển thị trên OLED
ESP-NOW nhiều node với ESP32: nhiều mạch gửi về một trạm thu, hiển thị trên OLED

Hướng dẫn dựng mô hình ESP-NOW nhiều node: tối đa bốn ESP32 gửi số đo về một trạm thu, trạm thu hiện điện áp, RSSI và tình trạng từng node trên màn hình OLED 0.96 inch.

Điều khiển relay từ xa bằng ESP-NOW: remote ESP32 một nút nhấn có phản hồi trạng thái
Điều khiển relay từ xa bằng ESP-NOW: remote ESP32 một nút nhấn có phản hồi trạng thái

Hướng dẫn làm bộ điều khiển relay từ xa bằng hai mạch ESP32 và ESP-NOW hai chiều: remote gửi lệnh, mạch relay báo lại trạng thái, lọc theo địa chỉ MAC và bật mã hóa.


Bình luận
Đã thêm vào giỏ hàng