简述 - Brief Introduction

辉光管情怀

辉光管是电子管时代的显示器件,利用的是辉光放电原理,驱动电压高,体积大,娇气、寿命短(1000小时左右),随之 VFD 和 LED 的出现,辉光管很快就被淘汰,但许多人依然被其美丽的显示效果所吸引,由此制作一些怀旧风或朋克风的时钟。在动画《命运石之门》中,辉光管以世界线变动率检测仪的应用效果展示在人们面前。

美观程度与用户体验

在设计之初,作品都是在美观的基础上扩展功能,并努力优化程序结构,使其可以保持长时间运行而不至于崩溃,提高使用体验。期待最终以一个装饰品的样貌作为最终成果,而不是电线外露的小制作水准。当然因为手工水平的局限性,或许不能做到完美。

功能实现 - Functionality

到目前为止,最终实现的功能如下:

设计与实现 - Design & Making

外观设计与制作

外观的设计图如下:

外观设计

实际制作实现如下:(锯木头是真的累)

外壳采用红花梨木板,使用电磨进行切割、钻孔。樱花状的镂空是驿站表示运行状态的呼吸灯,灵感来源于老款的 MacBook Pro。开关采用复古的摇杆式拨动开关。

外壳图片

辉光显示模块电路设计

光管的数字部分驱动由苏联产的 K155ID1 BCD 译码器完成每个辉光管配一个译码器,这样虽然成本高,但因为不需要动态扫描提高了稳定性,也方便了程序的编写和减少了控制器的负担,小数点部分使用 A42 高压三极管驱动。而三极管、译码器以及 RGB LED 的控制由 4*2 组74HC595 位移缓存器完成。

设计图如下:

电路设计

电路版设计

焊接完毕后的效果如下图:

电路完成图

⚠️ 注意:设计图在印制完毕后发现有些错误:

  1. 一个是三极管的丝印印在了相反的一面,所以三极管应该要反着焊。
  2. 另一个是从左到右第一个辉光管和第二个辉光管的三极管在电路上有问题,所以在焊接的时候要手动调整一下,两个基极接到的译码器引脚需要反一反。

材料需求

  • 主要模块
树莓派 zero wh
Arduino nano
电压转换模块 *2
18650 电池控制模块
树莓派麦克风模块
PN532 NFC 模块
音响功放模块
  • 主要电子元件
IN-12 辉光管
摄像头
音响
DHT11 传感器
贴片 LED
电位器
…
  • 其它材料
红花梨木板
复古拨动开关
贴片点动开关
小风扇
18650 电池
洞洞板
…

硬件的架构与实现

控制的流程图如下,其中因为树莓派串口被蓝牙占用,树莓派与 Arduino 、PN532 模块的连接使用 I2C 总线。

硬件的架构设计如下:

Hardware Sturcture

整体安装到木盒中的效果:

如下图是安装到一半的情况:

安装到木盒中的效果

程序实现

程序的完整代码放在 Github 上:

Aeonni/Aeonni-Nixie (opens new window)

⚠️ 注意:

  • 因为微信机器人中包含的代码以及一些 API 包含了个人信息,所以整个模块进行了删除,如果有人要用的话,可以自己实现,用到的库是:itchat
  • 另外,Modules 文件夹中引用了 py532lib 库,主要自己从官方下载 (opens new window)并放入文件夹中

树莓派程序使用 Python3 编写,Arduino 的程序使用 C++ 编写,程序的架构设计图如下,main.py 调用其它模块运行,并进行变量共享:

软件文件结构的设计与改进:

改进的原因与方案:

  • /Dev 改名为 /Modules (原因:模块种类不一“Dev”不合适)
    • 其中的模块名按照性质以 Service_\Device_\Module_ 开头
  • 模块统一使用 Module_Manager 模块进行管理
  • 调整的目的是为了后台管理的加入。

软件文件结构的设计与改进

模块之间的连接结构设计与改进:

原有的模块默认开启,只能通过微信机器人和用户交互,后来增加后台管理系统,通过后台、模块管理器对模块进行统一的管理。

模块结构的设计与改进

模块的类

写于文件 Aeonni_Nixie_Module.py ,其它模块都从这边继承:

class AN_Module():
    def __init__(self, name, version, color = default_color):
        self.moduleName = name
        self.__version__ = version
        self.color = color
        self.state = 'running'
    def isRunning(origin_func):
        def wrapper(self, *args, **kwargs):
            if self.state.upper() == 'RUNNING':
                return origin_func(self, *args, **kwargs)
            return False
        return wrapper
    @isRunning
    def isrunning(self):
        return True
    def module_close(self):
        self.state = 'stopped'
    def module_open(self, opt = True):
        if opt:
            self.state = 'running'
            return True
        self.state = 'Running'
        return True
    def getinfo(self):
        return dict(
            name = self.moduleName,
            ver = self.__version__,
            colors = self.color,
            state = self.state,
        )

后台管理系统的实现

  • 认证方式:密码认证、NFC 认证
  • 框架:Flask (Python)
  • 没有可以使用的库,所以从头开始写 html、js、css

用户可以使用后台页面管理模块的开关,

实现效果图:

后台登录微信机器人

关于主函数

main.py 只是引入一些库,并初始化运行一些模块,代码详见 Github。

使用与测试

续航

安静运行的状态下,续航可以达到7小时以上,但是如果持续作为蓝牙音箱且风扇持续工作,则续航在两到三个小时,甚至更短,所以平时是连接着电源(12v)的。

充电时长未测试。

音质

直接通过有线连接音频接口,音质好,没有底噪,树莓派引出的音频线接上会有一点底噪,可能需要更好的屏蔽干扰。

微信机器人

因为 itchat 使用的是微信网页版的接口,所以在长时间没有发消息的时候会自动退出,但如果一直有消息交互,则可以稳定运行。

持续工作能力

曾经持续工作一个礼拜没有出问题

最终完成效果图

最终完成效果图

详细功能与演示请移步 Bilibili (opens new window)

@Aeonni 写于2018.12.31

转载请注明出处

Last Updated: 2021-03-30 01:00:06