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,然后檢查是否得到以下內容。
連續獲取俯仰滾偏航的值
最初,所有三個值都將為零,但是當您移動面包板時,您可以觀察到這些值正在發生變化。如果他們更改,則表示您的連接正確,否則請檢查您的連接?;c時間在這里注意俯仰滾動和偏航三個值如何根據您傾斜傳感器的方式而變化。如果您感到困惑,請按Arduino上的重置按鈕,值將再次初始化為零,然后將傳感器向一個方向傾斜并檢查哪些值正在變化。下圖將幫助您更好地理解。
解釋橫滾俯仰和偏航
在這三個參數中,我們只對滾動和俯仰感興趣。滾動值將告訴我們 X 軸的傾角,俯仰值將告訴我們 Y 軸的傾角?,F在我們已經了解了基礎知識,讓我們開始對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并將所有值設置為零時,可以在程序內多次調用此線路?!癿pu.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();
}
-
Android
+關注
關注
12文章
3925瀏覽量
127156 -
MPU6050
+關注
關注
39文章
307瀏覽量
71208 -
傾角儀
+關注
關注
0文章
9瀏覽量
2624
發布評論請先 登錄
相關推薦
評論