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で統一した。
回路
いろいろ詰め込み過ぎて、いつもより複雑。実体配線図は、こんな感じ。
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かな。