【干货】基于Arduino 的二进制手表
扫描二维码
随时随地手机看文章
- Button_V1.f3d
- Watch_Body_w_Buttons_V1.f3d
- BOM_Binary_Watch.xls
- Binary_Watch_V9.ino
此项目的所有文件:Arduino 代码的库可以从这里的 GitHub 下载:
- M41T62 RTC 库
- FastLED 库
- 低功耗库
- 二进制RGB接口
- 时间显示(具有非常准确的计时)
- 日期显示
- 秒表功能
- 报警功能
- 电池寿命至少 2 周
- USB充电
- 用户可轻松定制的软件
- 干净简洁的设计
下一步是开始为框图中的每个模块的各个组件做出决策!第 4 步:选择组件
结果证明这个电路中有相当多的组件。下面,我挑选了一些最重要的,并解释了我为什么选择它们。LED
对于二进制接口,选择相当简单。我知道我想使用 LED 进行显示,并发现我需要其中的 16 个(在 4×4 网格中)来显示尽可能多的信息。在我研究完美 LED 的过程中,APA102不断出现。它是一种非常小的 (2mm x 2mm) 可寻址 LED,具有多种颜色,而且相当便宜。尽管我以前从未与它们合作过,但它们似乎非常适合这个项目,所以我决定使用它们。微控制器
微控制器的选择也非常简单。我在独立应用程序中使用Atmega328P-AU有很多经验,并且非常熟悉它的功能。这与 Arduino Nano 板中使用的微控制器相同。我知道可能有更便宜的微控制器可以使用,但知道Atmega328将完全支持所有 Arduino 库是为该项目选择它的一个重要因素。RTC(实时时钟)
RTC 的主要要求是准确性。我知道手表没有任何互联网连接,因此无法通过互联网连接重新校准,用户需要手动重新校准。因此,我想让计时尽可能准确。该M41T62 RTC具有最高的准确度的一个,我能找到(±2ppm的这相当于每月±5秒)。将高精度与I2C兼容性和超低电流消耗相结合,使该 RTC 成为该项目的理想选择。DC-DC 升压转换器
只需查看电路并确定所需的电压和电流,即可选择 DC-DC 升压转换器 IC。在低电压下运行电路会降低电流消耗,但我不能低于 4.5V(16MHz 时钟下的最小微控制器电压),也不能高于 4.5V(RTC 的最大电压)。这意味着我必须在精确的 4.5V 下运行电路,以便在推荐的规格范围内运行组件。我计算出电路的最大电流不会超过250mA。因此,我开始寻找能够满足要求的升压转换器,并很快偶然发现了TPS61220。该TPS61220 需要最少的外部元件,相当便宜并且能够满足电流和电压要求。电池
对电池的主要要求是尺寸。电池需要足够小,以便它可以安装在手表外壳内,而不会使其看起来笨重。我认为电池不能超过20mm × 35mm × 10mm。由于这些尺寸限制和 250mA 的电流要求,我选择的电池仅限于 LiPo 电池。我发现了一个“Turnigy纳米技术300mAh的1S”电池Hobbyking,我决定使用。充电IC
除了需要兼容1S LiPo电池外,对充电控制器没有特别要求。我发现MCP73831T是一款完全集成的充电控制器,专为单节电池充电应用而设计。它的功能之一是能够通过外部电阻调整充电电流,我发现这在此应用中非常有用。锂聚合物保护
我想包括电压和电流监控,以保护电池免受任何危险的过度充电和过度放电情况的影响。提供此类功能的 IC 数量有限,其中一种更便宜的选择是BQ29700 IC。它需要最少量的外部组件,并包括对单节锂聚合物电池的所有必要保护。现在已经选择了组件,是时候创建原理图了!第 5 步:原理图使用 Altium Designer,我能够使用来自每个组件数据表的建议将上面的原理图放在一起。原理图分为不同的块,以使其更具可读性。我还添加了一些带有重要信息的注释,以防其他人想要重新创建此设计。
下一步是在 PCB 上布置原理图!第 6 步:PCB 布局事实证明,PCB 布局是该项目最具挑战性的部分。我选择使用 2 层 PCB 以将 PCB 制造成本降至最低。我选择使用 36 毫米的标准手表尺寸,因为这似乎非常适合 LED。我添加了一些 1 毫米螺丝孔以将 PCB 固定在手表外壳中。目标是通过将所有组件(当然 LED 除外)放置在底层来保持干净和美观的设计。我还想使用绝对最少数量的过孔,以避免在顶层出现可见的过孔。这意味着我必须在单层上布线所有走线,同时确保电路的“嘈杂”部分远离敏感的信号走线。我还确保所有走线尽可能短,将旁路电容器放置在靠近负载的位置,对高功率组件使用较粗的走线,否则请遵循 PCB 设计的所有常见良好做法。路由花了相当多的时间,但我认为结果非常好。下一步是为手表外壳创建 3D 模型!第 7 步:3D 设计手表外壳是根据使用 Fusion 360 的非常传统、经典的手表设计而设计的。我为表带使用了标准的 18 毫米间距,以使手表与各种其他表带兼容。PCB 的切口设计为比 PCB 本身大 0.4 毫米,以适应任何制造误差。我包括了一些用于安装 PCB 的螺丝柱和一个用于放置 PCB 的小边缘。我确保将 PCB 从顶部凹进一毫厘,以避免 LED 的锋利边缘卡在衣服上。外壳的高度仅由电池的厚度决定。外壳的其余部分旨在通过圆润的边缘和抛光的边角看起来很好看。我确实必须保持设计的 3D 打印友好性,以便我可以在家里 3D 打印它而无需任何支撑材料。现在硬件已经完成,是时候开始开发软件了!第 8 步:代码我通过包含所有必要的库来开始编写代码。这包括用于与 RTC 通信和驱动 LED 的库。之后,我为每种模式创建了单独的函数。当用户通过按下按钮切换模式时,程序会调用与该模式对应的功能。如果用户在指定的时间内没有按下按钮,手表就会进入睡眠状态。睡眠模式由所有 LED 逐渐消失直至完全关闭来指示。使用睡眠模式可大大延长电池寿命,并在不使用时保持 LED 关闭。用户可以通过按下上按钮来唤醒手表。唤醒后,手表会检查电池电量以确保不需要充电。如果需要充电,LED 会在显示时间之前闪烁几次红色。如果电池电量低于临界水平,则它根本不会开启。剩下的时间编程是让其他模式尽可能直观。我认为在所有模式下使用相同的按钮负责相同的功能将是最直观的。经过一些测试,这是我想出的按钮配置:
- 顶部按钮按下:唤醒/在“显示时间”、“显示日期”、“秒表”和“闹钟”模式之间循环。
- 顶部按钮保持:进入“设置时间”、“设置日期”、“开始秒表”或“设置闹钟”模式。
- 底部按钮按下:增加亮度。
- 底部按钮按住:进入“选择颜色”模式。
将引导加载程序刻录到 ATmega328P-AU SMD关于如何使用常规的 Arduino Uno 作为编程器来刻录引导加载程序和对微控制器进行编程。第一步是通过上传“ArduinoISP”示例代码将 Arduino Uno 变成 ISP。我使用了一个面包板和一个编程插座,并连接了教程中的原理图。之后,我只需在 Arduino IDE 中按下“Burn Bootloader”,就可以将引导加载程序刻录到微控制器上。一旦微控制器有了引导加载程序,我只需从 Arduino Uno 中移除现有的微控制器,并将 Arduino Uno 板用作 USB 到串行适配器,将代码上传到编程插座中的微控制器。上传完成后,我可以开始焊接过程。下一步是收集所有组件并将它们焊接在一起!第 10 步:焊接焊接过程分为两部分。首先需要焊接底层,然后是顶层。我使用胶带将手表 PCB 固定在几个原型板之间。这确保了 PCB 在焊接过程中不会移动,这一点非常重要。然后我将焊接模板放在 PCB 上,并使用大量焊膏覆盖所有焊盘。我继续使用一对薄镊子将所有组件放在相应的垫上。然后我使用热风枪将所有组件回流焊接到位。焊接底层时,我对其进行了快速目视检查,以确保焊接成功。然后我翻转电路板并在另一侧重复焊接过程,这次是使用所有 LED。焊接顶层时不要使电路板过热非常重要,因为底部的所有组件都有脱落的风险。值得庆幸的是,所有组件都保持原位,使用普通烙铁将按钮焊接到位后,PCB 就完成了!现在是最后组装的时候了!第 11 步:组装组装非常简单。我将电池连接到 PCB 并将电池和 PCB 放置在 3D 打印外壳内。我继续在 PCB 的每个角的安装孔中拧入四个螺钉。之后,我使用 18 毫米弹簧条连接表带,手表就完成了!
第 12 步:结论和改进手表按预期工作,我对它的结果感到非常满意。到目前为止,我没有遇到任何问题,并且在使用整整一周后,电池几乎保持充满电。
将来我可能会为手表添加其他功能。由于 USB 端口连接到微控制器,固件可以随时更新新功能。不过现在,我将继续使用这个版本的手表,看看它在长期使用后如何保持。