[Arduino|Module] QS30-1 辉光管通用模块 Arduino 类库开发记

Photobucket

很高兴能在第一时间收到由严泽远开发的 QS30-1 辉光管通用模块,并开始 Arduino 类库的开发。作为硬件小白,能有现成的辉光管模块使用,真是再惬意不过的事情。难怪说辉光管变得越来越小众,这次收到的10颗辉光管,大多数都是70后,余下的也至少是大80后。崭新的模块,用的却是比自己还要年长的绝版器件,让人不由肃然起敬。它们的出生年月,就这样淡淡地映在管体上,缓缓淌着老时光的调调,静静看着,不经意间再次走神,放空,像是穿越,轻轻静静……

Photobucket

硬件部分,详细参见严泽远的博客,除了独立电源设计使得模块可以各自为阵以外,由于使用经典的 74HC595 作为数据层驱动器件,并引出了所有输入接口,模块就具备了以下特点:

  1. 节省IO口,串入并出;
  2. 可级联,无限扩展;
  3. 亮度PWM无极可调

再结合为日益流行起来的 Arduino 开发的类库(library),驱动起来,实现各种自定义效果,就变得更加简单,相信从未没有接触过辉光管的朋友也能轻松玩转起来,不信我们来试试看。

Photobucket

1)一句话初始化

NixieTube(uint8_t pin_din, uint8_t pin_st, uint8_t pin_sh, 
          uint8_t pin_oe, byte section_count = 1);

硬件连接部分,模块与 Arduino 之间,除了共地以外,只需要4条数据线的连接,在 Arduino 的开发环境中,初始化函数如上所示。
参数从左到右,依次对应模块上1、2、3、4引脚,以及级联的模块数量,默认值是1。

在示例代码中,定义函数是这样:

NixieTube tube(11, 12, 13, 10, 8);

即第11脚接DIN,第12脚接STCP,第13脚接SHCP,第10脚接OE(这个脚带有PWM输出的功能),级联8节模块。(详细的引脚定义,请参见datasheet

注意:模块本身使用直流12V供电,并带有5V输出引脚。Arduino本身并没有12V的输出,所以在开发环境下,使用外部电源供电辉光管模块,同时使用USB供电 Arduino。此时,切记不可将模块的5V输出与Arduino的VCC连接,避免电流冲击损坏USB口。在开发结束,在实用环境下,则可断开 Arduino 和 电脑之间的 USB 连接,使用模块的 5V 输出,插入 Arduino 的 VCC 口,对 Arduino 进行供电。

在 Arduino 的系统平台上,让用户脱离对硬件底层寄存器的设置,能非常简单地实现 IO 口的定义,使用杜邦线建立连接以后,依次填入主板上对应的 IO 口号码即可。其中,建议第4脚 pin_oe 使用带有 PWM 输出的 IO 口,这样方便对显示亮度进行调节。毕竟满功率输出的辉光管,功耗还是还是很惊人的,而且也不利于延长使用寿命。一般在夜间,采用 0x20 的亮度就能有很不错的显示效果,亮度从关闭到满功率输出取值范围为0-255(十六进制0X00-0Xff),可以通过 setBrightness 函数进行设置。

void setBrightness(byte brightness);

对于1至3号引脚没有特别要求,只要能用 Arduino 官方库中 digitalWrite() 函数进行控制就行。

级联的模块数量,也同样在初始化函数中进行了设置。Arduino 的类库,使用C++进行开发,程序从面向过程进化为面向对象,表面上的优势,就包括对象成员内部数据的封装。再也不需要使用地雷一般的全局变量,已经定义过一次的变量,就无需再次定义。而在初始化函数中,通过申请动态内存的方法,根据级联的数量,向 Arduino 系统申请相应数量的内存,作为数据缓存,这样就很轻松实现了代码对于不同级联数量的适应。而存入的级联数量,也将作为重要的判断依据,对后续函数的输入参数进行校验。

Photobucket

2)完全自定义

void setBackgroundColor(byte index, Color color); 
// 设置第 index 位辉光管的背光颜色(8种可选)
void setNumber(byte index, byte num);
// 设置第 index 位辉光管的显示数字(0-9,输入-1则关闭)
void setColon(Colon colon);
// 设置第 index 位辉光管的冒号(4种可选)

从上图照片可以看到,8种背光状态(白、黄、青、绿、紫、红、蓝、关闭)都显示出来,而且冒号的四种状态(关闭、上点亮、下点亮、亮点齐亮),还有从0-9的数字,都得以显示,模块之间实现了相互独立。参数 Index 用来指定辉光管序号(从右到做,从0开始)。在类库的设置中,还采用了 enum 枚举类型,

