使用 Arduino BOB 快速评估传感器和外设                         
作者:Clive "Max" Maxfield/Digi-Key

物联网 (IoT) 的兴起激发了许多创新型初创公司寻求融入下一次重大变革的机会。但是,很多初创公司的设计团队比较精简,而且还深受产品上市时间日益缩短的制约。因此,每位设计人员不得不从事多个工程领域的工作,包括模拟、数字、射频 (RF) 和无线/有线网络。当然,他们一直在寻找能够加快 IC、传感器和外设评估并降低评估成本的办法。
一种方法是使用 IC 供应商提供的评估和开发套件来支持其解决方案。如果支持度非常高,那么这将一种很好的方法。不过,还有一种选择是使用 Arduino 生态系统。此生态系统已从业余爱好者的游乐场发展成为一个功能完善的设计与支持生态系统。
本文介绍设计人员如何在设计周期的早期利用 Arduino 来评估 IC、外设和传感器——使用传感器和外设分线板 (BOB) 之类的开源硬件,并结合各种库和示例程序之类的开源软件。本文将以 Maxim Integrated 实时时钟 (RTC) 和 Adafruit Industries 分线板 (BOB) 为例展开讨论。

物联网的兴起

物联网的第一个真实案例可以追溯到 1980 年代早期,当时美国卡耐基梅隆大学的一台可口可乐售卖机被连上了网络,程序员可以利用互联网检查饮料是否有售以及是否凉爽,确认之后才真正前去售卖机。直到 1999 年,物联网才作为一个概念才被正式提出。
物联网真正形成的确切时间尚有争议。对我们来说,物联网诞生的最佳定义也许是“当连接到互联网的‘事物’或‘物体’比人还多的时候”。据此估计,物联网诞生于 2008 年至 2009 年之间,物与人的比率从 2003 年的 0.08 增长到 2010 年的 1.84。

Arduino 的发展
物联网的诞生伴随着 2000 年代初期创客运动的兴起。Arduino 的全球首次部署发生在 2005 年,Make(创客)杂志也于同一年发行,并于一年后举办了第一届 Maker Faire(创客展)。
自确立以来,Arduino 已建立起复杂的开源软件和硬件生态系统,只是欠缺一种方法来将受到良好支持的 Arduino 生态系统引入专业设计人员的疆界,以简化其工作并缩短产品上市时间。
事实上,解决办法是以有机的方式出现的:围绕 Arduino 成长起来的巨大生态系统产生了意想不到的附带效应——专业工程师使用 Arduino 评估传感器和外设,然后将其部署到自己的设计中。现在有许多这样的例子,例如 RTC。

使用 RTC 的外设评估示例
几乎每个现代 32 位微控制器都带有集成的 RTC,许多 16 位甚至 8 位微控制器也有集成 RTC。尽管这会缩小电路板面积,减少物料 (BOM),降低最终产品的成本,但使用内部 RTC 存在一些缺点。
一个缺点是微控制器必须在软件控制下启用和禁用内部 RTC,因此,如果发生诸如电源故障之类的事情,导致微控制器锁定或其代码执行紊乱,那么 RTC 可能会被意外禁用。相比之下,外部 RTC 具有独立的电源轨和晶体,因而更为稳健,不太可能被微控制器上运行的代码意外关闭。此外,与微控制器相比,外部 RTC 通常采用更大的芯片制造工艺节点来实现,其较大的硅片尺寸使其更不易发生位翻转,即由宇宙射线等辐射引起的单粒子翻转 (SEU)。

RTC IC 示例:Maxim Integrated 的 DS1307 和 DS3231
Maxim Integrated 的DS1307 和 DS3231 是两款颇受欢迎的 RTC IC。这两款器件均能记录秒、分、时、星期几、日期、月份和年份信息,针对少于 31 天的月份进行自动调整,考虑闰年,并支持 24 小时或 12 小时模式。而且,这两款器件均通过串行 I2C 总线与主微控制器通信,并且包含一个检测电路,可检测电源故障并自动切换到备用电源(通常为电池)——在这种情况下,器件仍能维持计时操作(图 1)。
图 1:DS1307 是一个很好的外部 RTC 例子。其优点是拥有自己的本地晶体和电源轨,并且不会受到代码失效的影响。它通过 I2C 接口与主微控制器通信。(图片源:Maxim Integrated)
当然,检查规格书以确定这些器件之间的差异很重要。例如,DS1307 需要一个 5 V 电源和一个外部晶体。相比之下,更精密的 DS3231 可以采用 2.3 至 5.5 V 的电源供电,并配有集成的温度补偿晶体振荡器 (TCXO) 和晶体。
有时候,这些器件之间的区别不是一眼就能看出。例如,两款器件均提供 SQW(方波)输出,如果在软件控制下激活,则需要一个外部上拉电阻。但是,对于 DS1307,SQW 输出可编程为产生 1 赫兹 (Hz)、4.096 千赫兹 (kHz)、8.192 kHz 或 32.768 kHz 信号。相比之下,对于 DS3231,此输出可编程为产生 1 Hz、1,024 kHz、4.096 kHz 或 8.192 kHz 信号。
在 DS1307 的情况下,时钟精度取决于晶体的精度以及振荡器电路的容性负载与晶体调整所针对的容性负载之间的匹配精度。相比之下,具有温度补偿功能的 DS3231 在 -40°C 至 +85°C 范围内有更明确的精度数值,即在 ±2 分钟/年以内(图 2)。
图 2:DS3231 是一款温度补偿晶体振荡器,其精度为 ±2 分钟/年,工作温度范围为 -40°C 至 +85°C。(图片源:Maxim Integrated)
假设这两款器件从规格书看不存在妨碍采用的因素,那么设计人员如何对其进行实际评估呢?一种解决方案是设计和构建定制分线板 (BOB),并从头开始开发代码以驱动器件。另一种更快速、更具成本效益的解决方案则是使用 Arduino 硬件与软件生态系统中现成的 BOB 和代码。

