0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何使用MPU6050構(gòu)建的傾角儀或精神調(diào)平器

科技觀察員 ? 來(lái)源:circuitdigest ? 作者:阿斯文斯·拉吉 ? 2022-11-17 17:43 ? 次閱讀

MPU6050是一個(gè) IC 3 軸加速度計(jì)和一個(gè) 3 軸陀螺儀組合成一個(gè)單元。它還包含一個(gè)溫度傳感器和一個(gè)DCM,用于執(zhí)行復(fù)雜的任務(wù)。MPU6050通常用于構(gòu)建無(wú)人機(jī)和其他遠(yuǎn)程機(jī)器人,如自平衡機(jī)器人。在這個(gè)項(xiàng)目中,我們將學(xué)習(xí)如何使用MPU6050構(gòu)建的傾角儀或精神調(diào)平器。眾所周知,傾角儀用于檢查表面是否完美調(diào)平,它們既可以作為氣泡式儀表,也可以作為數(shù)字儀表使用。在這個(gè)項(xiàng)目中,我們將構(gòu)建一個(gè)可以使用Android應(yīng)用程序進(jìn)行監(jiān)控的數(shù)字傾角儀。使用手機(jī)等遠(yuǎn)程顯示器的原因是,我們可以監(jiān)控 MPU6050 的值而無(wú)需查看硬件,當(dāng) MPU6050 放置在無(wú)人機(jī)或其他一些無(wú)法訪問(wèn)的位置時(shí),這將非常方便。

所需材料:

Arduino Pro-mini (5V)

MPU6050 陀螺儀傳感器

HC-05 或 HC-06 藍(lán)牙模塊

富貿(mào)發(fā)展板

面包板

連接線

智能手機(jī)

poYBAGN2AmCAFjx_AACIAuIl-5o476.jpg

電路圖:

poYBAGN2AmSASWfjAACVhEZ5MWA003.png

此Arduino傾斜傳感器項(xiàng)目的完整電路圖如下所示。它只有三個(gè)組件,可以很容易地在面包板上構(gòu)建。

MPU6050在I2C的幫助下進(jìn)行通信,因此SDA引腳連接到Arduino的A4引腳,即SDA引腳,SCL引腳連接到Arduino的A5引腳。HC-06藍(lán)牙模塊在串行通信的幫助下工作,因此藍(lán)牙的Rx引腳連接到引腳D11,藍(lán)牙的Tx引腳連接到Arduino的引腳D10。這些引腳 D10 和 D11 將通過(guò)對(duì) Arduino 進(jìn)行編程配置為串行引腳。HC-05模塊和MSP6050模塊工作在+5V電壓下,因此它們由Arduino的Vcc引腳供電,如上所示。

我使用了一些面包板連接線,并在一個(gè)小面包板上構(gòu)建了設(shè)置。連接完成后,我的電路板如下所示。

pYYBAGN2AmaABOcYAACyJr05Xb8685.jpg

為您的設(shè)置提供動(dòng)力:

您可以像我一樣通過(guò)FTDI編程板為電路供電,也可以使用9V電池或12V適配器并將其連接到Arduino pro mini的Raw引腳。Arduino Pro-mini有一個(gè)內(nèi)置的穩(wěn)壓器,可以轉(zhuǎn)換這個(gè)外部電壓調(diào)節(jié)+5V。

poYBAGN2AmeAM-PSAABpW9zId-A976.jpg

對(duì) Arduino 進(jìn)行編程:

硬件準(zhǔn)備就緒后,我們可以開(kāi)始對(duì)Arduino進(jìn)行編程。與往常一樣,該項(xiàng)目的完整代碼可以在此頁(yè)面底部找到。但是為了更好地理解該項(xiàng)目,我將代碼分解為小問(wèn)題,并按照以下步驟進(jìn)行解釋。

第一步是將MPU6050與Arduino接口。

下載 ZIP 文件并將其添加到您的 Arduino IDE。然后前往文件->示例->Arduino_MPU6050_Master-> MPU6050_gyro_pitch_roll_yaw。這將打開(kāi)使用我們剛剛下載的庫(kù)的示例程序。因此,單擊上傳并等待程序上傳到Arduino Pro mini。完成后,打開(kāi)串行監(jiān)視器并將波特率設(shè)置為115200,然后檢查是否得到以下內(nèi)容。

連續(xù)獲取俯仰滾偏航的值

最初,所有三個(gè)值都將為零,但是當(dāng)您移動(dòng)面包板時(shí),您可以觀察到這些值正在發(fā)生變化。如果他們更改,則表示您的連接正確,否則請(qǐng)檢查您的連接?;c(diǎn)時(shí)間在這里注意俯仰滾動(dòng)和偏航三個(gè)值如何根據(jù)您傾斜傳感器的方式而變化。如果您感到困惑,請(qǐng)按Arduino上的重置按鈕,值將再次初始化為零,然后將傳感器向一個(gè)方向傾斜并檢查哪些值正在變化。下圖將幫助您更好地理解。

