稼働中

マイクロビット(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