Raspberry Pi PicoでPythonのお勉強 ~7~
SPIを使うための接続変更ができましたので、今回からSPIアクセスのためのソース作成に入ります。最初にSPIが開通しているかどうかを調べるためにBMP280のチップIDだけをSPIで読み出すソースを作成しました。
ちなみに最初にデバイス固有のIDを読み出すというのは、そのデバイスがハードウエア的に正しく動作しているかを確認するためによく使われる手です。チップIDが正しく読み出せないということは、デバイス自体が壊れている、接続が正しくない、電源回路が壊れている、など様々な原因でデバイスが正しく動作していないということになります。
そんなわけで、まずは今回チップIDだけを読み出す以下のソースを作成して動かしてみました。
from machine import Pin, SPI
cs = Pin(1, mode=Pin.OUT, value=1)
spi = SPI(0, baudrate=100000, polarity=0, phase=0, sck=Pin(2), mosi=Pin(3), miso=Pin(0))
try:
cs(0)
rxdata = spi.read(2, 0xD0)
finally:
cs(1)
print(rxdata)
ここではソースの中身については置いておいて、とりあえず得られた結果は以下の通りでした。
>>> %Run -c $EDITOR_CONTENT
b'\x00X'
BMP280のデータシートによるとチップIDは0x58なのですが、今回作成したソースでは0x58という値が表示されませんでした。そこでSPIの信号波形確認を行ったところ、Raspberry Pi Picoから正しく信号が出力されていることが確認できました。またBMP280からもチップIDである0x58が返ってくることも確認できました。
なので、Raspberry Pi PicoとBME280間のSPI信号は正しくやり取りされているのに、Raspberry Pi Pico側で正しくSPIのデータを受け取れていないのか?などとだいぶ悩みました。
いろいろと調べてみると、どうもbytes型をprint 関数で表示するとバイト列に含まれるデータは ASCIIコードで表示され16進数で表示されないということが分かりました。そこでXのASCIIコードを調べると16進で0x58ということなのでSPIが正しく動いていることが確認できました。先頭バイトが0x00と16進で表示されていたので、つい16進で表示されるものだと思い込んでいました。
試しに以下のようにbytesがhexで表示されるようにソースを変更してみると
import binascii
from machine import Pin, SPI
cs = Pin(1, mode=Pin.OUT, value=1)
spi = SPI(0, baudrate=100000, polarity=0, phase=0, sck=Pin(2), mosi=Pin(3), miso=Pin(0))
try:
cs(0)
rxdata = spi.read(2, 0xD0)
finally:
cs(1)
print(binascii.hexlify(rxdata))
下記の様に16進で正しく0x58と表示されました。
>>> %Run -c $EDITOR_CONTENT
b'0058'
ちなみにいろいろ調べると16進にするにはbytes.hexが使えるということでしたが、今回使っているMicroPythonではbytes.hexは使えませんでした。
というわけで、作成したSPIアクセスのソースが動いたので、次回からはソースの中身について解説していくことにします。