×

使用arduino、mpu6050和python控制游戏

消耗积分:2 | 格式:zip | 大小:0.08 MB | 2022-12-13

陈秀珍

分享资料个

描述

大家好,

该控制器可用作玩游戏的游戏控制器。我想用 MPU6050 做一些东西,然后我决定做这个项目。

那么让我们看看它是如何工作的

在这个项目中,ardiono uno 读取油门按钮、刹车按钮的按钮状态和 MPU6050 传感器提供的数据,然后在串行监视器上打印一个字符,然后 python 程序读取该字符以模拟程序的键盘输入(游戏)。

那么如何制作这个东西呢?

步骤1

最初,您必须做一些基本的接线来将 arduino 与 mpu6050 和两个按钮连接起来,一个用于油门,另一个用于刹车。

pYYBAGOX2rGAWUzWAADv5-EElj435.jpeg
 

现在你必须在自行车上设置硬件,让它感觉更真实(你可以跳过这个或安装在你想要的地方)

将 MPU6050 传感器安装牢固。将其 Z 轴与我的设置类似(您可以更改,但您必须在代码中进行一些更改)

 

poYBAGOX2ruARVQ6AAEI7UzTnTQ73.jpeg
 

第 3 步

现在在软件部分,我正在使用库 和 。

pYYBAGOX2sCAJlHUAAG2KyiMiag081.jpg
安装 MPU6050_tockn.h
 

现在我对每个动作都使用了一些关键代码。

事件动作

如果按下油门按钮,则在串行端口上写入“w”

如果按下刹车按钮,在串口上写“s”

如果观察到正确的位置,在串口上写“d”

如果观察到左侧位置,请在串行端口上写入“a”

如果按下油门按钮并观察到正确的位置,则在串行端口上写入“e”

如果按下油门按钮并观察到左侧位置,则在串行端口上写入“q”

如果按下制动按钮并观察到正确的位置,则在串行端口上写入“c”

如果按下制动按钮并观察到左侧位置,则在串行端口上写入“z”

所以为此我们必须使用以下代码

if(mpu6050.getAngleZ()>25 && digitalRead(A0))  
  Serial.println('q');
 else if(mpu6050.getAngleZ()<-25 && digitalRead(A0))
  Serial.println('e');
 else if(mpu6050.getAngleZ()>25 && digitalRead(A1))
  Serial.println('z');
 else if(mpu6050.getAngleZ()<-25 && digitalRead(A1))
  Serial.println('c');
 else if(digitalRead(A0))
  Serial.println('w');
 else if(digitalRead(A1))
  Serial.println('s');
 else if(mpu6050.getAngleZ()>25)
 Serial.println('a');
 else if(mpu6050.getAngleZ()<-25)
 Serial.println('d');

注意 - 如果您使用另一个轴,那么您可以使用 mpu6050.getAngleX() 或 mpu6050.getAngleY()。

mpu6050.getAngleZ()>25

在这里,我将考虑当mpu6050.getAngleZ()给出的值大于 25(阈值点)时向左移动,您可以更改并设置自己的阈值点,为了找到自己的阈值点,您可以使用 getAngle 的示例代码来检查传感器的值每个位置,然后您可以在所需位置选择 Sthe 值。

pYYBAGOX2s2Aam-AAAH5MLMjubU512.jpg
使用此示例检查每个位置的传感器值
 

看我的串口监视器

 

到目前为止,我们在串口上获取值,现在我们将使用 python 扫描串口然后模拟输入,在此我将给出两个 python 代码其中一个使用pyautogui生成输入 但有时这不适用于 Direct X游戏,所以我也会给出第二个 python 代码(port2.py ),希望它可以工作,所以一个接一个地尝试两个 python 代码(port1.pyport2.py ),看看哪个有效。您还可以在运行 python 程序后选择一个记事本,如果您看到它在按下油门按钮或进行任何其他动作时在记事本上打印 w,那么从这个硬件和 arduino 方面来说一切都很好。

我在下面给出了完整的代码。[注意-在python程序中将端口名称更改为您的arduino端口,对我来说这是' COM3 ']

4 步 - 运行它

1-首先连接 arduino 打开串行监视器,如果一切正常,您会在串行监视器中看到正确的输出,然后关闭串行监视器

2 - 打开游戏

3rd - 运行 python 脚本进入游戏窗口

4th - 享受,现在你完成了

现在看看它是如何实时工作的,我在沥青 8 中使用它 - Airborne

 

所以希望你喜欢它。


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

评论(0)
发评论

下载排行榜

全部0条评论

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

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.lene-v.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'使用arduino、mpu6050和python控制游戏',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"//www.lene-v.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);