一板网电子技术论坛

风筝
发表于: 2018-4-2 17:30:51 | 显示全部楼层

DIY-Arduino-Inclinometer-using-MPU6050.jpg


MPU6050集成了一个3轴加速度计和3轴陀螺仪。它还内置温度传感器和DCM来执行复杂的任务。 MPU6050通常用于建造无人机和其他远程机器人,如自平衡机器人。在这个项目中,我们将学习如何使用MPU6050构建倾角仪或者Spirit Leveller。正如我们所知,倾角仪用于检查表面是否完美平整,它们可以作为sprit bubbl表面或数字仪表。在这个项目中,我们将建立一个数字倾角仪,可以使用Android应用程序进行监控。使用类似移动电话的远程显示器的原因是我们可以监视MPU6050的值,而不必查看硬件,当MPU6050放置在无人机或其他一些不可接近的位置时,这将非常方便。


所需材料

●    Arduino Pro-mini(5V)开发板

●    MPU6050陀螺仪传感器

●    HC-05或HC-06蓝牙模块

●    FTDI转换板

●    面包板

●    连接导线

●    手机

MPU6050.jpg


电路原理图

Arduino倾角仪项目的完整电路图如下所示。它只有三个组件,可以很容易地在面包板上构建。

DIY-Arduino-Inclinometer-using-MPU6050-circuit-diagram.png


MPU6050通过I2C进行通信,因此SDA引脚连接到Arduino的A4引脚,该引脚是SDA引脚,SCL引脚连接到Arduino的A5引脚。 HC-06蓝牙模块工作在串行通信模式下,因此蓝牙的Rx引脚连接到引脚D11,蓝牙的Tx引脚连接到Arduino的D10引脚。这些引脚D10和D11将通过编程Arduino配置为串行引脚。 HC-05模块和MSP6050模块的工作电压为+ 5V,因此它们由Arduino的Vcc引脚供电,如上所示。

我使用了一些面包板连接线,并将其安装在一个小型面包板上。连接完成后,电路板如下所示。

DIY-Arduino-Inclinometer-using-MPU6050-hardware.jpg


为您的设置提供电源

您可以像我那样通过FTDI编程板为您的电路供电,或者使用9V电池或12V适配器,并将其连接到Arduino pro mini的Raw引脚。 Arduino Pro-mini有一个内置稳压器,可将外部电压转换为+ 5V。

FTDI-USB-to- TTL-Serial-Adapter-Module.jpg

编程你的Arduino

一旦硬件准备就绪,我们就可以开始编程我们的Arduino了。像往常一样,这个项目的完整代码可以在这个页面的底部找到。但为了更好地理解这个项目,我已经将代码分解成一小段,并在下面进行了解释。


第一步是将MPU6050与Arduino连接起来。对于这个项目,我们将使用Korneliusz开发的库,可以从下面的链接下载

MPU6050 Liberty - Korneliusz Jarzebski

下载ZIP文件并将其添加到您的Arduino IDE。然后前往File-> Examples-> Arduino_MPU6050_Master - > MPU6050_gyro_pitch_roll_yaw。这将打开使用我们刚刚下载的库的示例程序。所以点击上传,然后等待程序上传到你的Arduino Pro mini。完成之后,打开串口监视器并将波特率设置为115200,并检查是否获得了以下内容。

Getting-Value-of-Pitch-Roll-Yaw-serially.png

最初,所有三个值都将为零,但随着您移动面包板您可观察到这些值发生变化。如果他们改变它意味着你的连接是正确的,否则检查你的连接。请花一些时间注意三个值Pitch Roll和Yaw根据您的传感器倾斜方式而变化。如果您感到困惑,请按Arduino上的复位按钮,数值将再次初始化为零,然后向一个方向倾斜传感器,并检查哪些值是变化的。下面的图片会帮助你更好地理解。

Explaining-Roll-Pitch-and-Yaw.png

在这三个参数中,我们只对Roll和Pitch感兴趣。 Roll值会告诉我们X轴的倾斜度,而Pitch值会告诉我们Y轴的倾斜度。现在我们已经理解了基本知识,让我们开始编程Arduino以读取这些值,然后通过蓝牙将它发送给Arduino。一如既往,让我们从包含该项目所需的所有库开始

  1. #include <Wire.h> //Lib for IIC communication
  2. #include <MPU6050.h> //Lib for MPU6050
  3. #include <SoftwareSerial.h>// import the serial library
