ADコンバーターMCP3008 / SPI / AD変換値を1回だけ読み出してみる / micro:bit / MicroPython

参考: SPI — BBC micro:bit MicroPython 0.5.0 documentation

f:id:ti-nspire:20180626095658p:plain:w400

from microbit import *

StartByte    = 1
SingleOrDiff = 1
whichCH      = 0
DummyByte    = 0
CS           = pin16.write_digital

# 3バイトを書き込んで3バイトを読み出す。

# [0]バイト目として0b 0000 0001をwriteする。この1がスタートビットとして働く。
# ADCから返ってくるバイトデータは無視する。

# [1]バイト目として、シングルエンドか差動かと、チャンネルとを指定する。
# ここでは 0b 1000 0000をwriteする。
# ビット7を1にしたのでシングルエンド(0にすれば差動)。
# ビット6:4の3ビットでチャンネル(0-7)を指定する。ここでは0、すなわちチャンネル0を選んだ。
# ADCからは0b xxxx x0??が返ってくる。??のビット1:0が10ビットデータの上位2ビットである。

# [2]バイト目としてダミーバイトをwriteする。ここでは0にしたが何でもよい。
# ADCからは10ビットデータの下位8ビットが返ってくる。
buf = bytes([StartByte, (SingleOrDiff<<7 | whichCH<<4), DummyByte])
raw = bytearray([0 for i in range(len(buf))])

CS(1)
spi.init() # デフォルトはmode=0。

CS(0)
spi.write_readinto(buf, raw)
CS(1)

print([bin(buf[i]) for i in range(3)])
print([bin(raw[i]) for i in range(3)])

# 2つの8ビットデータを10ビットデータに並べ換える。
A2Ddata = (raw[1]<<8 | raw[2]) & 0b1111111111
volt    = A2Ddata * 3.23/1024.0 # 3.23はmicro:bitの電源電圧の実測値。
    
print("AD%d , %.2f(v)" % (A2Ddata, volt))

実行結果:
f:id:ti-nspire:20180626094429p:plain
f:id:ti-nspire:20180626095858p:plain