RaspberryPi

Raspberry PiにA/DコンバータMCP3002をつなぐ(spidev 3.3対応)

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を使ったほうがプログラムが短くてすっきりするので助かります。