复制代码


然后我们初始化蓝牙模块的软件串口。通过使用Arduino中的软件串口库,可以将这些IO引脚编程为串行引脚。在这里,我们使用数字引脚D10和D11,其中D10 ID Rx和D11是Tx。

  1. SoftwareSerial BT(10, 11);  // RX, TX
复制代码


接下来,我们初始化程序所需的变量和对象,并转到setup()函数,在此函数中我们指定串行监视器和蓝牙的波特率。对于HC-05和HC-06,波特率为9600,因此必须使用相同的波特率。然后,我们检查Arduino的IIC总线是否连接到MPU6050,如果没有,我们会打印警告消息,并且只要设备连接就保持在那里。之后,我们校准陀螺仪并使用其各自的功能设置其阈值,如下所示。

  1. void setup()
  2. {
  3.   Serial.begin(115200);
  4.   BT.begin(9600); //start the Bluetooth communication at 9600 baudrate
  5.   // Initialize MPU6050
  6.   while(!mpu.begin(MPU6050_SCALE_2000DPS, MPU6050_RANGE_2G))
  7.   {
  8.     Serial.println("Could not find a valid MPU6050 sensor, check wiring!");
  9.     delay(500);
  10.   }
  11.   mpu.calibrateGyro();   // Calibrate gyroscope during start
  12.   mpu.setThreshold(3); //Controls the sensitivty
  13. }
复制代码


行“mpu.calibrateGyro();”校准MPU6050当前放置的位置。无论何时需要校准MPU6050并将所有值设置为零,都可以在程序中多次调用该行。 “mpu.setThreshold(3);”这个函数控制传感器移动的数值有多大,一个太小的值会增加噪声,所以在使用的时候要小心。


在void loop()内部,我们重复读取陀螺仪和温度传感器的值,计算俯仰,滚转和偏航的值,并将其发送到蓝牙模块。以下两行将读取原始陀螺仪值和温度值


  1.   Vector norm = mpu.readNormalizeGyro();
  2.   temp = mpu.readTemperature();
复制代码


接下来,我们通过乘以时间步长并将其与之前的值相加来计算俯仰,滚转和偏航。 timeStep不过是连续读数之间的间隔。

  1.   pitch = pitch + norm.YAxis * timeStep;
  2.   roll = roll + norm.XAxis * timeStep;
  3.   yaw = yaw + norm.ZAxis * timeStep;
复制代码


为了更好地理解时间步骤,我们来看看下面的一行。该行用于以10mS或0.01秒的间隔精确读取MPU6050的值。所以我们宣布timeStep的值为0.01。如果还有更多时间,请使用下面的行来保存程序。 (millis() - timer())给出程序执行到目前为止的时间。我们只用0.01秒来减去它,剩下的时间我们只是使用延迟函数来保存我们的程序。

  1. delay((timeStep*1000) - (millis() - timer));
复制代码

一旦我们完成了读取和计算值,我们可以通过蓝牙将它们发送到我们的手机。但这里有一个问题。我们正在使用的蓝牙模块只能发送1个字节(8位),这使得我们只能从0到255发送数字。所以我们必须分割我们的值并将其映射到这个范围内。这由以下几行完成


  1.   if (roll>-100 && roll<100)
  2.   x = map (roll, -100, 100, 0, 100);
  3.   if (pitch>-100 && pitch<100)
  4.   y = map (pitch, -100, 100, 100, 200);
  5.   if (temp>0 && temp<50)
  6.   t = 200 + int(temp);
复制代码

正如你可以看出,roll的值被映射到变量x的0到100,pitch被映射到变量y的100到200,temp被映射到变量t的200以上。我们可以使用相同的信息从我们发送的数据中检索数据。最后,我们使用以下几行通过蓝牙编写这些值。

  1.   BT.write(x);
  2.   BT.write(y);
  3.   BT.write(t);
复制代码

  如果你已经理解完整的程序,向下滚动浏览程序并上传到Arduino板。


准备Android应用程序

Arduino倾角仪的Android应用程序是使用Processing IDE开发的。这与Arduino非常相似,可以用来创建系统应用程序,Android应用程序,网页设计等等。


但是,无法解释如何创建此应用程序的完整代码。所以你有两种方法可以解决这个问题。您可以从下面的链接下载APK文件,并直接在手机上安装Android应用程序。


