VFD 简介

VFD 全称 vacuum fluorescent display(真空荧光显示器),是一种玻璃制的显示设备,通常应用在 DVD 和汽车仪表板上。具体的工作原理就是在一个玻璃围成的真空区域里,放置类似电子管的装置,让阴极射出的电子在栅极吸引下加速冲击阳极上的荧光粉,从而显示内容。

如果你用过老式 DVD,那么大概率见过这种显示器。就显示效果来说,与 OLED 一样是自发光,可视角度很广;并且因为属于较厚的玻璃制品,有种很独特的散射效果。

VFD 通常有数字型(7段 / 15段)和点阵型,以及一些定制产品(例如音响产品上专用于显示频谱)。这里我使用的是15段(米字)数字型,一共可显示7位数字,并有两个额外位置用于显示冒号。闲鱼上的 mangolu0215 在出售这款 VFD。

PT6312

VFD 本身只是一个显示设备,要驱动是相对比较复杂的。除了需要(相对于计算设备来说的)高压,还需要相关的控制器。对数字型 VFD 来说 PT6312 可能是比较常用的驱动芯片。点此可以查看数据手册。

这次使用的是成品模块(如图),板上已经集成了变压器和控制芯片,外部只需要输入低压,与控制器直接通信,就可以控制屏幕了。模块本身有两种规格,一种使用3.3V输入,另一种使用5V输入,使用时注意区分。

模块正面

模块背面

PT6312 使用三线串口来操作数据。在一些库(例如mbed)中,我有见过使用 SPI 来控制的相关代码。但我尝试用 Python 来实现都以失败告终。最终是参考卖家给出的51单片机的 C语言代码,直接操作线路上的电平来实现的。

Python 库

基于卖家给出的 C语言代码,翻译成了一个 Python 包,点此查看源代码。这里介绍一下如何使用。

硬件连接

前文给出了模块背面的照片,在左侧接口的下方印有各引脚的定义,从上往下依次是:

  • Vcc 电源输入
  • GND 地线
  • HV_on 这个引脚不连接到控制芯片,而是控制模块上变压器的开关,高电平时变压器才打开。只有变压器打开,屏幕才通电。(注意:即使屏幕不通电,也可以向控制芯片发送数据,这两者是不冲突的)
  • Dout 数据出口。这个引脚无需接入
  • Din 数据入口
  • Clk 时钟信号
  • Stb 频闪线

Din + Clk + Stb 三个引脚用于向 PT6312 发送指令。如果不需要单独控制屏幕,HV_on 直接连接3.3V就可以使屏幕一直通电。

接下来在树莓派上随便找4个空余的 GPIO 引脚。参考这里来找到各个 GPIO 引脚的编号,注意使用 BCM 编号,而不是物理编号。例如下图中我选择了外侧物理编号为 22 ~ 28 的四个连续的引脚,这里四个引脚的 BCM 编号就分别是 25, 8, 7, 1。

引脚选择

接下来用合适的方式将模块连接上这些引脚,记得也接上电源输入和地线。注意:模块本身的接口座是2.0mm间距的 7pin JST 接口,常用的方口杜邦线是 2.54mm 间距,直接插的话空间不够,需要在外部转接。

软件环境准备

需要 Python 3环境。

可以先用你偏好的方式(venv / conda)来创建虚拟 Python 环境。完成后,直接使用 pip install pt6312 来安装驱动库即可。

点亮

库主要提供了一个 VFD 类。使用 python3 进入交互式命令行。

1
2
3
4
5
6
>>> from pt6312 import VFD
>>> vfd = VFD(8, 7, 1, hv_on=25)  # 使用各个BCM引脚编号来初始化
>>> vfd
>>> <VFD device@3061282608 [DIN=GPIO8,CLK=GPIO7,STB=GPIO1,HV_ON=GPIO25], currently off>
>>> vfd.on()  # 屏幕通电
>>> vfd.display_all() # 用于测试屏幕的方法,点亮屏幕上所有的字符

运行效果如图。受屏幕设计限制,米字中间那一点是点不亮的。

全字符点亮效果

时钟例子

源代码中包含一个简单的时钟例子

1
2
3
4
while 1:
    now = datetime.now()
    vfd.update(now.strftime('%H:%M:%S'))
    vfd.delay(1000)

VFD.update(s) 一次可以显示7个字符。但屏幕上有额外的两个冒号,因此当第3、6个字符是冒号时是不占用字数的。以下是运行时钟的效果图。

简单的时钟例子运行效果

VFD 除了 .update(s),还提供以下方法:

  • .on() 屏幕通电
  • .off() 屏幕断电。注意:这只是断开屏幕的电源(拉低 HV_on),不会清空芯片数据。
  • .delay(n) 停顿 n 毫秒,用于一些延时操作。
  • .set_brightness(n) 设置亮度等级,亮度区间是 [0, 7],默认亮度是 3。