LoginSignup
6
5

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-02-10

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

6
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5