index
原文:https://circuitdigest.com/microcontroller-projects/arduino-inclinometer-using-mpu6050
0. 简介:
MPU6050集成了一个3轴加速度计和3轴陀螺仪。MPU6050是集成 3轴加速计和3轴陀螺仪的IC。它还装有温度传感器和DCM,以执行复杂的任务。MPU6050通常用于构建Drone和其他远程机器人,例如自平衡机器人。在本项目中,我们将学习如何使用MPU6050内置的测斜仪或水平仪。如我们所知,倾角仪用于检查表面是否完全平整,可以将其用作气泡仪或数字仪表。在此项目中,我们将构建一个可以使用Android应用程序进行监视的数字测斜仪。使用手机之类的远程显示器的原因是,我们可以监控MPU6050中的值而无需查看硬件,当MPU6050放置在无人机或其他无法接近的位置时,这将非常方便。
1. 所需材料
- Arduino Pro-mini(5V)开发板
- MPU6050陀螺仪传感器
- HC-05或HC-06蓝牙模块
- FTDI转换板
- 面包板
- 连接导线
- 手机
2. 电路原理图
Arduino倾角仪项目的完整电路图如下所示。它只有三个组件,可以很容易地在面包板上构建。
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引脚供电。
我使用了一些面包板连接线,并将其安装在一个小型面包板上。连接完成后,电路板如下所示。
3. 提供电源
您可以像我那样通过FTDI编程板为您的电路供电,或者使用9V电池或12V适配器,并将其连接到Arduino pro mini的Raw引脚。 Arduino Pro-mini有一个内置稳压器,可将外部电压转换为+ 5V。
4. Arduino编程
4.1 程序说明
硬件准备好后,我们就可以开始对Arduino进行编程了。下载:该项目的完整代码。但是为了更好地理解该项目,我将代码分解为一些小技巧,并按以下步骤进行了说明。
第一步是将MPU6050与Arduino连接起来。对于这个项目,我们将使用Korneliusz开发的库,可以从下面的链接下载
MPU6050 Liberty - Korneliusz Jarzebski:https://github.com/jarzebski/Arduino-MPU6050
作者同时提供了关于kalman滤波器库:https://github.com/jarzebski/Arduino-KalmanFilter
下载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。我们首先包括该项目所需的所有库
#include <Wire.h> // IIC通信库
#include <MPU6050.h> // MPU6050的库
#include <SoftwareSerial.h> //导入串行库
然后,我们初始化蓝牙模块的软件序列。这是有可能的,因为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); //start the Bluetooth communication at 9600 baudrate
// Initialize MPU6050
while(!mpu.begin(MPU6050_SCALE_2000DPS, MPU6050_RANGE_2G))
{
Serial.println("Could not find a valid MPU6050 sensor, check wiring!");
delay(500);
}
mpu.calibrateGyro(); // Calibrate gyroscope during start
mpu.setThreshold(3); //Controls the sensitivty
}
“ mpu.calibrateGyro();”行将MPU6050校准为当前所处的位置。每当需要校准MPU6050并将所有值都设置为零时,可以在程序中多次调用该行。 “ mpu.setThreshold(3);”此函数控制传感器运动时的阀值,太低的值会增加噪声,因此在摆弄此值时要小心。
在void loop()中,我们反复读取陀螺仪和 温度传感器的值,计算出俯仰,滚动和偏航的值,然后将其发送到Bluetooth模块。接下来的两行将读取原始陀螺仪值和温度值
Vector norm = mpu.readNormalizeGyro();
temp = mpu.readTemperature();
接下来,我们通过乘以时间步长并将其与之前的值相加来计算俯仰,滚转和偏航。 timeStep不过是连续读数之间的间隔。
pitch = pitch + norm.YAxis * timeStep;
roll = roll + norm.XAxis * timeStep;
yaw = yaw + norm.ZAxis * timeStep;
为了更好地了解时间步长,让我们看一下下面的行。放置该行以精确于10mS或0.01秒的间隔从MPU6050读取值。因此,我们将timeStep的值声明为0.01。如果还有更多时间,请使用下面的行保存该程序。(millis()– timer())给出到目前为止程序执行所花费的时间。我们只用0.01秒减去它,剩下的时间我们只是使用延迟功能将程序保存在那里。
delay((timeStep*1000) - (millis() - timer));
一旦我们完成了读取和计算值,我们可以通过蓝牙将它们发送到我们的手机。但这里有一个问题。我们正在使用的蓝牙模块只能发送1个字节(8位),这使得我们只能从0到255发送数字。所以我们必须分割我们的值并将其映射到这个范围内。这由以下几行完成
if (roll>-100 && roll<100)
x = map (roll, -100, 100, 0, 100);
if (pitch>-100 && pitch<100)
y = map (pitch, -100, 100, 100, 200);
if (temp>0 && temp<50)
t = 200 + int(temp);
可以看出,roll的值被映射到变量x中的0到100中,并且pitch被映射到变量y中的100到200中,而temp映射到变量t中的200或更高。我们可以使用相同的信息从发送的数据中检索数据。最后,我们使用以下几行通过蓝牙写入这些值。
BT.write(x);
BT.write(y);
BT.write(t);
如果你已经理解完整的程序,向下滚动浏览程序并上传到Arduino板。
5. 准备Android应用程序
Arduino倾角仪的android应用程序是使用Processing IDE开发的。这与Arduino非常相似,可用于创建系统应用程序,Android应用程序,网页设计等等。我们已经使用处理来开发下面列出的其他一些很酷的项目
但是,无法解释如何创建此应用程序的完整代码。所以你有两种方法可以解决这个问题。您可以从下面的链接下载APK文件,并直接在手机上安装Android应用程序。
适用于Arduino测斜仪的Android APK文件 (右键单击并将链接另存为…)
注意:应用程序默认只连接到名为“HC-06”的蓝牙设备
6. 了解Processing代码:
对于那些选择了以后理解Processing代码的人,我想解释几个要点。该代码要求Android处理模式正常运行,而Android处理模式又需要Android SDK文件。安装有点笨重,但值得。其次,如果您尝试使用下面给出的代码,则需要以下ZIP文件,其中包含数据文件和代码
在ZIP文件中,您可以找到一个名为data的文件夹,其中包含所有要加载到android应用程序中的图像和其他来源。下一行决定了蓝牙应自动连接到的名称
bt.connectToDeviceByName("HC-06");
在draw()函数内部,将重复执行这些操作,在这里我们绘制图像,显示文本并根据Bluetooth模块中的值对条进行动画处理。您可以通过阅读程序来检查每个功能内部发生了什么
void draw() //The infinite loop
{
background(0);
imageMode(CENTER);
image(logo, width/2, height/1.04, width, height/12);
load_images();
textfun();
getval();
}
最后,还有一件重要的事情要解释,请记住,我们将pitch,roll和tempture的值分割为0到255。因此,在这里,我们通过将其反向映射到正常值来再次将其恢复为正常值。
if (info<100 && info>0)
x = map(info, 0, 100, -(width/1.5)/3, +(width/1.5)/3);//x = info;
else if (info<200 && info>100)
y = map(info, 100, 200, -(width/4.5)/0.8, +(width/4.5)/0.8);//y = info;
else if (info>200)
temp = info -200;
println(temp,x,y);
有许多更好的方法可以将数据从蓝牙模块获取到电话中,但是由于这只是一个业余项目,我们已经忽略了它们,如果有兴趣,您可以深入研究。
7. Arduino倾角仪的工作原理
在您准备好硬件和应用程序之后,该该玩弄我们构建的内容了。将Arduino代码上传到开发板上,您还可以删除Serial.println行上的注释,并使用串行监视器检查硬件是否按预期工作。无论如何,那是完全可选的。
代码上传后,在手机上启动Android应用程序。该应用程序应自动连接到您的HC-06模块,并在应用程序的顶部显示“ Connect to:HC-06”,如下所示。
最初,除温度值外,所有值都将为零。 这是因为Arduino已经将MPU-6050作为参考进行了校准,现在您可以倾斜硬件并检查移动应用程序的值是否随着动画一起改变。 该应用程序的完整工作可以在下面给出的视频中找到。 所以现在您可以将面包板放置在任何地方,并检查表面是否完美平整。
希望你理解这个项目并从中学到一些有用的东西。 如果您有任何疑问,请使用下面的评论部分或论坛来解决问题。
8. Code
/*
MPU6050 Librarey: https://github.com/jarzebski/Arduino-MPU6050 (c) 2014 by Korneliusz Jarzebski
*/
#include <Wire.h> //Lib for IIC communication
#include <MPU6050.h> //Lib for MPU6050
#include <SoftwareSerial.h>// import the serial library
SoftwareSerial BT(10, 11); // RX, TX
MPU6050 mpu;
unsigned long timer = 0;
unsigned long timer2 = 0;
float timeStep = 0.01;
float pitch = 0;
float roll = 0;
float yaw = 0;
float temp = 0;
void setup()
{
Serial.begin(115200);
BT.begin(9600); //start the Bluetooth communication at 9600 baudrate
// Initialize MPU6050
while (!mpu.begin(MPU6050_SCALE_2000DPS, MPU6050_RANGE_2G))
{
Serial.println("Could not find a valid MPU6050 sensor, check wiring!");
delay(500);
}
mpu.calibrateGyro(); // Calibrate gyroscope during start启动时校准陀螺仪
mpu.setThreshold(3); //Controls the sensitivty 控制灵敏度
}
void loop()
{
timer = millis();
//Read Gyro and Temperature sensor values读取陀螺仪和温度传感器的值
Vector norm = mpu.readNormalizeGyro();
temp = mpu.readTemperature();
// Calculate Pitch, Roll and Yaw
pitch = pitch + norm.YAxis * timeStep;
roll = roll + norm.XAxis * timeStep;
yaw = yaw + norm.ZAxis * timeStep;
// Print values
Serial.print(" Pitch = ");
Serial.print(pitch);
Serial.print(" Roll = ");
Serial.print(roll);
Serial.print(" Yaw = ");
Serial.print(yaw);
Serial.print(" Temp = ");
Serial.print(temp);
Serial.println(" *C");
delay((timeStep * 1000) - (millis() - timer)); //makes sure we read only at a an interval of 0.01 secounds确保我们仅以0.01秒的间隔读取
if ((millis() - timer2) > 200)
send_BT();
}
void send_BT()
{
int t;
int x;
int y;
if (roll > -100 && roll < 100)
x = map (roll, -100, 100, 0, 100);
if (pitch > -100 && pitch < 100)
y = map (pitch, -100, 100, 100, 200);
if (temp > 0 && temp < 50)
t = 200 + int(temp);
BT.write(x);
BT.write(y);
BT.write(t);
timer2 = millis();
}