这是一系列项目中的第三个也是最后一个项目,旨在了解我们仅使用 Arduino Mega 可以创建多少 LED 立方体技术,即仅使用 Mega 本身而不需要充满移位寄存器和 LED 驱动器的 PC 板可以完成什么。为什么我要避免使用移位寄存器?因为它们对手线来说绝对是可怕的。(我试过了。)如果你想使用它们,你真的需要设计和制造一块 PC 板。
我们通常会通过将 64 个阳极放到主板上来构建一个 8x8x8 的立方体,它们将由一堆移位寄存器配置。然后我们将激活立方体中的八个层之一,并打开该层中相应的 LED 大约 1 毫秒。然后我们将重新加载我们的移位寄存器并激活下一层,等等。所以要以正常方式做一个 8x8x8 立方体,阳极的最小数字引脚要求是 64 个,阴极/层驱动器需要另外 8 个。那是 72 个数字引脚,如果不采取一些技巧,Mega 是不可能的。
我使用 Mega 的所有三个立方体项目都是在没有移位寄存器的情况下完成的。我们严格依赖 Mega 上可用的大量引脚。这个 8x8x8 的技巧是用一对平行但极性相反的 LED 构建我们的立方体的有点异想天开的方法。在一个方向上施加电压时,两个 LED 中的一个正向偏置并点亮。在另一个方向施加电压时,另一个 LED 正向偏置并点亮。我们的刷新程序轮流点亮一个,然后另一个。如果它们都被编程,它发生得足够快,我们可以同时看到它们。
使用这种方法,我们只需将 32 列 LED 连接到主板,因此无需任何移位寄存器即可直接从 Mega 数字引脚控制和为 8x8x8 立方体供电。
我们一次只点亮一层,即便如此,该层中也只有一半的 LED。但是同时打开 32 个 LED,我们需要一个晶体管来处理电流。因此,当我们想要点亮其阴极向下连接到主板的 LED 时,我们需要 8 个 PNP 晶体管来将我们的层拉高。当我们想要点亮阳极连接到主板的 LED 时,我们还需要 8 个 NPN 晶体管来将层拉低。如上所示,我最初的概念实际上会使用 16 个晶体管。但它也需要上拉和下拉电阻器和基极限流电阻器,所以我选择使用内置所有这些的八进制 NPN IC 和一个八进制 PNP 高端驱动器,同样所有电阻都已内置。我还决定,为了避免时间问题并避免需要逆变器,只需从 Mega 上的单独数字引脚驱动两个八进制驱动器。它将总数字引脚数增加到 48 个,但使主板上的组件数保持在非常低的水平。(2个DIP IC和32个电阻)
我们可能同时打开 32 个 LED。为了将电流保持在 Mega 的最大电流限制以下,我们通过 220 ohm 电阻将返回电路运行到电路板,这将 LED 电流限制为 6 max x 32 = 192 ma.,略低于 Mega 的最大 200 ma。(如果您想知道,LED 的正向压降约为 3 伏,而我们的驱动晶体管的正向压降为 0.7 伏,因此从我们的 5 伏电源,我们得到 1.3 伏/220 欧姆 = 6 毫安/LED。)
刷新需要 16 个步骤 - 8 层用于阴极连接到主板的 8 层,8 层用于阳极连接到主板的位置。我们为这些步骤中的每一步打开 LED 500 微秒,因此我们的刷新周期大约需要 8 毫秒,加上加载数据的一点时间 - 为这 16 个步骤中的每一步配置 32 个引脚。但是,我们使用的是超高效的数据加载,首先是因为我们使用的是直接端口访问而不是 digitalWrite,而且因为我们已经设置了内存阵列和端口分配的组合,因此我们只需简单地完成这 16 个传输中的每一个将内存中的四个字节直接存储到数字输出端口中。事实证明,这种方法非常有效,以至于我无法测量它所花费的时间。所以我们的刷新只需要一点点多于 8 毫秒。我们将刷新率设置为 80 Hz,因此每 12 次刷新一次。5 毫秒。这意味着我们的 Mega 将 2/3 的时间用于刷新立方体,而将 1/3 的时间用于运行主循环。
关于我们的层驱动器和刷新例程需要注意的另一件事是,我们的高端驱动器和低端驱动器的输出都直接连接到层并相互连接。我们需要确保它们永远不会同时打开,因为这基本上会使我们的 Mega 的 5 伏电源短路。因此,刷新例程不仅不会同时打开它们,还会在层之间增加 3 微秒的“稳定时间”,以确保我们不会在立方体中出现任何不需要的瞬态电流。
所以上面我们已经描述了这个概念。它在现实中是如何工作的?好吧,我构建了立方体,它按描述工作。我认为构造实际上比传统的 8x8x8 立方体要容易一些。(尽管 512 个 LED 的引线成型和焊接从来都不是一件容易的事。)
在此过程中,我学到了一些东西。如果您决定构建这个立方体,您可能会考虑做一些与我不同的事情。这个立方体中的 LED 相距 0.6 英寸。这个 0.6 英寸的间距是我用于所有三个立方体的。我对这两个 5x5x5 立方体都非常满意,但发现完全看透这个 8x8x8 有点困难。您可能会考虑使用 3 毫米 LED 而不是我使用的 5 毫米 LED。或者使用带有 2 英寸引线的 5mm LED 并将间距增加到 0.8 英寸甚至 1 英寸。您可能还想修改我将 LED 焊接在一起的方式,这样您就不必直接焊接到 LED 封装的底部。我发现几个被热损坏的 LED 必须更换。最后,在施工期间测试一切。确保在最终构建立方体之前找到并更换任何有缺陷的 LED。那是因为在这个设计中坏的 LED 不仅仅是一个坏的 LED。事实证明,应该通过该 LED 的电流通过反向偏置对的迷宫找到了替代路径。打开的 LED 被一堆“半开”的 LED 取代,这些 LED 本来应该是关闭的。当所有 LED 都正常工作时,它工作得很好,但即使是一个有缺陷的 LED 也会让人知道它的存在。
我通过构建 8 个垂直面板每个 8x8 LED 来构建这个立方体。要构建面板,第一步是引导形成并组装 32 对相对的 LED。
阳极(最长的引线)是竖直向上的。另一个 LED 的阴极(较短的引线)焊接到垂直阳极上。然后将第一个 LED 的阴极焊接到第二个 LED 的阳极。通过在一块正好相距 0.6 英寸的木头上钻 2 个孔,可以方便地构建这些对。这些孔需要非常贴合地安装 LED,以便它们保持在原位。
当你有 32 对时,你就可以构建一个面板了。该过程从 8 对构建四个垂直列开始。
我使用 BlueTack 将 LED 固定到位,直到可以焊接为止。我首先在 BlueTack 中每 0.6 英寸制作一次清晰的材料。这不是一个完美的过程 - 完成一列后,您需要清理它,这意味着使其尽可能垂直对齐,并确保从侧面出来的所有引线都旋转对齐;此外,引线是水平的,相距 0.6 英寸。
接下来,当您完成 4 列时,需要对它们进行测试。这是重要的一步。在这个阶段解决问题非常容易。如果您稍后在施工中发现问题,则修复变得越来越困难。
我没有为测试做任何花哨的事情。背景中的 Uno 是 5 伏的电源,仅此而已。位于原型板上的 330 欧姆电阻器限制电流。我检查了每个 LED 以确保它亮起,首先用一个极性的电压来测试一半的 LED,然后用相反的极性来测试另一半 LED。如果一对中的两个 LED 都亮起,则其中一个是极性错误。如果两者都不亮,则可能有一个短路。
一旦我们有了 4 个好的柱子,就可以将它们焊接到一个面板中了。为此,我使用同一条 BlueTack 将两根柱子固定在一起,相距 0.6 英寸,将 8 根水平引线对齐并将它们焊接在一起。水平引线最初不会完全对齐。让一对夫妇排成一列并焊接它们,然后再排成两个并焊接它们,等等。最终你将把所有八个焊接在一起。确保面板是平的。确保它是方形的。确保它是直的。然后做同样的事情并添加另一列。当您以这种方式将 4 根柱子焊接在一起时,您就有了一个成品面板。
恭喜。现在再建七个!此时,您已准备好开始最终组装。我在主板上构建了我的立方体,但首先需要通过安装其他组件来准备主板。
上面您可以看到主板上安装的两个 IC 驱动器和 32 个电阻器。电阻器安装在两个方向上相距 0.6 英寸。由于两个原因,在这张照片中看起来并不完全如此。首先,我让所有电阻器从它们各自的列返回到立方体的中心。我这样做是为了防止 IC 附近的区域变得拥挤,但这可能没有必要。我先安装了 IC,事后看来,它们离立方体太近了。他们没有理由不能低一英寸。您可以清楚地看到,必须将一个电阻器安装在不合适的位置,因为它本来应该在 IC 的顶部。
此图顶部的电阻器已焊接到位并经过修整,但尚未连接任何东西。两个IC显示在图片中间。高边驱动器在顶部,我用黑色记号笔将其标记为 A 表示阳极,将引脚 1 标记为 1。下面是低边 NPN 驱动器,标有 C 表示阴极。它的引脚 1 也标有 1。这两个 IC 以这种方式安装,以便它们的输出彼此面对。这是因为两者的输出都与层相关。我已经将它们彼此连接起来并稍微展开,以便从立方体返回的层可以下来并从另一侧连接到它们。连接采用镀锡铜线。
此时,我们已准备好将 50 根跳线连接到电路板的背面。有 32 个连接到电阻器,8 个连接到高侧驱动器的输入端,8 个连接到低侧驱动器的输入端,1 根地线和 1 根 +5 伏线连接到高侧的引脚 9驱动器,其源电压引脚。这些电线都是 30 厘米。长,并直接焊接到电路板背面的适当位置。另一端绕过电路板的一侧,并通过公跳线针连接到 Mega 上的针脚。此时您也可以使用某种形式的支架安装 Mega。实际上,我自己使用了几块小塑料方块和一点热胶来安装 Mega。
我们准备安装面板。安装面板包括将四根垂直柱引线推入电路板,平整层,然后将四根引线焊接到背面对应的电阻器上。
每个面板在安装后和安装下一个面板之前都需要进行测试。这样,如果有任何问题(冷焊点、死 LED 等),它可以在它卷到立方体中间之前修复。然而,在我们测试第一个面板之前,我们需要将层连接到电路板。这是通过将一根直的镀锡铜线连接到该层,然后降低到 8 个 IC 输出中的一个来实现的。并且不要忘记与 Mega 的接地和 +5 连接。+5 连接到高端驱动器的引脚 9。
第 7 层(顶层)连接到低侧驱动器的引脚 18(第一通道)和高侧驱动器的引脚 11(第八通道)。第 0 层(最低层)到低侧驱动器的引脚 11 和高侧驱动器的引脚 18。
在这一点上,我们还需要将所有电线连接到 Mega。下表显示了 Mega 上的哪个引脚连接到每个电阻器。这些是红色和绿色的连接。与高端和低端驱动器的连接以蓝色显示。它们每个都直接从对应的输出连接到 IC。例如,输出到第 7 层的低端驱动器是 IC 上的引脚 18。引脚 18 的正对面是 IC 上的引脚 1,因此来自低端驱动器引脚 1 的导线连接到 Mega 上的引脚 9,如下图所示。
至此,我们现在可以测试面板了。测试面板的程序包含在软件中。您需要在草图顶部告诉它您正在测试哪个面板。图片中正在测试的是面板 0。
一旦您测试了已安装的面板,您就可以安装下一个。您尚未安装将面板连接到每个附加层的水平导轨,因此您需要在您正在测试的面板和每层的面板 0 之间放置一个临时跳线。(我只使用了一根跳线并分别测试了每一层,将一根跳线从一层移到另一层。)
安装并测试所有面板后,您就可以连接各层了。这是通过在每一层的面板之间铺设一条直的镀锡铜线来实现的。
从顶部开始连接层。并确保在连接顶层时测量 0.6 英寸的间距。一旦你连接了层,你的立方体就完成了,你应该可以运行主节目了。
我们已经谈到了一些关于软件的内容。定时刷新中断程序是任何立方体软件的核心。我设计这个非常简单和高效。这需要使用两个不同的内存阵列来存储立方体中每个 LED 的状态。因此,一个存储阳极下降到板上的 LED 的状态,另一个存储阴极下降到主板的 LED 的状态。这两个数组通过它们在数组中的位置存储 x 和 z 值,并将 y 值存储为该位置的位。位设置为 1 表示 LED 开启,位设置为 0 表示 LED 关闭。同样,所有这些都非常有效,但是尝试弄清楚如何将立方体中的特定 LED 设置为打开或关闭可能会非常令人困惑。所以我们基本支持软件的另一个关键是 ledOn(x, y, z) 和一个 led0ff(x, y, z)。这些子程序完成了所有艰苦的工作,以确定需要更改这两个阵列中的哪个位以打开或关闭特定的 LED。
因此,通过打开或关闭任何特定 LED 的子程序,以及不断点亮和更新立方体以匹配我们阵列的内容的刷新程序,创建各种动画和特殊效果相当容易。我们的主要草图,称为展示,是为展示立方体的性能而创建的几分钟的动画。
在软件下还有另一个主题要讨论。节目中的大多数动画都是直接打开然后关闭 LED 的模式。有些人使用一点数学来控制这些模式。但在另一种类型的节目中有一些动画。这些基于称为精灵的对象类。sprite 类在多维数据集中定义了一个对象。sprite 中的对象可以移动、反弹、旋转等。它允许相当容易地创建一些动画,如果没有基于对象的代码将很难创建这些动画。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !