[樹莓] Python 透過 SPI 讀取 MPU9250
因為I2C的協定傳輸速率太低,每秒100筆左右的資料而己
所以動了念頭用SPI來傳送陀螺儀的資料。
(PS: SPI最高可到20MHZ,實測使用樹莓3讀取可到2000~4000筆資料)
有了SPI的好處在可做傅利葉轉換成頻譜,把陀螺儀測到的資訊轉換成頻率。
這是這次主角MPU9250:
1. 接線
樹莓 | MPU9250
17(3.3V) > VCC
19(SPI_MOSI) > SDA/SDI
21(SPI_MISO) > ADO/SDO
23(SPI_SCLK) > SCLK
24(SPI_CS0) > NCS
25(GND) > GND
2. PYTHON 程式
import spidev
spi = spidev.SpiDev()
spi.open(0, 0)
spi.mode = 3
spi.cshigh = False
L = [191, 192, 129]
resp = [ ]
resp = spi.xfer(L)
spi.close()
zAccel = (L[1] << 8) + L[2]
print(zAccel)
3. 解說
一開始研究SPI讀取MPU9250的時候撈出來的資料都是錯的。
如果讀取的位址不對的話,從MPU9250回應回來的資料都是0x00
觀察過MPU9250的spec後,對照register map才能依照位址讀取相對應的值,又或者可以用writeByte對IC下指令,更改輸出或模式。(The Register Maps is your best friend)
以上的程式碼是讀取Z軸的accel, 其讀取位址是
ACCEL_ZOUT_H = 0x3F (十進制為63)
ACCEL_ZOUT_L = 0x40 (十進制為64)
這邊要注意的是,讀取的位址值要加再上128,才是真正的位址值也就是
63+128 = 191, 64+128 = 192
所以在程式裡讀取的位址是191, 192的原故。至於是為什麼?
Using 7 bits, 63 decimal form is 0111111, but you wanted to read this address so you have to tag on a 1 in front, giving you 10111111 (bin), 191 (dec), or BF (hex). In general, you'll always have to add a number to the address you want to read.
以上的話截至下面的參考裡,就不多做解譯了。若想深入了解請在下方的參考裡面找。
讀回來的值基本上是二進制(0~65536)轉換成十進制的值,之後還需要運算才可得到真正的數值。
# all value need to convert to right value
if(value > 32768):
value -= 65536
return value
#convert to acceleration in g and gyro dps
accel_sens = 16 # accel default value is 16
a_x = (acc_x/(2.0**15.0))*accel_sens
a_y = (acc_y/(2.0**15.0))*accel_sens
a_z = (acc_z/(2.0**15.0))*accel_sens
gyro_sens = 250 # gyro default value is 250
w_x = (gyro_x/(2.0**15.0))*gyro_sens
w_y = (gyro_y/(2.0**15.0))*gyro_sens
w_z = (gyro_z/(2.0**15.0))*gyro_sens
以上的程式碼我一樣會貼在參考資料裡,也可參照spec去做更多的操作,不過這邊只先做簡單介紹。雖然看似簡單,但這次走了蠻多歪路才到目的。以前都使用I2C太過便利了,才會有寫不出來又不看spec的壞習慣。透過這次經驗對SPI了解不少。
4. 參考 references
主要參考此篇
https://www.raspberrypi.org/forums/viewtopic.php?t=221293
從MPU9250讀到二進制後轉換成十進制程式碼參考
https://makersportal.com/blog/2019/11/11/raspberry-pi-python-accelerometer-gyroscope-magnetometer
MPU9250的spec
https://invensense.tdk.com/wp-content/uploads/2015/02/RM-MPU-9250A-00-v1.6.pdf
陀螺儀感測器介紹
留言
張貼留言