こんにちは、LinuCエバンジェリストこと、鯨井貴博@opensourcetechです。
今回は、アナログ温度センサーLM61BIZと ADコンバータMCP3002を使って、
温度を測定します。
使用部品
アナログ温度センサー LM61BIZ
左から電源+(今回は3.3V)、データ出力、GNDとなります。
-25℃〜85℃の範囲を測定出来る温度センサーです。
なお、0℃時 600mV(0.6V)のオフセットがあるのでプログラム作成時には考慮する必要があります。
高精度IC温度センサLM61BIZ: センサ一般 秋月電子通商-電子部品・ネット通販
ADコンバータ MCP3002
アナログ温度センサーから受信したデータを、デジタルデータに変換する役割を持ちます。
下の中央2つの端子でデータを受け付けることが出来ます。
10bit 2ch ADコンバータ MCP3002−I/P: 半導体 秋月電子通商-電子部品・ネット通販
配線図
以下のように、Raspberry Pi(今回はzero wを使用)・MCP3002・LM61BIZを接続します。
※26番の代わりに、24番を使ってもOKです。
※電源+/GNDを逆に接続すると、温度センサーがむちゃくちゃ熱くなる(マジで火傷しそうなくらい熱くなります)ので間違えないように注意しましょう。
それぞれの端子の意味や製品仕様については、以下からチェックしましょう。
LM61BIZデータシート
http://akizukidenshi.com/download/LM61biz.pdf
MCP3002データシート
http://akizukidenshi.com/download/ds/microchip/mcp3002.pdf
Raspberry Pi zero w側の準備
SPI通信を使用するので、Raspberry Pi側でSPIが使えるように準備をします。
SPIの有効化
その後、SPIモジュールが認識されていることと、spidev0.0とspidev0.1の2つのMCP3002からのデータ受信用のファイルが/devにあるか確認します。
spi_bcm2835 7424 0
pi@raspberrypi:~ $ ls -la /dev/spidev0.*
crw-rw---- 1 root spi 153, 0 3月 19 23:26 /dev/spidev0.0
crw-rw---- 1 root spi 153, 1 3月 19 23:26 /dev/spidev0.1
その他、python(バージョン3)・pip3・python-spidev・wiringpiなど必要なソフトウェアをインストールします。
※apt/apt-get/pip3コマンドでインストールします。
pi@raspberrypi:~ $ sudo pip3 install wiringpi
なお、以下のようにpythonが2.系と3.系が同居している場合は、
パスの指定など間違えないように注意しましょう。
この記事の中では、python3.系を使ってます。
Python 2.7.9 (default, Sep 17 2016, 20:26:04)
[GCC 4.9.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> exit
Use exit() or Ctrl-D (i.e. EOF) to exit
>>> exit()
pi@raspberrypi:~ $ python3
Python 3.4.2 (default, Oct 19 2014, 13:31:11)
[GCC 4.9.1] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> exit
Use exit() or Ctrl-D (i.e. EOF) to exit
>>> exit()
温度データ取得
データの取得には、Pythonを使ってMCP3002に入力されたデータを読み取ります。
以下のようなPythonプログラムを作成し、実行できるように実行権限も付与しておきます。
なお、Raspberry Piの26番ではなく24番を使う場合は、「SPI_CH = 0」としてください。
また、MCP3002のCH1を使う場合には「Buffer = 0x7800 | ( 0x1800 * READ_CH )」としてください。
※0x6800がMCP3002のCH0のデータ開始位置、0x7800がCH1のデータ開始位置を示します。
ここにもアップしてあります。
https://github.com/kujiraitakahiro/RaspberryPi/blob/master/temp_analog.py
pi@raspberrypi:~ $ cat /home/pi/temp_analog.py
#!/usr/bin/python3
# -*- coding: utf-8 -*-
#Import wiringgpi for Control GPIOs, Import time for Using Sleep function.
import wiringpi as pi
import time
#Select SPI channel on MCP3002(ADconverter)
SPI_CH = 1
READ_CH = 0
pi.wiringPiSPISetup( SPI_CH, 1000000 )
Offset = ( 0.6 / 3.3 ) * 1023 #LM61BIZ offset is 0℃ = 0.6V(600mV)
#for LM61BIZ
while True:
Buffer = 0x6800 | ( 0x1800 * READ_CH )
Buffer = Buffer.to_bytes( 2, byteorder='big' )
pi.wiringPiSPIDataRW( SPI_CH, Buffer )
Value = ( Buffer[0] * 256 + Buffer[1] ) & 0x3ff
Volt = ( Value - Offset ) * 3.3 / 1023
Temp = round(Volt * 100, 3)
print ("Value: ",Value," Volt: ",Volt," Temperature: ",Temp,"℃ ")
time.sleep(1)
pi@raspberrypi:~ $ ls -l /home/pi/temp_analog.py
-rwxr-xr-x 1 pi pi 774 3月 20 22:04 /home/pi/temp_analog.py
温度の測定は、作成したPythonプログラムを実行します。
温度センサーを指で触るなどして温めると少しずつ温度が上昇し、
保冷剤などを温度センサーにつけると少しずつ温度が下降します。
Pythonプログラムの停止は、ctrl+cで行います。
※以下は、見やすく整形しているので実際にはもっと沢山出力されてジワジワ温度変化するように見えると思います。
Value: 249 Volt: 0.2032258064516129 Temperature: 20.323 ℃
Value: 250 Volt: 0.2064516129032258 Temperature: 20.645 ℃
Value: 250 Volt: 0.2064516129032258 Temperature: 20.645 ℃
Value: 249 Volt: 0.2032258064516129 Temperature: 20.323 ℃
Value: 249 Volt: 0.2032258064516129 Temperature: 20.323 ℃
Value: 250 Volt: 0.2064516129032258 Temperature: 20.645 ℃
Value: 250 Volt: 0.2064516129032258 Temperature: 20.645 ℃
Value: 249 Volt: 0.2032258064516129 Temperature: 20.323 ℃
Value: 248 Volt: 0.19999999999999998 Temperature: 20.0 ℃
Value: 249 Volt: 0.2032258064516129 Temperature: 20.323 ℃
Value: 250 Volt: 0.2064516129032258 Temperature: 20.645 ℃
Value: 250 Volt: 0.2064516129032258 Temperature: 20.645 ℃
Value: 253 Volt: 0.2161290322580645 Temperature: 21.613 ℃
Value: 253 Volt: 0.2161290322580645 Temperature: 21.613 ℃
Value: 254 Volt: 0.2193548387096774 Temperature: 21.935 ℃
Value: 254 Volt: 0.2193548387096774 Temperature: 21.935 ℃
Value: 257 Volt: 0.2290322580645161 Temperature: 22.903 ℃
Value: 257 Volt: 0.2290322580645161 Temperature: 22.903 ℃
Value: 256 Volt: 0.22580645161290322 Temperature: 22.581 ℃
Value: 256 Volt: 0.22580645161290322 Temperature: 22.581 ℃
.
.
省略
.
.
Value: 251 Volt: 0.20967741935483872 Temperature: 20.968 ℃
Value: 248 Volt: 0.19999999999999998 Temperature: 20.0 ℃
Value: 247 Volt: 0.19677419354838707 Temperature: 19.677 ℃
Value: 244 Volt: 0.18709677419354837 Temperature: 18.71 ℃
Value: 243 Volt: 0.18387096774193548 Temperature: 18.387 ℃
Value: 242 Volt: 0.18064516129032257 Temperature: 18.065 ℃
Value: 240 Volt: 0.17419354838709677 Temperature: 17.419 ℃
Value: 239 Volt: 0.17096774193548384 Temperature: 17.097 ℃
Value: 238 Volt: 0.16774193548387095 Temperature: 16.774 ℃
Value: 237 Volt: 0.16451612903225804 Temperature: 16.452 ℃
Value: 236 Volt: 0.16129032258064516 Temperature: 16.129 ℃
Value: 235 Volt: 0.15806451612903225 Temperature: 15.806 ℃
Value: 234 Volt: 0.15483870967741933 Temperature: 15.484 ℃
Value: 233 Volt: 0.15161290322580645 Temperature: 15.161 ℃
Value: 232 Volt: 0.14838709677419354 Temperature: 14.839 ℃
Value: 231 Volt: 0.14516129032258066 Temperature: 14.516 ℃
Value: 230 Volt: 0.14193548387096774 Temperature: 14.194 ℃
Value: 229 Volt: 0.13870967741935483 Temperature: 13.871 ℃
Value: 228 Volt: 0.13548387096774192 Temperature: 13.548 ℃
Value: 227 Volt: 0.132258064516129 Temperature: 13.226 ℃
Value: 226 Volt: 0.12903225806451613 Temperature: 12.903 ℃
Traceback (most recent call last):
File "/home/pi/temp_analog.py", line 25, in <module>
^C time.sleep(1)
KeyboardInterrupt
おまけ
以下にある方法とcrontabを組み合わせると、定期的にデータを確認できます。
LINE notify による通知連携 - Opensourcetechブログ
crontab
https://github.com/kujiraitakahiro/RaspberryPi/blob/master/temp_analog2.py
おわりに
実は以前今回と同じことをやろうとして うまくいかずに挫折したことがあったのですが(半年くらい前かな?)、無事に完了できてホッとしましたw
電子工作って、以下のような知識と経験が身についていいですね。
・電子部品の種類や役割
・電気の知識(ボルト・アンペア・抵抗Ω・アノード・カノードなど)
・ADコンバータ(MCP3002)やアナログ温度センサー(LM61BIZ)の製品やデータシートの見方
・Pythonなどデータをとるためのプログラミング技術