完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
1.硬件准备
1.1模块介绍 要制作游戏手柄肯定要有个摇杆,然后再加个大按键模块 最重要还是要有个主控,今天我们需要的主控就不是Arduino UNO了,而是Arduino Leonardo。 Arduino Leonardo是基于ATmega32u4的开源电子板,它也有20个输入/输出引脚,包括013引脚和A0A5引脚,用法和Arduino UNO基本一样,但是与Arduino UNO又有所不同,它直接使用了ATmega32u4的USB通信功能,取消了USB转UART芯片,这使得Leonardo不仅可以作为一个虚拟的串行端口,还可以作为鼠标或者键盘连接到计算机。 1.2接线方式 注意:Leonardo板子上只有一个+5V端口,但是大按键模块和摇杆都需要+5V端口,本着能不增加模块就不增加模块的原则,小编直接借用了板子上ICSP的+5V引脚和GND引脚给按键模块供电 2.软件编程 2.1 下载库文件 要把Leonardo变成游戏手柄还需要安装一个Joystick库文件 2.2 安装库文件 解压下载后的Joystick库文件,然后把解压后的文件剪切到ArduinoIDE安装目录下的libraries文件夹内,如图所示: 2.3编写程序 程序部分就比较简单了,先导入Joystick库,创建Joystick对象,并设置好按键的个数和摇杆的X、Y轴;然后在setup()函数中初始化按键的引脚,并且让Leonardo连接到计算机的游戏控制器;在主循环loop()函数中分别获取按键的状态和摇杆X轴和Y轴的值。 需要注意的是获取按键时要考虑去抖动的问题,程序中用到了lastButtonState数组保存上次按键的状态,当按键的本次状态和上次保存的状态不一样的时候才会调用Joystick库中的setButton函数设置按键的状态,在Joystick库中setButton中的按键编号是从0开始的; //获取按键状态,按下为1,松开为0,有防抖功能 for (int index = 0; index < 5; index++) { int currentButtonState = !digitalRead(index + 2);//读取按键的值 if (currentButtonState != lastButtonState[index])//判断是否和上次状态一样 { //Serial.println(currentButtonState); //设置手柄按键,参数1表示按键的地址,参数2为按键的状态 Joystick.setButton(index, currentButtonState);//设置手柄的按键 lastButtonState[index] = currentButtonState;//保存按键的状态 } } 设置摇杆状态时,要从A0、A1引脚读取X轴和Y轴的模拟值,范围从0到1023,摇杆在中间原点的值是512 但由于硬件制造的问题,这个中间值有所偏差,我们在程序中假设偏差值是RANGE 最后通过判断X轴和Y轴的数值在(0,512-RANGE)、(512-RANGE,512+RANGE)、(512+RANGE,1023)哪个范围内来决定摇杆的位置,并调用Joystick中的setXAxis()和setYAxis()函数设置摇杆的状态 //获取摇杆X轴和Y轴的值,数值范围为0~1023,中值为512(有误差) X = analogRead(A0); Y = analogRead(A1); //避免多次重复设置X轴或Y轴的值 if ((X != oldX) || (Y != oldY)) { //X轴在512的偏差范围内,设置为0,即X在中间位置 if ((X >= 512 - RANGE) && (X <= 512 + RANGE)) Joystick.setXAxis(0); else if (X > 512 + RANGE)//X轴向右偏移 Joystick.setXAxis(-1); else Joystick.setXAxis(1);//X轴向左偏移 //Y轴在512的偏差范围内,设置为0,即Y在中间位置 if ((Y >= 512 - RANGE) && (Y <= 512 + RANGE)) Joystick.setYAxis(0); else if (Y > 512 + RANGE)//Y轴向下偏移 Joystick.setYAxis(-1); else Joystick.setYAxis(1);//Y轴向上偏移 //保存X轴和Y轴的值 oldX = X; oldY = Y; } 3.测试手柄 把写好的程序上传到Leonardo主控器,然后就可以直接测试游戏手柄是否能正常使用了,小编只在windows10系统上做了测试,至于其他系统环境小伙伴们自行测试吧 首先打开控制面板,然后选择查看设备和打印机,在设备中找到Arduino Leonardo(一个游戏手柄的形状),选中Arduino Leonardo点击鼠标右键,选择游戏控制器设置,在弹出窗口中选择属性,打开测试页面即可看到轴和按钮两个测试项,推动摇杆时轴中的+号就会移动,按下按键时对应编号的按钮就会高亮,这就表示Arduino Leonardo可以作为游戏手柄使用了 注:具体操作请关注微信公众号:不莣初芯 4.魂斗罗游戏 小编在网上找到了一个游戏模拟器和魂斗罗游戏的nes文件,但是安装之前需要关闭计算机的杀毒软件!! 先解压压缩包,然后打开VirtuaNES文件夹,双击打开VirtuaNES.exe软件,最后把“魂斗罗S枪30条命版.nes”文件拖拽到VirtuaNES软件内就可以了运行魂斗罗游戏了,游戏开始会进入演示界面,暂时不用管,待配置完游戏手柄再退出。 5.设置游戏手柄 在VirtuaNES软件中打开选项菜单,选择控制器>然后在弹出窗口的左下角选择 设置2>窗口中出现空白的摇杆和按键选项>用鼠标左键单击空格,然后推动摇杆到对应的位置或按下对应的按键,空格处就会填充对应的摇杆或按键的ID>设置完以后单击确定就可以正常使用游戏手柄玩魂斗罗游戏了 注意:小编为了用起来方便,就把摇杆顺时针旋转了90度,X轴和Y轴的方向有些变化,另外小编还把X轴负方向作为了SELECT键,摇杆上的按键作为START键用来选择游戏关卡和开始游戏。实际操作时,小伙伴们可以按照自己的习惯设置摇杆和按键的功能。 最后,小编利用硬纸壳做了一个手柄的样子,有条件的小伙伴也可以用3D打印机打印一个手柄,然后跟着小编玩起来! |
|
1 条评论
|
|
只有小组成员才能发言,加入小组>>
3311 浏览 9 评论
2994 浏览 16 评论
3493 浏览 1 评论
9058 浏览 16 评论
4087 浏览 18 评论
1176浏览 3评论
604浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
598浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2334浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1895浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 20:53 , Processed in 1.154269 second(s), Total 82, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号