ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

ESP32-Bit-Pirate 仓库中的 SX126x LoRa Ping-Pong 例程深度解析:基于 RAK4631 的双节点测距与低功耗设计

ESP32-Bit-Pirate 仓库中的 SX126x LoRa Ping-Pong 例程深度解析:基于 RAK4631 的双节点测距与低功耗设计 嵌入式硬件开发【免费下载链接】ESP32-Bit-PirateA Hardware Hacking Tool with Web-Based CLI That Speaks Every Protocol项目地址https://gitcode.com/GitHub_Trending/es/ESP32-Bit-Pirate点击查看免费下载导读本文以 ESP32-Bit-Pirate 仓库内置的 SX126x-Arduino 库中 PingPong-RAK4631 例程 为绝对主体完整剖析一个一端发 PING、另一端回 PONG的双节点 LoRa 点对点通信程序。读完你将掌握基于 SX126x Radio API 的收发初始化全流程、用 CAD信道活动检测做发射前避让的防碰撞策略、用 FreeRTOS 信号量替代忙轮询实现低功耗的事件驱动模型以及 RAK4631 上 DFU BLE-UART 双服务的 BLE 调试通道搭建方法并能直接将其移植到其他 SX126x 开发板上。一、例程定位为什么 LoRa 节点需要 Ping-Pong该例程PlatformIO 版本可在 Atom 或 Microsoft Visual Studio 的 PlatformIO 插件中编译实现的是两个 LoRa 节点之间的简单 PING / PONG 应答一个节点发送 PING另一个节点收到后回复 PONG。它是最基础、也最实用的 LoRa 连通性验证程序——用来测试你的 LoRa 天线、发射功率与频段配置下能打多远range test非常合适。程序在setup()中会打印SX126x PingPong test横幅并通过Serial.printf(RssiValue%d dBm, SnrValue%d\n, rx_rssi, rx_snr)输出每次收到包时的 RSSI 与 SNR配合收发双向报文即可直观评估链路余量。当前仓库将 SX126x-Arduino 完整收纳在 lib/SX126x-Arduino 下本仓库的 platformio.ini 亦为各板卡定义了 SX1262 LoRa 引脚如LORA_SCK_PIN、LORA_MOSI_PIN、LORA_CS_PIN、LORA_RST_PIN、LORA_BUSY_PIN、LORA_DIO1_PIN说明该库正是仓库 Sub-GHz / LoRa 能力的底层依赖之一理解本例程即理解这套 SX126x 驱动的核心用法。二、工作原理三段式状态机原文档给出的运行逻辑本质上是一个围绕听 → 判 → 发循环的有限状态机完整流程如下监听节点进入 RX 监听状态等待外来报文。RX 超时3 秒若 3 秒内没收到任何包启动一次CADChannel Activity Detection信道活动检测若 CAD 结果显示信道空闲则发送一个 PING 包随后重新进入监听。收到 PING启动 CAD若信道空闲则回复 PONG随后重新进入监听。收到 PONG启动 CAD若信道空闲则继续发送下一个 PING随后重新进入监听。可以看到无论哪个状态发送动作永远前置一次 CAD 检查——只有确认信道空闲才占用信道发包这是避免两个节点同时抢发、互相碰撞的关键设计。对应源码位于 PingPong-RAK4631.ino其中OnRxTimeout回调置位RX_ERR事件主循环在CAD_FIN分支中根据tx_cadResult决定发包或重新监听radio.cpp 中的RadioSetCadParams即为底层SX126xSetCadParams的封装位于第 1160 行。三、关键参数表一份可直接修改的 LoRa 配置清单例程把所有射频参数集中定义为宏便于按地区法规与硬件能力调整。以下为源码 PingPong-RAK4631.ino 中的完整参数及含义宏默认值含义与取值说明RF_FREQUENCY916100000 (Hz)载波频率示例为 916.1 MHz须符合当地 ISM 频段法规EU868 / US915 等TX_OUTPUT_POWER22 (dBm)发射功率受 SX126x 硬件与法规上限约束LORA_BANDWIDTH0带宽索引0: 125 kHz1: 250 kHz2: 500 kHz3: 保留带宽越小灵敏度越高、速率越低LORA_SPREADING_FACTOR7扩频因子范围SF7..SF12SF 越大抗干扰越强、速率越慢LORA_CODINGRATE1编码率索引1: 4/52: 4/63: 4/74: 4/8纠错冗余随编号增大而增加LORA_PREAMBLE_LENGTH8前导码长度符号数收发两端必须一致LORA_SYMBOL_TIMEOUT0RX 符号超时单位符号0 表示由RX_TIMEOUT_VALUE决定LORA_FIX_LENGTH_PAYLOAD_ONfalse是否固定负载长度false表示隐式头部可变长度LORA_IQ_INVERSION_ONfalse是否启用 IQ 反转LoRaWAN 上行常用P2P 场景保持falseRX_TIMEOUT_VALUE3000 (ms)单次 RX 监听超时超时后触发OnRxTimeoutTX_TIMEOUT_VALUE5000 (ms)单次 TX 超时保护防止卡死BUFFER_SIZE64收发缓冲区与负载长度字节注意LORA_PREAMBLE_LENGTH、LORA_BANDWIDTH、LORA_SPREADING_FACTOR、LORA_CODINGRATE、LORA_IQ_INVERSION_ON在收发两端必须配置一致否则无法解调对方报文——这也是调试时最容易踩的坑。四、初始化流程逐行拆解4.1 LoRa 硬件初始化无需手写引脚例程明确说明代码专为 RAK4631 编写使用该板卡专用的初始化例程无需自行定义引脚uint32_t init_result lora_rak4630_init(); Serial.printf(RAK4631 LoRa init %s\r\n, init_result 0 ? success : failed);lora_rak4630_init()内部完成 SPI 总线、复位、忙检测等板级配置相关实现见 src/boards/mcu/board.cpp 与 src/RAK4630_MOD.cpp。移植到其他开发板时这一步需替换为对应板卡的初始化函数或参考本仓库 platformio.ini 中各 env 的LORA_*_PIN引脚宏自行接线。4.2 注册事件回调SX126x-Arduino 采用事件驱动模型先填充RadioEvents_t结构体RadioEvents.TxDone OnTxDone; RadioEvents.RxDone OnRxDone; RadioEvents.TxTimeout OnTxTimeout; RadioEvents.RxTimeout OnRxTimeout; RadioEvents.RxError OnRxError; RadioEvents.CadDone OnCadDone;六个回调覆盖了收发成功、收发超时、接收错误与 CAD 完成等全部关键异步事件与库中RadioEvents_t的定义一一对应。4.3 Radio 初始化与参数下发Radio.Init(RadioEvents); // 以事件结构体初始化 Radio 实例 Radio.Sleep(); // 先休眠便于后续逐个配置 Radio.SetChannel(RF_FREQUENCY); // 设置工作信道载波频率 Radio.SetTxConfig(MODEM_LORA, TX_OUTPUT_POWER, 0, LORA_BANDWIDTH, LORA_SPREADING_FACTOR, LORA_CODINGRATE, LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON, true, 0, 0, LORA_IQ_INVERSION_ON, TX_TIMEOUT_VALUE); Radio.SetRxConfig(MODEM_LORA, LORA_BANDWIDTH, LORA_SPREADING_FACTOR, LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH, LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON, 0, true, 0, 0, LORA_IQ_INVERSION_ON, true);MODEM_LORA指明使用 LoRa 调制区别于 FSK 模式SetTxConfig的第 3 个参数 0 表示无需频率跳频表true表示使能 TX 超时保护SetRxConfig末尾的true表示使能 RX 连续监听模式single/continuous 选择。4.4 进入监听Radio.Rx(RX_TIMEOUT_VALUE); // 开始监听超时 3000ms调用后硬件进入接收状态之后的一切都由回调驱动主循环不再做任何忙轮询。五、低功耗核心FreeRTOS 信号量事件驱动原文档专门强调不要让loop()空转而是用信号量在 LoRa 事件到来时才唤醒 MCU。源码中的实现要点SemaphoreHandle_t g_task_sem NULL; // 事件唤醒信号量 volatile uint16_t g_task_event_type NO_EVENT; // 事件位掩码事件位定义宏值含义NO_EVENT0b0000000000000000无事件TX_FIN0b0000000000000001TX 完成TX_ERR0b0000000000000010TX 超时RX_FIN0b0000000000000100RX 完成RX_ERR0b0000000000001000RX 超时/错误CAD_FIN0b0000000000010000CAD 完成工作机理setup()中xSemaphoreCreateBinary()创建信号量并先 Give 一次确保初始可用loop()首行xSemaphoreTake(g_task_sem, portMAX_DELAY)——没有事件时任务永久阻塞MCU 可进入低功耗六个回调如OnTxDone只做两件事g_task_event_type | TX_FIN置位事件位再xSemaphoreGive(g_task_sem)唤醒任务被唤醒后loop()进入while (g_task_event_type ! NO_EVENT)循环用位掩码判定事件类型处理完后用 N_TX_FIN等方式清除对应位。这种中断置位 信号量唤醒 主循环统一处理的模式比在loop()里轮询标志位功耗更低也让事件处理逻辑集中在单线程中避免了并发竞争。六、主从角色自动协商Master / Slave 逻辑例程用一个bool isMaster标志实现角色自协商无需人工配置哪端先发上电默认isMaster true等待 3 秒 RX 超时后由 Master 主动发 PINGMaster 收到 PONG说明远端在线delay(500)后执行 CAD信道空闲则发下一个 PINGMaster 收到 PING说明对方已是 Master把自己降级为 SlaveisMaster false此后负责回 PONGSlave 收到 PING执行 CAD空闲则回复 PONGSlave 收到其他数据或 RX 超时重新升级为 MasterisMaster true并重新发起 PING。OnRxDone回调中的报文识别使用strncmp((const char *)RcvBuffer, (const char *)PingMsg, 4) 0逐字节比对前 4 个字符PING/PONG其余字节由for (int i 4; i BufferSize; i) { TxdBuffer[i] i - 4; // 用递增数字填充负载方便观察 payload }填充为递增序列便于在串口或 BLE-UART 上肉眼核对数据完整性。七、CAD发包前的先听后发每次发包前代码统一执行Radio.Sleep(); Radio.SetCadParams(LORA_CAD_08_SYMBOL, LORA_SPREADING_FACTOR 13, 10, LORA_CAD_ONLY, 0); cadTime millis(); Radio.StartCad();LORA_CAD_08_SYMBOLCAD 检测窗口为 8 个符号第 2 个参数LORA_SPREADING_FACTOR 13CAD 检测峰值阈值detection peak随扩频因子联动调整第 3 个参数 10CAD 检测最小值detection minimumLORA_CAD_ONLY检测后不自动切换 RX交由代码显式控制底层实现可在 radio.cpp 找到RadioSetCadParams直接转发给SX126xSetCadParams((RadioLoRaCadSymbols_t)cadSymbolNum, cadDetPeak, cadDetMin, (RadioCadExitModes_t)cadExitMode, cadTimeout)。OnCadDone(bool cadResult)返回后主循环打印CAD returned channel busy/free after %ldms用millis() - cadTime计算检测耗时。信道忙则退回Radio.Rx(RX_TIMEOUT_VALUE)继续监听信道空闲则按当前角色组装TxdBuffer并Radio.Send(TxdBuffer, BufferSize)发出。八、BLE 调试通道DFU BLE-UART 双服务例程同时启用了 Nordic nRF52 的 BLEble.ino受#ifdef NRF52_SERIES保护仅 nRF52 编译时生效DFU 服务BLEDfuNordic 官方的 OTA 升级服务用于在芯片上无线更新固件先于其他服务bledfu.begin()以保证一致性BLE-UART 服务BLEUart bleuart把调试日志通过 BLE 转发出去可配合 Android 上的 Serial Bluetooth Terminal 等 BLE-UART App 查看——这正是原文档中提到的调试方式。初始化要点Bluefruit.begin(); Bluefruit.setTxPower(4); // 合法值-40..4 dBm Bluefruit.setName(PPG_LORA_SX126x_TEST); Bluefruit.Periph.setConnectCallback(connect_callback); Bluefruit.Periph.setDisconnectCallback(disconnect_callback); bleuart.begin();广播参数restartOnDisconnect(true)断线自动重播setInterval(32, 244)单位 0.625 ms即快速模式约 20 ms、慢速模式约 152.5 mssetFastTimeout(30)快速模式 30 秒超时start(0)表示持续广播直到连接。连接状态由bleUARTisConnected全局标志跟踪connect_callback置truedisconnect_callback置false。主程序在每次事件分支中都会if (bleUARTisConnected) bleuart.print(...)把与串口相同的日志镜像到 BLE 通道实现在不插线的情况下观察 LoRa 通信过程。九、运行与测试在两块 RAK4631 上验证准备两块 RAK4631或任意 SX126x 开发板替换板级初始化函数并核对platformio.ini中LORA_*_PIN接线。用 PlatformIO 打开 PingPong-RAK4631 目录编译并烧录到两块板。串口以 115200 baud 打开源码Serial.begin(115200)两块板均能看到SX126x PingPong test与BoardId: xx-xx-...打印。观察日志Master 每 3 秒超时后经 CAD 发 PINGSlave 收到后回 PONG每次接收打印RssiValuexx dBm, SnrValuexx可作为测距与天线效果的直接依据。如需无线调试用 BLE-UART App 连接PPG_LORA_SX126x_TEST即可看到与串口同步的日志。十、常见问题与调参建议两端收不到对方优先检查频率、SF、带宽、编码率、前导码、IQ 反转是否一致见第三节参数表距离不够在法规允许范围内提高TX_OUTPUT_POWER或将LORA_SPREADING_FACTOR从 7 调高到 9/12速率变慢但灵敏度显著提升或将带宽从 125 kHz 换到更窄配置频繁丢包确认 CAD 参数LORA_CAD_08_SYMBOL、LORA_SPREADING_FACTOR 13阈值、10 的最小检测值是否与当前 SF 匹配两节点间距过近导致接收饱和时可适当降低功率低功耗无效确认loop()确实阻塞在xSemaphoreTake上且没有任何delay()长驻路径Master 分支的delay(500)仅在收到 PONG 后短暂执行属有意为之的节奏控制。结语通过本例程可以完整掌握 SX126x-Arduino 库的事件驱动编程范式RadioEvents回调 信号量唤醒 位掩码事件分发加上 CAD 先听后发与主从自协商构成了一个稳健、省电、可实际用于链路评估的 LoRa P2P 通信骨架。它也是理解本仓库 Sub-GHz/LoRa 能力入口的最佳范例——将这套初始化与事件处理模式迁移到其他板卡与协议场景仅需替换板级初始化和回调内容即可。相关源码与库均可在仓库内继续深入研读例程目录、Radio 底层实现、板级初始化。赞分享嵌入式硬件开发【免费下载链接】ESP32-Bit-PirateA Hardware Hacking Tool with Web-Based CLI That Speaks Every Protocol项目地址https://gitcode.com/GitHub_Trending/es/ESP32-Bit-Pirate点击查看免费下载相关推荐基于 SX126x-Arduino 与 PlatformIO 的 LoRa Ping-Pong 测距示例全解析RAK4631 / ESP32 / nRF52832基于 SX126x Arduino 与 PlatformIO 的 LoRa Ping Pong 测距示例全解析RAK4631 / ESP32 / nRF528嵌入式硬件开发SX126x-Arduino PingPong 示例深度解析基于 RAK4631 的双节点 LoRa 测距与 CAD 信道检测实战SX126x Arduino PingPong 示例深度解析基于 RAK4631 的双节点 LoRa 测距与 CAD 信道检测实战 导读 本文围绕 ESP32嵌入式硬件开发ESP32-Bit-Pirate 项目内 SX126x 库 DeepSleep-nRF52Pio 示例详解构建低功耗 LoRaWAN 传感器节点ESP32 Bit Pirate 项目内 SX126x 库 DeepSleep nRF52Pio 示例详解构建低功耗 LoRaWAN 传感器节点 导读 本文围嵌入式硬件开发上一篇三步搞定智能聊天机器人麦麦AI助手QQ群管理实战指南下一篇革命性AI图像翻译工具CUT快速实现无配对图像转换的终极指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表