ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

基于RAK811与AA电池的低功耗LoRa节点设计全解析

基于RAK811与AA电池的低功耗LoRa节点设计全解析 1. 项目概述用AA电池驱动的RAK811 LoRa节点如果你正在寻找一个低功耗、长距离、且能独立运行数年的无线传感节点方案那么基于RAK811模块和AA电池供电的设计绝对值得你花时间研究。这个组合听起来简单但背后涉及的低功耗设计、LoRa通信协议栈管理以及电源系统优化是很多物联网项目从原型走向实际部署的关键门槛。我最近刚完成一个环境监测项目节点部署在野外要求至少一年不换电池最终就是采用了RAK811STM32AA电池的方案实测下来非常稳定。简单来说这个项目的核心就是利用RAK811这颗集成了LoRa射频和STM32 MCU的模块作为大脑和通信单元再搭配一个精心设计的电源管理电路让整个节点仅靠几节普通的AA电池就能持续工作。它解决的不仅仅是“无线通信”问题更是“如何在极低功耗下实现可靠的周期性数据上报”这一物联网经典难题。无论你是想搭建一个远程的温湿度监测站、一个资产追踪器还是一个农业土壤墒情传感器这个架构都能提供一个坚实可靠的硬件和软件基础。接下来我会从设计思路、硬件选型、软件实现到功耗优化一步步拆解这个项目的所有细节。2. 核心硬件设计与选型解析2.1 主角RAK811模块深度剖析RAK811是瑞科慧联推出的一款明星级LoRa模块它之所以成为众多低功耗节点的首选关键在于其高度集成化。模块核心是一颗STM32L系列的超低功耗微控制器并集成了Semtech的SX1276/78 LoRa芯片。这意味着你拿到手的就是一个完整的、带MCU的LoRa解决方案无需再额外设计复杂的射频电路。为什么选择RAK811而不是单独的LoRa芯片MCU对于资源受限或追求快速开发的原型来说集成方案优势明显。首先它简化了硬件设计天线匹配、射频滤波等难点都由模块厂商解决了保证了通信性能。其次瑞科提供了完整的AT指令固件和LoRaWAN协议栈你可以通过串口发送简单的AT命令就完成LoRa通信的所有配置和数据收发极大降低了软件开发门槛。当然如果你需要对底层协议有绝对控制权RAK811也支持通过DFU方式烧录自定义固件直接编程STM32灵活性很高。关键参数与选型注意RAK811有多个版本主要区分频段如CN470, EU868, US915, AS923和是否支持LoRaWAN Class A/B/C。对于电池供电的节点我们通常选择仅支持Class A的版本因为Class A是功耗最低的模式终端仅在发送后短暂打开接收窗口。购买时一定要根据项目部署地区的无线电法规选择对应的频段版本。注意模块的启动电流和发射电流峰值较高可达120mA这对电池和电源电路是巨大考验。单纯依赖电池直接供电在大电流脉冲下电压会被拉低可能导致模块重启。因此一个能提供足够瞬时功率且自身损耗极低的电源电路至关重要。2.2 动力之源AA电池供电系统设计用AA电池供电目标就是超长续航。常见的AA电池有碱性电池和锂铁电池如耐时锂铁电池。碱性电池容量大约2000-3000mAh但电压平台下降快从1.5V逐渐降至1.0V且低温性能差。锂铁电池电压平台更稳约1.5V容量适中约3000mAh且低温性能和自放电率远优于碱性电池是更专业的选择。我们的供电系统设计核心是“宽压输入、稳压输出、能量缓冲”。升压稳压电路核心多节AA电池串联如3节或4节可以提供4.5V或6V的初始电压但随着放电会下降。而RAK811等核心芯片通常需要稳定的3.3V。因此我们需要一个高效率的DC-DC升压稳压器例如TI的TPS61099x系列或Analog Devices的LTC3536。这类芯片能在低至0.7V的输入电压下启动并将电池的宽电压范围如2.4V-6V高效、稳定地转换到3.3V确保在电池电量耗尽前系统电压始终稳定。大容量储能电容能量缓冲这是容易被忽略但至关重要的部分。在RAK811发射的瞬间需要约120mA的电流。如果这个电流全部瞬间从电池经DC-DC电路抽取可能会因为路径阻抗导致电压跌落。我们在稳压电路的输出端紧靠着RAK811的VCC引脚并联一个低ESR的钽电容或超级电容例如100μF钽电容 10μF陶瓷电容。这个电容组就像一个小型“能量水池”在模块需要大电流时快速放电平滑电流脉冲避免电源电压波动引起系统复位。电源路径管理与开关为了实现最低的待机功耗我们不仅需要MCU和模块进入深度睡眠还需要切断传感器等外围电路的供电。可以使用一颗低漏电流的MOSFET如Si2301作为电子开关由MCU的一个GPIO控制。当MCU睡眠时该GPIO输出高阻态并通过一个上拉电阻确保MOSFET关闭彻底断开传感器电源实现真正的“零”功耗。2.3 辅助电路与传感器接口一个完整的节点除了通信还要感知世界。我们需要为传感器预留接口。设计原则是“分时供电接口兼容”。接口设计预留一个标准的排针接口包含3.3V受控、GND、以及至少一路I2CSCL, SDA和一路UARTTX, RX。I2C可以连接绝大多数数字温湿度、气压、光照传感器UART可用于连接更复杂的传感器如二氧化碳传感器。GPIO则用于触发式测量或开关量输入。电平转换确保所有接口电平与STM32的3.3V IO电平兼容。如果使用5V传感器必须加入电平转换电路如TXS0108E避免损坏MCU。PCB布局要点射频部分必须严格按照RAK811手册的参考设计布局。天线接口到天线座的距离要最短周围做好铺地隔离。DC-DC电路的电感、输入输出电容要紧靠芯片引脚。模拟传感器部分应远离数字和射频电路必要时用地线分割。3. 低功耗软件架构与实现硬件搭好了软件才是决定电池能用一天还是一年的关键。低功耗软件设计的核心思想是“尽量睡觉活干完就睡”。3.1 主循环与状态机设计程序不能写成while(1)里不断轮询的“忙等”模式。我们必须采用事件驱动的状态机。// 伪代码示例 int main(void) { hardware_init(); // 初始化时钟、GPIO、外设 enter_stop_mode(); // 上电先进入深度睡眠等待唤醒 while(1) { switch(system_state) { case STATE_WAKEUP: // 被RTC或外部中断唤醒 power_on_peripherals(); // 打开传感器电源 read_sensors(); // 采集数据 power_off_peripherals(); // 关闭传感器电源 system_state STATE_LORA_TX; break; case STATE_LORA_TX: init_lora_module(); // 唤醒/初始化RAK811模块 send_lora_data(); // 发送数据 wait_for_ack(); // 可选等待ACKClass A模式 deinit_lora_module(); // 让模块进入睡眠模式 system_state STATE_PRE_SLEEP; break; case STATE_PRE_SLEEP: prepare_for_sleep(); // 配置唤醒源如RTC system_state STATE_SLEEP; break; case STATE_SLEEP: enter_stop_mode(); // 进入STM32的Stop模式功耗可降至几微安 // MCU在此暂停等待中断唤醒 // 唤醒后程序将从这里继续执行跳转到STATE_WAKEUP system_state STATE_WAKEUP; break; } } }这个状态机确保了每个环节完成后不必要的硬件立即被关闭。整个生命周期中MCU绝大多数时间都处于STATE_SLEEP。3.2 RAK811模块的AT指令控制与睡眠对于使用AT固件的RAK811控制其睡眠是关键。不能简单地断开电源因为重新上电的初始化过程耗时耗电。RAK811提供了低功耗命令。初始化与配置上电或唤醒后通过UART发送AT命令配置LoRa参数频段、扩频因子、带宽、编码率、发射功率等。这些配置可以保存在模块的Flash中下次唤醒无需重复配置使用ATNWM1保存至Flash。发送数据使用ATSENDport:data发送数据。例如ATSEND1:48656C6C6FHello的十六进制。进入低功耗模式发送完数据并处理完接收窗口后发送ATSLEEP命令。模块会进入最低功耗的睡眠模式此时电流可低至2μA左右。模块的UART会关闭但可以通过特定的唤醒引脚如RESET或WAKEUP或重新上电来唤醒。唤醒策略为了最大化睡眠时间我们通常采用“MCU与模块同步睡眠”的策略。即MCU通过一个GPIO控制给RAK811模块的电源或使能端。当需要通信时MCU先唤醒自己然后打开模块电源等待模块启动稳定后再进行通信。通信完毕后MCU先发送ATSLEEP让模块进入软关机然后再切断模块电源最后MCU自己再进入深度睡眠。这种方式比单纯依赖ATSLEEP更能杜绝任何可能的漏电。3.3 STM32的深度睡眠与RTC唤醒STM32L系列提供了多种低功耗模式。对于我们的场景Stop模式是最佳选择。在Stop模式下核心时钟关闭SRAM和寄存器内容保持功耗可低至几微安。通过RTC实时时钟定时器产生中断可以唤醒MCU。配置步骤选择RTC时钟源通常为外部32.768kHz的LSE晶振精度高且功耗低。配置RTC周期自动唤醒RTC_WAKEUP功能设置唤醒间隔例如每5分钟。在进入Stop模式前确保所有已开启的外设时钟都已关闭所有配置为输出的GPIO引脚设置为模拟输入模式以减少漏电除了用于唤醒的引脚如RTC闹钟对应的EXTI线。调用HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);进入Stop模式。RTC闹钟时间到产生中断MCU唤醒系统时钟会重置为HSI内部高速时钟。在程序继续执行后需要重新配置系统时钟到原来的状态如MSI。实操心得在调试低功耗时务必断开调试器JTAG/SWD因为调试器本身会向MCU注入电流严重干扰功耗测量。使用高精度的万用表串联在电池供电回路中测量平均电流或睡眠电流。一个设计良好的节点其平均电流应在几十微安级别。4. LoRa通信参数配置与网络考量4.1 扩频因子、带宽与编码率的权衡LoRa的可配置参数直接决定了通信距离、数据速率和功耗这是一个经典的“不可能三角”。扩频因子SF, Spreading Factor从SF7到SF12。SF越大扩频增益越高接收灵敏度越好传输距离越远但空中传输时间Time On Air也呈指数级增长导致功耗急剧增加。对于电池供电的固定节点在满足链路预算的前提下应尽可能使用较小的SF。带宽BW常见有125kHz, 250kHz, 500kHz。带宽越宽数据速率越快空中时间越短但接收灵敏度会略有下降。通常125kHz是兼顾距离和功耗的折中选择。编码率CR纠错等级从4/5到4/8。CR越高纠错能力越强抗干扰越好但有效数据负载减少空中时间增加。在环境干扰不极端的情况下使用4/5即可。配置策略首先根据你的最远通信距离和网关灵敏度通过LoRa链路预算计算器在线有很多确定所需的最小SF。例如在城市环境2-3公里内SF9可能就够了。然后固定BW125kHz CR4/5。将这个配置如ATCFG868000000,9,125,5,8,14写入RAK811的Flash。更高级的做法是实现自适应数据速率ADR让网络服务器根据节点的信号质量动态指挥节点调整SF和功率但这需要LoRaWAN网络支持。4.2 数据包设计与空中时间计算LoRa数据包由前导码、报头、负载和CRC组成。空中时间ToA直接决定了每次发射的能耗。可以使用Semtech提供的LoRa计算器工具精确计算。减少ToA的技巧精简数据只发送必要的传感器数据。例如温度值可以用2字节整数分辨率0.01°C代替4字节浮点数。减少冗余如果数据变化缓慢可以只发送变化量差值而非绝对值。优化包结构在LoRaWAN中MAC层已经包含了一些开销。在自定义点对点模式下可以自定义更精简的协议。假设我们使用SF9 BW125kHz CR4/5发送一个12字节的负载计算出的ToA大约在200ms量级。如果发射电流为120mA那么单次发射消耗的电量约为120mA * 0.2s / 3600 6.67mAh。看起来很小但如果每5分钟发一次一年下来仅发射耗电就接近6.67mAh * 12次/小时 * 24小时 * 365天 / 1000 ≈ 700mAh。这还不包括接收、MCU运行和传感器测量的功耗。因此延长上报周期是省电最有效的手段需要根据应用需求在数据新鲜度和功耗间取得平衡。4.3 点对点 vs. LoRaWAN网络点对点P2P模式简单直接一个节点对一个网关或另一个节点。配置简单无需网络服务器延迟可控。适合私有网络、设备间直接通信或简单的数据收集场景。RAK811的AT固件支持P2P模式配置。LoRaWAN模式节点接入公共或私有的LoRaWAN网络如TTN, ChirpStack。网络负责安全、自适应速率、漫游等。优势是标准化可管理大量节点支持双向通信Class A下行有限制。缺点是引入了网络服务器复杂度且Class A的下行通信只能在节点发送后的两个短暂接收窗口进行不适合需要实时下发的场景。对于电池供电的简单传感器节点如果只是单向数据上报且部署范围固定P2P模式往往更简单、更可控。如果需要集中管理成千上万个节点或者需要远程下发配置那么LoRaWAN是更专业的选择。5. 系统集成、测试与功耗优化实战5.1 从原理图到PCB的实战要点画原理图时除了核心电路别忘了调试接口预留SWD调试接口和串口LOG输出接口方便调试和烧录。电池电压检测利用STM32的ADC通道通过电阻分压监测电池电压以便在电量低时上报预警信息。复位与烧录为RAK811模块和STM32分别设计复位电路。如果STM32和RAK811内部的STM32共用SWD接口需要小心处理避免冲突通常建议只引出主控MCU的SWD。PCB布局时电源路径优先从电池接口到DC-DC再到储能电容和模块VCC的走线要尽量短而粗减小阻抗。射频区域隔离RAK811模块的射频部分下方所有层做净空处理不铺铜。天线馈线阻抗控制为50欧姆根据PCB层压计算线宽周围打上一圈地孔形成“护城河”。晶振远离32.768kHz的RTC晶振及其走线要远离数字信号线和电源线避免干扰。5.2 功耗测量与优化记录功耗优化是一个“挤牙膏”的过程。你需要一个能测量微安级电流的万用表或专用功耗分析仪。分阶段测量深度睡眠电流系统完全休眠时。目标10μA。如果过高检查是否有GPIO配置不当导致漏电是否有外设电源未彻底切断如传感器、指示灯。MCU运行电流仅MCU运行模块和传感器断电时。通常在几百微安到几毫安取决于主频。传感器采集电流传感器上电、测量期间的电流峰值和持续时间。LoRa发射电流模块发射时的峰值电流约120mA和平均电流取决于ToA。LoRa接收电流模块在接收窗口的电流约10mA。优化手段降低主频在不影响功能的前提下将STM32的主频降到最低可行值如2MHz。优化外设时钟只在使用时打开外设ADC, I2C, UART的时钟用完立即关闭。GPIO状态未使用的GPIO设置为模拟输入模式。输出引脚在睡眠前设置为低电平或高阻态视外部电路而定。关闭调试接口在发布版代码中禁用所有调试串口输出。软件滤波减少不必要的传感器读取次数。例如温度每10秒读一次取平均而不是每次唤醒都读。5.3 常见问题与排查实录即使设计再仔细调试阶段也总会遇到问题。下面是一些典型问题及排查思路问题现象可能原因排查步骤与解决方案节点完全无法启动1. 电源问题电压不足、反接2. 复位电路问题3. 晶振不起振1. 测量电池座电压、稳压芯片输入输出电压。2. 检查复位引脚电平手动复位试试。3. 用示波器检查主晶振和RTC晶振波形。LoRa通信距离极短1. 天线问题未接、损坏、阻抗不匹配2. LoRa参数配置错误频段不对3. 电源不稳导致发射功率不足1. 确保天线正确连接并使用天线分析仪检查驻波比。2. 核对模块频段与配置命令中的频率是否一致。3. 在发射瞬间用示波器测量模块供电引脚电压看是否有大幅跌落。电池消耗过快1. 睡眠电流过大2. 发射过于频繁3. 传感器漏电1. 用万用表μA档串联测量睡眠电流逐一断开外围电路定位漏电源。2. 检查程序逻辑确认发射间隔是否按设计运行。3. 检查传感器电源控制MOSFET是否在关闭时完全关断。RTC唤醒时间不准1. 32.768kHz晶振负载电容不匹配2. 晶振受干扰或质量差3. 软件补偿未做1. 根据晶振规格书调整负载电容值。2. 更换质量好的晶振并确保布局远离干扰源。3. STM32的RTC通常有误差可通过软件定期校准如每天与网关同步一次时间计算偏差进行补偿。偶尔丢包或重启1. 电源受到大电流冲击2. 程序跑飞看门狗未启用3. 堆栈溢出1. 加强电源滤波增加储能电容容量。2. 启用独立看门狗IWDG并设置合理的喂狗周期。3. 检查任务栈空间分配避免局部大数组。一个关键的避坑技巧在给RAK811模块发送AT命令时务必等待并解析其返回的响应。很多初学者发送ATSLEEP后立即切断电源导致模块未成功进入睡眠模式。正确的做法是发送命令 - 等待接收串口返回“OK\r\n” - 延迟几十毫秒确保模块处理完成 - 再进行下一步操作如断电。同样发送数据后也应等待“OK\r\n”或错误响应以便进行重试逻辑。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进