ラズベリーパイによるディジタル入出力について,
こじ研さんのページ(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 osspi = 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 datadef ConvertVolts(data,places):
volts = (data * 3.3) / float(4095)
volts = round(volts,places)
return voltsdef ConvertTemp(data,places):
temp = ((data * 3.3)/float(4095)*100)
temp = round(temp,places)
return temptemp_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の出力結果
コメントを残す