DIY一款既实用又时尚的二进制手表
本帖最后由 RRoy 于 2020-8-5 16:34 编辑!(data/attachment/forum/202005/14/112301ypulelusslluezpr.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "4.png")
!(data/attachment/forum/202005/14/112313vtttewrtfftje0xi.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "5.png")
如图所示,今天给大家介绍一个炫酷的项目——电子风满满的二进制手表,由瑞典电子爱好者Alex制作。这个项目在instructables的钟表类比赛中获得了一等奖。
**注:文中涉及的代码等资料,可以在文末左下角或者在“DF创客社区”公众号后台回复“Alex二进制手表”获取。**
最近一段时间,开始接触到一些关于二进制手表的知识,我也开始在搜寻相关的资料来尝试自己是不是也能做一个。但是,我发现很难找到一个既实用又时尚的设计,所以一气之下,我决定干脆自己从头开始设计一个。
## 创意
!(data/attachment/forum/202005/14/112326lboz8oqql11ky1qz.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "6.png")
灵感来源于下面这个视频:
https://www.bilibili.com/video/BV1Mt4y117eP/
想要做一个二进制手表第一步首先要确立一些设计标准,我想到了下面这些:
#### 建立设计标准
- 支持二进制RGB显示方式
- 支持时间显示(非常精确的计时)
- 支持日期显示
- 支持秒表功能
- 支持警报功能
- 长电池寿命
- 支持USB充电
- 软件可由用户轻松定制
- 设计简洁干净
这些标准成为了这整个项目设计的基础。下一步是会给大家说清楚我希望手表如何工作。
## 步骤2:简单的二进制呈现理论
#### BCD码(Binary-Coded Decimal)
> 用4位二进制数来表示1位十进制数中的0~9这10个数码,是一种二进制的数字编码形式,用二进制编码的十进制代码。BCD码这种编码形式利用了四个位元来储存一个十进制的数码,使二进制和十进制之间的转换得以快捷的进行。
该计划很简单。除了接口是二进制的(特别是BCD(二进制编码的十进制))之外,二进制监视的操作与常规监视相同。BCD是一种二进制编码,其中每个十进制数字都由固定位数表示。我需要4位才能代表0-9的数字。对于标准的hh:mm时间格式,我需要其中4位数字。这意味着我总共需要16个位,这些位将由16个LED表示。
习惯了,用BCD读取时间非常容易。手表底部的行代表最低有效位(1),顶部的行代表最高有效位(8)。每列代表hh:mm时间格式的数字。如果LED亮起,则计算该值。如果指示灯熄灭,则忽略它。
要读取第一个数字,只需将第一列(最左侧)中所有激活的LED对应的值相加即可。从左到右对其他数字执行相同的操作。现在您已经在BCD中阅读了时间!
对于手表上的其他功能,该原理相同。RGB LED的使用将有助于区分使用不同颜色的不同功能和模式。这使用户可以轻松浏览各个功能而不会感到困惑。
下一步是创建框图!
计划很简单。二进制手表将像普通手表一样工作,除了界面将是二进制显示的。
这里用到了BCD码。
#### BCD码(Binary-Coded Decimal)
> 用4位二进制数来表示1位十进制数中的0~9这10个数码,是一种二进制的数字编码形式,用二进制编码的十进制代码。BCD码这种编码形式利用了四个位元来储存一个十进制的数码,使二进制和十进制之间的转换得以快捷的进行。
8421BCD码是最基本和最常用的BCD码,它和四位自然二进制码相似,各位的权值为8、4、2、1,也称为有权BCD码。
我需要用4位来表示0-9中的数字。且对于标准HH:MM时间格式,我需要4个这样的数字。这意味着总共1需要16位,这里用16个LED表示。
一旦你习惯了用BCD读时间是很容易的。
手表底部一行表示最低有效位(1),顶部的行表示最高有效位(8)。每一列表示HH:MM时间格式中的一个数字。如果LED亮起,则计算该值。如果LED熄灭,则忽略它。
要读取第一个数字,只需将第一(最左边)列中所有亮着的LED对应的值相加即可。从左到右对其他数字执行相同的操作。
所以上面对应显示的时间就是13:47!
这一原则同样适用于手表的其他功能。
使用RGB LED原因是有助于区分使用不同颜色对应不同功能和模式。可以让使用者轻松地浏览这些功能,而不会混淆。
下一步,我们来创建框图。
## 步骤3:开始工作
与其他任何电子项目一样,框图是早期设计阶段的重要组成部分。
根据这些标准,我设法整理出了上面的框图。图中的每个方框表示电路中的一个功能,箭头表示这些功能之间的关系。整个框图很好地概述了电路的工作原理。
下一步是开始对框图中每个模块的各个组件进行决策!
## 步骤4:选择组件
在这个电路中有相当多的元件。下面,我挑选了一些最重要的部分,来解释我为什么选择它们。
#### LED
对于二进制显示界面,选择相当简单。我知道我想用LED来显示,并发现我需要16个LED(在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的电流要求,我对电池的选择仅限于锂电池。
我在Hobbyking上找到了我决定使用的个"Turnigy Nano-Tech 300mAh 1S"电池。
#### 充电电路
对充电控制器没有特别的要求,只是需要与1S 锂电池兼容。
我找到了MCP73831T,它是一个完全集成的充电控制器,专为单电池充电应用而设计。
它的特点之一是能够调节通过外部电阻器的充电电流。
#### 锂电保护
这里我想包括电压和电流监控,保护电池免受过充电和过放电的影响。
提供此类功能的IC数量有限,其中一个较便宜的选择是BQ29700 IC。它只需要极少量的外部元件,而且包括了单节锂电池的所有必要保护。
现在我们选好了元件,一起来创建原理图吧!
## 步骤5:原理图
这里用到了Altium Designer,我能够使用每个组件数据表中的建议将上述示意图汇总在一起。原理图分为不同的框,以使其更具可读性。我还添加了一些注释,其中包含重要信息,以防其他人想要重新创建此设计。
下一步是在PCB上布置原理图!
通过使用Altium Designer,我能够利用每个组件的数据手册中的建议来整理上述原理图。
原理图被分成不同的块,更具可读性。我还添加了一些重要信息的注释,以防其他人想要重新创建此设计。
下一步我们在PCB上布局原理图。
## 步骤6:PCB布局
PCB布局是整个项目最具挑战性的部分。
选择使用2层PCB,以将PCB制造成本降至最低。
选择使用36毫米的标准手表尺寸,因为它看起来非常适合LED。
我增加了一些1毫米的螺丝孔来将PCB固定在手表外壳中。
我们的目标是通过将所有组件(当然除了LED)放置在底层,从而保持整个设计的整洁美观。
我还希望使用最少数量的过孔,以避免在顶层出现可见的过孔。这意味着我必须在单个层上布线所有走线,同时确保电路的"噪声"部分远离敏感的信号走线。我还确保所有走线尽可能短,将旁路电容放置在接近负载的位置。对于高功率元件使用较厚的走线,否则应遵循PCB设计的所有常见良好实践。布线花了相当多的时间,但我认为结果很好。
下一步我们来为手表外壳创建一个3D模型。
## 步骤7:3D设计
表壳的设计基于采用Fusion 360的非常传统的经典表设计。表带使用了18mm的标准间距,使该表与多种其他表带兼容。
PCB的开孔设计比PCB本身大0.4mm,来适应任何制造误差。
安装PCB的螺柱和一个小的边缘,用于放置PCB板。
我确保将PCB从顶部凹进几毫米,避免LED的锋利的边缘卡在衣服上造成损坏。
外壳的高度完全由电池的厚度决定。外壳的其余部分设计得非常美观,边缘圆润,边角光滑。
我必须保持设计对3D打印友好,这样就可以在没有任何支撑的情况下在家里进行3D打印。
现在,硬件已经完成,是时候开始软件部分的工作了!
## 步骤8:代码
我通过包含所有必需的库开始了代码。这包括用于与RTC通信和驱动LED的库。之后,我为每种模式创建了单独的函数。当用户通过按下按钮切换模式时,程序将调用与该模式相对应的功能。如果用户未在指定的时间内按下按钮,手表将进入睡眠状态。
所有LED都将逐渐熄灭,直到它们完全熄灭,才表明处于睡眠模式。使用睡眠模式可大大增加电池寿命,并在不使用时保持LED熄灭。用户可以通过按下上方的按钮唤醒手表,并且默认情况下手表会显示时间,因为这是最常见的模式。唤醒后,手表还将检查电池电量以确保不需要充电。如果需要充电,LED将在显示时间之前闪烁红色几次。如果电池电量低于临界水平,它将完全无法打开。
至于其他模式,我想让它们尽可能直观。我认为在所有模式下使用相同的按钮负责相同的功能将是最直观的。经过一些测试,这是我想到的按钮配置:
- 按下顶部按钮:唤醒/在“显示时间”,“显示日期”,“秒表”和“警报”模式之间循环。
- 顶部按钮保持: 进入“设置时间”,“设置日期”,“启动秒表”或“设置闹钟”模式。
- 底部按钮按下:增加亮度。
- 底部按钮保持: 进入“选择颜色”模式。
底部按钮始终负责亮度和颜色调整,而与您所处的模式无关。
当用户进入颜色调整模式时,LED开始循环显示所有可能的RGB颜色。用户可以暂停动画并选择该特定模式所需的颜色(红色显示时间,蓝色显示日期等)。
用户可以轻松自定义颜色来区分不同的模式。
现在代码已完成,是时候把它们上传到微控制器了!
## 第9步:编程
差不多到了焊接和组装的时候了,但在此之前,我们需要对微控制器进行编程。
我遵循了这个教程。
> (http://www.electronoobs.com/eng_arduino_tut6.php)
> 关于如何使用常规的Arduino UNO烧录引导程序和对微控制器进行编程的信息。
第一步是通过上传"ArduinoISP"示例代码,将ArduinoUno变成ISP烧录器。
我使用了一个带有编程接口的电路试验板,并将教程中的原理图连接起来。
之后,我只需在Arduino IDE中按下"Burn Bootloader",就可以将引导程序烧录到微控制器上。
一旦微控制器有了引导加载程序,我就简单地从Arduino UNO中删除了现有的微控制器,并使用Arduino UNO板作为USB转串口适配器,将代码上传到编程接口的微控制器。上传完成后,可以开始焊接过程。
下一步,我们收集所有组件并将它们焊接在一起。
## 步骤10:焊接
焊接过程分为两部分。首先需要焊接底层,然后是顶层。
我使用胶带将手表PCB固定在几个原型板之间。这确保了PCB在焊接过程中不会移动,这一点非常重要。
然后,我将焊接模板放在PCB上,并使用大量的焊锡膏覆盖所有的焊盘。接着,我开始使用镊子将所有组件放置在它们相应的焊盘上。然后,我用热风枪将所有组件回流焊接到位。
在焊接底层时,我进行了快速的目视检查,来确保焊接成功。然后,我翻过电路板,在另一侧重复焊接过程,这一次是焊接所有的LED。
焊接顶层时,关键的一点是不要使电路板过热,因为这会让底层的所有元件有脱落的风险。
保证所有元件都留在原处,并使用烙铁将按钮焊接到位后,PCB板也完成了!
现在是最后组装时候了!
## 步骤11:组装
组装非常简单。我将电池连接到PCB,并将电池和PCB放在3D打印外壳中。
之后,将四个螺钉拧入PCB各个角上的安装孔内。
最后,用18mm的弹簧条连接了表带,手表就完成了!
## 步骤12:结论和改进
这款手表的表现完全符合预期,我非常满意。
到目前为止,我还没有遇到任何问题,使用了整整一周后,电池仍可以几乎充满电。
未来,我将来可能会在手表中添加其他功能。
由于USB端口连接到微控制器,因此可以随时更新升级固件。
不过现在,我会继续使用这个“版本”的手表,先观察它在长时间使用后的表现如何。
**PS : 大家如果对这个项目有任何想法,意见或问题,可以在下面留言讨论。
你也可以直接与作者交流,他的邮箱是aptechnologies.se@gmail.com。**
### 那么问题来了,上面现在是几点钟?
---
项目作者:Alex
编辑:Roy
> 参考资料:
1. Burn the bootloader to a ATmega328P-AU SMD: http://www.electronoobs.com/eng_arduino_tut6.php
2. 原文地址:https://www.instructables.com/id/The-Ultimate-Binary-Watch/
3. 部分资料来源于互联网,首发于(https://mc.dfrobot.com.cn/thread-305264-1-1.html)
非常喜欢,已经做成了,借鉴的原创意,PCB和程序全部重新开发了,采用STM32主控,使用了自带的RTC+外置晶振,加了一颗紫外线传感器,一颗气压传感器,这样多了紫外线测量、温度和海拔功能,更像是一个户外表,然后又把小区的门禁卡NFC也集成上去了,功能妥妥的了,下面上图
VYN3CrvI 发表于 2020-5-16 21:53
没有pcb文件吗?
因为这个项目是在instructables上的,作者无法上传压缩文件,原帖子下面好多人要想要PCB文件,项目作者留了他的邮箱: abdulkhalique712@gmail.com ,你可以尝试联系他一下,顺便练习一下英文! DFHJM_IpFmV 发表于 2020-8-24 21:19
可以把打印pcb的软件来一个波?
这个项目是在instructables上的,作者无法上传压缩文件,好多人要想要PCB文件,项目作者留了他的邮箱: abdulkhalique712@gmail.com ,你可以尝试联系他一下 带上这款手表有一种清新脱俗的感觉 挺喜欢这个PCB的,就是为什么用UNO这么屌丝 带上它以后,吃饭更香了,跑马更有劲了,谈个女盆友也更有底气了22333333 这款手表真的很实用!
创意也很好,把六十进制改成了二进制!
{:6_215:} 哇,我终于看懂二进制表了 小米创客+ 发表于 2020-5-7 20:48
带上它以后,吃饭更香了,跑马更有劲了,谈个女盆友也更有底气了22333333
公众号后台有朋友想说他可以打印外壳,要把你微信推送给他么{:5_151:} RRoy 发表于 2020-5-8 10:37
公众号后台有朋友想说他可以打印外壳,要把你微信推送给他么
好啊,我们怎么联系 赞一个! pcb做的很好,二进制不好读啊 Alex二进制手表 板子挺好看的
数学教师专属福利啊{:6_203:} 21:08,好难读啊{:6_213:} 21:04
不知道对不 超喜欢,就是要做这个PCB麻烦~ 小慈 发表于 2020-5-10 11:18
21:08,好难读啊
哈哈,你快了四分钟{:5_160:} Alex二进制手表 淘宝上有专门卖手表的配件,蓝宝石玻璃面有切割好的成品,几块钱吧,贴上去,还能再高端一点 Grey 发表于 2020-5-14 11:06
淘宝上有专门卖手表的配件,蓝宝石玻璃面有切割好的成品,几块钱吧,贴上去,还能再高端一点 ...
good !(还是国内好,有淘宝...) 20060606 发表于 2020-5-9 11:16
pcb做的很好,二进制不好读啊
8421,8421多读几次