Funny Snowman

FunnySnowman > Geek<ギーク>なコトをやってみよっと

「ラピロ」のArduino基盤が熱いので温度計センサーを付けてみた。

ゴール設定(ラズパイに温度センサーを付けて温度を計測する)

ラピロ(Rapiro)の電源を付けっぱなしにしていると、ラピロの体に内蔵されているArduino基盤あたりがとても暖かくなるので、温度計センサーを取り付けて計測してみる。

Rapiro Arduino board makes warm

事前準備(ラピロに温度計センサーを内蔵する)

温度計センサー(DS18B20)は、抵抗とGPIO用のケーブルと一緒に専用の基盤にハンダ付けする。ラピロ頭部には、たくさんの部品を後付けできる十分なスペースがある。今後のためにも無駄な隙間を探してセンサーを効率的に配線、設置します。

温度計センサーをラピロに内蔵する

ラピロに内蔵したラズパイ(Raspberry Pi3 ModelB)のGPIOコネクタ接続図。接続した部品は、超小型アンプモジュール(音量調整付き)、ラズパイ専用カメラモジュール、マイク内蔵USBカメラ、ラピロ(Arduino)基盤、そして温度計センサー(DS18B20)の計5つ。GPIOには沢山の空きポートがあるので、まだまだ改造が可能。

ラピロ(Raspberry pi3) GPIOコネクタ接続図

事前準備(1-Wireを初期設定する)

「1-Wire」というデータ転送する規格がある。この1-Wireは、(共有可能な電源線を除き)GPIOをひとつしか使わずにデジタルセンサー情報を取得できる凄い技術である。これをセットアップする。

起動時にモジュールを読み込むための設定

「/etc/modules」に、[w1-gpio]と[w1-therm]を追記する。

pi@raspberrypi:~$ cat /etc/modules
# /etc/modules: kernel modules to load at boot time.
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with "#" are ignored.
w1-gpio        # 1wire-temperature
w1-therm       # 1wire-temperature
  

次に「/boot/config.txt」の[w1-gpio-pullup]を有効にする(コメントを外す)。

pi@raspberrypi:~$ sudo vi /boot/config.txt

▼コメントを外す
#dtoverlay=w1-gpio-pullup,gpiopin=24
  

▼検査
コメントアウトされていることを検査する

pi@raspberrypi:~$ cat /boot/config.txt | grep w1-gpio
dtoverlay=w1-gpio-pullup,gpiopin=24
  

▼検査
コマンド「lsmod | grep w1」でw1の存在を確認する。何も表示されない場合は下記を実行してモジュールを追加する。

pi@raspberrypi:~$ lsmod | grep w1
pi@raspberrypi:~$ _                         # ←何も表示されないと失敗。この場合は modprobe で追加する。
pi@raspberrypi:~$ sudo modprobe w1-gpio
pi@raspberrypi:~$ sudo modprobe w1-therm

pi@raspberrypi:~$ lsmod | grep w1           # ちゃんとw1が存在する場合。
w1_therm                3584  0
w1_gpio                 3657  0
wire                   25219  2 w1_gpio,w1_therm
  

実験(温度を計測してみる)

温度計センサーは、[w1]というデバイスのファイルとしてデータを読み取ることができる(さすがLinux)。下記デバイス名のw1_slaveをcatコマンドで読み出すと計測した温度を取得できる。

$ cat /sys/bus/w1/devices/28-031652ddc4ff/w1_slave
96 01 4b 46 7f ff 0c 10 a0 : crc=a0 YES
96 01 4b 46 7f ff 0c 10 a0 t=25375
  

「t=25375」を1000で割った値 25.375 が小数点3位までの温度値、つまり25.375度。

Pythonスクリプト:温度を計測して、ファイルに記録する。

このスクリプトは、温度を取得して、ファイルに追記保存するもの。ジョブを自動実行するcronデーモンに設定して、1分毎に温度を記録するなどに活用できるはず。このまま実行するなら、コマンド実行する度にファイルに温度を記録していきます。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import commands
import time
import datetime

if __name__ == '__main__':

    cmd = "cat /sys/bus/w1/devices/28-031652ddc4ff/w1_slave | "
    cmd += "perl -e 'while(){if(/t=([-0-9]+)/){print $1/1000;}}'"
    rtn = commands.getoutput( cmd )
    print( "温度 = " + rtn + "°C" )

    #ファイルへの出力
    now = datetime.datetime.now()
    rtn = rtn + ",{0:%Y/%m/%d,%H:%M:%S}\n".format(now)

    f = open( "/home/pi/myProgram/temperature.txt", "a" )
    f.write( rtn )
    f.close()
  

