我们在机电屏幕上玩俄罗斯方块



有一天,在Avito上查看广告时,我遇到了一件非常有趣的事情-信号灯板或英文的翻转显示。 这种显示器用于在机场,火车站,体育馆或公共交通工具上的路线指示器上显示信息。

我认为使用这种类型的显示器可以做很多有趣的事情。

我安装屏幕的位置只能从铭文的其余部分(“存储”)中猜测。 也许这是火车站或OT车站的信息咨询台-在评论中写下您的想法。

屏幕是一个由7列乘30列组成的单元矩阵。 每个单元都包含一个圆形的旋转两色板和一个绿色LED。 该板具有一定数量的74HCxxx系列和其他微电路的逻辑元件,事实证明,这些逻辑元件几乎足以通过一个简单的串行接口控制屏幕。

购买后,我花了一些时间搜索有关如何使用此类屏幕的信息,因为我只有直接显示图像的部分,并且通常还有一个控制器,该控制器可以控制键盘或通过PC软件通过UART端口进行控制。

不可能通过板上的铭文确定制造商的隶属关系,但也许我并没有努力,因为找出它的工作原理,绘制设备图并开发用于与典型微控制器接口的模块会更加有趣。

但是首先,您必须为自己设定一个特定的目标,为此您可以在日常生活中应用此屏幕。 第一个想法是一只手表,它显示有关街道和家里的天气,时间,日期,简短的激励性信息等的扩展信息;)等等。然后我认为,如果将屏幕旋转90 ° ,它看起来就像是俄罗斯方块的玻璃,所以决定制造俄罗斯方块,然后就会看到它。

机电筛网如何工作?


非常简单:每个屏幕单元(复选框)都包含一个磁盘-一个扁平的永久磁铁,一侧涂成黄色,另一侧涂成黑色,并在该磁盘下放置一个电磁体。 当向电磁线圈施加电脉冲时,标志会翻转,重要的是,将标志固定在一个位置上。 当改变电流方向并施加重复的脉冲时,标志旋转并固定在另一侧。 对于切换,持续时间为1毫秒且电压为12伏的脉冲就足够了。
电磁线圈的电阻约为18欧姆。

电池装置,来源: Eldi数据表

磁盘如何旋转,来源: Flip-Disc Display

为了方便起见,将通过两个二极管的线圈组合成行和列的矩阵。 要在屏幕上的任何位置切换,您需要激活线路上的电流源(current source)和行上有电磁线圈相交的行上的电流吸收器(current sink),或者相反地,切换到另一侧。 实际上,这类似于仅在脉冲模式下通过H桥控制DC电动机。



从理论上讲如何管理标志,我们弄清楚了。 现在该进行实际实施了。

屏幕逆向工程


带着万用表和Kicad,我开始重新绘制屏幕布局,从控制LED开始。 事实证明,这部分是自给自足的,并且在施加电源和控制信号时,您可以通过相当简单的界面来点亮屏幕任意行中的任何LED。 任何时候都只能激活一行,因此图像的输出必须是动态的。



模块电路由一个LED矩阵组成,这些LED的阴极连接到Toshiba TB62705 LED驱动器。 从控制逻辑的角度来看,它们是链状连接的普通8位移位寄存器。 每行中的LED的阳极连接并连接到MOSFET晶体管的漏极。 源极连接到DC-DC转换器的输出,所有7个晶体管的栅极都连接到3:8 74HC238解码器的输出。

因此,要控制LED,您需要通过将屏幕编号提交给解码器输入来选择屏幕行,然后通过第一个LED驱动器的SERIAL和CLOCK输入加载32位数据。 然后归档日志。 将LATCH输入保持为“ 1”时,LATCH输入为“ 1”,并且相应的LED点亮。

要使LED闪烁,我使用了兼容arduino的板上Teensy 3.5板。 可以在GitHub上找到LED控制代码的示例


该方案的第二部分,负责管理信号灯,要复杂一些。


扬声器控制的电源部分由一对电流源/吸收电路组成,它们的输出通过保护二极管连接到列中每个线圈的第一输出。 东芝TBD62783芯片用作电流源,TI最喜欢的ULN2803用作漏极。 线圈的第二个结论成行组合,并连接到屏蔽板上的连接器。 显然,这样做是为了在一个单独的模块中进行字符串管理,因为可以将多个屏幕组合成一个长屏幕。 但是,尚不清楚为什么开发人员在每个屏幕板上放置所有必需的组件来控制LED。

该逻辑由八个3:8解码器74HC238组成,其控制输入并联。 偶数解码器的输出连接到电流源的控制输入,奇数解码器的输出连接到漏极的输入。 74HC238的允许输入连接到另一个3:8解码器,这完全消除了电流源和电流电路同时处于活动状态的情况。 公共解码器的使能输入连接到比较器芯片,并且仅在其输入值匹配时才被激活。 图的这一部分很可能还负责将多个模块组合到一个大屏幕中。

因此,要选择特定的列,您需要将其在组中的编号(0-7)发送到COL_A0-A2总线,然后通过将其编号提供给公共解码器的输入COL_EN_A0-A2来激活特定74HC238的输出。 此外,输入A0可用作源/接收指示器,其余2位用作组号(0-3)。

控制逻辑和电源输入被路由到两个50针IDC连接器。 图中显示了其中之一的接线。



在分析了电路之后,我意识到在没有Kicad和烙铁的帮助下使标志闪烁是行不通的,因此继续创建一个用于选择字符串和配对的模块。

