マイクロビット(c_10)MCP3004/3008 用モジュール
MCP3004/3008(I2C) c_mcp3008_00.py
MCP3004/3008は4-Channel/8-Channel 10-Bit A/D Convertersです。※詳細はデータシートを参照ください。
MCP3004/3008で使う自作の’c_mcp3008_00.py’を作成しました。使い方だけを記載します。(※記事e_031を元にクラスにしました。)
‘c_mcp3008_00.py’は末尾にあります。使い方だけを記載します。
使い方
ファイル転送
micro:bitへ’c_mcp3008_00.py’を送った後でimportして使います。micro:bitに直接ファイルをアップロード出来ない場合(Thonny 3.1.12など)は、microfsなどを使ってアップロードします。
※microfsについては、当サイト内のこちらを参照ください。
※c_mcp3008_00.pyの末尾に、使用例(c_mcp3008_00_ex.py)の## example以降をコピペ追加しても動作確認できます。
メソッド
‘c_mcp3008_00’をimportすると「r_CHN」のメソッドが使えるようになります。
MCP3008(Vref=3300,CS_pin=16)で初期化します。
(01)r_CHN(num=0, conf=1)
チャンネル番号と入力モードを指定します。指定チャンネルのAD変換した電圧値を返します。
num:測定するチャンネル番号
conf:測定モード(single-ended=1/differential=0)
使用例
電源2Vを抵抗で4分圧してCH0~CH3に入力して動作確認しました。#※記事e_031と同じです。
c_mcp3008_ex.py
from microbit import *
from c_mcp3008_00 import MCP3008
## example--------------------------------
# MCP3004/3008 4/8CH 10-Bit A/D Converters
# MCP3008(Vref,CS_pin) default 3300,pin16
ADC=MCP3008(3300,pin16) #instance
# read channel r_CHN(channel, SGL/DIFF) default single(1)
# single-ended
ch0=ADC.r_CHN(0) # CH0
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_mcp3008_ex.py
CH0=2036(mV) #電源2V
CH1=1521(mV)
CH2=1005(mV)
CH3= 505(mV)
CH01= 512(mV)
CH10= 0(mV) # 極性が違うので
CH23= 502(mV)
CH32= 0(mV) # 極性が違うので
>>>
モジュール
c_mcp3008_00.py
from microbit import *
# AQM0802 8x2 LCDモジュール用
from microbit import *
# MCP3004/3008 4/8CH 10-Bit A/D Converters
class MCP3008:
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/1024 # 10bit mV/bit
# chip select CS=L Chip Select
def CS(self,dat):
self.CS_pin.write_digital(dat)
# read channel
# r_CHN(channel, SGL/DIFF) default single(1) diff(0)
def r_CHN(self,num=0, conf=1):
self.CS(1)
buf=bytearray(3)
buf[0]=0x01 # start bit
# control bit |single/diff|D2|D1|D0|X|X|X|X|
buf[1]=(conf<<3 | num) <<4
buf[2]=0x00 # don't care
#print(buf)
r_buf=bytearray(3)
self.CS(0)
spi.write_readinto(buf, r_buf)
self.CS(1)
data=(r_buf[1] & 3) << 8 | r_buf[2]
data=data*self.LSB
#print('CH%d='% num, '%4d(mV)'%data )
return data