マイクロビット(c_16)MCP3204/3208 用モジュール
MCP3204/3208(SPI) c_mcp3208_00.py
MCP3204/3208は4-Channel/8-Channel 12-Bit A/D Convertersです。※詳細はデータシートを参照ください。
MCP3204/3208で使う自作の’c_mcp3208_00.py’を作成しました。使い方だけを記載します。(※記事e_047を元にクラスにしました。)
‘c_mcp3208_00.py’は末尾にあります。使い方だけを記載します。
使い方
ファイル転送
micro:bitへ’c_mcp3208_00.py’を送った後でimportして使います。micro:bitに直接ファイルをアップロード出来ない場合(Thonny 3.1.12など)は、microfsなどを使ってアップロードします。
※microfsについては、当サイト内のこちらを参照ください。
※c_mcp3208_00.pyの末尾に、使用例(c_mcp3208_ex.py)の## example以降をコピペ追加しても動作確認できます。
メソッド
‘c_mcp3208_00’をimportすると「r_CHN」のメソッドが使えるようになります。
MCP3208(Vref=3300,CS_pin=16)で初期化します。
Vref:基準電圧をmVで与えます。デフォルトは3300mVです。
CS_pin:MCP3208のチップセレクトと接続するmicro:bitのpinを与えます。デフォルトはpin16です。
(01)r_CHN(num=0, conf=1)
AD変換するチャンネル番号と入力モードを指定します。指定チャンネルのAD変換した電圧値を返します。
num :AD変換するチャンネル番号を与えます。デフォルトは0です。
conf:測定モードを与えます。single-endedは1、differentialは0を与えます。デフォルトは1です。
使用例
電源2Vを抵抗で4分圧してCH0~CH3に入力して動作確認しました。記事e_047と同じです。
c_mcp3208_ex.py
from microbit import *
from c_mcp3208_00 import MCP3208
## example--------------------------------
# MCP3204/3208 4/8CH 12-Bit A/D Converters
ADC=MCP3208(3300,pin16) #MCP3208(Vref,CS_pin) default 3300,pin16
# read channel
# r_CHN(channel, SGL/DIFF) default single-ended(1)
# Input Configuration=single-ended(1)/differential(0)
# single-ended
ch0=ADC.r_CHN(0,1) # CH0,1 (default)
ch1=ADC.r_CHN(1) # CH1
ch2=ADC.r_CHN(2) # CH2
ch3=ADC.r_CHN(3) # CH3
print('CH0=%4d(mV)'%ch0)
print('CH1=%4d(mV)'%ch1)
print('CH2=%4d(mV)'%ch2)
print('CH3=%4d(mV)'%ch3)
# differential
ch01=ADC.r_CHN(0,0) # CH0=IN+ CH1=IN-
ch10=ADC.r_CHN(1,0) # CH0=IN- CH1=IN+
ch23=ADC.r_CHN(2,0) # CH2=IN+ CH3=IN-
ch32=ADC.r_CHN(3,0) # CH2=IN- CH3=IN+
print('CH01=%4d(mV)'%ch01)
print('CH10=%4d(mV)'%ch10)
print('CH23=%4d(mV)'%ch23)
print('CH32=%4d(mV)'%ch32)
実行結果
>>> %Run c_mcp3208_ex.py
CH0=2039(mV) #電源2V
CH1=1527(mV)
CH2=1011(mV)
CH3= 509(mV)
CH01= 512(mV)
CH10= 0(mV) # 極性が違うので
CH23= 503(mV)
CH32= 0(mV) # 極性が違うので
>>>
MCP3204/3208 用モジュール
c_mcp3208_00.py
from microbit import *
# MCP3204/3208 4/8CH 12-Bit A/D Converters
class MCP3208:
def __init__(self,Vref=3300,CS_pin=pin16):
#spi.init(baudrate=1000000, bits=8, mode=0, sclk=pin13, mosi=pin15, miso=pin14)
spi.init()
self.Vref=Vref
self.CS_pin=CS_pin
self.LSB=self.Vref/4096 # 12bit mV/bit
# chip select CS=L Chip Select
def CS(self,dat):
self.CS_pin.write_digital(dat)
# read channel num=channel number conf=single(1)/diff(0)
def r_CHN(self,num, conf=1):
self.CS(1)
buf=bytearray(3)
# |Start bit'1'|SGL/DIFF(conf)|D2|
buf[0]= 4|(conf<<1)|(num>>2) # |D2|D1|D0|>>2 |0|0|D2|
#|D1|D0|X|X|X|X|X|X|
buf[1]=(num<< 6) & 0xc0 #0b11000000(0xc0)
buf[2]=0x00 # don't care
#print(buf)
r_buf=bytearray(3)
self.CS(0)
spi.write_readinto(buf, r_buf)
#print('r_buf',r_buf)
self.CS(1)
data=(r_buf[1] & 0xf) << 8 | r_buf[2] #0b1111(15)0xf
data=data*self.LSB
#print('CH%d='% num, '%5.1f(mV)'%data )
return data