解釋橫滾俯仰和偏航

在這三個(gè)參數(shù)中,我們只對(duì)滾動(dòng)和俯仰感興趣。滾動(dòng)值將告訴我們 X 軸的傾角,俯仰值將告訴我們 Y 軸的傾角?,F(xiàn)在我們已經(jīng)了解了基礎(chǔ)知識(shí),讓我們開(kāi)始對(duì)Arduino進(jìn)行編程,以讀取這些值,通過(guò)藍(lán)牙將其發(fā)送到Arduino。與往常一樣,讓我們首先包含此項(xiàng)目所需的所有庫(kù)

#include //Lib for IIC communication
#include //Lib for MPU6050
#include // import the serial library
然后我們初始化藍(lán)牙模塊的軟件序列號(hào).這是可能的,因?yàn)锳rduino中的軟件串行庫(kù),IO引腳可以編程為串行引腳。這里我們使用數(shù)字引腳 D10 和 D11,其中 D10 id Rx 和 D11 是 Tx。

SoftwareSerial BT(10, 11); // RX, TX
接下來(lái),我們初始化程序所需的變量和對(duì)象,然后轉(zhuǎn)到setup()函數(shù),在其中指定串行監(jiān)視器和藍(lán)牙的波特率。對(duì)于 HC-05 和 HC-06,波特率為 9600,因此必須使用相同的波特率。然后我們檢查Arduino的IIC總線是否連接到MPU6050,如果沒(méi)有,我們會(huì)打印警告消息,只要設(shè)備已連接,就會(huì)保持在那里。之后,我們校準(zhǔn)陀螺儀并使用其各自的功能設(shè)置其閾值,如下所示。

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();”行校準(zhǔn)MPU6050當(dāng)前放置的位置。每當(dāng)需要校準(zhǔn)MPU6050并將所有值設(shè)置為零時(shí),可以在程序內(nèi)多次調(diào)用此線路?!癿pu.setThreshold(3);”此功能控制傳感器上移動(dòng)的值變化程度,太低的值會(huì)增加噪聲,因此在擺弄它時(shí)要小心。

在void loop()內(nèi)部,我們反復(fù)讀取陀螺儀和溫度傳感器的值,計(jì)算俯仰,滾動(dòng)和偏航的值,將其發(fā)送到藍(lán)牙模塊。以下兩行將讀取原始陀螺儀值和溫度值

Vector norm = mpu.readNormalizeGyro();
temp = mpu.readTemperature();
接下來(lái),我們通過(guò)乘以時(shí)間步長(zhǎng)并將其與先前的值相加來(lái)計(jì)算俯仰、橫滾和偏航。時(shí)間步長(zhǎng)只不過(guò)是連續(xù)讀數(shù)之間的間隔。

pitch = pitch + norm.YAxis * timeStep;
roll = roll + norm.XAxis * timeStep;
yaw = yaw + norm.ZAxis * timeStep;
為了更好地理解時(shí)間步長(zhǎng),讓我們看一下下面的行。放置此行以 10mS 或 0.01 秒的間隔精確讀取 MPU6050 的值。所以我們聲明 timeStep 的值為 0.01。如果還有更多時(shí)間,請(qǐng)使用下面的行來(lái)保持程序。(millis() – timer()) 給出到目前為止程序執(zhí)行所花費(fèi)的時(shí)間。我們只需用 0.01 秒減去它,在剩余的時(shí)間內(nèi),我們只需使用延遲函數(shù)將程序保留在那里。

delay((timeStep*1000) - (millis() - timer));
完成讀取和計(jì)算值后,我們可以通過(guò)藍(lán)牙將它們發(fā)送到我們的手機(jī)。但這里有一個(gè)問(wèn)題。我們使用的藍(lán)牙模塊只能發(fā)送 1 字節(jié) (8 位) 這允許我們僅發(fā)送從 0 到 255 的數(shù)字.因此,我們必須拆分我們的值并將其映射到此范圍內(nèi)。這是通過(guò)以下行完成的

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);
正如您可以計(jì)算的那樣,滾動(dòng)的值映射到變量 x 中的 0 到 100,音高映射到變量 y 中的 100 到 200,溫度映射到變量 t 中的 200 及以上。我們可以使用相同的信息從我們發(fā)送的內(nèi)容中檢索數(shù)據(jù)。最后,我們使用以下行通過(guò)藍(lán)牙寫入這些值。

