编程Arduino 4x4x4 LED立方体以做更多很棒的事情

这是一些相当高级的编码。在定制自定义的代码之前,您确实需要阅读所有之前的内容。

应用程序1:迷你蛇

我无需运行一组类似蛇的图案序列,想要编程一条蛇-一种人工的蛇,它可以自行选择,而且完全不可预测。仅限于2个细分,我将在后面解释,您可以在下面查看演示。在此处下载完整的代码。

处理3D空间时,单个点需要3个坐标: X, Y 和< strong> Z 。

但是,在我们的立方体中,X和Z平面由LED引脚表示,而Y直接映射到阴极平面。为了方便使用这些坐标并找出围绕立方体的运动,我创建了一个新的数据类型(使用结构)来表示立方体上的单个点,我称之为“ xyz"。它仅由两个整数组成:“ xz"和“ y"。通过这种结构,我还可以在下面的特殊(xz,y)坐标系中表示一个方向:

Y运动(向上,向下)< / em> :( xz,y + 1),(xz,y-1)
Z 运动(向前,向后) :(xz-1,y),(xz + 1,y)
X运动(左,右):(xz + 4,y),( xz-4,y)

例如,要将LED沿一个位置向左移动(0,0),我们应用(xz + 4,y) 并以(0,4)结尾。

对移动有一定限制-即Y坐标只能是可能的 0到3 (0是最底层,3是最上层),而XZ坐标只能是 0到15 。在Z轴运动上设置了另一个限制,以防止从立方体的后部到前面的“跳跃",反之亦然。在这种情况下,我们使用模数函数测试4的倍数,并拒绝该移动尝试。这是逻辑,用 valid()函数表示,如果建议的方向是可以接受的移动,则该函数返回true,否则返回false。我添加了进一步的功能来检查反方向 –也就是说,如果蛇正在向一个方向前进,我们不希望它向后退,即使它是有效的位置,以及 move()函数,该函数获取坐标,方向并返回新坐标。

XYZ 数据类型, valid() move() inverse()函数都可以在 xyz.h 中找到下载中的文件。如果您想知道为什么将其放入一个单独的文件而不是主程序文件中,那是由于一些复杂的Arduino编译器规则阻止了返回自定义数据类型;它们必须放置在自己的文件中,然后在主文件的开头导入。

在主运行时文件中,一个方向数组存储了蛇可能做出的所有可能动作;我们可以简单地选择一个随机数组成员来获得新的方向。还创建了变量来存储当前位置(现在),先前的方向和先前的位置。其余代码对您来说应该是显而易见的。只需f o r个循环,然后打开和关闭LED。在主循环中,我们检查建议的方向是否有效,如果是,则按照这种方式进行。如果没有,我们会选择一个新的方向。

在主循环中唯一要指出的是一些检查,以纠正我发现的涉及多路复用的错误:如果新位置在相同的阴极平面或相同的阴极平面上阳极引脚,关闭前一个LED会导致两个LED都熄灭。也是在这一点上,我意识到在我当前的实现中,超越2段蛇形是不可能的:尝试以角落布置方式点亮3个LED。您不能这样做,因为激活2层和2个LED引脚后,将打开4个LED,而不是3个。这是我们有限的多维数据集设计固有的问题,但不必担心:我们只需要使用< strong>视觉持久性以重写绘图方法。

视觉持久性意味着当光线顺序到达我们的眼睛时(比我们能够处理的快),它看起来像是一幅图像。在我们的案例中,与其同时绘制所有四个图层,不如绘制第一层,将其停用,绘制第二层并使其停用:这比我们知道发生任何变化的速度还快。这是消息编写者工作的原理,就像这样:

使用视觉持久性的新绘制方法

然后首先创建一个新的绘制例程。我创建了一个 4 x 16二维数组(正确或错误)以表示LED立方体状态的文字。绘制例程将通过简单地对其进行迭代并将每一层刷新到立方体一小会儿来实现视觉的持久性。它将继续以当前状态绘制自己,直到刷新时间过去为止,此时我们将控制权传递回main loop()。我将代码的这一部分保存在此LED_cube_POV文件中,因此,如果您只是想开始编写自己的游戏,而后又想以此为基础。

应用2:Game of生活

现在,让我们将其开发为Conway的《人生游戏》的基本版本。对于不熟悉(尝试使用Google搜索来查找令人敬畏的复活节彩蛋动画)的人来说,生命游戏是细胞自动机的一个示例,它创造了一种令人着迷的给出的行为只有几个简单的规则。

例如,这是蚂蚁在智力和蜂巢的思想下如何运动的方式,尽管生物学事实表明它们实际上遵循非常基本的荷尔蒙规则。这是完整的下载代码:按重置按钮重新启动。如果您发现自己一遍又一遍地获得相同的模式,请尝试按住“休息"按钮更长的时间。

以下是生命游戏的规则:

  • 任何活动单元中的活动较少而不是两个活邻居死亡,就好像是人口不足造成的。
  • 任何有两个或三个活邻居的活细胞都可以存活到下一代。
  • 任何一个活细胞超过三个活着的邻居死掉了,就像人满为患一样。
  • 任何具有三个活着的邻居的死单元都变成了活着的单元,就像通过繁殖一样。
  • 运行代码。您会注意到,在5到10个“世代"内,自动机可能已经停下来,稳定在某个位置;有时,这种稳定的模式会改变位置并在木板上移动。在极少数情况下,它们甚至可能完全消失。这是只能使用4x4x4 LED的限制,但无论如何都是一个很好的学习练习。

    解释代码:

  • 您可能不熟悉 memcpy( )功能。我用它来保存以前的游戏状态,因为数组不能像普通变量那样相互分配-您必须在内存空间中进行实际复制(在这种情况下为64位)。
  • howManyNeighbours()函数应该可以自我解释,但如果情况并非如此,则此方法采用单个坐标,并遍历每个可能的邻居(与我们先前在蛇中使用的方向相同的数组)应用程序),以检查它们是否有效。然后,它会检查那些相邻的LED在先前的游戏状态中是否“点亮",并计数有多少。
  • 该“生活游戏"应用的主要功能是 progressGame(),这会将自动机规则应用于当前游戏状态。
  • 改进:到目前为止,我已经花了太长时间了,但是您可能想尝试添加检查5代左右相同图案后是否会自动重置电路板。那请告诉我!我也建议您尝试将POV方法添加到蛇游戏中,以期有可能使更长的蛇成为可能。

    今天就是我了。我可能稍后会再访问一些Arduino LED多维数据集应用程序,但希望您能够修改我的代码并创建自己的游戏规则:让我们知道您在注释中提出了什么,以便我们都可以下载您的创作!与以往一样,我将在这里回答您的问题并捍卫我的可怕编码能力。

    标签: