×

MPU6050教程开源分享

消耗积分:2 | 格式:zip | 大小:0.00 MB | 2023-06-25

分享资料个

描述

 

poYBAGSBqwqAE6nUAAKG6tloSi8599.jpg
 

 

第 2 步:简介

 
 
 
poYBAGSBqxSAIze0AAJLam1v3f0662.jpg
 
1 / 3
 

MPU6050是世界上第一个集成 6 轴运动跟踪设备,将 3 轴陀螺仪、3 轴加速度计和数字运动处理器™ (DMP) 全部结合在一个小型 4x4x0.9mm 封装中,即中间的集成电路,它基于I2C通信协议,具体不讨论,参考MPU 6050的Datasheet

 

第 3 步:硬件

 
 
 
pYYBAGSBqxeAdFuRAAGGXfSWGaQ606.jpg
 
1 / 4
 

MPU 6050 采用模块形式,有 8 个引脚,但不用担心,我们将只使用 4 个重要引脚,足以与我们的 Arduino 板集成。

所以我们有 VCC,接地,它接受从 2v 到 5v 的任何输入,因为这个板上有一个稳压器,因此支持 3.3v 逻辑高电平和 5v 逻辑高电平。

接下来我们有一些 SMD 封装的免费电阻器和电容器,最重要的部分是 MPU6050 IC,它是一个 MEMS 或微机电系统,它根据轴位置的变化改变电压。

该 IC 还有 SCL SDA,它们是 I2C 引脚,XDA 和 XCL 是辅助串行引脚,在本教程中我们不会将它们与 Arduino 一起使用,我们有 AD0,它是辅助端口和主端口之间的地址选择,最后我们有 INT中断引脚,

我们的 Arduino UNO 和 NANO 的连接如下:

VCC-5v

接地 - 接地

沙中线 - A5

SDA-A4

(对于其他 Arduino 板,只有 SDA 和 SCL 引脚发生变化。)

这就是连接的全部

