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

步骤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循环。如果您弄错了,它就会跳出循环并执行闪烁的操作,然后结束。

安集微成功IPO过会 科创板半导体第一股出炉
在VR中还可以感受触觉和温度了
AI浪潮下,机器视觉如何再扩百亿“版图”?
苹果:只有原装20W快充头才能发挥iPhone 12的快充实力
资金紧张和电池业务持续亏损也无法阻止SKI加码动力电池业务的野心
怎样制作基于SNES控制器的Arduino游戏
降低噪声与电磁干扰的解决办法
黄曲霉毒素定量检测仪的功能都有哪些
智创未来 · 引领5G价值,广和通携5G AIoT创新应用亮相2022德国慕尼黑电子展
一种掉电后备电源的设计方案
华为 Mate30 Pro 5G 更新EMUI 11.0.145 :新增了长焦画中画预览界面
如何免开发而打造一款智慧便捷的电量统计插座
上海光机所在100PW激光系统的色散控制方面取得新进展
AI技术会对医疗行业产生重大而深远的影响
通过操作命令来统计 Linux 中文件和文件夹/目录的数量
手机基带_手机基带是什么
华为P10最新消息:华为P10闪存门、屏幕门、内存门事件,某些人处心积虑看那些给华为P10造的谣有多毒!
FCI和3M宣布HPCE和HP2电源的第二货源协议
基于SPS的DAFB变换器漏感分析
LRE板卡交换机在轨交信号通信系统的应用