[樹莓] 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


陀螺儀感測器介紹

http://kitsprout.logdown.com/posts/335386

留言

熱門文章