×

基于Arduino的无人机构建

消耗积分:2 | 格式:zip | 大小:0.03 MB | 2023-07-10

20762

分享资料个

描述

电影“三个白痴”一直是我开始从事这个项目的主要灵感来源。

最后,我要感谢我的家人一直以来对我的支持和信任。

  • 硬件建设:

无人机只不过是一个利用 4 个电机飞行并接收远距离用户输入的物体(即为什么有时它被称为 UAV – unmanned ariel vehicle)。

给定的 450 毫米框架将使用 1000kv 无刷电机和 8 到 10 英寸长的螺旋桨。如果 450 毫米无人机框架不可用,可以使用下表来确定为特定无人机尺寸购买哪种电机和螺旋桨:

选择电子速度控制取决于无刷电机的最大输入电流。为了安全起见,我选择了 30 安培的电调,因为我的电机消耗的电流远小于 30 安培。(电子速度控制只是一个小模块,它允许我们通过简单地以脉冲形式发送信号来控制电机的速度)。

无人机物理 -> 因为我们有 4 个电机,一组电机将顺时针旋转,另一组逆时针旋转。发生这种情况是因为如果所有电机都逆时针旋转以保存角动量,则四轴飞行器将在顺时针方向上执行偏航(绕 z 轴旋转)运动。

绕 x 轴旋转 -> 俯仰

绕 y 轴旋转 -> 滚动

绕 z 轴旋转 -> 偏航

确保在焊接时将 1 对 esc 以 cw 格式焊接,另一对以 ccw 格式焊接到无刷电机。(即一对 esc 应该相同地焊接到无刷电机 -> 黄色到黄色线,黑色到黑色线和红色到红色线。在下一对中,只需轻弹任意 2 根线)。esc 的另一端应焊接到框架上已经存在的配电板上。

将 Xt-60 连接器焊接到框架上,稍后将用于将电池连接到配电板。

  • Arduino 连接:

Arduino Uno 是这个四轴飞行器的主要大脑,应该出现在中心,因为那里的振动最小。

MPU 6050 应焊接在 Arduino 原型扩展板上,连接应如下所示 ->

电压 ->+5v

接地->接地

SCL ->A5

SDA ->A4

Major NOTE-> esc 应尽可能远离 mpu6050 模块,因为如果它们保持靠近,由于电磁干扰,esc 会影响 mpu 模块测量的值并使 quad 不稳定。

esc 的信号线应连接到引脚 D4 到 D7,接收模块(远程)应连接到引脚 D6 到 D9。

为了给 Arduino 加电,我们直接从配电板获取输入并在它们之间连接一个二极管(这样做是为了确保当代码被闪存到 Arduino 时,计算机的串行端口不会因高压而损坏电池)。

我们连接 2 个 1 和 1.5 千欧姆的电阻来测量电池电压(这是通过制作简单的分压器电路完成的)。输入电压将用于在电池电压低于特定限制时发出警报并向用户发出警报)。

  • 模块说明:
  • MPU6050:

该模块将构成基本的惯性测量单元 (IMU),用于测量所有 3 轴上的四边形角度。加速度计测量线性加速度,该加速度将用于计算以 g 为单位的作用在四边形上的力(使用科里奥利力的概念)。g 中的值和反三角函数将使我们能够计算四边形的角度。

我们使用陀螺仪的原因是测量角速度,角速度将再次用于测量角度。不能简单地使用加速度计,因为当四边形运动时,它给出的值将是随机且不稳定的。因此,通过测量角速度和数据表中的一些固定值,我们可以确定角度。因此,IMU 使用 2 个模块测量角度。此外,为了减少来自此类微电子机械传感器 (MEMS) 的噪声,我们让读数通过滤波器。

  • Arduino:主要代码由该模块运行。该代码初始化所有模块并确保接收到正确的信号。还添加了一个安全机制,以确保只有当所有遥控杆都处于低位时四轮驱动才启动。

该代码的刷新率为 250 HZ,即它每 4000 微秒进行一次更正。

此时,它能够生成:

  • 读取陀螺仪角度数据
  • 计算 PID 修正
  • 电压降补偿脉冲
  • 将计算出的脉冲发送到 esc

每个脉冲由 1000 到 2000 微秒组成。

  • 代码说明:

代码文件由 3 个代码组成,即

  • YMFC_设置文件->

该文件用于在飞行前配置整个四轴飞行器并将收集到的数据存储在 E2PROM 中(这允许我们将数据存储在 Arduino 上,即使 Arduino 断电)。此代码用于检查遥控器传输的中心和端点,即 rc 发送的信号值(以微秒为单位),这是必不可少的,因为它会根据输入限制四轴飞行器的飞行。它还用于配置无人机的 3 轴并确定哪个部分是四边形的机头(这样做是为了确保不需要轴反转,即如果四边形向右转,IMU 应该以 +ve 度测量角度,因为这是选择的约定)。所有这些读数都存储在 Arduino 的 eeprom 上,随后由其他模块使用 库中的内置函数检索。

  • YMFC_esc_calibrate ->

此代码是必不可少的,因为它用于同步四轴飞行器的所有电机,即所有电机应在给油门时同时启动。与此代码一起,我们检查 IMU 测量的角度并估计所需的校正(在四边形将显示所有角度 0 度的水平上没有必要)。检查接收器信号,最后此代码用于平衡螺旋桨与电机。完成这种平衡是为了减少电机产生的振动并且不影响 mpu6050 模块,平衡是通过在支柱上涂上一块绝缘胶带来抑制它来完成的。

  • YMFC_flight_controller->

最重要的模块。在这个模块中,我们使用了之前从其他模块收集的所有数据。代码初始化并获取大约 2000 个角度读数,以计算代码在 void loop() 中执行时需要消除的任何恒定误差。它还确保电池电压最佳以及来自远程的所有信号是否正常工作。

在 void loop 函数中,仅当执行特殊的摇杆序列时才会启动电机,并且还会使用特殊的摇杆序列来切断电机。稍后根据 quad 的输入和方向确定脉冲并将其发送到 esc。需要注意的最重要的一点是,我们直接在代码中使用了机器级语句,因为通过使用 Arduino ide 提供的内置函数,代码超过了可用的 4000 微秒时间(即刷新率)。

PID -> 比例积分和微分:

这是软件最重要的组成部分

比例项:当输入和当前位置之间的差异(误差)很高时,该项会产生更高的输出。

积分项:该项用于消除系统中存在的恒定误差,比例项无法消除这些误差,因为它比较四边形的先前位置和当前位置,并基于此生成输出。

导数项:称为积分结束的严重问题会增加四边形的压力并可能导致严重的不平衡,因此我们使用导数项来预测轨迹的未来并在误差变化率过大时减慢四边形.

最后,我们利用了自动水平功能,当摇杆处于中心位置时,它会使无人机保持平衡。这完全是因为 IMU 使四边形与 3 轴对齐。

 

 


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

评论(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的无人机构建',//标题 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);