Raspberry PiでADコンバータを利用したくて、Raspberry PiにA/DコンバータMCP3002をつなぐの記事を見ながらやってみたものの、応答が全部ゼロになって困っていました。
いろいろ調べたところ、原因が判明。
####原因(1)MOSI、MISO、SCSK等をGPIOで使うとspidevが使えなくなる。
よく見るとカラー図解 最新 Raspberry Piで学ぶ電子工作に書いてありました。
前回の方法を使うと、再起動するまでspidevは使えなくなるとのこと。
####原因(2)spidevがバージョンアップしていた
これもカラー図解 最新 Raspberry Piで学ぶ電子工作の補足情報にありました。「spi.max_speed_hz = 1000000」のように最大周波数の設定が必要になったとのこと。
以上を参考に、プログラムを改造してみました。
##Pythonコード
# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO
import time
import spidev
#MCP3002からSPI通信で10ビットのデジタル値を取得。0から1の2チャンネル利用可
def readadc_spidev(adcnum):
if ((adcnum > 1) or (adcnum < 0)):
return -1
command1 = 0xd | (adcnum<<1)
command1 <<= 3
ret = spi.xfer2([command1,0,0])
adcout = (ret[0]&0x3)<<8 | ret[1]
return adcout
GPIO.setmode(GPIO.BCM)
spi=spidev.SpiDev()
spi.open(0, 0) # bus0, CE0
spi.max_speed_hz = 1000000 # 1MHz
try:
while True:
inputVal0 = readadc_spidev(0)
print(inputVal0)
time.sleep(0.2)
except KeyboardInterrupt:
pass
spi.close()
###MCP3002の入力(MOSI)
データシートを見ると入力は8ビットです。SINGLE ENDED MODEでCH0なら0b01101000、CH1なら0b01111000です。(出力はMSBフォーマット)
ここではreadadc_spidev(adcnum)
の引数で、CH0か1で切り替えられるようにしています。
###MCP3002の出力(MISO)
データシートを見ると出力は8ビット+8ビットの2バイトに分割されていることがわかります。1番目のバイトは最後の2ビットだけが使用されており、これと2番目のバイトの8ビットを足して合計10ビットで出力値を表します。
そこで最初のバイトの末尾2ビットと、2番目のバイトの8ビットをつなぎ合わせて1個の数値として出力するようにadcout = (ret[0]&0x3)<<8 | ret[1]
としています。
##実行結果
ここではMCP3002の出力値をそのまま出していますので、0~1023までの1024段階で結果が表示されます。
848
869
804
799
581
583
725
809
818
811
789
768
780
624
746
811
##使用機材
- Raspberry Pi 3 model B+
- MCP3002(ADコンバータ)
- 可変抵抗10kΩ
- ジャンパー線など
##配線図
前回のを見てください。
spidevが使えないときの方法も見つけましたが、やはりspidevを使ったほうがプログラムが短くてすっきりするので助かります。