稼働中

Raspberry Pi Pico(s_05)MCP3008 用モジュール

MCP3008 MCP3008c.py

MCP3008用モジュール
MCP3008は分解能10bitの8チャンネルのA/Dコンバータです。SPI通信で制御します。
※詳細はMCP3008のデータシートを参照ください。
MCP3008センサーモジュールで使う自作の’MCP3008c.py’を作成しました。記事d_04を元に作成しています。
使い方だけを記載します。’MCP3008c.py’は末尾にあります。

使い方

■ファイル転送
Raspberry Pi Picoへ’MCP3008c.py’を送った後でimportして使います。
※MCP3008c.pyの末尾に、使用例(MCP3008_ex.py)の## example以降をコピペ追加しても動作確認できます。
■メソッド
‘MCP3008c’をimportすると「CS、r_CHN」のメソッドが使えるようになります。
MCP3008(Vref=3300,spi_num=0,cs_num=1)で初期化します。
Vref:基準電圧
spi_num:使用するSPI0、SPI1の番号(0,1)
cs_num:CSに使うGPIO番号
SPI0、SPI1の[RX, Csn, SCK, TX]のGPIO番号リストは以下になります。
#SPI0 [ 0, 1, 2, 3] [ 4, 5, 6, 7] [16,17,18,19]
#SPI1 [ 8, 9,10,11] [12,13,14,15]
※RX(MISO), TX(MOSI)
spi_numとcs_numを設定すれば、RX, SCK, TXは指定されます。

(01)CS(dat=1)
Chip selectの’0’、’1’を送ります。CS(0)でデバイスが有効になります。
(02)r_CHN(num=0, conf=1)
r_CHN():AD変換値を返します。この場合はデフォルトのCH0、single-endedの変換値が返ります。
num:AD変換するチャンネルを指定します。MCP3008の0~7のCH番号です。
conf:AD変換の測定モードです。single-ended(1)differential(0)です。

使用例

MCP3008で2000mVを4分圧した電圧を測定しました。記事と同じです。


MCP3008c_ex.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from machine import SPI, Pin
from MCP3008c import MCP3008
## exapmle
# MCP3008 A/D変換
ADC=MCP3008(3300,0,1)       # init (Vref=3300,spi_num=0,cs_num=1)
# Single
print('CH0=',ADC.r_CHN(0))
print('CH1=',ADC.r_CHN(1))
print('CH2=',ADC.r_CHN(2))
print('CH3=',ADC.r_CHN(3))
# Diff
print('CH0=IN+ CH1=IN- =',ADC.r_CHN(0,0))
print('CH2=IN+ CH3=IN- =',ADC.r_CHN(2,0))
print('CH2=IN- CH3=IN+ =',ADC.r_CHN(3,0))

実行結果 
実行すると以下のようになりました。※Thonnyのshellに表示されます。


>>> %Run -c $EDITOR_CONTENT
CH0= 2072.168
CH1= 1530.762
CH2= 1031.25
CH3= 528.5156
CH0=IN+ CH1=IN- = 547.8516
CH2=IN+ CH3=IN- = 512.4023
CH2=IN- CH3=IN+ = 0.0           #負になるので

MCP3008モジュール用


MCP3008c.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from machine import SPI, Pin
#SPI  [RX, Csn, SCK, TX]
#SPI0 [ 0, 1, 2, 3] [ 4, 5, 6, 7] [16,17,18,19]
#SPI1 [ 8, 9,10,11] [12,13,14,15]

class MCP3008:
    def __init__(self,Vref=3300,spi_num=0,cs_num=1):
        CS_pin=Pin(cs_num, mode=Pin.OUT, value=1)
        self.spi = SPI(spi_num, baudrate=1000_000,sck=Pin(cs_num+1), 
                       mosi=Pin(cs_num+2), miso=Pin(cs_num-1))
        self.Vref=Vref
        self.CS_pin=CS_pin
        self.LSB=self.Vref/1024  # 10bit
        
    # chip select CS=L Chip Select
    def CS(self,dat=1):
        self.CS_pin(dat)

    # |SGL/DIFF|D2|D1|D0|X|X|X|X|  conf:single(1)/diff(0) num:CH
    def r_CHN(self,num=0, conf=1):
        self.CS(1)
        buf=bytearray(3)
        buf[0]=0x01
        buf[1]=(conf<<3 | num) <<4 # control bit single/diff|D2|D1|D0|X|X|X|X|
        buf[2]=0x00
        r_buf=bytearray(3)
        
        self.CS(0)
        self.spi.write_readinto(buf, r_buf)
        self.CS(1)
        data=(r_buf[1] & 3) << 8 | r_buf[2]
        data=data*self.LSB
        return data