0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何使用MPU6050构建的倾角仪或精神调平器

科技观察员 来源:circuitdigest 作者:阿斯文斯·拉吉 2022-11-17 17:43 次阅读

MPU6050是一个 IC 3 轴加速度计和一个 3 轴陀螺仪组合成一个单元。它还包含一个温度传感器和一个DCM,用于执行复杂的任务。MPU6050通常用于构建无人机和其他远程机器人,如自平衡机器人。在这个项目中,我们将学习如何使用MPU6050构建的倾角仪或精神调平器。众所周知,倾角仪用于检查表面是否完美调平,它们既可以作为气泡式仪表,也可以作为数字仪表使用。在这个项目中,我们将构建一个可以使用Android应用程序进行监控的数字倾角仪。使用手机等远程显示器的原因是,我们可以监控 MPU6050 的值而无需查看硬件,当 MPU6050 放置在无人机或其他一些无法访问的位置时,这将非常方便。

所需材料:

Arduino Pro-mini (5V)

MPU6050 陀螺仪传感器

HC-05 或 HC-06 蓝牙模块

富贸发展板

面包板

连接线

智能手机

poYBAGN2AmCAFjx_AACIAuIl-5o476.jpg

电路图:

poYBAGN2AmSASWfjAACVhEZ5MWA003.png

此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引脚供电,如上所示。

我使用了一些面包板连接线,并在一个小面包板上构建了设置。连接完成后,我的电路板如下所示。

pYYBAGN2AmaABOcYAACyJr05Xb8685.jpg

为您的设置提供动力:

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

poYBAGN2AmeAM-PSAABpW9zId-A976.jpg

对 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”,如下所示。

pYYBAGN2AmmAQuo1AAC9UbH8FZw269.jpg

最初,除温度值外,所有值都将为零。这是因为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();

}

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

    关注

    12

    文章

    3851

    浏览量

    125637
  • MPU6050
    +关注

    关注

    38

    文章

    304

    浏览量

    69835
  • 倾角仪
    +关注

    关注

    0

    文章

    9

    浏览量

    2488
收藏 人收藏

    评论

    相关推荐

    跪求mpu6050解算倾角的程序

    最近在做塔机的检测平台,但是在测水平方面遇到了问题,本想用MPU6050模块检测塔机的垂直度,但是这个传感好像不能直接输出倾斜角度(Z轴的倾角或者XY方向的倾角),显示
    发表于 03-30 17:04

    STM32 实现 MPU6050 数据读取与倾角检测

    都不懂的东西。事实上如果你只是想从传感读出陀螺仪和加速度值,并简单计算一下坐标倾角(不涉及姿态解算、四元素等),其实没有想象中那么难。PS:MPU6050 的确涉及到许多令人敬畏的数学知识,但如果
    发表于 05-05 18:02

    如何用MPU6050三轴加速度计算出倾角

    如何用三轴加速度 计算出倾角?用MPU6050
    发表于 07-08 04:49

    关于MPU6050的简介

    关于MPU6050前言简介首先,个人是通过野火的视频,有专门介绍MPU6050的版块来做的了解。然后关于MPU6050基本认识跟坐标系就不做阐述了MPU6050主要是陀螺
    发表于 08-03 07:37

    MPU6050的使用步骤

    文章目录前言一、MPU6050是什么?二、使用步骤1.引入库2.读入数据总结前言一、MPU6050是什么?MPU6050是一款性价比很高的陀螺,可以读取X Y Z 三轴角度,X Y
    发表于 02-10 07:22

    MPU6050简介

    时,MPU-60X0提供完整的9轴运动融合输出到其主I2CSPI端口(SPI仅在MPU-6000上可用)。MPU6050, 该芯片内部集成一个三轴加速度传感
    发表于 02-11 07:46

    mpu6050无法获取绝对角度吗?

    之前用ADXL345是可以获得相对于世界坐标的绝对倾角角度但用MPU6050(原子的例程),似乎只能获得相对于初始化时的角度。 也就是初始化时候如果不是水平,而是倾斜30度(比如拿俯仰角来说),那么
    发表于 11-06 08:02

    MPU6050原理图

    MPU6050原理图,PDF格式,还蛮清晰。
    发表于 03-24 17:25 109次下载

    MPU6050(硬件IIC)

    MPU6050(硬件IIC)MPU6050(硬件IIC)
    发表于 04-02 16:29 71次下载

    一文看懂mpu9150和mpu6050区别

    本文开始对mpu9150进行了介绍,其次介绍了mpu6050的定义、mpu6050感测范围以及mpu6050的特征,最后阐述了mpu9150
    发表于 03-08 10:07 4.1w次阅读

    mpu6050怎么与单片机连接

    本文开始介绍了mpu6050的定义和mpu6050的感测范围,其次阐述了mpu6050特征,最后介绍了mpu6050与单片机的连接方法。
    发表于 03-09 08:42 2.6w次阅读

    mpu6050姿态解算原理_mpu6050姿态解算程序

    mpu6050常用作提供飞控运行时的姿态测量和计算。本文首先介绍了MPU6050姿态解算的原理,其次详细的介绍了mpu6050姿态解算程序。
    的头像 发表于 03-09 09:15 4.2w次阅读

    MPU6050简介

    MPU6050简介什么是MPU6050MPU6050的特点MPU6050框图MPU6050初始化MPU6050—DMP使用介绍
    发表于 12-06 11:51 67次下载
    <b class='flag-5'>MPU6050</b>简介

    MPU6050( )

    MPU6050( )
    发表于 12-06 15:06 30次下载
    <b class='flag-5'>MPU6050</b>( )

    如何使用MPU6050和Arduino构建一个数字量角器

    MPU6050是一款 集成 了 IC 3 轴加速度计和 3 轴陀螺仪的 单元。它还包含一个温度传感器和一个 DCM 来执行复杂的任务。MPU6050 常用于构建无人机和其他远程机器人,如自平衡机器人。在这个项目中,我们将使用
    发表于 08-31 15:42 4476次阅读
    如何使用<b class='flag-5'>MPU6050</b>和Arduino<b class='flag-5'>构建</b>一个数字量角器