Pythonスクリプトの実行結果

pi@raspberrypi:~$ python temperature.py
温度 = 25.562°C
pi@raspberrypi:~$ cat temperature.txt
25.562,2017/06/10,22:32:44
  

Pythonスクリプトを自動実行する(cronの設定)

【設定】cronを[-e]オプションで実行して設定する。下図は、1分毎に毎回[python temperature.py]を自動実行する場合。

▼はじめてのcron設定(起動時にエディタを指定します)
pi@raspberrypi:~$ crontab -e
no crontab for pi - using an empty one

Select an editor.  To change later, run 'select-editor'.
  1. /bin/ed
  2. /bin/nano        <---- easiest
  3. /usr/bin/vim.basic
  4. /usr/bin/vim.tiny

Choose 1-4 [2]: 3
crontab: installing new crontab
▼2回目以降のcron設定(エディタが起動します)
pi@raspberrypi:~$ crontab -e
# m h  dom mon dow   command
# 例: 00 1 * * * python test.py #毎日1時に実行する
# 例: */2 * * * * python test.py #2分ごとに実行する
# 例: 2 * * * * python test.py #毎時2分に実行する
* * * * * python temperature.py
  

【スケジュールの検査】cronで自動実行するジョブを表示して確認する場合。

pi@raspberrypi:~$ crontab -l
# m h  dom mon dow   command
* * * * * python temperature.py
  

【ログ出力】cronのログを出力したい場合(設定しなくても可)。

pi@raspberrypi:~$ # ▽cronのログを出力するように変更。[#cron]のコメントを外す。
pi@raspberrypi:~$ sudo vi /etc/rsyslog.conf
#cron.*                         /var/log/cron.log
↓
cron.*                         /var/log/cron.log
pi@raspberrypi:~$ # ▽ログサービスを再起動する
pi@raspberrypi:~$ sudo /etc/init.d/rsyslog restart
[ ok ] Restarting rsyslog (via systemctl): rsyslog.service.
pi@raspberrypi:~$ # ▽ログを確認する
pi@raspberrypi:~$ cat /var/log/cron.log
Jun 10 22:19:01 raspberrypi CRON[3919]: (pi) CMD (python temperature.py)
Jun 10 22:20:01 raspberrypi CRON[3965]: (pi) CMD (python temperature.py)
Jun 10 22:21:01 raspberrypi CRON[4052]: (pi) CMD (python temperature.py)
  

実験(連続データを取得してグラフ化してみた)

温度計センサーに指で触ってみると、手っ取り早く温度の変化を実験することが出来た。

Rapiro Arduino board makes warm

今度は、連続ヒートラン試験。6月の気温が低めの朝方に計測して、ファイルに保存されたデータがこれ(↓)。

25.437,2017/06/11,08:10:01
25.437,2017/06/11,08:11:02
25.437,2017/06/11,08:12:01
25.437,2017/06/11,08:13:02
25.437,2017/06/11,08:14:01
25.5,2017/06/11,08:15:02
25.375,2017/06/11,08:16:02
25.375,2017/06/11,08:17:02
25.437,2017/06/11,08:18:02
25.437,2017/06/11,08:19:02
  

Excelで「テキストファイルを(カンマ区切りで)開く」を実行して、Excelシートに読み込んで折れ線グラフを作成してみた。犬猫などペットを飼っている人には、空調管理に良いかもしれません。例えば、気温が30度を越えたら、飼い主にメールで自動通知するとか。

Rapiro Arduino board makes warm

まとめ(ラズパイに温度センサーを付けて温度を計測する)

温度計センサー部品の電子工作が出来れば、Pythonスクリプトで温度データを取得するのはとっても簡単(わずか数行のスクリプトで良い)だということが分かった。温度データを活用すれば、閾値を設定して暑かったり、寒かったりしたら、メールで自動通知したり、温度を元に季節の挨拶「例えば、今日は暑いですね」とか知的な挨拶ができたり、人工知能(AI)と言うのに相応しい機能を実装できるはずだ。明日、やってみようっと。

Rapiro and Temperature Sensor

▲上に戻る