ラズベリーパイによるディジタル入出力について,

こじ研さんのページ(Raspberry Pi応用編)

が非常に参考になった。例題を順々に実行することで,勉強になった。

ただ,「SPIによるADCの接続」について,SPI通信がうまくいかなかった。カーネルのバージョンの問題なのか原因は不明。
他に,BCM2835 libraryを用いる方法も試みたが,やはりうまくいかない。

cat /proc/version
Linux version 4.1.13-v7+ (dc4@dc4-XPS13-9333) (gcc version 4.8.3 20140303 (prerelease)

いろいろ試みた結果,PythonからSPIデバイスを操作するためのpy-spidevを用いた方法でうまくいった。

参考にしたページ

  • Qiita 「Raspberry PiのPythonからTMP36のアナログ温度センサとMCP3008のADコンバータを使う」
  • Analogue Sensors On The Raspberry Pi Using An MCP3008

接続の構成

  • Raspberry Pi 2 model B
  • MCP3208(12 bit ADC)
  • LM35DZ(温度センサ)

配線は,以下のようにした。

上記の参考ページのプログラムは,10bitのADCであるため,12bitに変更したプログラムを以下のように作成した。

import spidev
import time
import os

spi = spidev.SpiDev()
spi.open(0,0)

def ReadChannel(channel):

adc = spi.xfer2([(0x07 if (channel & 0x04) else 0x06), (channel & 0x03) << 6, 0])
data = ((adc[1] & 0x0f) << 8 ) | adc[2]
return data

def ConvertVolts(data,places):

volts = (data * 3.3) / float(4095)
volts = round(volts,places)
return volts

def ConvertTemp(data,places):

temp = ((data * 3.3)/float(4095)*100)
temp = round(temp,places)
return temp

temp_channel = 0

delay = 5

while True:

temp_level = ReadChannel(temp_channel)
temp_volts = ConvertVolts(temp_level,3)
temp = ConvertTemp(temp_level,2)
print “——————————-”
print(“Temp : {} ({}V) {}degC “.format(temp_level,temp_volts,temp))

time.sleep(delay)

spi.xfer2では,3バイトの信号を送信する。こじ研さんのページが詳しかった。

000001,SD,D2, D1,D0,000000,  00000000

SDはシングルエンド・差動の選択,D2D1D0はチャネルの選択。

本プログラムを実行した結果は,以下のようになった。

MCP3208,LM35DZの出力結果

MCP3208,LM35DZの出力結果

広告