MicroPythonで、I2Cでバイアスからのデータを入出力をする時、データをByte型で与えたり受けたりしないといけない。よくわかんなくて値を直接書いたりしていたのだが、どうもうまくいかず・・・
文字列で指定できれば楽だが値は文字列で表現できないため、書き込みの場合はコマンドバッファを作ってポインタを渡す
from machine import Pin, I2C
im = I2C(1,scl=Pin(19),sda=Pin(18),freq=10000);
cmd2=bytearray(2);
cmd2[0]=0x4E; # Command
cmd2[1]=0x02; # Data
im.writeto(0x68,cmd2);
で、読み込みの場合は、読み込みバイト数に合わせてBufferを作り取り出せばいいのだが、ここでByteOrderというエンディアンでつまづいた。
cmd =bytearray(1);
cmd[0]=0x1F; # ACCEL_DATA_X1
im.writeto(0x68,cmd);
buf=im.readfrom(0x68,6);
accx=int.from_bytes(buf[0:2],'big',True);
bufは6byteになるが、例えば b'\x07\xea\x00\x17\x00\xa5' と返される。このデバイス加速度センサーで、accx(上位),accx(下位)、accy・・・の順で6byteになっているので、accx=0x07ea。07が上位なので、'big'エンディアンとして2バイトを変換すると2026となる。ここで、問題は、int.from_bytesの最後の引数のTrueである。私の使っているulab入りのMicroPythonバイナリではsigned=Trueが効かず全てuint16になってしまう。
ulabのnumpyを使用すると、符号付きを扱えるが、今度はByteOrderがlittle固定になってしまう
>>> np.frombuffer(buf[0:2], dtype=np.int16)
array([-5625], dtype=int16)
結局わからず、次のようにすればできるがまどろっこし
bufa=bytearray(2)
bufa[0]=buf[1]
bufa[1]=buf[0]
>>> np.frombuffer(bufa, dtype=np.int16)
array([2026], dtype=int16)
これなら、最初から逆に1バイトずつ読んだ方がいいのでは??
コメントを追加