enum Color
{
	White, Yellow, Cyan, Green,
	Magenta, Red, Blue, Black,
};

enum Colon
{
	None, Upper, Lower, Both
};

调用函数的时候,可以采用

tube.setBackgroundColor(3, Green); 
tube.setColon(7, Both); 

这样的方式进行调用,使得设置更加清楚直观,因为底层完全封装起来,用户不需要具备高深的硬件驱动知识,也无需钻研位运算,只需要直接写入自己需要的效果,由类库在内部操作显示缓存,勉强都能称得上是“所见即所得”吧。在所有的自定义参数都设置完成以后,统一通过

void display();

显示函数进行打印/刷新。

Photobucket

void setBackgroundColor(Color color); 
void setNumber(byte num);
void setColon(Colon colon);

利用C++的函数重载,同样的函数名根据其定义不同,可以用来实现不同的效果。之前的自定义函数中,如果缺少了指定辉光管序号的输入,则函数功能变为对所有的模块进行操作,可以用在初始化以及清屏之类的操作之中。这个在C语言里面是无法实现的,汇编?那就更别想了。

Photobucket

3)还有更高级的函数哦~

格式化输出函数

void printf(const char *__fmt, ...);

相信很多对 C 语言有入门的朋友,都对 printf 函数不会太陌生。在 nixit-tube 库中,也同样加入对其的支持。上图中的效果,我们可以使用多种格式化输出的方式,进行显示。例如

tube.printf("9876543210");
tube.printf("%ld%d", 987654321, 0);
tube.printf("%ld%ld", 98765, 43210);

而在时间的打印中,我们可以通过

tube.printf("%d.%d %2d:%02d:%02d", month, day, hour, minute, second);

这样的函数,直接进行日期时间输出,函数中集成了对“ . ”、“ : ”、“ ‘ ”,三种符号的支持,对应冒号点三种显示状态,而对于非数字以及非冒号的输入,这一律进行跳过处理,是不是方便很多呀?

至此,类库基本介绍完毕,更详细的内容和源代码,欢迎来访问 NixieTube 类在 GitHub 上的代码托管主页,下载最新完整的 Arduino 平台的类库和示例。本代码基于《姓名標示-非商業性 3.0 Unported (CC BY-NC 3.0) 》进行开源,欢迎大家下载使用。相信在使用其它硬件平台,如果89C51系列的朋友,也能获得参考,成功驱动其 QS30-1 辉光管模块。

接下来,看图片吧~

Photobucket
沉金工艺 PCB,老严一贯的风格,用料十足

Photobucket
有类库的话,在 Arduino 实现这个时钟,只需要十几行的代码哦~

Photobucket
6级级联,时分秒显示

Photobucket
特写,背光每10秒钟变换一次。

Photobucket
注意,由于辉光管是会“中毒”的,显示数字经常变换的管子,反倒不容易坏,而固定显示常值的管子寿命就很短了。不过我们的模块就完全不怕这个,类似于汽车开了一定的里程,对轮胎进行调换,级联模块想要调换个顺序,应该是毫无压力吧~

Photobucket
看,1981年4月生的管子,我还要叫声哥~

Photobucket
一长串的感觉很绚丽吧~

Photobucket
特别注意:驱动辉光管的电路涉及高压部分,在点亮过程中,严禁触碰电路板,以免被电击。实验时,建议带上绝缘手套,制作成品后,也不妨加上外壳进行保护,防止漏电。在正式发售的版本中,老严给PCB正面背面都覆盖了有机玻璃板,安全系数就高了很多。

Photobucket

一边是传统经典制作的辉光管,一边是日渐流行的 Arduino 开源硬件平台,这样的新老结合,是不是很美妙呀~ Arduino 社区的发展壮大,离不开各种大大小小的第三方类库,而正是由于这些类库的存在,使得 Arduino 能快速驱动相应模块,非常敏捷地搭接系统,不再需要辛苦地打基础(有基础当然不是坏事),而能直接利用现有的模块、组件,迅速让自己的想法得到实现。而这正是开源硬件的魅力所在。

特别感谢:严泽远

QS30-1 辉光管模块相关资源:

Creative Commons License
aGuegu’s nixie-tube for Arduino library hosting on GitHub is licensed under a Creative Commons Attribution-NonCommercial 3.0 Unported License.

关于aGuegu

向着更高的逼格
此条目发表在模块分类目录,贴了, , , , , , , 标签。将固定链接加入收藏夹。