这记录了我如何制作一个可以测量地面上积雪量的设备。它能够使用小电池运行多年,在零以下 (Celcius) 温度下生存,并使用 LoRaWAN 将测量结果传输到互联网以进行进一步处理。
这个项目是出于必要而开始的——如果需要清理我们相当长的车道上的积雪,我希望我的起床闹钟能提前一个小时响起。在我多风的小镇,我需要部署多个传感器来应对积聚。
这可能有许多实际应用,包括
我是电子健康领域的一名软件开发人员,过去几年我一直在业余时间研究电子产品和 3D 打印机。我喜欢分享我在本地创客空间的旅程,并撰写了一些指南,主要是关于 hackster 和 element14。
本指南将涵盖创建低功耗传感器设备的有趣步骤,并深入探讨某些兴趣点。这些原理可用于其他类型的应用,例如替代传感器。我的编码风格和方法揭示了我在软件方面的背景。总是热衷于学习。
在本指南中,我将提供数据表的链接。数据表可能听起来并不令人兴奋,但在尝试突破硬件极限时却是关键。
我做了很多搜索,寻找其他人用来测量积雪的原理。这些是我的一些发现:
这些都不符合可以使用电池使用多年的低成本设备。
我最终使用了超声波传感器。它实际上不能测量雪的深度,但是通过从已知的地面长度中减去读数,可以推断出它。
我使用的传感器HRXL-MaxSonar MB7374专门设计用于读取不同类型雪面特征的读数。它还防水,防护等级为 IP67。
我一直想尝试一种新的 SoC,Seeed Studio Lora-E5 ,它具有小尺寸、LoRaWAN 无线电和低能量要求。Seeed Studio 慷慨地提供了样品和 Lora-E5-mini 开发板。该项目不以任何方式赞助。如果概念验证证明可行,我计划申请 Seeed Studio 提供的PCBA 产品,以围绕Lora-E5设计定制 PCB 。我找到了一个非常好的项目,只需进行一些修改,它就会成为我的灵感来源。作者查尔斯·哈拉德 ( Charles Hallard ) 帮助我解决了一些功耗问题。
传感器和开发板将根据设备的总尺寸设定前提。我的目标是纽扣电池供电设备,但很快得出结论,这对于开发板来说是不可行的。我选择了 AA 尺寸的电池,SAFT LS14500 。该电池可以安全地提供 50mA 的持续电流,高达 250mA 的脉冲电流,而不会因压降而损坏电池。它可以提供几年的运行时间,对于一个 PoC 来说绰绰有余。
开发板手感坚固,带有 USB-C 连接器。请注意,此连接器仅用于为设备供电和进行串行通信。您不能以这种方式对设备进行编程,因为您可能习惯于使用 Arduino 兼容板。但是,我能够在几分钟内使用工厂提供的 AT 固件为我的 The Things Stack 应用程序配置它。完整的过程记录在 wiki 中。
我将假定您具备 TTN 的先验知识(我使用 The Things Stack Community Edition),如果您不走运的话,因为那里有很多很棒的指南。
如前所述,开发板不能通过 USB 编程新固件。我以大约 35 美元的价格订购了一个ST Link V3 (STLINK-V3SET) ,它允许我的计算机对微控制器进行固件编程和调试。你不能使用 USB-to-FTDI 适配器、Atmel-ICE 或类似的东西,我花了一段时间寻找明确的答案。
首要任务是通过 USB更新 ST Link ,需要创建一个 ST 帐户。真的?!
然后我继续构建随附的 MB1440B 板,这样我就可以实际访问与 MCU 接口所需的引脚。
此外,我还花了一些时间弄清楚在编程器和开发板上使用什么引脚。我希望 Seeed wiki 能让这一点更清楚,因为我不得不依靠放大连接图片然后研究 MB1440B 数据表来猜测相应的引脚。
在 MB1440B 上,您会发现横向挤压成排的引脚。其中一组称为 CN6,但很难阅读和查找。检查图片。下表列出了通过 SWD 接口对 MCU 进行编程所需的连接器(复位是可选的):
连接表 ST Link v3 <--> LoRa-E5-mini
Color | ST Link (CN6) | LoRa-E5-mini
Yellow | NRST | RST
Green | DIO | DIO
Purple | GND | GND
Grey | CLK | CLK
在此设置中,仍需要连接 USB-C 以提供电源和可选的串行连接。
Lora-E5 包含来自 ST 的微控制器STM32WLE5JC 。我过去只使用 STM32(或与此相关的任何 STM 系列)进行过简短的开发,因此我不得不决定使用工具链和 IDE 对其进行编程。我一直想测试Mbed-os 框架和 IDE并试一试。Mbed 提供了对不同类型硬件的抽象,隐藏了库,并且应该让您专注于编写应用程序代码。听起来不错!虽然我能够在设备上编译和运行它,但我并不喜欢 Mbed。原因有很多,但主要是 IDE 感觉太基础了,缺乏重构支持,调试,例如 Charles Hallard 有一个很好的演练,告诉你如何设置它,如果你想试一试的话。
下一个明智的选择是带有用于 STM32WL 的 STM32Cube MCU 包和可选的 STM32 Cube Programmer 的 STM32 Cube IDE。我遵循了Lora-E5 wiki ,从擦除工厂 AT 固件开始,但无法编译示例项目。事实证明示例项目已经过时,并且还基于用户代码严重交织在一起的模板。我收到确认这将在不久的将来更新,并且该回购已从我测试时的位置移动。
经过大量实验和搜索后,我发现了一个不错的存储库,其中包含最新的 LoRa-E5 代码库,并演示了在物联网 (TTN) 上发送传感器数据. 我做了一个叉子,花了很多晚上研究和调试代码。乍一看,STM32 Cube IDE 令人不知所措。我过去使用过类似的 IDE,这帮助我建立了一个粗略的概览。我发现最令人困惑并且在某种程度上仍然如此的是生成代码和用户代码的混合。尽管我定期进行 git 提交,但我还是花了很多时间因为我的更改被覆盖而感到沮丧。我学会了尝试使用配置向导而不是在某些区域直接更改代码的艰难方法。我对配置工具的许多方面仍然不满意,但现在我对结果并不感到惊讶。
/* USER CODE BEGIN */
/* USER CODE END */
代码的关键方面太多,无法详细介绍,我将扩展一些。我希望您能够编译和运行该项目,如果是这样,请使用调试器来理解代码流。
首先,确保您养成在调试模式和低功耗模式之间切换的习惯。这由 sys_conf.h 中的以下定义决定:
VERBOSE_LEVEL
APP_LOG_ENABLED
DEBUGGER_ENABLED
LOW_POWER_DISABLE
STATUS_LED_ENABLE
我使用最后一个来切换 LED 指示灯,但为了追踪 LED 的所有可能使用,我将实际的切换注释掉了。请注意,当通过 USB 进行串行通信时,您无法控制是否使用 LED,正如您在板原理图CP2102N USB 桥上看到的那样。这让我有点头疼,直到我发现在断开连接时情况并非如此。
例如,如果您设置 DEBUGGER_ENABLED = 0 和 LOW_POWER_DISABLE = 0,任何调试尝试都会很快超时。
我没有找到在 STM Cube 内显示串行输出的方法,所以我使用具有正确波特率的Termite RS232 终端来捕获通过 USB 的日志记录。MCU 有多个 USART,USART1 用于日志记录,可以通过 USB 或 LoRa-E5-mini 引脚 TX(SoC 上的 PB6)读取。
继续,您需要通过新设备注册来设置您自己的 LoRaWAN 设置。通过在 STM32CubeIDE 中打开 .ioc 文件,选择 Middleware-> LoRaWAN -> LoRaWAN comissioning 来使用配置工具。不要直接写入 se-identity.h 文件,因为它会被覆盖。
se-identity.h
se-identity.h
se-identity.h
经常出现的问题是:如何在不公开私钥的情况下在公共代码存储库上跟踪我的项目?一个选项是提交一个带有假值的配置版本,停止在 git 中跟踪文件,并更改为真实值。这带来了一些问题:如何在其他计算机上继续开发该项目,甚至在以后接手该项目时确保保持正确的值?另外,如果配置文件包含我实际想要更改和共享的其他设置怎么办?我愿意接受建议。
编辑:感谢我的同事 Erling 推荐GitHub Encrypted secrets 。
我决定在开发期间提交我的密钥,然后在发布之前重新生成它们。
我研究了MB7374 数据表以了解它的许多方面和选项。建议通过引脚 5 读取测量值以确保准确性,因为它提供 TTL 输出。启动并打印产品信息后,它将以连续模式输出每个测量值,作为一串以“R”开头的 ASCII 字符,后跟使用 4 位数字的以毫米为单位的到表面的距离,例如“R0928”,对应于 92.8 厘米。我在 STM32 上使用 9600 波特率的 USART2。
6HRXL-MaxSonar-WRST7
MB7374-1XX
Copr. 2011-2019
MaxBotix Inc.
RoHS 23b 119 0819
TempI
R0937
R0937
R0936
R0936
R0936
R0936
TempI表示使用内部温度计。
注意:对于雪地应用,建议使用 5v 电源以实现 MB7374 的最佳运行。LoRa-E5-mini 上的稳压器AP2112仅在电池供电时提供 3.3v(5v 引脚仅在连接 USB-C 时接合)。因此,这一概念验证有望提供下一个版本是否需要为传感器提供 5v 电压的答案。
MB7374 引脚 5(串行输出)连接到 LoRa-E5-mini 引脚 TX2(STM32WLE5JC 的 PA2)。请记住,串行只是输出,不需要输入。MB7374 引脚 7 (GND) 连接到 GND。我将 MB7374 引脚 6 (V+) 连接到开发板引脚 D0 (PA0)。待机状态下传感器的电流消耗太高,我决定在每次传输前使用 GPIO 来接通它。该引脚有一个用户标签 US_ENABLE(超声波启用)。我确保引脚可以提供足够的电流,阅读两个数据表,也通过测量。更稳健的解决方案需要使用晶体管来切换传感器。查看我的土壤水分指南以获取示例。
主要设备逻辑位于文件 lora_app.c 中。SendTxData只是启用传感器,获取读数并准备一个缓冲区,其中包含要传输的实际字节,传输,然后进入睡眠(停止 2 模式),重复。
项目 repo 包含用于 The Things Stack 的 Javascript 上行链路解码脚本。
function decodeUplink(input) {
var bytes = input.bytes
return {
data: {
distance: ((bytes[0] & 0x80 ? 0xFFFF<<16 : 0) | bytes[0]<<8 | bytes[1]),
temperaturec: ((bytes[2] & 0x80 ? 0xFFFF<<16 : 0) | bytes[2]<<8 | bytes[3]),
voltage : (bytes[4]<<8 | bytes[5])
},
warnings: [],
errors: []
};
}
距离:到表面的距离,以毫米为单位。雪越多,数字越低。
temperaturec:这是 MCU 温度。这不应该是对设备周围环境的可靠测量,因为它旨在为某些 MCU 功能提供校准参考。该设备是防水的,进一步消除了对环境的敏感性。由于 MCU 做的工作很少,我仍然想看看它是否可以提供有用的数据。我在设备附近安装了一个可靠的温度传感器,到目前为止它们报告的温度非常相似。由于我的代码中的一个错误,温度值被报告为整数。
voltage:这应该是电池电压,是电池即将耗尽的指标。这是使用生成的函数 SYS_GetBatteryLevel 检索的。我认为这个函数是有问题的,因为它似乎报告了 MCU AREF。我将不胜感激关于如何实施的任何建议。
接收数据如果传输之后是 TTN 应用程序返回排队的下行链路消息,则触发。我已经实现了一个下行消息:传输间隔的配置。这使我能够更改测量之间的分钟数,从 0 到 65535。这允许最长约 45 天的睡眠时间。请注意,如果要更改间隔,请求将排队等待下一次计划的设备传输,所以要小心。在 The Things Stack 控制台中,您可以通过导航到设备、转到“消息”选项卡,然后转到“下行链路”来对下行链路进行排队。FPort 为 1,Payload 类型为 Bytes。您需要将分钟数格式化为两对十六进制数字,最高有效字节在前。例如“01FF”将对应于 511 分钟。由于懒惰,设备应用程序需要两对,
一旦将数据路由到 The Things Network,有数以千计的选项可用于处理数据。我在以前的指南中介绍了一些。在本指南中,我想重点介绍一种使用 The Things Network 命令行界面 (CLI) 调查几天的测量值的简便方法。
启用免费短期存储集成并创建 API 密钥。
ttn-lw-cli use 1/au1/nam1>.cloud.thethings.network
最后使用OAuth2.0 登录。
ttn-lw-cli login
现在您可以进行查询以检索消息。由于它默认使用 gRPC protobuf,除了冷启动外,传输速度快如闪电。
ttn-lw-cli applications storage get "snowmonitor" --limit 10 --order "-received_at" --up.uplink-message.decoded-payload
将结果转储到一个 .json 文件中,您可以使用您最喜欢的绘图工具在本地进行漂亮的可视化。
在整个开发过程中,我积极使用我信赖的 Qoitech Otii Arc来测量和比较更改硬件和代码时对电流消耗的影响。这使我能够系统地尝试不同的电源电压电平、天线设计、代码执行顺序等。一些有趣的观察:
为了您的观赏乐趣,电源配置文件包含在回购协议中。
总之,我在睡眠期间实现了大约 73uA 的电流消耗。虽然与 SoC 宣传的 2uA 速率相去甚远,但这对于 PoC 来说还不错。开发板调节器可能占了大部分多余部分(数据表:通常为 55uA),其余部分为浮动引脚等。
传输峰值约为 80mA,参考。HF 问题。大约消耗 7uWh pr。传播。使用一个简单的计算器可以告诉我们,在这种情况下,每 15 分钟传输一次与每 60 分钟传输一次相比,差异微不足道。前者粗略估计电池寿命超过 3.5 年,远远超过设计定制电路之前进行测试所需的时间。
这种概念验证显然需要在相当恶劣的条件下进行户外测试。我花了一半的项目时间来设计防水外壳并使用树脂 SLA 打印机 3D 打印它。容纳天线和传感器是一个很大的挑战,我最终设计了一个外壳,允许电子设备在拧入传感器的同时旋转。橡胶垫圈提供密封。
我首先对所有重要组件进行建模,这样可以节省大量迭代。
传感器采用奇怪的美国标准螺纹,NPT 美国锥管螺纹 (ANSI B 1.20.1) ,3/4"-14。什么?!我花了很多时间试图在 Fusion 360 中打一个匹配的孔,终于finding a plugin that would help. 每次更新 Fusion 360 时都需要安装此插件,非常蹩脚。
最终结果看起来就像光剑生了一个带管炸弹的孩子,但它似乎达到了目的。
我相信这可以使用质量稳定的 FDM 打印机打印,但我认为您需要使用树脂涂层将其密封。使用优质 SLA 打印机(例如 Formlabs Form 3)的结果是打印过程非常顺利。我需要做一些迭代,因为我还没有弄清楚线程,我想添加一些文本以防它丢失。作为一项额外措施,我在天线开口周围添加了一些蓝色螺纹锁固剂。
该设备已运行 14 天,传输了 1903 次测量值。令我惊喜的是,传感器并不像我担心的那样依赖与表面的直角。表面粗糙度似乎可以反射足够多的声波。它一直保持干燥,这是我另一个非常关心的问题。我计划让传感器测量更长的时间,然后返回平均值以提高准确性。我还必须制作一个更大的帽子来防止积雪,正如在一场特别严重的风暴中观察到的那样。
我曾希望尝试使用纽扣电池为裸露的 LoRa-E5 芯片供电。发现高频传输期间电流消耗的高尖峰促使我推迟使用电容器的实验,直到这个版本的 PoC 完成。定制的纽扣电池供电 PCB 将为减小整体设计的尺寸和复杂性带来巨大机遇。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !