python捷聯慣導的姿態解算_用Python控制硬體6-I2C匯流排控制
阿新 • • 發佈:2021-01-01
技術標籤:python捷聯慣導的姿態解算
和上一篇的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,這是一個集成了陀螺儀和重力加速度的測量晶片。
首先根據手冊,對晶片初始化:
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,將連續測量的結果記錄下來。
下一篇繼續演示I2C的其它用法。