DIY 辉光管时钟

前言

辉光数码管是一种可以显示数字的电子设备。玻璃管中包括一个金属丝网制成的阳极和多个阴极,阴极做成数字形状。加高压后管内气体产生辉光放电,进而发光显示出数字。一个典型的辉光管如下图所示。

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

这是苏联产的 IN-14 辉光管,为节省成本,它显示的「2」和「5」用的是同一个模具,只是颠倒过来了。

蒸汽朋克(Steampunk)是一种流行的科幻题材,这类故事多是以对早期科技文化的怀旧与复古风格为目的。动漫《命运石之门》中的「世界线变动率探测仪」便是这样一例。这在原剧中出现了多次,有网友将其复刻了出来:

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

可行性

为了妥善地控制各个辉光管的显示,并且避免占用太多单片机的输出引脚,需要使用 BCD 码译码器。与此辉光管适配的元件为 74141 和 K155ID1(苏联产)。进一步考虑到 ESP32 的输出引脚仍然不够多,需要使用移位寄存器,如 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 个辉光管和配套的升压电路。
每个辉光管的阳极上都串接了一个限流电阻,笔者使用的阻值为 2 千欧。不同升压电路和辉光管性能不同,建议在面包板上用不同阻值的限流电阻测试一下,确认无误再焊接。

挑战性

潜在的风险包括:

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

后记

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

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

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


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

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

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