RTC BOB 示例:Adafruit 的 DS1307 和 ChronoDot
DS1307 和 DS3231 IC 的两款常用 BOB 是 Adafruit 的 3296 DS1307 实时时钟 BOB(图 3)和 255 ChronoDot 超高精度实时时钟 V2.1 BOB(图 4)。
图 3:Adafruit 的 DS1307 RTC BOB。(图片来源:Adafruit Industries)
图 4:ChronoDot 超高精度实时时钟 v2.1 BOB。(图片来源:Adafruit Industries)
当与适当的微控制器开发板(例如 Arduino Uno R3)结合使用时,再加上可从互联网下载的开源库和示例代码,嵌入式系统和物联网设备的专业设计人员便可立即开始评估工作。
设计人员完成评估后,可以选用 BOB 的开源硬件设计的适当部分,并将其直接整合到自己的设计中。同样,他们可以选用开源库以及其基于开源示例开发的代码,并将其用作产品的一部分。

面向软件开发人员的硬件技巧与诀窍
如前所述,DS1307 和 DS3231 RTC 均通过串行 I2C 总线与主微控制器通信。经常困扰软件开发人员的“难题”之一是,构成该总线的两个信号(分别称为 SCL 和 SDA)都需要上拉电阻。
Adafruit 的 DS1307 或 DS3231 (ChronoDot) BOB 均不包含上拉电阻,不过 ChronoDot 有标记 R1 和 R2 的焊盘,可以在其上添加电阻。
不包含上拉电阻的原因是 I2C 总线可以连接多个器件(IC 或 BOB)。I2C 总线使用 7 位地址,27 = 128。但是,地址 0000000 是一个通用调用地址,用于寻址总线上的所有器件,故理论上总线能够支持 127 个分立器件。实际上,总线可以支持的器件数量由总线的电容(包括走线和负载的电容)决定,总线电容总量以 400 皮法 (pF) 为限。
硬件设计人员可以使用一个公式来计算多个并联电阻的等效值。出于讨论的目的,我们可以考虑如下简单的例子。如果两个器件有相同阻值的上拉电阻,则其等效电阻为该值的一半;如果四个器件有相同值的上拉电阻,则其等效电阻为该值的四分之一。

如果总线上已经存在一个带上拉电阻的 I2C 器件,则无需采取进一步措施。如果不存在上拉电阻,而且设计人员 100% 确定他们将来不会在板上添加带有上拉电阻的 BOB,那么最好使用一对 4.7 千欧 (kΩ) 电阻作为上拉电阻。但是,如果将来有可能增加带上拉电阻的 BOB,那么此时应添加一对 10 kΩ 电阻,因为在将另一个 BOB 添加到总线上之前和之后,这些电阻都有效用。

面向硬件设计人员的软件技巧与诀窍

“wire 库”是一个通信库,利用它可便捷地与 I2C 器件进行双线类通信。对于 Arduino,这是作为集成开发环境 (IDE) 的一部分提供的,因此设计人员只需在程序的开头添加语句 #include <Wire.h>。
真正的诀窍是要找到合适的 RTC 库。一个很好的例子是 Adafruit 的 RTClib,它可以从 Github 下载。接下来,在程序开头添加语句 #include "RTClib.h"。
然后,通常在定义常量值之后,就需要根据所用的 BOB,利用语句 RTC_ DS1307 RTC; 或 RTC_DS3231 RTC; 实例化 RTC(创建其实例)。
再后来,当在程序中完成所有设置时(对于 Arduino 草图,它是 setup() 函数的一部分),设计人员便需要添加语句 Wire.begin(); 和 RTC.begin(); 来初始化 I2C 通信和 RTC 子系统。
前面提到的 Github 页面上提供的示例可以让设计人员快速启动并运行,进而访问和调整当前日期与时间。不太明显的是如何访问 SQW(方波)输出。默认情况下,此输出处于非活动状态以节省功耗。举例来说,使用此引脚的一种方式是让其处于活动状态并设置如 1 Hz 的运行频率,然后使用此信号触发主微控制器上的中断。
软件开发人员可以毫不费力地在库代码中找到所有这些东西,但对于硬件设计工程师来说,翻阅此代码可能会有困难,因此下面给出一个简短的总结:
对于 DS1307,只需添加一个或多个 RTC。Ds1307SqwPinMode(<选项>); 形式的语句,支持的选项值有 ON、OFF、SquareWave1HZ、SquareWave4kHz、SquareWave8kHz 和 SquareWave32kHz。
同样,对于 DS3231,应添加一个或多个 RTC。Ds3231SqwPinMode(<选项>); 形式的语句,支持的选项值有 ON、OFF、DS3231_SquareWave1Hz、DS3231_SquareWave1kHz、DS3231_SquareWave4kHz 和 DS3231_SquareWave8kHz。

结论
由于团队规模较小,上市时间越来越紧,设计人员必须承担多个工程领域的工作,并不断寻找加快 IC、传感器和外设评估且降低成本的方法。如本文所述,有一种方法是将 Arduino 与传感器和外设分线板 (BOB) 之类的开源硬件及库和示例程序之类的开源软件结合使用。