1. 程式人生 > 其它 >python捷聯慣導的姿態解算_用Python控制硬體6-I2C匯流排控制

python捷聯慣導的姿態解算_用Python控制硬體6-I2C匯流排控制

技術標籤:python捷聯慣導的姿態解算

48cc88105ab0542276bd724722882031.png

和上一篇的SPI命令類似,MCUSH終端的I2C命令也是IO模擬的,也同樣支援多個。

命令模擬了I2C匯流排的兩個訊號:時鐘SCL、資料SDA;同樣還是隻支援主裝置,只能對外控制,SCL永遠是輸出。列一下語法幫助:

=>i2c --help
usage: i2c [--delay=<delay_us>] [-a <address>] [--sda=<sda_pin>] [--scl=<scl_pin>] 
[-I] [-D] [-l] [-n] [-r <read_cycle>] <value>
options:
 --delay         default 5
 -a/--address    default 0
 --sda           default 0.0
 --scl           default 0.1
 -I/--init       init pins
 -D/--deinit     deinit pins
 -l/--lsb        lsb first
 -n/--nostop     no stop bit
 -r/--read       default 0
 value           data
=>

通常命令列的控制過程是這樣的,先指定從裝置地址(注意這裡地址是低7位)初始化:

=>i2c -a 0x?? -I
=>

向指定地址寫入3個位元組資料:

=>i2c 0x01 0x02 0x03
=>

向指定地址寫入1個位元組資料,並讀回3個位元組資料:

=>i2c -r3 0x01
0xFF 0xFF 0xFF
=>

測試一下這個從地址是否有響應:

=>i2c
ACK error
!>

這裡得提示一下,MCUSH的提示符會根據上一條命令的執行情況而變化:

  • “=>”表示一切正常;
  • “?>”表示存在語法錯誤;
  • “!>”表示語法正確但是執行錯誤。

匯流排不再使用後,同樣需要釋放資源:

=>i2c -D
=>

很明顯,命令列效率太低,還是得用Python。下面舉個實際案例,控制目前流行的多軸運動感測器MPU6050,這是一個集成了陀螺儀和重力加速度的測量晶片。

754d491e42bdd9ed5d51f21662c39898.png

首先根據手冊,對晶片初始化:

from mcush import *
m=Mcush.Mcush('/dev/ttyUSB0')
m.i2c_init( 0x68, sda='0.0', scl='0.1' )  # 晶片地址0x68
# 寫晶片暫存器
def write( addr, val ):
    m.i2c( [addr, val] )
# 讀晶片暫存器
def read( addr ):
    m.i2c( [addr], 1 )[0]  # 讀單個字元
# 對暫存器逐個初始化
write( 107, 0x80 )  # 器件復位
while True:
    if not read( 107 ) & 0x80:   # 等待器件復位完成(可以忽略)
        break
write( 107, 0x00 )  # 內部晶振8M
write( 108, 0x00 )  # 進入工作模式
write( 1, 0x80 )  # AUX_VDDIO=VDD
write( 25, 0x07 )  # 取樣率: 0x07(125Hz)
write( 26, 0x06 )  # 濾波器: 0x06(5Hz)
write( 27, 0x18 )  # 陀螺儀設定: 0x18(無自檢, 2000deg/s)
write( 28, 0x01 )  # 加速度計設定: 0x01(無自檢, 2G, 5Hz)

完成後直接讀測量結果即可,下面讀三軸加速度值(這裡用到的Utils.s2h函式將兩個位元組拼裝成有符號16位整數):

def getAccelX():
    a,b = m.i2c( [0x3B], 2 )  # 連續讀兩個位元組
    return Utils.s2h( chr(b) + chr(a) ) / 16384.0 * 9.8
        
def getAccelY( self ):
    a,b = m.i2c( [0x3D], 2 )  # 連續讀兩個位元組
    return Utils.s2h( chr(b) + chr(a) ) / 16384.0 * 9.8
        
def getAccelZ( self ):
    a,b = m.i2c( [0x3F], 2 )  # 連續讀兩個位元組
    return Utils.s2h( chr(b) + chr(a) ) / 16384.0 * 9.8

至此,成功將三軸重力加速度值取出。繼續呼叫第三方庫matplotlib,將連續測量的結果記錄下來。

9bf351655bbe51e2060a6065fafcef20.png

下一篇繼續演示I2C的其它用法。