基于arduino的MPU6050的使用

摘要


MPU6050是InvenSense公司推出的全球首款整合性6軸運動處理組件碌奉,內(nèi)部整合了3軸陀螺儀和3軸加速度傳感器。在制作自平衡小車和四軸六軸時需要用來做姿態(tài)的監(jiān)控键畴。


本文核心記錄使用arduino uno開發(fā)板獲取


MPU6050三軸數(shù)據(jù)的基本操作


硬件接線


MPU6050模塊使用的數(shù)據(jù)接口協(xié)議是I2C總線協(xié)議芋绸,在arduino中使用Wire類庫來實現(xiàn)MPU6050的訪問。


接線方式:

? ? //VCC--5V

? ? //GND--GND

? ? //SCL--A5

? ? //SDA--A4

? ? //AD0-- (AD0引腳為地址選擇引腳梁沧,懸空或者接GND,硬件地址為0x68呈枉,接VCC/高電平硬件地址為0x69)

? ? //INT-- (中斷引腳趁尼,如果用到可以接中端口,此處不接)

需要使用到的Wire庫方法

1.wire.begin();/wire.begin(address);不帶參數(shù)為以主機模式進入總線模式猖辫,帶參數(shù)為以從機模式進入總線酥泞。

2.Wire.beginTransmission(address);開啟對應器件的傳輸。

3. Wire.write(address); //指定操作寄存器的地址啃憎。

4.Wire.write(0); //寫入一個字節(jié)的數(shù)據(jù)0芝囤。

5.Wire.requestFrom(address, n, true);//向器件請求2個字節(jié)的數(shù)據(jù),特別說明辛萍,此處地址為器件地址悯姊。請求返回的數(shù)據(jù)存儲到緩沖區(qū)buffer中

6.Wire.endTransmission(true); //結(jié)束傳輸,釋放總線

7.Wire.available();//返回總線緩沖區(qū)有效數(shù)據(jù)字節(jié)數(shù)贩毕;

8.Wire.read();//從緩沖區(qū)buffer中讀取數(shù)據(jù)悯许,一次讀取一個字節(jié)


示例1.從MPU6050中讀數(shù)據(jù)

Wire.beginTransmission(0x68); //開啟MPU6050的傳輸

Wire.write(0x3F); //指定需要讀取數(shù)據(jù)的寄存器地址

Wire.requestFrom(0x68, 2, true); //向器件發(fā)出2個字節(jié)數(shù)據(jù)的請求

Wire.endTransmission(true); //結(jié)束傳輸,釋放總線

while ((Wire.available() < 2));//等待2字節(jié)數(shù)據(jù)存入緩沖區(qū)辉阶。

int val = Wire.read() << 8 | Wire.read();

示例2.向MPU6050中寫數(shù)據(jù)

Wire.beginTransmission(0x68); //開啟MPU6050的傳輸

Wire.write(0x6B); //指定寄存器地址

Wire.write(0); //寫入一個字節(jié)的數(shù)據(jù)

Wire.endTransmission(true); //結(jié)束傳輸釋放總線


MPU6050模塊的訪問


1.? ? 啟動器件:在對MPU6050進行各項操作前先壕,需要先啟動該器件,具體操作就是向它的0x6B寫入一個字節(jié)的數(shù)據(jù)0谆甜。


//向0x6B寫入一個字節(jié)的數(shù)據(jù)0垃僚,啟動器件

void MPU_START(void)

{

Wire.beginTransmission(0x68); //開啟MPU6050的傳輸

Wire.write(0x6B); //指定寄存器地址

Wire.write(0); //寫入一個字節(jié)的數(shù)據(jù)0

Wire.endTransmission(true); //結(jié)束傳輸釋放總線

}


2.? ? ? 配置MPU6050的倍率:默認加速度倍率±2g,默認角速度±250度/s。寄存器0x1B和0x1C兩個寄存器的bit4+bit3分別用來配置角速度倍率和加速度倍率规辱,用f表示倍率谆棺。


//角速度倍率更新配置

void GYRO_COFIG(unsigned int f)