BT.write(x);
BT.write(y);
BT.write(t);
如果您已經(jīng)了解了完整的程序,請(qǐng)向下滾動(dòng)以查看該程序并將其上傳到Arduino板。

使用處理準(zhǔn)備 Android 應(yīng)用程序:
這個(gè)Arduino傾角儀的安卓應(yīng)用程序是使用處理IDE開(kāi)發(fā)的。這與Arduino非常相似,可用于創(chuàng)建系統(tǒng)應(yīng)用程序,Android應(yīng)用程序,網(wǎng)頁(yè)設(shè)計(jì)等等。

在ZIP文件中,您可以找到一個(gè)名為data的文件夾,其中包含要加載到android應(yīng)用程序中的所有圖像和其他來(lái)源。以下行決定藍(lán)牙應(yīng)自動(dòng)連接到哪個(gè)名稱

bt.connectToDeviceByName("HC-06");
在 draw() 函數(shù)中, 這些東西將在這里重復(fù)執(zhí)行,我們繪制圖像, 顯示文本并根據(jù)藍(lán)牙模塊中的值對(duì)條形進(jìn)行動(dòng)畫處理.您可以通過(guò)通讀程序來(lái)檢查每個(gè)函數(shù)內(nèi)部發(fā)生的情況。

void draw() //The infinite loop
{
background(0);
imageMode(CENTER);
image(logo, width/2, height/1.04, width, height/12);
load_images();
textfun();
getval();
}
最后,還有一件重要的事情需要解釋,請(qǐng)記住,我們將俯仰、滾動(dòng)和溫度的值拆分為 0 到 255。因此,在這里,我們?cè)俅瓮ㄟ^(guò)將其反向映射到正常值來(lái)將其恢復(fù)為正常值。

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);
有更好的方法將數(shù)據(jù)從藍(lán)牙模塊傳輸?shù)绞謾C(jī), 但由于這只是一個(gè)愛(ài)好項(xiàng)目,我們忽略了它們, 如果有興趣,您可以深入挖掘.

Arduino測(cè)斜儀的工作:
準(zhǔn)備好硬件和應(yīng)用程序后,是時(shí)候享受我們構(gòu)建的內(nèi)容了。將Arduino代碼上傳到開(kāi)發(fā)板,您還可以刪除Serial.println行上的注釋,并使用串行監(jiān)視器檢查硬件是否按預(yù)期工作。無(wú)論如何,這是完全可選的。

上傳代碼后,在手機(jī)上啟動(dòng)Android應(yīng)用程序。應(yīng)用程序應(yīng)自動(dòng)連接到您的 HC-06 模塊,它將在應(yīng)用程序頂部顯示“連接到:HC-06”,如下所示。

pYYBAGN2AmmAQuo1AAC9UbH8FZw269.jpg

最初,除溫度值外,所有值都將為零。這是因?yàn)锳rduino已針對(duì)此位置校準(zhǔn)了MPU-6050作為參考,現(xiàn)在您可以傾斜硬件并檢查移動(dòng)應(yīng)用程序上的值是否也隨著動(dòng)畫而變化。該應(yīng)用程序的完整工作可以在下面給出的視頻中找到。因此,現(xiàn)在您可以將面包板放置在任何地方,并檢查表面是否完全平整。

