Backspace Invaders或如何将64x64 LED显示屏连接到Arduino


4095个LED和所有所有

令人惊讶的是,作为Arduino Uno底层的ATmega328控制器可以处理此类显示器上的图像输出。 事实证明,这都是一个“口袋”控制台(重达几公斤),其中缝制了一个基于“太空侵略者”的游戏。 计划提出其他建议,因为还有足够的可用内存。

在切口下,您可以了解如何安排这种显示器以及如何控制它。

有时,我不是从收藏中找到旧计算机 ,而是用即兴创作的材料自己制作。

这次,我想做一些紧凑的东西,分辨率达到80年代初期的控制台和计算机水平。 没错,64x64像素的显示屏无法达到Atari 2600,但比诺基亚3310显示屏高出64像素,诺基亚3310显示屏上也有游戏。 因此,至少对于舒适的俄罗斯方块或乒乓球来说,它应该有足够的余量。


除了显示器之外,我还获得了与Arduino Uno兼容的开发板,并开始考虑如何使所有这些东西飞起来。

Adafruit销售此类显示器,您可以在其网站上找到其用法的示例 。 还有一个指向的链接,可用于与他们合作。 该库支持Arduino Uno和Arduino Mega。

该库组织视频存储器,在其中存储像素颜色。 用户程序重新绘制这些像素,并且图像显示在计时器中断处理程序中。 在小型显示器上,此方法效果很好,但就我而言,这种方法不好。 即使为每个像素分配了半个字节(每个R,G,B和一个额外的位),那么对于64x64矩阵,也将需要2 KB的内存。 这就是ATmega328P的全部。 当然,您可以使用功能更强大的处理器,但这不是绝地武士的方法。

毕竟,谁强迫我们一次存储屏幕的所有行? 您可以在显示每行之前重新计算。 对于来自多个子画面的原始图形,这些计算应该不会花费太多时间,因此所有工作都应正常进行。


那是在一所夏季计算机学校的树林里,懒得寻找微电路的文档并跟踪电路板以了解连接的东西,所以太懒了。 因此,我从先前下载的库中选择了用于显示的算法:

  • 在显示器的输入处设置输出线的地址
  • 用与当前行相交的精灵像素的颜色填充数组。
  • 我们依次移位移位寄存器中的所有像素,该寄存器控制LED
  • 我们单击接收到的数据并将其提交给寄存器的输出

结果,选择大小仅为屏幕四行的阵列作为视频存储器。 为什么是四个? 那是因为同时我们将数据推入两行-因为矩阵具有两组输入:R1 / G1 / B1和R2 / G2 / B2。 它们控制两行,每行间隔16个像素。

但是,为什么不是两行,而是四行呢? 事实证明,64x64矩阵由两个独立的32x64矩阵组成。 可以将单独的处理器输出连接到每个,但是ATmega328不够。 幸运的是,提供了一个照顾这些矩阵级联的制造商-一个移位寄存器的输出可以连接到另一个矩阵的输入。 然后,我们得到32x128逻辑矩阵,物理上显示为64x64。 也就是说,在每个阶段,我们需要将两行128像素的像素推入寄存器-这是物理屏幕的4行。



在夏季的计算机学校,我们制作了控制台的原型。 第一款游戏与太空侵略者有点相似。



实际上,LED确实烧毁了他们的眼睛。 您不太可能使用PWM来调整其亮度-ATmega的速度不足。 我们需要采用某种ARM或FPGA。

我在木箱中设计的最终版本。 屏幕由磨砂有机玻璃保护。 由于光线的散射,眼睛不再疲劳,但现在在视频上记录控制台的工作变得更加困难-整个图像变得模糊。



整个程序使用1101字节(53%)的RAM和6432(19%)ROM。 仍有可供选择的几种游戏和菜单的空间。

参考文献

  1. 项目来源: github.com/Dovgalyuk/BackspaceInvaders
  2. 关于adafruit矩阵的说明: learn.adafruit.com/32x16-32x32-rgb-led-matrix
  3. Adafruit矩阵管理库: github.com/adafruit/RGB-matrix-Panel
  4. 用于绘制图形基元的Adafruit库: github.com/adafruit/Adafruit-GFX-Library
  5. 在更强大的处理器上进行的一个类似项目: learn.adafruit.com/ledgames-beaglebone-black-64x64-led-game/overview
  6. 本文是关于管理较小的显示器的: geektimes.ru/post/275548

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


All Articles