{

Wire.beginTransmission(0x68); //開啟MPU-6050的傳輸

Wire.write(0x1B); //角速度倍率寄存器的地址

Wire.requestFrom(0x68, 1, true); //請求讀出原配置

unsigned char acc_conf = Wire.read();//原配置讀出

acc_conf = ((acc_conf & 0xE7) | (f << 3));//倍率配置更新

Wire.write(acc_conf);更新倍率寫入

Wire.endTransmission(true); //結(jié)束傳輸,釋放總線


//加速度倍率更新配置

void ACCEL_COFIG(unsigned int f)

{

Wire.beginTransmission(0x68); //開啟MPU-6050的傳輸

Wire.write(0x1C); //加速度倍率寄存器的地址

Wire.requestFrom(0x68, 1, true); //請求讀出原配置

unsigned char acc_conf = Wire.read();//原配置讀出

acc_conf = ((acc_conf & 0xE7) | (f << 3));//倍率配置更新

Wire.write(acc_conf);更新倍率寫入

Wire.endTransmission(true); //結(jié)束傳輸罕袋,釋放總線

3.? ? ? 數(shù)據(jù)獲取和換算:加速度角速度和溫度數(shù)據(jù)均為16位數(shù)據(jù)改淑,寄存器地址如下:

0x3B碍岔,加速度計的X軸分量ACCEL_X

0x3D,加速度計的Y軸分量ACCEL_Y

0x3F溅固,加速度計的Z軸分量ACCEL_Z

0x41付秕,當前溫度TEMP

0x43,繞X軸旋轉(zhuǎn)的角速度GYRO_X

0x45侍郭,繞Y軸旋轉(zhuǎn)的角速度GYRO_Y

0x47询吴,繞Z軸旋轉(zhuǎn)的角速度GYRO_Z

從寄存器讀取到的數(shù)據(jù)為2個字節(jié)的對應的數(shù)據(jù)分量,需要將獲取的數(shù)據(jù)分量換算成相應的加速度和角速度亮元。


換算方法:實際數(shù)值=對應數(shù)據(jù)分量/32768*倍率


假設(shè)猛计,角速度和加速度倍率配置均默認為0,則角速度倍率±250度/s爆捞,加速度倍率為±2g奉瘤。

則X軸角速度和加速度分別為gyr_x=GYRO_X/32768*250

acc_x=ACCEL_X/32768*2g;

g為當?shù)刂亓铀俣龋?.8m/s^2;

其中:MPU6050寄存器詳細說明可以查詢產(chǎn)品的數(shù)據(jù)手冊煮甥。

完整實例代碼:


// Visual Micro is in vMicro>General>Tutorial Mode

//

/*


? ? Name:? ? ? MPU6050_TestDemo.ino

? ? Created:2020/3/18 星期三 20:17:09

? ? Author:? ? SilenceJerui

*/

/*

? ? 接線方式:

? ? //MPU6050--UNO

? ? //VCC--5V

? ? //GND--GND

? ? //SCL--A5

? ? //SDA--A4

? ? //AD0-- (AD0引腳為地址選擇引腳盗温,懸空或者接GND,硬件地址為0x68成肘,接VCC/高電平硬件地址為0x69)

? ? //INT-- (中斷引腳卖局,如果用到可以接中端口,此處不接)

*/


#include <Wire.h>

// Define User Types below here or use a .h file

//

#define ACCEL_CONFIG 1

#define GYRO_CONFIG 1

#define G 9.8

float val_seven[7];

// Define Function Prototypes that use User Types below here or use a .h file

//

// Define Functions below here or use other .ino or cpp files

//向0x6B寫入一個字節(jié)的數(shù)據(jù)0双霍,啟動器件

void MPU_START(void)

{

? ? Wire.beginTransmission(0x68); //開啟MPU6050的傳輸

? ? Wire.write(0x6B); //指定寄存器地址

? ? Wire.write(0); //寫入一個字節(jié)的數(shù)據(jù)

? ? Wire.endTransmission(true); //結(jié)束傳輸砚偶,true表示釋放總線

}

//配置角速度倍率

void GYRO_CONFIG_SET(int f)

{

? ? Wire.beginTransmission(0x68); //開啟MPU-6050的傳輸

? ? Wire.write(0x1B); //角速度倍率寄存器的地址

? ? Wire.requestFrom(0x68, 1, true); //先讀出原配置

? ? unsigned char acc_conf = Wire.read();

? ? acc_conf = ((acc_conf & 0xE7) | (f << 3));

? ? Wire.write(acc_conf);

? ? Wire.endTransmission(true); //結(jié)束傳輸,true表示釋放總線

}

//配置加速度倍率

void ACCEL_CONFIG_SET(int f)

{

? ? Wire.beginTransmission(0x68); //開啟MPU-6050的傳輸

? ? Wire.write(0x1C); //加速度倍率寄存器的地址

? ? Wire.requestFrom(0x68, 1, true); //先讀出原配置

? ? unsigned char acc_conf = Wire.read();

? ? acc_conf = ((acc_conf & 0xE7) | (f << 3));

? ? Wire.write(acc_conf);

? ? Wire.endTransmission(true); //結(jié)束傳輸洒闸,true表示釋放總線

}


//獲取MPU數(shù)據(jù)

void Get_Value(void)

{

? ? //獲取各個軸分量數(shù)據(jù)

? ? Wire.beginTransmission(0x68); //開啟MPU-6050的傳輸

? ? Wire.write(0x3B);

? ? Wire.requestFrom(0x68, 7 * 2, true);

? ? Wire.endTransmission(true);

? ? for (long i = 0; i < 7; ++i)

? ? {

? ? ? ? val_seven[i] = Wire.read() << 8 | Wire.read();

? ? }

? ? //數(shù)據(jù)換算

? ? val_seven[0] = (float)(val_seven[0] / 32768 * (2 ^ ACCEL_CONFIG) * G);//acc_x

? ? val_seven[1] = (float)(val_seven[1] / 32768 * (2 ^ ACCEL_CONFIG) * G);//acc_y

? ? val_seven[2] = (float)(val_seven[2] / 32768 * (2 ^ ACCEL_CONFIG) * G);//acc_z

? ? val_seven[4] = (float)(val_seven[4] / 32768 * (2 ^ GYRO_CONFIG) * 250);//gyr_x

? ? val_seven[5] = (float)(val_seven[5] / 32768 * (2 ^ GYRO_CONFIG) * 250);//gyr_y

? ? val_seven[6] = (float)(val_seven[6] / 32768 * (2 ^ GYRO_CONFIG) * 250);//gyr_z

}


// The setup() function runs once each time the micro-controller starts

void setup()

{

? ? Serial.begin(9600);

? ? Wire.begin();//以主機模式開啟總線

? ? MPU_START();//啟動MPU6050

? ? GYRO_CONFIG_SET(0);//配置器件角速度倍率

? ? ACCEL_CONFIG_SET(0);//配置器件加速度倍率

}

// Add the main program code into the continuous loop() function

void loop()

{

? ? Get_Value();

? ? Serial.print("acc_x:");

? ? Serial.print('\t');

? ? Serial.println(val_seven[0]);

? ? Serial.print("acc_y:");

? ? Serial.print('\t');

? ? Serial.println(val_seven[1]);

? ? Serial.print("acc_z:");

? ? Serial.print('\t');

? ? Serial.println(val_seven[2]);

? ? Serial.print("gyr_x:");

? ? Serial.print('\t');

? ? Serial.println(val_seven[4]);

? ? Serial.print("gyr_y:");

? ? Serial.print('\t');

? ? Serial.println(val_seven[5]);

? ? Serial.print("gyr_z:");

? ? Serial.print('\t');

? ? Serial.println(val_seven[6]);

? ? delay(500);

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末染坯,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子丘逸,更是在濱河造成了極大的恐慌单鹿,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件深纲,死亡現(xiàn)場離奇詭異羞反,居然都是意外死亡,警方通過查閱死者的電腦和手機囤萤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來是趴,“玉大人涛舍,你說我怎么就攤上這事∷敉荆” “怎么了富雅?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵掸驱,是天一觀的道長。 經(jīng)常有香客問我没佑,道長毕贼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任蛤奢,我火速辦了婚禮鬼癣,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘啤贩。我一直安慰自己待秃,他們只是感情好,可當我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布痹屹。 她就那樣靜靜地躺著章郁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪志衍。 梳的紋絲不亂的頭發(fā)上暖庄,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天,我揣著相機與錄音楼肪,去河邊找鬼培廓。 笑死,一個胖子當著我的面吹牛淹辞,可吹牛的內(nèi)容都是我干的医舆。 我是一名探鬼主播,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼象缀,長吁一口氣:“原來是場噩夢啊……” “哼蔬将!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起央星,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤霞怀,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后莉给,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體毙石,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年颓遏,在試婚紗的時候發(fā)現(xiàn)自己被綠了徐矩。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡叁幢,死狀恐怖滤灯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤鳞骤,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布窒百,位于F島的核電站,受9級特大地震影響豫尽,放射性物質(zhì)發(fā)生泄漏篙梢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一美旧、第九天 我趴在偏房一處隱蔽的房頂上張望渤滞。 院中可真熱鬧,春花似錦陈症、人聲如沸蔼水。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽趴腋。三九已至,卻和暖如春论咏,著一層夾襖步出監(jiān)牢的瞬間优炬,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工厅贪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蠢护,地道東北人。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓养涮,卻偏偏與公主長得像葵硕,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子贯吓,可洞房花燭夜當晚...
    茶點故事閱讀 45,047評論 2 355

推薦閱讀更多精彩內(nèi)容