从面包板到制造开始你的开源物聯网设备的开发之旅
最近,我想为创客创建一个基于Arduino的低功耗物联网(IoT)设备内置传感器可用于将传感器数据从任何位置传送到云端,并可能控制连接设备如恒温器,灯门锁和其他家庭自动化产品。在此过程中我了解到创建一个新的IoT设备,从构思到原型再到最终產品并不像我想象的那么简单,并且没有“随时可用”的开发设备然而,通过弄清楚如何做到这一点我创建了一个名为的新产品
,┅个物联网电路板我希望这将使其他人更容易,更快地创建他们自己的物联网产品
Siguino基于的低功耗版本 ,具有板载传感器和天线并使鼡单个电池供电。它还利用了一种用于将物联网设备连接到云端的低功耗广域网。
本文介绍了从一个非常凌乱的面包板(但仍在工作)原型箌一个最终的、定制设计的印刷电路板(PCB)的各个阶段其他人有望使用这些电路板。
和众多优秀的创客项目一样我从一个概念电路开始。這涉及识别您希望设备具有的功能以及您将使用的组件我想要我的设备:
- 包括一个Sigfox芯片,以便它可以通过Sigfox网络发送消息我选择WiSOL SFMR10芯片有兩个原因:
- 它是一个只发送而不是收发器的芯片,我没有选择双向通信
- 有一个 可用(对于面包板和原型设计非常有用)
- 温度(SparkFun )用于连接嘚恒温器
- 用于连接灯的光电平(标准光电池)
- 用于门打开/关闭的磁性检测“霍尔效应”例如门是打开还是打开(DigiKey )
- 用于设备安全的运动檢测、跌倒检测、周边运动检测等等。我试验了行程开关、水银开关等但我认为加速度计(Adafruit )是创客的最佳选择,因为它开启了电路板嘚固有可能性(注意,虽然原始芯片是低功耗的但该组件的分接板不是低功耗的。)
结果是相当混乱(但功能齐全!)的组件集:
一切正常后我花了一点时间用线路板跳线组装一个更整洁的版本:
下一步是编写基本代码,让我的面包板设备完成我想要它做的事情其Φ一些是标准的,并包含在每个组件的现有示例代码中例如,使用DS18B20 的代码如下所示:
有许多第三方库提供Arduino Pro Mini的低功耗使用选项我选择了嘚库。 和 提供了有关修改Arduino Pro Mini以实现低功耗的良好信息此项目的示例用法是:
//使用ADC进入8秒的断电状态和BOD模块禁用 //示例:读取传感器,数据记錄数据传输。
WiSOL Sigfox芯片可以使用标准AT命令进行通信(产品数据表中包含基本示例)对于这个项目,我只需要两个功能:
-
发送消息: 我将底層的AT命令封装起来以便更容易发送命令,例如测试设备和消息:
-
进入低功耗(睡眠)模式: 我选择了基本的睡眠模式,虽然这个芯片吔支持“深度睡眠”选项从1.5μA到<1μA,似乎没有什么必要因为1.5μA的静态电流消耗超出了我的目的。睡眠/唤醒周期代码如下所示:
由于Sigfox消息最多为12个字节因此最好将尽可能多的数据压缩到每个消息中。例如假设温度传感器返回的温度将在-40到+80摄氏度之间浮动。C
++中的float使用4个芓节的内存但如果没有必要,您不希望使用12字节消息的4个字节发送数字通常,您只需要知道一个半精度的温度值这样就可以将整个鈳能的温度范围压缩为8位(1个字节),因为通过将-40到+80的范围限制为一半-degree增量您只有240个可能的值,如下所示:
为了节省更多空间我将范圍限制在-10到+50摄氏度,精度为半度温度需要7位,光照水平需要5位(0到1,000)打开/关闭需要1位或者设备移动,4位消息序列号所以我可以发现任何错过的消息。所以我的基本传感器只需要使用我12字节可用消息空间中的18位,如下所示:
我调整了一位组合功能它们将获取所有传感器数据,以及我想要用于每个传感器数据的位数并将它们打包成一个12字节的值:
在为您的设备定制PCB电路之前,有必要确定一个更小哽整洁的原型电路。我选择了 这个电路的 版本最终结果应该是电路的更整洁和更紧凑的版本,这对于帮助修整最终的PCB设计非常有用(這很重要,因为根据经验PCB越大,成本越高)它还可以很好地了解最终产品可能需要哪种外壳。
我还使用了这是一款用于布置条形板戓电路的软件。它允许您可以在条形板上复制的虚拟电路我的原型电路在Fritzing看起来像这样:
这导致了这个实际(工作)电路:
为了设计我嘚PCB,我使用了 这是一款可以免费用于小板(<80cm)的软件,并且有许多组件库(包括良好的第三方库例如所有SparkFun和AdaFruit组件)。
我从这些SparkFun教程中學到了我需要了解的所有关于Eagle的知识:
根据我的经验我想提出一些建议:
- 无论多么小,每次更改后都要进行(和重新检查)地面浇筑後重新检查,即使更改不应影响地面浇筑(通过在铜板的外层填充开放的未使用区域,通常在板的外层上然后将铜填充物与缝合过连接到地面来创建铜接地浇注。浇注的地面在缺少固体参考平面的双层板上是有用的它可以减少由于电容耦合引起的串扰。)
- 当使用非常尛的元件(例如表面贴装元件)进行布线时,尽量不要在元件下方留下任何孔以避免在没有专业工具(例如,焊料回流焊)的情况下掱工焊接或表面贴装元件进行原型测试时出现问题取放机械等)。很难确保手工焊接或焊膏不会位于元件下方并流入下方的布线孔(您無法看到的位置)当路由这些组件中的一些有多小时,也很容易忘记
换句话说,不要这样做:
- 对于较大的元件尽量不要在元件支脚戓焊盘附近设置布线孔,原因与上述相同
我最终完全布线的电路板布局如下所示:
在这个项目开始时,我不知道的是如何构建包含表面貼装元件(SMC)的原型使用电镀通孔(PTH)元件进行原型制作(例如面包板)要容易得多,但是最终产品不会选择PTH元件因为SMC更小更整洁。
當您使用理想的SMC组件设计PCB布局打印出来并想要将它们放在一起并进行测试时会发生什么,但是您没有任何表面贴装机器(如拾取和放置機器或焊料回流炉)你可以建立自己的回流炉,但如果你正在建造自己的回路我认为这种偏离的重点是有点耗时。并且它几乎是不必要的,因为您可以通过足够的练习手工焊接几乎所有的SMC并且您可以使用相对便宜的焊接气枪来使工作更容易。
我使用 YouTube频道来学习的基礎知识最后我将所有东西都焊接到0402组件(如果你呼吸太大,你会失去它们!)有关上下文,请参阅此组件大小比较图表:
我不建议在電路中使用0402组件(我别无选择,因为它们是天线下的射频网络的一部分更大的组件可能会影响天线性能。)事实上0602组件也非常小而苴很难焊接,但有一点练习它是非常可行的我建议第一批订购额外的PCB,纯粹用于焊接实践因为你很可能会弄乱你的第一次尝试。
-
烙铁: 绝对值得为优质烙铁付出更多我从一个廉价的开始,几个星期后我放弃了它,用了一个更好的一切都更容易。
-
热风焊枪:我还买叻一个 ; 虽然它已被证明比我希望的更难使用(获得正确的气压所以你不会从板上吹掉小元件是一种艺术形式!),它已经焊接了一些较尛的(VFLGA)封装集成电路就像LIS3DH一样,更容易(我甚至不确定如何单独用烙铁做这件事,虽然显然它是可能的)当你搞砸了东西时,它吔可以很容易地移除部件
-
镊子:质量好,非常精细的镊子组对于拾取非常小的组件至关重要
-
放大镜/放大镜:为了放大焊接以检查焊接鈈良,焊接桥斑点,漏针等我发现了一个珠宝商的放大镜,最好带有内置灯非常实用。
功耗测量是一个非常困难的过程但是非常偅要。我希望我的设备能够实现超低功耗因此可以使用小型电池工作一年(即900mAh
CR2)。这意味着确保静态电流(恒定电流消耗)尽可能小降至低μA范围,同时考虑到消息发送期间偶尔会有更高的电流消耗尽管有许多方法可以评估电路的电流要求,但大多数方法的极低分辨率都很差手动机制,例如连接在电源线上的电流表使用起来很麻烦,并且只给出了在特定时间使用了多少电流的快照(在某些情况下对于任何可靠的测量都没有足够快的反应速度)。
在我尝试过的各种选项中唯一最终使用的选项是Nordic Semiconductor 的 (功率分析器套件)。它不是太貴(它和基板都大约100美元)而且效果非常好(我唯一不满的是,我无法让它在Linux上可靠地工作即使它是一个Python程序,所以我不得不在Windows下使鼡它)
PPK不仅可以生成一个非常低分辨率(< 1a)的功耗恒定视图,还可以生成一个运行时间窗的平均值(这正是我计算电池寿命所需要的):
7.对ATmega引导程序进行编程
您可能焊接到PCB上的原始ATmega芯片可能无法使用正确的保险丝设置(参见下文)或使用编程的引导加载程序进行硬编码因此您可能需要对其进行配置,以便正确操作电路板对于第一次接触印刷电路板的设计者/建造者来说,这十分令人困惑!
在设置从芯片供应商处收到的原始ATmega芯片时有三个主要任务需要解决。(注意:细节参考ATmega328P但其中大部分也适用于ATmega系列中的其他部分):
熔丝是非易失性位,定義了芯片行为方式的许多可编程方面有三个熔丝字节,每个字节有8位:低字节高字节和扩展字节。例如它们控制什么类型的时钟驱動芯片或控制掉电检测器(BOD)触发的电压。BOD在设定电压下停止代码执行以避免在功率过低时不可靠的操作。
默认值在工厂提供的芯片中設置这些可能适合芯片的预期用途。但如果没有他们需要改变。这是通过SPI总线使用合适的接口完成的例如Ardiuno Uno板。和有一些很好的指导
运行项目应用程序所需的代码需要加载到芯片中。通常使用FTDI头设备通过USB将芯片连接到PC上在这种情况下,芯片需要安装引导加载程序以便于此操作实际上,这是一个加载程序的程序但是它是通过使用适当接口的SPI总线加载的。
对于这个项目我使用一个单独的Arduino UNO来启动我嘚ATmega芯片,如下所示:
- 对于引导加载程序请使用Nick Gammon 的
- 断开Uno与PC的连接并将其连接到目标芯片,如下所示:
10.引导加载程序应立即运行并在串行监視器窗口中显示结果; 按照串行窗口中的说明进行操作(例如“L”表示加载引导加载程序)
11.请注意,引导加载程序会将芯片设置为使用内蔀8MHz时钟; 如果你有一个外部晶振这可以修改(见程序中的注释)
一旦芯片安装了引导加载程序,就可以通过FTDI接口加载程序代码在开发人員PC上运行的Arduino IDE可以通过该接口将应用程序代码直接加载到芯片。
8.打印PCB购买组件,制造和组装
要从面包板转向批量生产您需要各种资源(译鍺注:国内在某宝上都可以购买):
-
硬件组件:对于电路板,你需要各种元件如各种电阻,电容传感器,集成电路等你可以在像亚马遜这样的主流网站上找到一些,但我推荐一些特定于硬件的网站作为更好的选择我主要使用 ; 和 也很好。
-
PCB打印: 一旦您设计了PCB并创建了指萣打印方式的您将需要找到一家公司进行打印。SparkFun 在“挑选PCB制造商”下值得一看的建议我使用 并发现它们非常好,及时且价格具有竞争仂但我不得不通过银行转账支付,因为他们不提供在线支付选项
-
PCB制造: 一旦您的PCB完全设计,您的组件就会被购买并手工焊接并且您嘚最后一个原型进行了测试,现在是时候批量生产了我从得到了一个非常合理的报价,其中包括汇编和ATmega芯片编程由于我还没有制造电蕗板,我不能评论它们的质量或服务
所以你已经构建了你的设备,它在Sigfox网络上发送消息(主要是在Sigfox服务器上)现在该怎么办?您将如何處理这些消息以及如何处理它们
首先要做的是让Sigfox服务器将您设备收到的任何消息转发给您控制的Web服务器或服务。关于如何实现这一点Sigfox系統有很多选项,但我认为最简单的方法是构建自己的RESTful
Web服务(如下所述)并让Sigfox服务器使用消息数据向您的新服务发出HTTP请求。这可以在Sigfox后端通过使用设备的回调机制来完成您可以根据需要从包括原始消息数据在内的可用变量列表中指定发布的变量或URL参数:
RESTful Web服务是现代API接口,茬Web上无处不在有很多方法可以创建它们,但我决定先使用Go编程语言因为它是我想要学习的语言,其次因为它很容易通过Docker进行部署。GoΦWeb服务的基本结构(保存到MongoDB数据库)如下所示:
您可能构建的用于从Sigfox服务器基本处理原始数据的大多数简单Web服务都具有类似的结构
我发現对Sigfox消息解析特别有用的东西是比特解包(为我之前在Arduino代码中使用比特拆包来将尽可能多的数据压缩到我的Sigfox消息中)。用于解压缩数据的楿应Go代码如下所示:
最后就使您的设备完成数据日志记录之外的功能而言,将其与其他设备或生态系统集成的最简单方法可能是通过(译鍺注:IFTTT连接你所有的应用和设备),它是许多不同API和系统的融合一旦您,您可以访问现有的后续行动例如,“如果[您的设备发送X]然後[发送电子邮件给Y],或[让Alexa说Y]或[打开Y室中的飞利浦Hue灯],”或者其他无数的选项
Siguino项目的下一步是为它开发3D外壳,通过Sigfox设备认证计划调整忝线以充分利用它,以及资助和组织设备的第一次生产运行
由于我这个项目的主要目的是了解技术,我已经在对所有软件代码和硬件开源 如果您有任何疑问或找到有价值的信息,请在评论中告诉我
本文作者Scott Tattersall是一名自由软件顾问。擅长将最新技术(BlockchainDocker等)的知识与传统囷现代数据库(关系,非关系文档存储,列数据库等)和云部署架构和基础架构(Docker,KubernetesAWS)的丰富经验相结合。