前記載のPCのI/OとしてのArduinoから
ArduinoとFirmataを使えばPCから簡単にI/Oを操作できる事がわかりました。
そこで、pythonを使ってGUIでI2CセンサーをコントロールできるGUIサンプルを作りました。
接続図
手元にあったMPU6500を使って汎用的なI2Cセンサーを接続できるような
Pythonプログラムを作ってみました。
下記にテスで使ったBMG160( TDK : IMU - 慣性測定ユニット 6-Axis MEMS MotionTracking Device)を使ったレジスタ設定テキストサンプル
# Register Configration sample
SLAVE,0x68
REG,0x00,1,0x00,R,CHIP_ID
REG,0x02,1,0x00,R,RATE_X_LSB
REG,0x03,1,0x00,R,RATE_X_MSB
REG,0x04,1,0x00,R,RATE_Y_LSB
REG,0x05,1,0x00,R,RATE_Y_MSB
REG,0x06,1,0x00,R,RATE_Z_LSB
REG,0x07,1,0x00,R,RATE_Z_MSB
REG,0x08,1,0x00,R,TEMP
REG,0x09,1,0x00,R,INT_STATUS_0
REG,0x0a,1,0x00,R,INT_STATUS_1
REG,0x0b,1,0x00,R,INT_STATUS_2
REG,0x0c,1,0x00,R,INT_STATUS_3
REG,0x0e,1,0x00,R,FIFO_STATUS
REG,0x0f,1,0x00,RW,RANGE
REG,0x10,1,0x00,RW,BW
REG,0x11,1,0x00,RW,LPM1
REG,0x12,1,0x00,RW,LPM2
REG,0x13,1,0x00,RW,RATE_HBW
REG,0x14,1,0x00,W,BGW_SOFTRESET
REG,0x15,1,0x00,RW,INT_EN_0
REG,0x16,1,0x00,RW,INT_EN_1
REG,0x17,1,0x00,RW,INT_MAP_0
REG,0x18,1,0x00,RW,INT_MAP_1
REG,0x19,1,0x00,RW,INT_MAP_2
REG,0x1a,1,0x0000,RW,Interrput Select
上記レジスタ設定を交換すれば別センサーを簡単にI2C Read / Writeできるようにしてみました。
Python(winpython)を使ってGUI化した結果下記のような実行結果を得ました。
問題点として、動作が非常に重い事(通信速度9600bps固定)と、I2Cの制御が不安定な事が気になります。
I2CReadを行う場合、下記のような手続きが必要となります。
board.i2c_read(slave_addr, addr, 1, board.I2C_READ)
time.sleep(0.3)
data = board.i2c_get_read_data(slave_addr)
pyMataの場合、このI2C Readタイミングをユーザ側で決めなければならないらしく非常に遅い。
300ms間隔開けても普通に失敗することもあるので、安全を見ると500msはほしいところ。
レジスタを読むだけならこれでいいのかもしれませんが、センサーをウォッチするには向いていない性能。
pyMataは既に更新止まっているので、別のpythonモジュールも探してみます。