做了个辉光管时钟

2020-01-07 14:18:21 +08:00
 RedL0tus

本文原本是想要参加少数派的新年征文的,后来因为种种原因我自己滚了。想着写都写了总还是要给人看的,先在这边发一下。过段时间会在我博客上发个细节更多的版本,可能会把链接发在附文。

下面这图是文章里提到的头图。

然后我确实是不懂硬件,也是第一次用 Arduino,请各位大佬轻点,轻点(

下面是原文。


今年可以说是买了不少东西了。因为不明原因耳机电脑集体暴毙,买了 Final 家的 F4100 和 MBP 13 2019 等等等等,都是挺好的东西( MBP 的话前提是别出 bug,这是我这段时间对苹果最不满的地方了)。但是要说最喜欢的还是前两天刚刚做完主体部分的的辉光管时钟。

什么是辉光管

他们正式的名称实际上应该是叫数码管,是一种可以显示数字和其他信息的电子设备。

基本结构是在充有稀有气体的玻璃管里放入多个数字形状的阴极金属丝,还有连通的金属网阳极。往里面通入高压电之后(通常 170 伏左右)会激发阴极的数字附近的气体发光从而形成能看到的数字。一般情况下里面充入的气体是氖,造成一般情况下颜色是一种温暖的橙色。简单而又不是很准确的说法就是可以控制的小型霓虹灯。然后一般情况下分为侧视和顶视两种类型,故名思意就是一种是数字显示在侧面一种显示在顶部。通常顶视的比侧视的小很多也便宜很多。

做个辉光管时钟可以说是我一直的梦想之一。我最早知道辉光管这种东西是中学时看了一部叫命运石之门的动画,里面有一样东西叫世界线变动率探测器,形象就是一个有着八颗侧视辉光管的钟。

当时就觉得它看着有一种特别的美感,但是我并不知道它们叫什么,甚至不知道它们是不是真实存在的。直到后面有一次偶然看到一篇文章讲述如何制作一个类似的东西当时钟,成功给我种了这棵草。

但是现实是残酷的,现在这些管子的售价可以说是非常高昂了。尽管单个成本并不算高,早年也是大量生产的物品,但是因为种种原因它们早在上世纪五六十年代就已经停产了,现在能买到的大多是那时美国或苏联剩下来的存货。这就造成这些管子的年龄应该比我们大多数人都要高,虽然这种“历史的积淀”让它们变得更加带感,但是同时也造成了本垃圾作为一个穷学生根本买不起成品;自己做的话作为一个只会写点 bug 的中学生,我并不会自己画电路也不会焊元件,更不用说高压电路了。就算排除别的所有东西德成本,管子本身的价格也还是不太能承受。最后这个梦想也就搁置了,而这一放就是几年。

开坑的原因

今年八九月份忙完了重要的事情之后就变得很闲,整天不知道做什么摸鱼就摸过去了,GitHub 上也很久没有新的提交了。十一月的时候感觉这样下去不行,一定要找点事情做,这棵以前被种下的草不知道怎么的又被我想起来了,然后就一发不可收拾了。

制作过程

首先要澄清的是我依旧不会设计电路,所以我先从寻找有没有能接受的成品或者 DIY 套装开始。当然也只能买顶视的管子,侧视的经典的比如苏联产 IN-18 差不多都要一百多刀一根,完全负担不起。

在开始做之前有在一个叫 Crowd Supply 的 DIY 科技产品众筹网站上看到有个叫 Nixie Tap 的钟已经在出货了,是一种使用四个小型的顶视管子配 ESP8266 微控制器的钟。他们提供 $99 的 DIY 套装和 $398 的成品。成品的价格我觉得不是很能接受,DIY 套装的话当我真的决定要做的时候已经没有了。于是无奈之下只得放弃。

经过一段时间搜索之后我发现基本还是没有可以接受的成品,要么买不到了要么价格太过夸张。于是我决定找找看有没有可以使用或者参考的电路设计,最好是能跟 Arduino 搭配使用的那种。在软件方面我并不怎么怕,对我来说主要的难点还是硬件上的东西。虽然从原理上来说要点亮管子最主要的东西就是升压电路,要把一般电路里使用的五伏或者九伏升压到一百七十伏左右,别的东西就只是简单的通电断电而已。我一开始的设想是用我这边闲置的上古树莓派 1B 来控制独立的升压电路,但是后来发现没有符合要求的板子,连接电池的话树莓派本身功耗可能相对也太高就放弃了。后来我发现一个叫 ArduiNix 的产品看起来挺不错的,价格也能接受。同时它们也有售卖成套的管子,也省得我从不同的渠道上购买。

最后决定使用 Arduino Uno Wi-Fi Rev 2 这个板子来控制,顾名思义比普通的 Arduino Uno 多一个 Wi-Fi 支持,同时比普通的 Arduino Uno 贵不少,但是省得我再接一个 ESP8266 出来。

时钟的功能的话还需要一个硬件 RTC ( Real-Time Clock,实时时钟),因为 Arduino 这种板子自己是没有办法在断电之后让时钟继续走下去的,重新设置又会很麻烦,本身精度可能也不高。于是购买了 DS3231SN,是我在普通渠道下能买到的精度最高的 RTC。

供电我决定使用早年购买的一个吃灰中的移动电源,配合一根能从 5V 2A 升压到 9V 1A 的线应该能满足需求。

当时以为很简单就能搞定,不过现实并没有那么美好,我一个硬件苦手还是没能避免出问题。

硬件的第一次尝试

起先想着虽然买不起侧视的,但是八个管子还是要的,于是购买了八个 IN-17 的套装。没几天之后东西到了(盒子我没拍照)。说实话我并不怎么会焊板子,这可以说是我第一次自己制作板子。电烙铁用的是几年前冲动消费买的十几美元一套的垃圾套装,焊锡用的也是套装里面自带的。那个垃圾烙铁在连续使用几分钟后会连手握的地方都边烫,那个垃圾焊锡的话融化得也慢。经过几小时的奋战之后搞定了驱动板,把万用表接上去能正常进行升压。

后来兴高采烈得去把连着管子的子板也焊了。但是接上去并给 Arduino 刷好了示例程序就傻眼了,显示的数字都是不完整的,几个不同的数字的部分重叠在了一起。

可以看到里面的数字并不成型

不甘心的我检查了下示例程序,虽然很烂但是并没有发现什么问题。拿万用表在板子上检查才发现我驱动版焊坏了,控制用的芯片的芯片座有几个脚不通了,与其他的种种原因结合起来最后结果就是我浪费了这一个驱动版的钱。

反思之后觉得是下面几点原因:

硬件的第二次尝试

上次浪费的那些钱我可以说是很心痛了,想着这次绝对不要出错就把他们官网上的产品都大概了解了一遍。最后决定买六个 IN-12 的管子,因为它们更大更好看,同时又是通过可拔插的针脚连接的,这能让我能更简单得保证管子没有焊歪。 单个管子不点亮是这样的

至于工具的话最后购买了 eDesign 的 TS80,焊锡换成了 Kester 的 6040 有铅焊锡。至于为什么不买白光的焊台,主要是我这边白光很贵而且体积太大。这个 TS80 是通过 USB Type-C 这样的精致接口供电的,我甚至能通过移动电源来给烙铁供电。后来的体验确实是比之前的垃圾好太多,完成得比上次快多了,效果也比之前好很多,老祖宗们说的工欲善其事必先利其器确实有道理。

同样的又是几天后收到了包裹。几小时的奋斗之后再进行了测试之后没发现什么问题,把管子接上去之后终于成了.

软件和硬件细节上的坑

(这部分如果嫌枯燥可以跳过,只要知道我最后把能用的程序写出来了就行了)

枯燥的硬件终于结束,终于到了我会一点的软件部分了。Arduino 使用的是一种魔改版的没有精简版 C++,或者实际上叫它是能 OOP 的 C with Classes 更恰当。我此前并没有写 C++ 的经历,但是好在他们把需要折腾的地方都给简化了,导致我看起来和写起来都没什么大问题。

起先想直接改原版的程序算了,但是后来感觉实在看不下去,写得实在是太烂了,有时还会出我觉得很迷惑的问题,于是我决定还是要自己从头写。在通读了示例代码之后写出了我觉得更好的抽象。

后来发现这个驱动板有个挺严重的问题。控制辉光管显示什么数字的原理很简单,仅仅是给对应的数字的阴极和共用的阳极通电就行,但是问题是每一个管子就有 11 个针脚(零到九共十个,还有一个阳极),六个管子接起来的话总共就要 66 个,那么这样的话如果像 ArduiNix 这样把管子跟控制板分离的话连接用的线的数量就会变得很多,板子也会变得超级巨大。而 ArduiNix 的解决方法是仅仅提供 20 个阴极和 4 个阳极,每个阳极对应着两个管子,然后 10 个阴极一组控制那两个管子上显示的数字,然后这样轮换下去。只要闪得足够快人眼就会认为它在常亮,也就是一种类似 PWM 的情况。这种设计思路我没弄错的话应该叫 Multiplexing,多路复用。这样的做法我确实可以理解,这样可以在缩小板子的体积的同时做到可以随时更换板子,而缺点就是驱动用的程序会变得更复杂。这也是为什么我觉得官方程序烂的原因之一,他们相当于是把本来可以通过循环搞定的事情用最笨的手动的方式解决了。还有个需要多路复用的原因是 Arduino 本身能用的针脚也有限,尽管用了译码器,零到九这十个针脚编码成二进制也还是需要需要四位,也就是四个针脚。这么一套下来已经把 Arduino Uno 除了 Serial 输出占掉的 0 和 1 号以外的所有数字输出针脚用完了。

我把基本功能实现之后想起来之前看到过还有种显示上的效果叫 Crossfade,简单点说就是原本的数字淡出,后来的数字淡入。但是在上文提到的这种多路复用的情况下我不是很确定怎样才是正确的实现方法。我本来以为是逐渐减少原本数字显示的时间然后延长新数字显示的时间就行,但是做出来感觉效果并不是很对,并且复杂度是越来越高了。而官方示例代码自称是有这种效果,但是实际对比之后发现他们做的 Crossfade 效果并不明显,就觉得这样凑和用算了。以后有空的话可以再试试看能不能实现。

接下来是调整时间上的问题,我虽然放了个看起来挺准确的 RTC 在上面,但是还是有需要调整的情况。自动校准的话我使用 NTPClient 这个库做了个通过 NTP ( Network Time Protocol,网络时间协议)自动校时。NTP 就是我们平时手机上或电脑上看到的那种自定设置时间背后的东西,通过这个协议可以跟网络上的时间服务器进行同步。但是不管是 NTP 还是 RTC 都是没有时区这个概念的,仅仅是用来同步国际协调时的,而 Arduino 使用的精简 C++ 的库里也没有处理时间相关的东西,这又是一种实现起来很麻烦的东西。我毕竟是做给自己看的所以有点问题也无所谓,只是简单做了一个偏移。至于手动调整的话如果加实体按钮的话需要加很多,我嫌麻烦,那些元件要少量的买也不太好买。于是我随波逐流用上了 Blynk 这个库,使得我可以在手机上控制它。但是有个问题是发送消息到 Blynk 的服务器上会造成延时,可能是网络的延时也可能是 Arduino 的性能太弱,结果就是会让前面提到的闪烁的时间间隔变长,让闪烁变得肉眼可见。所以现在的程序并不会把显示的数字提交到 Blynk 的服务器上,感觉还是有点遗憾的。Blynk 的控制端被我做成了这样:

我实在是不会做 GUI,我摆放这些控件的思路就两个字,塞爆!

所以如果你们要做或者我以后要再做一个的话,还是更建议自己画板子就是了。毕竟自己做的话一般明白自己需要哪些东西,只要把所有的都做成一体,或者使用别的更合适的方式连接驱动板和管子所在的板子就可以不需要多路复用,配合锁存器就可以让控制器从无休止的闪烁之中解放出来,成本可能会高一点但是就不会遇到我现在遇到的这些令人难过的问题。不管怎么样,最后做出来的至少能看。我写的程序源码可以在我的 GitHub Gist 上找到: https://gist.github.com/RedL0tus/b521a65cb32255e23a07fcf0d6cd425c

至于显示出来的效果嘛,顶上的 banner 就是我拍的照片。只是可惜我没有合适的设备可以固定管子,也没有相机和脚架,管子焊得也说不上完美,还是能看到到瑕疵的。

当前的总结

现在对于硬件方面我基本满意了,虽然有点歪,壳子也还没做。但是这毕竟是自己做出来的东西,逐渐膨胀的我还有我的成就感导致我觉得这就是我今年买的最好的东西。

晚上关灯之后拍的,我感觉可以说是非常漂亮了,题图就是从这张裁剪出来的

硬件我是 12 月 19 号完成的,程序我是在 12 月 31 晚上十一点半完成的,正好赶在新年前半小时,顺手在某个不存在的地方做了一个跨年倒计时直播。

说起来之前看到有人用 LED 配合亚克力板来模仿辉光管的效果,名字好像叫 Lexie,实际也挺好看的,寿命也会远比真正的辉光管长。如果只是要钟的功能的话它可以说是性价比很低的一种解决方案了,如果用普通的七段式屏幕或者 LED 点阵屏幕的话成本估计只有这个几分之一,同时远远比辉光管节能。与此同时真正的辉光管毕竟基本上都是半个世纪多以前的东西了,本身因为高压之类的问题寿命也不会很长。花这么多钱买这些做个寿命不长的钟听起来性价比非常低,但是对我来说做这些可以说是给自己圆梦了。感觉偶尔从效率啊性价比之类的东西之前让自己放松放松也不坏。虽然最后感觉钱包挺疼的就是了。

最后作为新时代恶臭青年,请允许我臭一下( x

就是这样了!大家新年快乐!

11066 次点击
所在节点    分享创造
76 条回复
component
2020-01-07 17:35:48 +08:00
quan7u
2020-01-07 18:29:45 +08:00
@mokeyjay 暗号吗?其实我看番时不知道到底什么意思,只是觉得喊出来很 中 二
coderljx
2020-01-07 19:09:08 +08:00
EL PSY CONGROO ~
hws8033856
2020-01-07 19:20:36 +08:00
@yrucrew 胸针臆想出来的装 B 暗号,除了中二没啥卵用,还不如助手的叉子有用
mrcn
2020-01-07 19:42:45 +08:00
好好看 也好贵😱
claymore94
2020-01-07 19:44:58 +08:00
楼主总共花了多少钱啊,我看完 命运石之门的时候也想 弄个,但是当时记得比较贵 就放弃了
JimmyTinsley
2020-01-07 19:52:00 +08:00
EL PSY CONGROO
这一切都是命运石之门的选择啊!
mumujun
2020-01-07 19:58:38 +08:00
整挺好,听说这个挺容易坏的,真的假的
alphardex
2020-01-07 22:01:51 +08:00
世界を騙すなど、造作もない!
EL PSY CONGROO !
Osk
2020-01-07 22:31:28 +08:00
楼主可以考虑使用移位寄存器来扩展 IO 以解决闪烁的问题,选择有并口输出锁定的型号(忘了信号名称和型号),只需要几个 io 口就能扩展出一堆 dio。

以前我驱动数码管时也是,无论咋调,总会遇到亮度和闪烁的问题,换移位寄存器就 ok,变成静态驱动了
tun
2020-01-07 23:10:15 +08:00
流弊
JamesR
2020-01-07 23:22:33 +08:00
好看,世界线变动率探测器,可惜懂得欣赏的人不多,EL PSY CONGROO !
Mayuri
2020-01-07 23:25:41 +08:00
世界是可以被欺骗的!
EL PSY CONGROO !
alphatoad
2020-01-08 02:16:24 +08:00
很酷,升压电路咋解决的?
gcyrn
2020-01-08 04:00:52 +08:00
总物料成本多少?
自己也想整一个
RedL0tus
2020-01-08 04:30:19 +08:00
@threebr @component @tun 谢谢!

@ZredoC @manami @coderljx @JimmyTinsley @alphardex @JamesR El psy congroo!

@LancerEvo 当然不是,我甚至没有 CHH 账号,之前每次开放注册都被我错过了,要申请的话我也不知道拿啥,我太菜了!

(顺便说下,大佬是车迷吗

@PerFectTime 也可以买成品鸭(

@hiplon 可以康康十楼(

@ChasYuan 要买的话有很多更好的成品可以买,就是会很贵(

@mokeyjay @hws8033856 谢谢帮忙解释!

@yrucrew 是动画里的暗号。觉得中二很正常,毕竟胸针本身的设定就是中二(

@mrcn 买成品更贵... 我也很绝望啊(

@claymore94 大概两三百刀吧,不算工具的话大概一百五六十刀。买成品的话肯定会更贵,然后因为这些管子都是停产了的,以后价格会不会更便宜也不好说(

@mumujun 好像是这样的。不过我用的 IN-12 单个管子本身的话就算在现在也不贵,以后有机会的话可以屯一些备用。然后就是我做了暂时关闭显示的功能,不用的时候可以关掉,也许可以延长寿命。

@Osk 我这边主要问题是我自己不会画板子... 然后要用那种拓展的板子的话应该是需要改动现在的板子的?如果需要画板子的话宁可从头重做了(小声

还是感谢建议就是,等我啥时候会点 EE 了做个带锁存器的板子试试(

@Mayuri 嘟嘟噜!

@alphatoad 我买的别人画好的板子套件,我只是自己焊起来了而已(都是穿孔元件,不是很难)。根据我有限的理解,具体升压的话应该是用的一个 100uH 的线圈,别的元件应该是用来控制和译码的(

@gcryn 一百五六十刀吧(
板子之类的肯定有更好的选择,应该还能省个几十刀(
0312birdzhang
2020-01-08 08:09:38 +08:00
是大佬,好看
shakespark
2020-01-08 08:47:01 +08:00
很漂亮,如果能检测到世界线偏移率就更棒了
xmai
2020-01-08 09:03:26 +08:00
EL PSY CONGROO
superrichman
2020-01-08 10:14:20 +08:00
这东西成本很高
EL PSY CONGARI

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/635784

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX