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ā)展板
面包板
連接線
電路圖:
此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è)置。連接完成后,我的電路板如下所示。
為您的設(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。
對(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”,如下所示。
最初,除溫度值外,所有值都將為零。這是因?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();
}
-
Android
+關(guān)注
關(guān)注
12文章
3939瀏覽量
127638 -
MPU6050
+關(guān)注
關(guān)注
39文章
307瀏覽量
71516 -
傾角儀
+關(guān)注
關(guān)注
0文章
9瀏覽量
2650
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論