/*


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();

}

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Android
    +關(guān)注

    關(guān)注

    12

    文章

    3939

    瀏覽量

    127638
  • MPU6050
    +關(guān)注

    關(guān)注

    39

    文章

    307

    瀏覽量

    71516
  • 傾角儀
    +關(guān)注

    關(guān)注

    0

    文章

    9

    瀏覽量

    2650
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    跪求mpu6050解算傾角的程序

    最近在做塔機(jī)的檢測(cè)平臺(tái),但是在測(cè)水平方面遇到了問(wèn)題,本想用MPU6050模塊檢測(cè)塔機(jī)的垂直度,但是這個(gè)傳感好像不能直接輸出傾斜角度(Z軸的傾角或者XY方向的傾角),顯示
    發(fā)表于 03-30 17:04

    STM32 實(shí)現(xiàn) MPU6050 數(shù)據(jù)讀取與傾角檢測(cè)

    都不懂的東西。事實(shí)上如果你只是想從傳感讀出陀螺儀和加速度值,并簡(jiǎn)單計(jì)算一下坐標(biāo)傾角(不涉及姿態(tài)解算、四元素等),其實(shí)沒(méi)有想象中那么難。PS:MPU6050 的確涉及到許多令人敬畏的數(shù)學(xué)知識(shí),但如果
    發(fā)表于 05-05 18:02

    關(guān)于MPU6050的簡(jiǎn)介

    關(guān)于MPU6050前言簡(jiǎn)介首先,個(gè)人是通過(guò)野火的視頻,有專門介紹MPU6050的版塊來(lái)做的了解。然后關(guān)于MPU6050基本認(rèn)識(shí)跟坐標(biāo)系就不做闡述了MPU6050主要是陀螺
    發(fā)表于 08-03 07:37

    MPU6050簡(jiǎn)介

    時(shí),MPU-60X0提供完整的9軸運(yùn)動(dòng)融合輸出到其主I2CSPI端口(SPI僅在MPU-6000上可用)。MPU6050, 該芯片內(nèi)部集成一個(gè)三軸加速度傳感
    發(fā)表于 02-11 07:46

    MPU6050陀螺原理圖代碼

    MPU6050陀螺使用( 原理圖代碼 )
    發(fā)表于 10-29 15:24 ?96次下載

    MPU6050(硬件IIC)

    MPU6050(硬件IIC)MPU6050(硬件IIC)
    發(fā)表于 04-02 16:29 ?79次下載

    mpu6050測(cè)試程序

     InvenSense公司的三軸陀螺MPU6050測(cè)試程序。IIC接口,51單片機(jī)驅(qū)動(dòng),LCD1602同步顯示。
    發(fā)表于 11-07 14:01 ?6142次閱讀
    <b class='flag-5'>mpu6050</b>測(cè)試程序

    Arduino與MPU6050的通信

    為避免糾纏于電路細(xì)節(jié),我們直接使用集成的MPU6050模塊。MPU6050的數(shù)據(jù)接口用的是I2C總線協(xié)議,因此我們需要Wire程序庫(kù)的幫助來(lái)實(shí)現(xiàn)Arduino與MPU6050之間的通信。請(qǐng)先確認(rèn)你的Arduino編程環(huán)境中已安裝
    發(fā)表于 11-07 14:25 ?7839次閱讀
    Arduino與<b class='flag-5'>MPU6050</b>的通信

    mpu6050怎么與單片機(jī)連接

    本文開(kāi)始介紹了mpu6050的定義和mpu6050的感測(cè)范圍,其次闡述了mpu6050特征,最后介紹了mpu6050與單片機(jī)的連接方法。
    發(fā)表于 03-09 08:42 ?2.7w次閱讀

    mpu6050姿態(tài)解算原理_mpu6050姿態(tài)解算程序

    mpu6050常用作提供飛控運(yùn)行時(shí)的姿態(tài)測(cè)量和計(jì)算。本文首先介紹了MPU6050姿態(tài)解算的原理,其次詳細(xì)的介紹了mpu6050姿態(tài)解算程序。
    的頭像 發(fā)表于 03-09 09:15 ?4.4w次閱讀

    MPU6050簡(jiǎn)介

    MPU6050簡(jiǎn)介什么是MPU6050MPU6050的特點(diǎn)MPU6050框圖MPU6050初始化MPU6050—DMP使用介紹
    發(fā)表于 12-06 11:51 ?76次下載
    <b class='flag-5'>MPU6050</b>簡(jiǎn)介

    MPU6050常見(jiàn)問(wèn)題的分析與處理

    # MPU6050常見(jiàn)問(wèn)題的分析與處理本文主要針對(duì)STM32使用MPU6050過(guò)程中產(chǎn)生的問(wèn)題進(jìn)行分析和處理,部分內(nèi)容也適用于其他單片機(jī)。本文基于MPU6050自帶的DMP算法。文章內(nèi)容對(duì)于M
    發(fā)表于 12-06 12:21 ?43次下載
    <b class='flag-5'>MPU6050</b>常見(jiàn)問(wèn)題的分析與處理

    MPU6050( )

    MPU6050( )
    發(fā)表于 12-06 15:06 ?31次下載
    <b class='flag-5'>MPU6050</b>( )

    如何使用MPU6050和Arduino構(gòu)建一個(gè)數(shù)字量角

    MPU6050是一款 集成 了 IC 3 軸加速度計(jì)和 3 軸陀螺的 單元。它還包含一個(gè)溫度傳感和一個(gè) DCM 來(lái)執(zhí)行復(fù)雜的任務(wù)。MPU6050 常用于
    發(fā)表于 08-31 15:42 ?5593次閱讀
    如何使用<b class='flag-5'>MPU6050</b>和Arduino<b class='flag-5'>構(gòu)建</b>一個(gè)數(shù)字量角<b class='flag-5'>器</b>

    MPU6050的Arduino陀螺游戲

    電子發(fā)燒友網(wǎng)站提供《帶MPU6050的Arduino陀螺游戲.zip》資料免費(fèi)下載
    發(fā)表于 11-11 11:20 ?1次下載
    帶<b class='flag-5'>MPU6050</b>的Arduino陀螺<b class='flag-5'>儀</b>游戲