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