上周,我构建了一个LED立方体– 64个LED ,您可以对其进行编程以进行梦幻般的未来派灯光秀,而且我希望您也这样做,因为它激励您并扩展Arduino技能的绝佳项目。我为您提供了一些基本的应用程序,以帮助您进行思考,但是今天,我将介绍为多维数据集制作的更多软件以及代码说明。这样做的目的不仅是为您提供更多运行的灯光秀,而且是为了了解对多维数据集进行编程的一些限制,并在此过程中学习一些新的编程概念。
这是一些相当高级的编码。在自定义提供的代码之前,您确实需要阅读我以前的所有 Arduino教程和我们的初学者Arduino指南。
应用程序1:迷你蛇
我不想运行一套像蛇一样的图案序列,而是想对一条蛇进行编程,这是一种人工的蛇,它可以自己做出随机选择,而且完全不可预测。仅限于2个细分,我将在后面解释,您可以在下面查看演示。在此处下载完整的代码。
处理3D空间时,单个点需要3个坐标: X, Y 和 Z 。
但是,在我们的立方体中,X和Z平面由LED引脚表示,而Y直接由LED引脚表示。映射到阴极平面。为了方便使用这些坐标并弄清楚立方体周围的运动,我创建了一个新的数据类型(使用结构)来表示立方体上的单个点,我称之为“ xyz”。它仅由两个整数组成:“ xz”和“ y”。通过这种结构,我还可以在下面的特殊(xz,y)坐标系中表示一个方向:
Y运动 (向上,向下):(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()《的有效位置,我们也不希望它向后退。/strong》函数,该函数将获取坐标,方向并返回新坐标。
XYZ 数据类型, valid(), move()和 inverse()函数都可以在下载的 xyz.h 文件中找到。如果您想知道为什么将其放入一个单独的文件而不是主程序文件中,那是由于一些复杂的Arduino编译器规则阻止了返回自定义数据类型;它们必须放置在自己的文件中,然后在主文件的开头导入。
在主运行时文件中,一个方向数组存储了蛇可能做出的所有可能动作;我们可以简单地选择一个随机数组成员来获得新的方向。还创建了变量来存储当前位置(现在),先前的方向和先前的位置。其余代码对您来说应该是显而易见的。只需f o r个循环,然后打开和关闭LED。在主循环中,我们检查建议的方向是否有效,如果是,则按照这种方式进行。如果没有,我们会选择一个新的方向。
在主循环中唯一要指出的是一些检查,以纠正我发现的涉及多路复用的错误:如果新位置在相同的阴极平面或相同的阴极平面上阳极引脚,关闭前一个LED会导致两个LED都熄灭。也是在这一点上,我意识到在我当前的实现中,超越2段蛇形是不可能的:尝试以角落布置方式点亮3个LED。您不能这样做,因为激活2层和2个LED引脚后,将打开4个LED,而不是3个。这是我们有限的多维数据集设计固有的问题,但不必担心:我们只需要使用视觉持久性以重写绘图方法。
视觉持久性意味着当光线顺序到达我们的眼睛时(比我们能够处理的快),它看起来像是一幅图像。在我们的案例中,与其同时绘制所有四个图层,不如绘制第一层,将其停用,绘制第二层并使其停用:这比我们知道发生任何变化的速度还快。这就是消息编写者工作的原理,就像这样:
使用视觉持久性的新绘制方法
首先,是一个新的绘制例程。我创建了一个 4 x 16二维数组(正确或错误)以表示LED立方体状态的文字。绘制例程将通过简单地对其进行迭代并将每一层刷新到立方体一小会儿来实现视觉的持久性。它将继续以当前状态绘制自己,直到刷新时间过去为止,此时我们将控制权传递回main loop()。我已将代码的这一部分保存在此LED_cube_POV文件中,因此,如果您只想开始编写自己的游戏,然后随时使用它作为基础。
应用2:Game of生活
现在,让我们将其开发为Conway的《人生游戏》的基本版本。对于不熟悉(尝试使用Google搜索来查找令人敬畏的复活节彩蛋动画)的人来说,生命游戏是细胞自动机的一个示例,它创造了一种令人着迷的给出的行为只有几个简单的规则。
例如,这是蚂蚁在智力和蜂巢的思想下如何运动的方式,尽管生物学事实表明它们实际上遵循非常基本的荷尔蒙规则。这是完整的下载代码:按下 reset 按钮重新启动。如果发现自己反复出现相同的模式,请尝试按住rest按钮更长的时间。
此处是生命博弈的规则:
任何少于两个活邻居的活细胞都会死亡,好像是由人口不足造成的。
有两个活邻居的活细胞或三个活着的邻居继续生活到下一代。
具有三个以上活着的邻居的任何活细胞都会死去,就像人满为患一样。
任何有三个活着的邻居的死细胞都会变成
运行代码。您会注意到,在5到10个“世代”内,自动机可能已经停下来,稳定在某个位置;有时,这种稳定的模式会改变位置并在木板上移动。在极少数情况下,它们甚至可能完全消失。这是只能使用4x4x4 LED的限制,但无论如何都是一个很好的学习练习。
解释代码:
您可能不熟悉 memcpy()函数。我用它来保存以前的游戏状态,因为数组不能像普通变量那样相互分配-您必须在内存空间中进行实际复制(在这种情况下为64位)。
howManyNeighbours()函数应该可以自我解释,但如果情况并非如此,则此方法采用单个坐标,并遍历每个可能的邻居(与我们先前在蛇中使用的方向相同的数组)应用程序),以检查它们是否有效。然后,它会检查那些相邻的LED在先前的游戏状态中是否“点亮”,并计数有多少。
该“生活游戏”应用的主要功能是 progressGame(),这会将自动机规则应用于当前游戏状态。
改进:到目前为止,我已经花了太长时间了,但是您可能想要尝试添加一张支票,该支票在经过5代左右的相同模式后会自动将板复位。那请告诉我!我也建议您尝试将POV方法添加到蛇游戏中,以期有可能使更长的蛇成为可能。
今天就是我了。我可能稍后会再访问一些Arduino LED多维数据集应用程序,但希望您能够修改我的代码并创建自己的游戏规则:让我们知道您在注释中提出了什么,以便我们都可以下载您的创作!与以往一样,我将在这里回答您的问题并捍卫我的可怕编码能力。
责任编辑:wv
-
led
+关注
关注
242文章
23235浏览量
660479 -
Arduino
+关注
关注
188文章
6468浏览量
186913 -
立方体
+关注
关注
0文章
6浏览量
6413
发布评论请先 登录
相关推荐
评论