DIY 辉光管时钟

前言

辉光数码管是一种利用气体辉光放电显示数字的电子元件。玻璃管中包括一个金属丝网制成的阳极和多个阴极,阴极做成数字形状,加高压后管内气体发光,即可显示出数字。下图是苏联生产的 IN-14 辉光管,为节省成本,它显示的「2」和「5」用的是同样的模具,只是颠倒过来了。

图片来自:https://en.wikipedia.org/wiki/Nixie_tube#/media/File:ИH-14_(IN-14)_Nixie_Tubes_Displaying_"25".jpg

辉光管的缺点也很明显,它的使用寿命很有限,并且需要高压才能点亮,因而逐渐被淘汰。今天辉光管仍有小规模的生产,但辉光管的意义更多的是以复古风格体现出对早期科技文化的怀旧,而不是实用价值。在许多小说、游戏和影视作品中,辉光管都作为蒸汽朋克(Steampunk)风格的代表出现。动漫《命运石之门》中的「世界线变动率探测仪」便是这样一例。这在原剧中出现了多次,有网友将其复刻了出来:

在游戏《传送门 2》中,同样出现了类似辉光管的显示装置。不过它的尺寸比较大,已经接近霓虹灯了。霓虹灯的发光原理与辉光管类似,都是依靠气体放电。非常有趣的是,辉光管往往与蒸汽朋克联系在一起,而霓虹灯则是赛博朋克的必备元素。

利用辉光数码管和单片机,即可制作出蒸汽朋克感的智能家居。主控采用 Arduino 或者 ESP32,借助于它们强大的功能,可以简洁而优雅地控制辉光管显示时间、温度等数字信息。通过进一步地开发配套的手机应用,即可通过 Wi-Fi 和蓝牙方便地展示任何自定义内容。

可行性

为了妥善地控制各个辉光管的显示,并且避免占用太多单片机的输出引脚,需要使用 BCD 码译码器。与此辉光管适配的元件为 74141 和 K155ID1(苏联产)。进一步考虑到单片机的输出引脚仍然不够多,需要使用移位寄存器,如 74HC595N,实现串行信号输入,并行信号输出,来达到「拓展」单片机输出的作用。具体内容见文章 Arduino 拓展输出接口

笔者在测试时使用的是 Arduino Mega2560:

这一方案的可行性在面包板上得到了验证。为单片机编写的代码并不复杂,并且实现了数字的交叉渐变。核心就是两个函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void nixieDisplay(int index, int num) {
digitalWrite(pins[index][0], num >> 0 & 0b01 ? HIGH : LOW); // A
digitalWrite(pins[index][1], num >> 1 & 0b01 ? HIGH : LOW); // B
digitalWrite(pins[index][2], num >> 2 & 0b01 ? HIGH : LOW); // C
digitalWrite(pins[index][3], num >> 3 & 0b01 ? HIGH : LOW); // D
}

void crossFade(unsigned int* state, unsigned int* newstate) {
for (int timer = 0; timer <= STEPS; timer++) {
for (int index = 0; index < 6; index++) {
nixieDisplay(index, state[index]);
}
delay(STEPS - timer);
for (int index = 0; index < 6; index++) {
nixieDisplay(index, newstate[index]);
}
delay(timer);
}
for (int index = 0; index < 6; index++) {
state[index] = newstate[index];
}
}

nixieDisplay 负责控制译码器,进而控制不同辉光管的显示;crossFade 则通过 PWM 实现渐变效果。

此外,对于最基础的时钟功能,需要一个支持断电后继续走时的时钟芯片。经过调查,笔者决定采用 DS1302(后改为更可靠的 DS3231),只需一块纽扣电池,即可在数年内精确地走时。并且,这些时钟芯片都有大量的配套开源代码,可以方便地与单片机交互。同步时间则可以通过串口连接、Wi-Fi 或 GPS 等方式。

综上所述,本项目的技术路线如下图所示:

对于最有难度的部分:印刷电路板,笔者使用了 Autodesk Eagle 进行设计。渲染效果图如下:

驱动辉光管需要 170V 左右的高压,因此电路部分还需要包含一个升压电路。由于没有设计经验,笔者在这里偷懒了:直接在某宝上找了一个店家,购买了 6 个辉光管和配套的升压电路。
每个辉光管的阳极上都串接了一个限流电阻,笔者使用的阻值为 20 千欧。不同升压电路和辉光管性能不同,建议在面包板上用不同阻值的限流电阻测试一下,确认无误再焊接。

挑战性

潜在的风险包括:

  1. 辉光数码管已经近乎停产,未来可能难以获得备件(从另一角度说,这也使其具有收藏价值)。
  2. 供电部分存在高压,需要可靠的隔离措施,否则有触电危险。
  3. 可能存在软件上的技术问题,需要进行进一步地测试和验证。

后记

在购买了需要的电子元器件、联系厂家打样生产 PCB 后,一个原型机被成功制造了出来。

自己设计 PCB 的好处是免去了在洞洞板上飞线的烦恼,在笔者翻译的文章自己打造一台恩尼格玛密码机中,原作者就是用足以让密集恐惧症患者崩溃的飞线完成了电路的连接。

最终的成品如下图所示。它的工作完全正常,这意味着之前的构想得到了检验。


本项目所用到的 Arduino 程序和电路板源文件已开源,采用 GPL3 协议发布,见 https://github.com/stevenjoezhang/nixie

参考文章:
Nixie Clock Home 辉光钟之家
如何自己制作一个 divergense meter(辉光管时钟)?- 知乎
用 Arduino 制作一个功能最基础的辉光钟
自制 NixieDisplay 辉光数码管显示时钟

有关 GitHub 仓库:
dekuNukem/exixe
silentcedar/NixieTubeClock

本文更新于 2021 年 9 月:
DS1302 的时钟依赖于外部晶振,受温度的影响较大,故将其更改为 DS3231。DS3231 是 I2C 协议的,比 DS1302 少一根数据线,因此无需修改电路板的设计,可以通过软件方法来兼容 DS3231 模块。