适配器模块和字符串管理




为了简化设计,我决定重复执行列选择的过程,并将其与74HC238解码器配对使用的电路TBD62783和ULN2803以及选择一个所需的行的74HC00逻辑芯片(4xNAND)可以清楚地将SET,RESET和PULSE模式分开,从而直接激活电源到选定的电磁体。 为了保存微控制器的结论,决定将行和列选择信号连接到一个移位寄存器的输出。

结果,要管理标志,您需要:

  1. 通过SERIAL / CLOCK / LATCH以串行代码发送并固定其坐标
  2. 选择所需的SET / RESET状态
  3. 短暂激活PULSE

坐标字节的解码:



没有移位寄存器的电路的第一个版本安装在无焊面包板上。 检查并兴奋地发现一切都会燃烧之后,我打开电源并快速按下按钮以手动脉冲PULSE脉冲。 流过电磁铁线圈的电流只是以防万一限于实验室电源。 复选框成功切换,并且在更改SET / RESET级别时,它又切换回。 我想:“这是成功的。”并开始使用我最喜欢的MGTF-0.07和用于电源/接地总线的单芯kynar-wire将电路转移到常规面包板上。

要通过板上的50针连接器连接到屏幕,必须使用22个触点+电源,因此我不想弄乱单个接线。 建议为IDE或更旧的SCSI设备使用扁平电缆。

经过一番摸索 ,我找到了一种压接IDC连接器的特殊工具,决定立即购买: Crimper ProsKit 6PK-214用于IDC连接器 。 在培训小型连接器之后,我第一次使自己成为20厘米的环路,两端带有IDC-50F连接器。

我们写一个控制程序


如上所述,TEENSY 3.5被用作控制控制器,其开发环境是Arduino IDE,因此该程序是用arduino方言C编写的。

改变屏幕点状态的主要功能
void update_dot(bool state, byte row, byte col) { byte cmd=0; // set 7-5 cmd bits to row 2-0 bits cmd=(row&B111)<<5; // set 4-0 cmd bits to col 4-0 bits cmd=cmd|(col&B11111); // write to Register digitalWriteFast(DOT_LATCH,LOW); for (byte i=0;i<8;i++) { byte onebit=bitRead(cmd,7-i); digitalWriteFast(DOT_CLOCK,LOW); digitalWriteFast(DOT_SERIAL_DATA,onebit); digitalWriteFast(DOT_CLOCK,HIGH); } digitalWriteFast(DOT_LATCH,HIGH); delayMicroseconds(10); digitalWriteFast(DOT_LATCH,LOW); // set set/reset pin if (state) { digitalWriteFast(DOT_SET_RESET,HIGH); } else { digitalWriteFast(DOT_SET_RESET,LOW); } // pulse digitalWriteFast(DOT_PULSE,HIGH); delay(1); digitalWriteFast(DOT_PULSE,LOW); } 

我进行了几次实验,以确定电源的最佳电压和脉冲馈电时间。 事实证明,将12V和1ms足以将标志稳定地固定在其中一个位置上。

测试用一种颜色填充后,我注意到一个“像素”坏了并且不会翻转。 用万用表测量的线圈电阻显示为几兆欧,详细检查显示得出了一个结论。 非常幸运的是,无法工作的“像素”来自屏幕边缘,因此我设法焊接了电线。 问题已解决。

修复细胞的照片

这是在第一次进行填充和文本输出的实验之后发生的事情:


俄罗斯方块


用C编写一个Tetris实现比我想象的要容易。 感谢JavierLópez及其初学者使用C ++的Tetris教程 。 我按照自己的理解重写了主要功能,并使代码适应了屏幕的功能(无边框和低分辨率)。 我将不承担工作的细节,该手册详细介绍了所有内容。

为了进行控制,使用了一个模拟操纵杆模块,因此我必须编写一个函数将ADC输出的值转换为数字常数。 为了一方面防止误报,另一方面确保正确的游戏性,存在困难。 如果在下一次读取状态后操纵杆的位置没有变化,则会添加一个延迟。

玩了大约10分钟之后,我意识到我很无聊,因为坠落形状的速度没有变化,并且分数根本没有显示。 没有竞争因素。

由于屏幕上没有足够的空间,因此显示带有标志的帐户很丑陋,因此决定使用LED创建替代平面来显示信息。 我在Internet上找到了3x5字体的一些表示形式,表示从0到9的数字,并编写了一个函数来显示所删除行数的分数。 为了获得更大的美感,我决定添加填充线消失时的闪烁。

显示器的动态特性促使该想法在计时器中断中调用屏幕的LED部分的更新功能。 LED灯串在活动状态下的中断频率和保持时间决定了发光的亮度。

我也这样做是为了使四米诺骨牌数字的下降速度随着线条的清除而增加。 在第一个版本中,数字每200毫秒向下移动一行。 如果每10条删除行从这个数字中减去40毫秒,那么游戏的步伐将大大加快,并且会引起人们的兴趣。 我的记录是38行!

垂直视频非常适合的罕见情况。


项目代码屏幕布局和界面模块已发布在GitHub上。

如果您有任何想法可以使用这种屏幕进行操作,请在评论中写下。

有用的链接:

1. Hackaday:Flip-Dot Display&DIY Controller
2. 独立于C ++平台的Tetris教程,侧重于初学者的游戏逻辑
3. GitHub上的项目存储库

Source: https://habr.com/ru/post/zh-CN447472/


All Articles