注意:应用程序默认只连接到名为“HC-06”的蓝牙设备

Android-app-screenshot.png


了解处理代码:

对于那些选择稍后了解处理代码的人,我想解释一些重要的观点。该代码要求Android的处理模式正在运行,而这又需要Android SDK文件。安装有点笨重,但它是值得的。其次,如果您试图使用下面给出的代码,那么您将需要以下ZIP文件,其中包含数据文件以及代码

用于Arduino倾角仪的处理程序ZIP文件


在ZIP文件中,您可以找到一个名为data的文件夹,其中包含要加载到android应用程序中的所有图像和其他来源。下面一行决定蓝牙应该自动连接到哪个名称

  1. bt.connectToDeviceByName("HC-06");
复制代码


在draw()函数内部,这些东西将在我们绘制图像的过程中重复执行,显示文本并根据蓝牙模块的值为条形状添加动画。您可以通过阅读程序来检查每个函数内发生了什么。

  1. void draw() //The infinite loop
  2. {
  3. background(0);
  4. imageMode(CENTER);
  5. image(logo, width/2, height/1.04, width, height/12);
  6.   load_images();
  7.   textfun();
  8.   getval();
  9. }
复制代码


最后,还有一件更重要的事情要解释,记住我们将音调,滚动和温度的值分为0到255.因此,我们再次通过将其反转到正常值来将其恢复到正常值。


  1.   if (info<100 && info>0)
  2.   x = map(info, 0, 100, -(width/1.5)/3, +(width/1.5)/3);//x = info;
  3.   else if (info<200 && info>100)
  4.   y = map(info, 100, 200, -(width/4.5)/0.8, +(width/4.5)/0.8);//y = info;
  5.   else if (info>200)
  6.   temp = info -200;
  7.   println(temp,x,y);
复制代码


从蓝牙模块到手机有很多更好的方法,但由于这只是一个嗜好项目,我们忽略了它们,如果您对此感兴趣,您可以深入挖掘。


Arduino测斜仪的工作:

在准备好硬件和应用程序之后,现在是时候享受我们已经建造的乐趣了。将Arduino代码上传到电路板,您还可以删除Serial.println行上的注释,并使用串行监视器检查硬件是否按预期工作。无论如何,这是完全可选的。

上传代码后,在您的手机上启动Android应用程序。应用程序应该自动连接到您的HC-06模块,它将在应用程序的顶部显示“Connect to:HC-06”,如下所示。

DIY-Arduino-Inclinometer-using-MPU6050-in-action.jpg

最初,除温度值外,所有值都将为零。 这是因为Arduino已经将MPU-6050作为参考进行了校准,现在您可以倾斜硬件并检查移动应用程序的值是否随着动画一起改变。 该应用程序的完整工作可以在下面给出的视频中找到。 所以现在您可以将面包板放置在任何地方,并检查表面是否完美平整。

希望你理解这个项目并从中学到一些有用的东西。 如果您有任何疑问,请使用下面的评论部分或论坛来解决问题。


代码

本教程使用的代码如下: main.rar (1000 Bytes, 下载次数: 7)

跳转到指定楼层
niko
发表于: 2018-9-10 09:25:11 | 显示全部楼层

楼主,我想问下,这个芯片是怎么固定在面包板上的啊,我买了一个MPU6050但是没法像这样固定在板上,总是感觉不稳,是不是中间还有一个接头?谢谢
回复

使用道具 举报

风筝
发表于: 2018-9-10 10:40:05 | 显示全部楼层

niko 发表于 2018-9-10 09:25
楼主,我想问下,这个芯片是怎么固定在面包板上的啊,我买了一个MPU6050但是没法像这样固定在板上,总是感 ...

做了一个MPU6050的小模块,将单独芯片焊接在电路板上,然后电路板引出了8引脚的插针。
回复

使用道具 举报

niko
发表于: 2018-9-10 15:43:07 | 显示全部楼层

风筝 发表于 2018-9-10 10:40
做了一个MPU6050的小模块,将单独芯片焊接在电路板上,然后电路板引出了8引脚的插针。 ...

哦。。好的,谢谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 156 | 回复: 242



Archiver|手机版|小黑屋|

GMT+8, 2018-11-13 02:05 , Processed in 0.031250 second(s), 31 queries . Powered by Discuz! X3.4

YiBoard一板网 © 2015-2018 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表