(在UTSOURCE找到所有组件

第 4 步:安装库

 
 
 
pYYBAGSBqxqAN_SbAAA5l29ckAw074.png
 
1 / 2
 

在开始编码之前,我们需要一个由 jarzebski 命名为 Arduino MPU-6050 的库,

我们还需要内置的 Wire Library,因此我们只需安装 MPU - 6050 Library。

这是MPU6050 库的链接

要将新库安装到您的 Arduino IDE 中,您可以使用库管​​理器。

  • 打开 IDE 并单击“Sketch”菜单,然后单击“Include Library”> 选择“Add.ZIP Library”选项。
  • 导航到 .zip 文件的位置并将其打开。

有关导入的更多信息,请参阅https://www.arduino.cc/en/guide/libraries

第 5 步:打开陀螺仪示例。

 
 
 
poYBAGSBqyGAEVyVAACPcp5dFy8042.jpg
 
1 / 2
 

将 MPU-6050 库添加到 Arduino IDE 后,我们有很多示例可供选择,例如

  • MPU6050_accel_pitch_roll
  • MPU6050_accel_simple
  • MPU6050_自由落体
  • MPU6050_gyro_pitch_roll_yaw
  • MPU6050_gyro_simple
  • MPU6050_运动
  • MPU6050_温度

我们需要慢慢了解库和基础知识,所以让我们从MPU6050_gyro_simple示例开始。

(你知道 MPU6050 也有一个温度传感器,但不是很准确所以我们没有在这里讨论它!)

第 6 步:理解代码

 
 
 
pYYBAGSBqy-ACTt4AAGIpz-yw6c157.jpg
 
1 / 3
 

基本上在这个例子中,我们将查看我们的传感器是否正常工作,因此我们将在串行监视器上显示传感器数据。

所以我们在设置部分开始串行监视器

Serial.begin(115200);

在此While 循环中,执行传感器测试序列。

while(!mpu.begin(MPU6050_SCALE_2000DPS, MPU6050_RANGE_2G))
{    Serial.println("Could not find a valid MPU6050 sensor, check wiring!");
delay(500);
}
有时我们正在做一个项目,并且必须将我们的传感器设置在一个特定的方向,我们需要偏移量,我们不需要这个教程,
  • 但要更改偏移量,只需取消注释这些行。
// mpu.setGyroOffsetX(155);
// mpu.setGyroOffsetY(15);
// mpu.setGyroOffsetZ(15);
( uncomment by removing "//" )
  • 有一条校准线,它实际上会将我们的传感器设置为平坦。
// Calibrate gyroscope. The calibration must be at rest.
// If you don't want calibrate, comment this line.
mpu.calibrateGyro();
记住偏移和校准是两个不同的东西,偏移会给你定义的校准,例如,你可以以奇怪的角度安装这个传感器,但它会作为零的参考点。
  • 接下来是灵敏度,默认值为 3。
// Set threshold sensivty. Default 3.
// If you don't want use threshold, comment this line or set 0.
mpu.setThreshold(3);
  • 在检查循环部分,完成了基本的硬件检查。
void checkSettings()
{
Serial.println();

Serial.print(" * Sleep Mode:        ");
Serial.println(mpu.getSleepEnabled() ? "Enabled" : "Disabled");

Serial.print(" * Clock Source:      ");
switch(mpu.getClockSource())
{
case MPU6050_CLOCK_KEEP_RESET:     Serial.println("Stops the clock and keeps the timing generator in reset"); break;
case MPU6050_CLOCK_EXTERNAL_19MHZ: Serial.println("PLL with external 19.2MHz reference"); break;
case MPU6050_CLOCK_EXTERNAL_32KHZ: Serial.println("PLL with external 32.768kHz reference"); break;
case MPU6050_CLOCK_PLL_ZGYRO:      Serial.println("PLL with Z axis gyroscope reference"); break;
case MPU6050_CLOCK_PLL_YGYRO:      Serial.println("PLL with Y axis gyroscope reference"); break;
case MPU6050_CLOCK_PLL_XGYRO:      Serial.println("PLL with X axis gyroscope reference"); break;
case MPU6050_CLOCK_INTERNAL_8MHZ:  Serial.println("Internal 8MHz oscillator"); break;
}

Serial.print(" * Gyroscope:         ");
switch(mpu.getScale())
{
case MPU6050_SCALE_2000DPS:        Serial.println("2000 dps"); break;
case MPU6050_SCALE_1000DPS:        Serial.println("1000 dps"); break;
case MPU6050_SCALE_500DPS:         Serial.println("500 dps"); break;
case MPU6050_SCALE_250DPS:         Serial.println("250 dps"); break;
}

Serial.print(" * Gyroscope offsets: ");
Serial.print(mpu.getGyroOffsetX());
Serial.print(" / ");
Serial.print(mpu.getGyroOffsetY());
Serial.print(" / ");
Serial.println(mpu.getGyroOffsetZ());

Serial.println();
}
我强烈建议保留此循环。
  • 在循环部分,这是整个代码中最重要的部分,即从我们的传感器获取值。首先我们需要调用值,使用 mpu.readRawGyro 或 mpu.readNormalizeGyro,现在原始和规范化的概念是这样的,原始基本上是数字,规范化值是经过过滤器和计算的值,或者你可以说,处理过的数据。
void loop()
{
Vector rawGyro = mpu.readRawGyro();
Vector normGyro = mpu.readNormalizeGyro();
  • 我们有 3 个轴,称为 xy 和 z,可以使用我们设置为 rawGyro 的变量名调用它们,后跟轴名,为了制作一个项目,我们将需要使用此变量名的 x、y 和 z 这 3 个值。轴命令。
Serial.print(" Xraw = ");
Serial.print(rawGyro.XAxis);
Serial.print(" Yraw = ");
Serial.print(rawGyro.YAxis);
Serial.print(" Zraw = ");
Serial.println(rawGyro.ZAxis);
Serial.print(" Xnorm = ");
Serial.print(normGyro.XAxis);
Serial.print(" Ynorm = ");
Serial.print(normGyro.YAxis);
Serial.print(" Znorm = ");
Serial.println(normGyro.ZAxis);
  • 最后,为了以舒适的速度查看值,让我们将延迟从 10 增加到 1000
delay(10);
}
由于我们的示例代码已准备就绪并且我们了解我们在代码中做了什么,现在是上传代码和查看结果的时候了。

代码可以在这里找到

 

第 7 步:在串口中查看结果

 
 
 
 
1 / 2
 

上传完成后,是时候打开串行监视器并观察输出了:

不要忘记将串口与我们在代码开头定义的波特率相匹配,即115200

如果我们的接线和硬件正确,我们应该在串行端口上获取每个轴的值,以获取传感器中原始和归一化陀螺仪的变化。

Initialize MPU6050
* Sleep Mode:        Disabled
* Clock Source:      PLL with X axis gyroscope reference
* Gyroscope:         2000 dps
* Gyroscope offsets: 0 / 0 / 0
Xraw = -65.00 Yraw = 25.00 Zraw = -29.00
Xnorm = 0.00 Ynorm = 0.00 Znorm = 0.00
Xraw = -62.00 Yraw = 20.00 Zraw = -32.00
Xnorm = 0.00 Ynorm = 0.00 Znorm = 0.00
Xraw = -64.00 Yraw = 25.00 Zraw = -30.00
Xnorm = 0.00 Ynorm = 0.00 Znorm = 0.00
Xraw = -66.00 Yraw = 23.00 Zraw = -29.00
Xnorm = 0.00 Ynorm = 0.00 Znorm = 0.00
Xraw = -67.00 Yraw = 20.00 Zraw = -33.00
Xnorm = 0.00 Ynorm = 0.00 Znorm = 0.00
Xraw = -64.00 Yraw = 22.00 Zraw = -31.00
Xnorm = 0.00 Ynorm = 0.00 Znorm = 0.00

这是我们在串口上得到的日志。

第 8 步:下一步是什么?

 


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

评论(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:'MPU6050教程开源分享',//标题 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);