參考資料
參考資料說明:
用戶手冊時針對電路設計者的,一般時芯片的一些電氣特性和經典電路,同時,也會說明該芯片的一些測量精度。
寄存器地圖是針對驅動開發者的,主要告訴開發者如何使用(控制和讀取)傳感器。我們把精力放在寄存器地圖這個文檔即可。
資料下載:PDF
I2C
MPU9250 是由兩個模塊(MPU6500+AK8963)組合而成。其中MPU6500可以測量加速度和角加速度(6軸)。AK8963可以測量各個方向磁場數據(3軸)。一共是9軸。
MPU6500的I2C地址為0x68。
BMP280的I2C地址為0x76。
使用樹莓派4B可以用以下指令查詢:
sudo i2cdetect -y 1
# 查詢數據 最后一個1的含義指的是樹莓派的第二個i2c總線,第一個為0
sudo i2cdump -y 1 0x68
# 后面跟一個地址可查詢對應的數據,查詢Register Map可以知其具體含義。
設備ID
MPU6500的設備ID是** 0x70**。地址為0x75。
BMP設備ID是0x58,ID地址為0xD0。
可以根據ID判斷傳感器是否正確連接。
關鍵數據讀取
說明:在讀取數據之前,還需要對傳感器進行一些參數設定,這個部分可以參考Register Map的提示設定。(比如電源模式,測量精度,FIFO模式等)
MPU6500:讀取加速度數據&換算單位
查詢手冊,找到關鍵數據的寄存器地址,如下圖:
可以知道,測量的數據的起始地址是0x3B,分別是ax, ay, az, gx, gy, gz。每一個數據是16位,也就是2個字節,總測量數據長度是12個字節。在終端中,讀取數據如下
利用樹莓派的smbus庫,可以編寫如下代碼片段
def readAccel(self): # 這里以讀取加速度為例,角加速度同理
data = bus.read_i2c_block_data(self.address, ACCEL_OUT, 6) # 讀取六個字節
# 這里讀取的數據的格式是補碼,可以從手冊里查詢到。
x = self.dataConv(data[1], data[0]) # 這里需要按照高位數據在高位的規則左位運算,補碼
y = self.dataConv(data[3], data[2]) # 同上
z = self.dataConv(data[5], data[4]) # 同上
x = round(x*self.ares, 3) # 單位換算&四舍五入
y = round(y*self.ares, 3) # 同上
z = round(z*self.ares, 3) # 同上
**這里的單位換算需要根據測量精度乘以對應數值。**這個地方可以這樣理解,傳感器就像一把尺子,有單位長度(即測量的最小長度)和量程。一把尺子的刻度的數量是固定的,這里的傳感器的刻度數量同樣固定,不同的是傳感器的單位長度是可調整的,根據 單位長度x刻度數量 =量程。 當單位長度變大時,量程也隨之變大,但是測量精度會隨之下降。反之,量程變小,測量精度提升。
具體代碼實現如下:(這里的2G,4G,8G,16G是量程,32768是正刻度數量。)
if afs == AFS_2G: self.ares = 2.0/32768.0
elif afs == AFS_4G: self.ares = 4.0/32768.0
elif afs == AFS_8G: self.ares = 8.0/32768.0
else: #afs == AFS_16G:
self.ares = 16.0/32768.0
BMP280: 讀取溫度和氣壓信息 & 單位換算
具體同上。這里列舉一些關鍵信息如下:
各個數據段含義:
測量精度控制:
具體換算實例
推薦庫
(可直接使用或者少量修改可用)
Arduino: https://github.com/thejmart/GY_91-.git
Python: https://github.com/qi-xmu/FaBo9AXIS-MPU9250-Python.git 說明:這個庫是克隆別人的,使用的是python2,同時只有MPU9250的代碼。可以等我的后期更新。
C/C++: https://github.com/ricardozago/GY91-MPU9250-BMP280.git