Opensourcetechブログ

OpensourcetechによるNGINX/Kubernetes/Zabbix/Neo4j/Linuxなどオープンソース技術に関するブログです。

アナログ温度センサーLM61BIZとADコンバータMCP3002で、温度を測定する

こんにちは、LinuCエバンジェリストこと、鯨井貴博@opensourcetechです。

 

今回は、アナログ温度センサーLM61BIZと ADコンバータMCP3002を使って、

温度を測定します。

 

 

 使用部品

アナログ温度センサー LM61BIZ

左から電源+(今回は3.3V)、データ出力、GNDとなります。

-25℃〜85℃の範囲を測定出来る温度センサーです。

なお、0℃時 600mV(0.6V)のオフセットがあるのでプログラム作成時には考慮する必要があります。

f:id:opensourcetech:20190320235559p:plain

高精度IC温度センサLM61BIZ: センサ一般 秋月電子通商-電子部品・ネット通販

 

ADコンバータ MCP3002

アナログ温度センサーから受信したデータを、デジタルデータに変換する役割を持ちます。

下の中央2つの端子でデータを受け付けることが出来ます。

f:id:opensourcetech:20190320235911p:plain

10bit 2ch ADコンバータ MCP3002−I/P: 半導体 秋月電子通商-電子部品・ネット通販

 

 

 配線図

以下のように、Raspberry Pi(今回はzero wを使用)・MCP3002・LM61BIZを接続します。

※26番の代わりに、24番を使ってもOKです。

※電源+/GNDを逆に接続すると、温度センサーがむちゃくちゃ熱くなる(マジで火傷しそうなくらい熱くなります)ので間違えないように注意しましょう。

f:id:opensourcetech:20190320235319p:plain

 

それぞれの端子の意味や製品仕様については、以下からチェックしましょう。

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の有効化

pi@raspberrypi:~ $ sudo raspi-config
5 Interfacing Options -> P4 SPI と進み有効化します。
※Rasbianのバージョンによって設定箇所が異なる可能性あり。

f:id:opensourcetech:20190321002846p:plain

f:id:opensourcetech:20190321002915p:plain

f:id:opensourcetech:20190321002943p:plain

f:id:opensourcetech:20190321003005p:plain

 

 その後、SPIモジュールが認識されていることと、spidev0.0とspidev0.1の2つのMCP3002からのデータ受信用のファイルが/devにあるか確認します。

pi@raspberrypi:~ $ lsmod | grep spi
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 apt-get install python-spidev
pi@raspberrypi:~ $ sudo pip3 install wiringpi
 

 なお、以下のようにpythonが2.系と3.系が同居している場合は、

パスの指定など間違えないように注意しましょう。

この記事の中では、python3.系を使ってます。

pi@raspberrypi:~ $ python
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で行います。

※以下は、見やすく整形しているので実際にはもっと沢山出力されてジワジワ温度変化するように見えると思います。

pi@raspberrypi:~ $ /home/pi/temp_analog.py
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

1 * * * * curl https://notify-api.line.me/api/notify -X POST -H "Authorization: Bearer *******************************************" -F "message=`/home/pi/temp_analog2.py`"
 
temp_analog2.pyについては、以下にアップしてます。

https://github.com/kujiraitakahiro/RaspberryPi/blob/master/temp_analog2.py

 

 

 おわりに

実は以前今回と同じことをやろうとして うまくいかずに挫折したことがあったのですが(半年くらい前かな?)、無事に完了できてホッとしましたw

 

電子工作って、以下のような知識と経験が身についていいですね。

・電子部品の種類や役割

・電気の知識(ボルト・アンペア・抵抗Ω・アノード・カノードなど)

・ADコンバータ(MCP3002)やアナログ温度センサー(LM61BIZ)の製品やデータシートの見方

・Pythonなどデータをとるためのプログラミング技術

 

 

 

 

www.slideshare.net

github.com

www.facebook.com

twitter.com

www.instagram.com

 

 

にほんブログ村 IT技術ブログ Linuxへ
Linux

にほんブログ村 IT技術ブログ オープンソースへ
オープンソース

 

 

Opensourcetech by Takahiro Kujirai