MPU6050是一个 IC 3 轴加速度计和一个 3 轴陀螺仪组合成一个单元。它还包含一个温度传感器和一个DCM,用于执行复杂的任务。MPU6050通常用于构建无人机和其他远程机器人,如自平衡机器人。在这个项目中,我们将学习如何使用MPU6050构建的倾角仪或精神调平器。众所周知,倾角仪用于检查表面是否完美调平,它们既可以作为气泡式仪表,也可以作为数字仪表使用。在这个项目中,我们将构建一个可以使用Android应用程序进行监控的数字倾角仪。使用手机等远程显示器的原因是,我们可以监控 MPU6050 的值而无需查看硬件,当 MPU6050 放置在无人机或其他一些无法访问的位置时,这将非常方便。
所需材料:
Arduino Pro-mini (5V)
MPU6050 陀螺仪传感器
HC-05 或 HC-06 蓝牙模块
富贸发展板
面包板
连接线
智能手机
电路图:
此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引脚供电,如上所示。
我使用了一些面包板连接线,并在一个小面包板上构建了设置。连接完成后,我的电路板如下所示。
为您的设置提供动力:
您可以像我一样通过FTDI编程板为电路供电,也可以使用9V电池或12V适配器并将其连接到Arduino pro mini的Raw引脚。Arduino Pro-mini有一个内置的稳压器,可以转换这个外部电压调节+5V。
对 Arduino 进行编程:
硬件准备就绪后,我们可以开始对Arduino进行编程。与往常一样,该项目的完整代码可以在此页面底部找到。但是为了更好地理解该项目,我将代码分解为小问题,并按照以下步骤进行解释。
第一步是将MPU6050与Arduino接口。
下载 ZIP 文件并将其添加到您的 Arduino IDE。然后前往文件->示例->Arduino_MPU6050_Master-> MPU6050_gyro_pitch_roll_yaw。这将打开使用我们刚刚下载的库的示例程序。因此,单击上传并等待程序上传到Arduino Pro mini。完成后,打开串行监视器并将波特率设置为115200,然后检查是否得到以下内容。
连续获取俯仰滚偏航的值
最初,所有三个值都将为零,但是当您移动面包板时,您可以观察到这些值正在发生变化。如果他们更改,则表示您的连接正确,否则请检查您的连接。花点时间在这里注意俯仰滚动和偏航三个值如何根据您倾斜传感器的方式而变化。如果您感到困惑,请按Arduino上的重置按钮,值将再次初始化为零,然后将传感器向一个方向倾斜并检查哪些值正在变化。下图将帮助您更好地理解。
解释横滚俯仰和偏航
在这三个参数中,我们只对滚动和俯仰感兴趣。滚动值将告诉我们 X 轴的倾角,俯仰值将告诉我们 Y 轴的倾角。现在我们已经了解了基础知识,让我们开始对Arduino进行编程,以读取这些值,通过蓝牙将其发送到Arduino。与往常一样,让我们首先包含此项目所需的所有库
#include //Lib for IIC communication
#include //Lib for MPU6050
#include // import the serial library
然后我们初始化蓝牙模块的软件序列号.这是可能的,因为Arduino中的软件串行库,IO引脚可以编程为串行引脚。这里我们使用数字引脚 D10 和 D11,其中 D10 id 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()内部,我们反复读取陀螺仪和温度传感器的值,计算俯仰,滚动和偏航的值,将其发送到蓝牙模块。以下两行将读取原始陀螺仪值和温度值
Vector norm = mpu.readNormalizeGyro();
temp = mpu.readTemperature();
接下来,我们通过乘以时间步长并将其与先前的值相加来计算俯仰、横滚和偏航。时间步长只不过是连续读数之间的间隔。
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);
正如您可以计算的那样,滚动的值映射到变量 x 中的 0 到 100,音高映射到变量 y 中的 100 到 200,温度映射到变量 t 中的 200 及以上。我们可以使用相同的信息从我们发送的内容中检索数据。最后,我们使用以下行通过蓝牙写入这些值。
BT.write(x);
BT.write(y);
BT.write(t);
如果您已经了解了完整的程序,请向下滚动以查看该程序并将其上传到Arduino板。
使用处理准备 Android 应用程序:
这个Arduino倾角仪的安卓应用程序是使用处理IDE开发的。这与Arduino非常相似,可用于创建系统应用程序,Android应用程序,网页设计等等。
在ZIP文件中,您可以找到一个名为data的文件夹,其中包含要加载到android应用程序中的所有图像和其他来源。以下行决定蓝牙应自动连接到哪个名称
bt.connectToDeviceByName("HC-06");
在 draw() 函数中, 这些东西将在这里重复执行,我们绘制图像, 显示文本并根据蓝牙模块中的值对条形进行动画处理.您可以通过通读程序来检查每个函数内部发生的情况。
void draw() //The infinite loop
{
background(0);
imageMode(CENTER);
image(logo, width/2, height/1.04, width, height/12);
load_images();
textfun();
getval();
}
最后,还有一件重要的事情需要解释,请记住,我们将俯仰、滚动和温度的值拆分为 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);
有更好的方法将数据从蓝牙模块传输到手机, 但由于这只是一个爱好项目,我们忽略了它们, 如果有兴趣,您可以深入挖掘.
Arduino测斜仪的工作:
准备好硬件和应用程序后,是时候享受我们构建的内容了。将Arduino代码上传到开发板,您还可以删除Serial.println行上的注释,并使用串行监视器检查硬件是否按预期工作。无论如何,这是完全可选的。
上传代码后,在手机上启动Android应用程序。应用程序应自动连接到您的 HC-06 模块,它将在应用程序顶部显示“连接到:HC-06”,如下所示。
最初,除温度值外,所有值都将为零。这是因为Arduino已针对此位置校准了MPU-6050作为参考,现在您可以倾斜硬件并检查移动应用程序上的值是否也随着动画而变化。该应用程序的完整工作可以在下面给出的视频中找到。因此,现在您可以将面包板放置在任何地方,并检查表面是否完全平整。
/*
MPU6050 Librarey: https://github.com/jarzebski/Arduino-MPU6050 ; (c) 2014 by Korneliusz Jarzebski
*/
#include //Lib for IIC communication
#include //Lib for MPU6050
#include // 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
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();
}
全部0条评论
快来发表一下你的评论吧 !