的MPU6050是IC 3轴加速计和3轴陀螺仪组合成一个单元。它还装有温度传感器和DCM,以执行复杂的任务。MPU6050通常用于构建无人机和其他自平衡机器人等远程机器人。在本项目中,我们将学习如何使用MPU6050内置的测斜仪或水平仪。如我们所知,倾角仪用于检查表面是否完全平整,它们既可以用作气泡仪也可以用作数字仪表。在这个项目中,我们将构建一个可以使用Android应用程序进行监视的数字测斜仪。使用手机之类的远程显示器的原因是,我们可以监控MPU6050中的值而无需查看硬件,当MPU6050放置在无人机或其他无法进入的位置时,这将非常方便。
所需材料:
- Arduino Pro迷你(5V)
- MPU6050陀螺仪传感器
- HC-05或HC-06蓝牙模块
- FTDI板
- 面包板
- 连接线
- 手机
电路原理图:
该Arduino倾斜传感器项目的完整电路图如下所示。它只有三个组件,可以很容易地在面包板上构建。
在与I2C的帮助MPU6050连通,因此SDA引脚连接到阿尔杜伊诺的A4销是SDA引脚和SCL引脚连接到阿尔杜伊诺的A5销。的HC-06蓝牙模块可与串行通讯因此蓝牙的Rx引脚连接到销D11和蓝牙的Tx引脚连接到Arduino的销D10的帮助。通过编程Arduino,这些引脚D10和D11将被配置为串行引脚。HC-05模块和MSP6050模块的工作电压为+ 5V,因此它们由Arduino的Vcc引脚供电,如上所示。
我使用了一些面包板连接线,并在一个小面包板上建立了设置。连接完成后,我的电路板如下所示。
为您的设置供电:
您可以像我一样通过FTDI编程板为电路供电,或者使用9V电池或12V适配器将其连接至Arduino pro mini的Raw引脚。Arduino Pro-mini具有内置电压调节器,该电压调节器可将该外部电压调节为+ 5V转换。
编程Arduino:
硬件准备好后,我们就可以开始对Arduino进行编程了。与往常一样,可以在本页底部找到该项目的完整代码。但是为了更好地理解该项目,我将代码分解为一些小技巧,并按以下步骤进行了说明。
第一步是将MPU6050与Arduino接口。对于这个项目,我们将使用由Korneliusz开发的库,可以从下面的链接下载该库
MPU6050自由-Korneliusz Jarzebski
下载ZIP文件并将其添加到您的Arduino IDE。然后转到 File-> Examples-> Arduino_MPU6050_Master-> MPU6050_gyro_pitch_roll_yaw 。这将打开使用我们刚刚下载的库的示例程序。因此,单击上载并等待程序被上载到您的Arduino Pro mini。完成后,打开串行监视器,将波特率设置为115200,然后检查是否得到以下内容。
最初,所有三个值都将为零,但是当您移动面包板时,您可以观察到这些值被更改。如果更改,则表明您的连接正确,否则请检查您的连接。在这里花一些时间,注意俯仰角和偏航角这三个值如何根据倾斜传感器的方式而变化。如果您感到困惑,请按Arduino上的Reset(重置)按钮,然后将值再次初始化为零,然后将传感器向一个方向倾斜,并检查哪些值在变化。下图将帮助您更好地理解。
在这三个参数中,我们仅对Roll和Pitch感兴趣。Roll值将告诉我们有关X轴的倾斜度,而Pitch值将告诉我们有关Y轴的倾斜度。到目前为止,我们已经了解了基础知识,可以实际开始对Arduino进行编程以读取这些值,并通过蓝牙将其发送到Arduino。一如既往,让我们首先包括该项目所需的所有库
#包括
然后,我们初始化蓝牙模块的软件序列。这是有可能的,因为Arduino中的软件串行库,可以将IO引脚编程为用作串行引脚。在这里,我们使用数字引脚D10和D11,其中D10为Rx,D11为Tx。
SoftwareSerial BT(10,11); // RX,TX
接下来,我们初始化程序所需的变量和对象,然后移至 setup() 函数,在此我们为串行监视器和蓝牙指定波特率。对于HC-05和HC-06,波特率为9600,因此必须使用相同的波特率。然后,我们检查Arduino的IIC总线是否已连接到MPU6050,否则,我们将打印警告消息,并在连接设备后一直保持在那里。之后,我们校准陀螺仪并使用其相应功能设置其阈值,如下所示。
void setup(){Serial.begin(115200); BT.begin(9600); //以9600波特率启动蓝牙通信// //初始化MPU6050 while(!mpu.begin(MPU6050_SCALE_2000DPS,MPU6050_RANGE_2G)){Serial.println(“找不到有效的MPU6050传感器,请检查接线!”);延迟(500); } mpu.calibrateGyro(); //在启动mpu.setThreshold(3)时校准陀螺仪; //控制灵敏度}
该行“ mpu.calibrateGyro();” 校准MPU6050的当前位置。每当需要校准MPU6050并将所有值都设置为零时,可以在程序中多次调用该行。 “ mpu.setThreshold(3);” 此功能控制该值随传感器的运动而变化多少,太低的值会增加噪音,因此在摆弄时要小心。
在 void loop()中, 我们反复读取陀螺仪和 温度传感器的值,计算俯仰,滚动和偏航的值,并将其发送到蓝牙模块。接下来的两行将读取原始陀螺仪值和温度值
向量范数= mpu.readNormalizeGyro(); temp = mpu.readTemperature();
接下来,我们通过乘以时间步长并将其加到先前的值来计算俯仰,横滚和偏航。一 时间步长 也不过是连续的读数之间的时间间隔。
间距=间距+规范YAxis * timeStep; roll = roll + norm.XAxis * timeStep; yaw = yaw + norm.ZAxis * timeStep;
为了更好地了解时间步长,让我们看一下下面的行。放置该行以精确于10mS或0.01秒的间隔从MPU6050读取值。因此,我们将timeStep的值声明为0.01。如果还有更多时间,请使用下面的行来保存该程序。(millis()– timer())给出程序到目前为止执行所花费的时间。我们只用0.01秒减去它,剩下的时间我们只是使用延迟功能将程序保存在那里。
延迟((timeStep * 1000)-(millis()-计时器));
一旦完成读取和计算值,我们就可以通过蓝牙将其发送到手机中。但是这里有一个陷阱。我们正在使用的蓝牙模块只能发送1字节(8位),这使我们只能发送0到255之间的数字。因此,我们必须拆分数值并将其映射到此范围内。这是通过以下几行完成的
如果(roll> -100 && roll <100)x =地图(roll,-100,100,0,100); if(pitch> -100 && pitch <100)y = map(pitch,-100,100,100,200); 如果(temp> 0 && temp <50)t = 200 + int(temp);
可以看出,roll的值被映射到变量x中的0到100中,并且音调被映射到变量y中的100到200中,而temp映射到变量t中的200和以上。我们可以使用相同的信息从已发送的内容中检索数据。最后,我们使用以下几行通过蓝牙写入这些值。
BT.write(x); BT.write(y); BT.write(t);
如果您了解完整的程序,请向下滚动以查看该程序并将其上载到Arduino开发板。
使用Processing准备Android应用程序:
Arduino测斜仪的android应用程序是使用Processing IDE开发的。这与Arduino非常相似,可用于创建系统应用程序,Android应用程序,网页设计等等。我们已经使用处理来开发下面列出的其他一些很酷的项目
- 使用Arduino的Ping Pong游戏
- 使用处理的智能手机控制的FM广播。
- 使用处理和超声波传感器的Arduino雷达系统
但是,无法解释有关如何创建此应用程序的完整代码。因此,您有两种方法可以解决此问题。您可以从下面的链接下载APK文件,然后直接在手机上安装android应用程序。或滚动至下方以找到完整的处理代码,并亲自了解其工作原理
在ZIP文件中,您可以找到一个名为 data 的文件夹,其中包含所有要加载到android应用程序中的图像和其他来源。下一行决定了蓝牙应自动连接到的名称
bt.connectToDeviceByName(“ HC-06”);
在 draw() 函数内部,将重复执行这些操作,此处我们将绘制图像,显示文本并根据蓝牙模块中的值对条进行动画处理。您可以通过阅读程序来检查每个功能内部发生了什么。
void draw()//无限循环{background(0); imageMode(CENTER); 图片(徽标,宽度/ 2,高度/1.04,宽度,高度/ 12); load_images(); textfun(); getval(); }
最后,还有一件重要的事情要解释,请记住,我们将音调,滚动和温度的值分割为0到255。因此,在这里,我们通过将其反向映射到正常值来再次将其恢复为正常值。
如果(info <100 && info> 0)x = map(info,0,100,-(width / 1.5)/ 3,+(width / 1.5)/ 3); // x = info; 否则,如果(info <200 && info> 100)y = map(info,100,200,-(width / 4.5)/0.8,+(width / 4.5)/0.8); // y = info; 否则(info> 200)temp = info -200; println(temp,x,y);
有很多更好的方法可以将数据从蓝牙模块获取到电话中,但是由于这只是一个业余项目,我们已经忽略了它们,如果有兴趣,您可以深入研究。
Arduino测斜仪的工作原理:
在您准备好硬件和应用程序之后,该该玩弄我们构建的内容了。将Arduino代码上传到开发板上,您还可以删除 Serial.println 行上的注释,并使用串行监视器检查硬件是否按预期工作。无论如何,那是完全可选的。
代码上传后,在手机上启动Android应用程序。该应用程序应自动连接到您的HC-06模块,并在应用程序的顶部显示“ Connect to:HC-06”,如下所示。
最初,除温度值外,所有值均为零。这是因为Arduino已针对该位置校准了MPU-6050作为参考,现在您可以倾斜硬件并检查移动应用程序上的值是否也随着动画而改变。可以在下面的视频中找到该应用程序的完整工作。因此,现在您可以将试验板放置在任何地方,并检查表面是否完全平整。
希望您了解该项目并从中学到一些有用的东西。如有任何疑问,请使用下面的评论部分或论坛以解决它。