怎样制作基于SNES控制器的Arduino游戏

电子说

1.3w人已加入

描述

步骤1:所需的材料

所需的材料如下:

-1 Arduino

-1小面包板

- 1个您不介意拆除的旧SNES控制器

-10-15跳线(我使用11个)

-5个LEDs

-胶带

第2步:连接Arduino的所有电线

将跳线插入arduino的2-9针中。参见下文,了解每个引脚的功能以及我推荐的配色方案。

引脚2:频闪引脚。从控制器连接到橙色导线,所以我将跳线设置为粉红色或橙色。

引脚3:时钟引脚。从控制器连接到黄色电线,所以我建议使用黄色跳线。

引脚4:数据引脚。控制器上有红色导线,所以最好使用红色跳线。

引脚5:顶部LED的电源。引脚6:右侧LED的电源。引脚7:底部LED的电源。

Pin 8:左侧LED的电源。引脚5-8的跳线颜色应相同。我选择“深绿色”。

Pin 9:指示灯电源。我使用了浅绿色。

5V:电源引脚,连接到控制器的白线,所以我用了白色的跳线。

GND:控制器的棕线,我用了黑色的跳线。

GND:用于将面包板的所有接地线重新连接到arduino,所有接地线都使用蓝色。

步骤3:设置LED和面包板

将您的LED以菱形放置在面包板上。确保没有2个LED引脚共享相同编号的行。将所有阴极(LED上的短引脚)连接到面包板上的接地线,然后将接地线连接到arduino的GND之一。将针脚5-8上的跳线连接到LED的阳极,与它们的位置相对应,如上一步中所述。

对于游戏指示器LED,只需将其与其他LED放开,将其阳极连接到Pin 9,其阴极连接到接地轨。

步骤4:连接控制器

到现在为止,您完全不必弄乱控制器。现在,您必须从电线末端切下塑料外壳,以便可以进入电线内部。它们上应该有一些金属小端(请参阅图片),因此,将跨接导线钩起来应该相当简单,对吗?

错。

首先将控制器线由arduino绑在桌子上。如果任其发展,就很难建立良好的联系。我的跳线直接从小金属物品中滑出,所以我拿了一把小刀,将两端撬开(见图),这样我就可以将跳线垂直地插入插座中。将5根线连接到控制器时,请确保它们彼此之间不接触,并且确保正确匹配颜色。

步骤5:

在这一点上,您应该已正确连接好一切并准备就绪。下载链接的Arduino草图,对其进行编译,然后将其上传到您的arduino。要播放,请等待游戏指示灯LED停止闪烁,然后将AXBY用作4个基本方向。在接下来的两个步骤中,我将尝试解释代码,但是如果您想要的只是一个运行中的游戏,则可以在此处停止。

Simon_Says_snes.ino

步骤6:代码,第1部分

首先介绍了控制器如何发送数据的一些背景知识。为了从控制器接收数据,您将选通引脚设置为高电平,然后读取数据的第一位(最低有效位)。要获得第二位,请切换时钟引脚,然后从数据引脚读取。您将继续执行16次。控制器的状态是一个2字节数字,其中12个最低有效字节包含当前被按下的按钮,而4个最高有效字节则无用。

所以前7行非常简单,因为它们只是分配名称

第8-20行声明用于检测按下控制器上哪个按钮的十六进制数据。每个十六进制值都会在数据流中打开一个单独的位,因此您可以使用移位来确定是否按下了某个按钮,或者仅使用按位和。

变量“数组”只是一个数组长度为30 ints的整数。这将存储游戏的按顺序。‘pos’是位置变量。

‘timeForPress’是必须按下按钮的时间。

接下来的是setup()方法。我们从播种随机数生成器开始,然后为每个引脚2-9设置引脚模式。接下来,我们出于调试目的打开串行通信,并将按钮顺序设置为全“ 4”。我这样做是因为b/c的LED编号系统最多只能增加3个,因此4个基本上只是一个占位符。现在我们将timeForPress设置为1000,并调用genSequence()方法,该方法将数组填充为0到3(含3)之间的随机整数。接下来,将我们的位置设置为0,以表明它尚未开始游戏,然后闪烁游戏指示器以表明游戏即将开始。

步骤7:代码,第2部分

在这一步中,我将快速介绍用于从控制器获取数据的方法。我在上一步中告诉了您理论知识,但是现在我将列出实际的函数调用。

我认为我从这个可指导的代码中获得了一些代码。但是,还不能完全确定。

有三种方法可用于检查控制器输入:

buttons()

频闪()

shiftin()

buttons()方法首先设置了返回值变量和一个位置计数器。然后,它选通(使用strobe()),并进入for()循环。在for循环中,它使用shiftin()方法和按位运算符一次读取并存储一位数据。

strobe()方法非常简单。基本上只是将选通引脚设置为高电平,然后立即返回至低电平。很简单的东西。这告诉控制器开始传输数据。

shiftin()方法实际上读取数据。它从数据引脚获取数据,然后切换时钟引脚,告诉控制器发送下一位。

仅使用这三种方法,您就可以读取控制器的状态。您永远不必直接调用strobe()或shiftin()。最后一点,当检查按钮是否被按下时,必须使用2个按位运算符。 〜(波浪号)不是按位的,而是反转数据,然后&检查状态与您要按下的按钮的关系。

步骤8:代码,第3部分

这是关于代码的最后一步。我只是要快速了解游戏循环的操作,因为对于新手程序员来说,这应该很容易理解。

loop()方法通过串行打印控制器的状态开始。然后,它播放存储在数组中的序列,然后使用readAndCheckInput方法检查用户输入,该方法本质上只是一个带有一些if语句的for循环。如果您弄错了,它就会跳出循环并执行闪烁的操作,然后结束。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分