make mcp3002 driver for RPi GPIO

投稿日:

Raspberry Pi のGPIOで、SPI (シリアル通信)をしてみた。

SPI専用の高速なドライバもあるけど、勉強も兼ねて、python でみちみちと書いた。

今回は、A/Dコンバータ(MCP3002)をRPiとつなぐのがメイン。
mcp3002に入力は2系統。気温はセンサーのLM35DZとアンプ(LM358)を利用。
明るさは、フォトダイオードIC S9648を利用。

mcp3002は、SPI接続なので、利用するPINはCLK,MISO,MOSI,CS の4本と電源3.3VとGNDの計6本。
センサー類の電源は、全て5Vで統一した。

回路

いろいろ詰め込み過ぎて、いつもより複雑。

MPC2003_bredboard.JPG

実体配線図は、こんな感じ。

MCP3002_board

mcp3002のGPIO driver

githubに公開してみた。
kurosuke / RPi-GPIO/mcp3002/

気温のテスト

気温の取得は、そもそも10mV単位に1℃の気温となるLM35DZの出力を、オペアンプで6倍(テスタで計るとなぜか5.96倍になる。200Ωとかいう怪しい抵抗のせいだろうか?)、基準電圧3.3Vを10bits精度で取得したmcp3002の結果を逆算。
    # calc temperature
    volt = (avg_result/1024.0) *3.3		# 10bits A/D convert 3.3Vref
    temp = (volt / 5.96) * 100			# LM75D temperature is 1C / 10mV
    print 'adc_result: %d, voltage: %0f, temperature: %f' % (result, volt, temp)

気温を取得するプログラムを実行すると、こんな感じ。

pi@raspberrypi:~/RPi_GPIO/mcp3002/exsamples$ sudo python temperature.py 
adc_result: 404, voltage: 1.266504, temperature: 21.250066
adc_result: 381, voltage: 1.266504, temperature: 21.250066
adc_result: 397, voltage: 1.276172, temperature: 21.412280

明るさのテスト

明るさの取得は、S9648の出力を、基準電圧3.3Vを10bits精度で取得したmcp3002の結果を逆算。
  volt = (result/1024.0)*3.3
  lux = volt * 1000
  print 'adc_result: %d, voltage: %0f, lux: %d' % (result, volt, lux)

一応ルクス(lux)計算をしているけど、未検証。
明るさを取得するプログラムを実行しつつ、フォトダイオードを手で暗く遮ったりすると、こんな感じ。

pi@raspberrypi:~/RPi_GPIO/mcp3002/exsamples$ sudo python lux.py 
adc_result: 0, voltage: 0.000000, lux: 0
adc_result: 19, voltage: 0.061230, lux: 61
adc_result: 18, voltage: 0.058008, lux: 58
adc_result: 2, voltage: 0.006445, lux: 6
adc_result: 2, voltage: 0.006445, lux: 6
adc_result: 32, voltage: 0.103125, lux: 103

さて、次はI2Cかな。