249 lines
4.3 KiB
Markdown
249 lines
4.3 KiB
Markdown
|
|
# Exercise: LoRa Transmission Validation (SX1262)
|
|||
|
|
|
|||
|
|
## Overview
|
|||
|
|
|
|||
|
|
This exercise validates raw LoRa packet transmission from the **LILYGO T-Beam SUPREME V3.0** using the onboard **SX1262** radio.
|
|||
|
|
|
|||
|
|
The objective is to:
|
|||
|
|
|
|||
|
|
1. Transmit deterministic LoRa packets at known parameters.
|
|||
|
|
2. Confirm successful reception using:
|
|||
|
|
|
|||
|
|
* A second T-Beam
|
|||
|
|
* A Waveshare SX1303 concentrator sniffer
|
|||
|
|
* Or any SDR/LoRa receiver configured with identical PHY settings
|
|||
|
|
3. Verify correct alignment of frequency, spreading factor, bandwidth, and coding rate.
|
|||
|
|
|
|||
|
|
This is a **PHY-layer validation exercise**, not LoRaWAN.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Hardware
|
|||
|
|
|
|||
|
|
### Transmitter
|
|||
|
|
|
|||
|
|
* Board: **LILYGO T-Beam SUPREME V3.0**
|
|||
|
|
* MCU: ESP32-S3
|
|||
|
|
* Radio: SX1262
|
|||
|
|
* Antenna: 915 MHz tuned antenna
|
|||
|
|
* Power: USB-C or 18650 battery
|
|||
|
|
|
|||
|
|
### Receiver / Sniffer
|
|||
|
|
|
|||
|
|
Any device capable of raw LoRa reception with manual PHY configuration:
|
|||
|
|
|
|||
|
|
* Second T-Beam (SX1262)
|
|||
|
|
* Waveshare SX1303 + `lora_pkt_fwd`
|
|||
|
|
* SDR with LoRa demodulator
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## LoRa Radio Specifications
|
|||
|
|
|
|||
|
|
The sniffer **must** match these parameters exactly.
|
|||
|
|
|
|||
|
|
| Parameter | Value |
|
|||
|
|
| ---------------- | ------------------ |
|
|||
|
|
| Radio Chip | SX1262 |
|
|||
|
|
| Frequency | **915.000 MHz** |
|
|||
|
|
| Modulation | LoRa |
|
|||
|
|
| Bandwidth | **125 kHz** |
|
|||
|
|
| Spreading Factor | **SF8** |
|
|||
|
|
| Coding Rate | **4/5** |
|
|||
|
|
| Preamble Length | 8 symbols |
|
|||
|
|
| Sync Word | 0x12 (Public LoRa) |
|
|||
|
|
| CRC | Enabled |
|
|||
|
|
| IQ Inversion | Disabled |
|
|||
|
|
| Output Power | 14 dBm (default) |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Important Notes for Sniffer Operators
|
|||
|
|
|
|||
|
|
### 1. Frequency
|
|||
|
|
|
|||
|
|
Ensure your sniffer JSON or configuration file contains:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
"freq": 915000000
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
If using SX130x HAL:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
915000000
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
No offset. No channel hopping.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 2. Spreading Factor
|
|||
|
|
|
|||
|
|
Must be:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
SF8
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
If the sniffer is set to multi-SF mode, confirm that SF8 is enabled.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 3. Bandwidth
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
125000 Hz
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Not 250 kHz. Not 500 kHz.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 4. Coding Rate
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
4/5
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Some interfaces represent this as:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
CR = 1
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 5. Sync Word
|
|||
|
|
|
|||
|
|
If your sniffer filters on sync word:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
0x12
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
This is the public LoRa sync word (not LoRaWAN private).
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Expected Packet Behavior
|
|||
|
|
|
|||
|
|
The transmitter:
|
|||
|
|
|
|||
|
|
* Sends a short ASCII payload
|
|||
|
|
* Repeats at a fixed interval
|
|||
|
|
* Does not use LoRaWAN
|
|||
|
|
* Does not use encryption
|
|||
|
|
* Does not use MAC layer framing
|
|||
|
|
|
|||
|
|
Sniffer output should display:
|
|||
|
|
|
|||
|
|
* RSSI
|
|||
|
|
* SNR
|
|||
|
|
* SF8
|
|||
|
|
* BW125
|
|||
|
|
* Payload length matching transmitter
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Confirming Correct Alignment
|
|||
|
|
|
|||
|
|
A properly aligned sniffer will show:
|
|||
|
|
|
|||
|
|
* Stable RSSI
|
|||
|
|
* Correct SF detection (SF8)
|
|||
|
|
* Clean CRC pass
|
|||
|
|
* No excessive packet loss at short range
|
|||
|
|
|
|||
|
|
If you see:
|
|||
|
|
|
|||
|
|
* No packets → Check frequency mismatch first.
|
|||
|
|
* Packets but CRC fail → Check bandwidth mismatch.
|
|||
|
|
* Packets only intermittently → Check spreading factor.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## SX1262 SPI Mapping (T-Beam SUPREME)
|
|||
|
|
|
|||
|
|
For reference, the radio is connected as follows:
|
|||
|
|
|
|||
|
|
| Signal | ESP32-S3 Pin |
|
|||
|
|
| ------ | ------------ |
|
|||
|
|
| SCK | 12 |
|
|||
|
|
| MISO | 13 |
|
|||
|
|
| MOSI | 11 |
|
|||
|
|
| CS | 10 |
|
|||
|
|
| RESET | 5 |
|
|||
|
|
| BUSY | 4 |
|
|||
|
|
| DIO1 | 1 |
|
|||
|
|
|
|||
|
|
These match the board’s hardware routing.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Build & Flash
|
|||
|
|
|
|||
|
|
### PlatformIO
|
|||
|
|
|
|||
|
|
1. Open project folder
|
|||
|
|
2. Select correct environment
|
|||
|
|
3. Compile
|
|||
|
|
4. Upload via USB-C
|
|||
|
|
5. Monitor serial output
|
|||
|
|
|
|||
|
|
### Arduino IDE
|
|||
|
|
|
|||
|
|
* Board: ESP32S3 Dev Module
|
|||
|
|
* Flash: 8MB
|
|||
|
|
* PSRAM: QSPI
|
|||
|
|
* Upload speed: 921600
|
|||
|
|
* USB Mode: CDC and JTAG
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Purpose of This Exercise
|
|||
|
|
|
|||
|
|
This exercise verifies:
|
|||
|
|
|
|||
|
|
* SPI communication with SX1262
|
|||
|
|
* Radio configuration correctness
|
|||
|
|
* Antenna functionality
|
|||
|
|
* Sniffer alignment
|
|||
|
|
* Baseline RF performance
|
|||
|
|
|
|||
|
|
It is intended as the foundational RF validation step before:
|
|||
|
|
|
|||
|
|
* Reticulum interface integration
|
|||
|
|
* microReticulum radio abstraction
|
|||
|
|
* LoRa time-synchronized experiments
|
|||
|
|
* Multi-node field testing
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## If You Cannot See Packets
|
|||
|
|
|
|||
|
|
Work through this checklist:
|
|||
|
|
|
|||
|
|
1. Confirm antenna attached.
|
|||
|
|
2. Confirm sniffer at 915 MHz.
|
|||
|
|
3. Confirm SF8.
|
|||
|
|
4. Confirm BW125.
|
|||
|
|
5. Reduce distance to < 2 meters.
|
|||
|
|
6. Increase TX power to 17–20 dBm for testing.
|
|||
|
|
7. Confirm no regional regulatory lock mismatch.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Relationship to `main.cpp`
|
|||
|
|
|
|||
|
|
This README corresponds to the current exercise implementation in:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
main.cpp
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
See source for definitive parameter values
|
|||
|
|
|
|||
|
|
If you modify radio parameters in code, update this README accordingly.
|
|||
|
|
|
|||
|
|
|