ラピロ(Rapiro)の電源を付けっぱなしにしていると、ラピロの体に内蔵されているArduino基盤あたりがとても暖かくなるので、温度計センサーを取り付けて計測してみる。
温度計センサー(DS18B20)は、抵抗とGPIO用のケーブルと一緒に専用の基盤にハンダ付けする。ラピロ頭部には、たくさんの部品を後付けできる十分なスペースがある。今後のためにも無駄な隙間を探してセンサーを効率的に配線、設置します。
ラピロに内蔵したラズパイ(Raspberry Pi3 ModelB)のGPIOコネクタ接続図。接続した部品は、超小型アンプモジュール(音量調整付き)、ラズパイ専用カメラモジュール、マイク内蔵USBカメラ、ラピロ(Arduino)基盤、そして温度計センサー(DS18B20)の計5つ。GPIOには沢山の空きポートがあるので、まだまだ改造が可能。
「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度。
このスクリプトは、温度を取得して、ファイルに追記保存するもの。ジョブを自動実行する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
【設定】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)
温度計センサーに指で触ってみると、手っ取り早く温度の変化を実験することが出来た。
今度は、連続ヒートラン試験。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度を越えたら、飼い主にメールで自動通知するとか。
温度計センサー部品の電子工作が出来れば、Pythonスクリプトで温度データを取得するのはとっても簡単(わずか数行のスクリプトで良い)だということが分かった。温度データを活用すれば、閾値を設定して暑かったり、寒かったりしたら、メールで自動通知したり、温度を元に季節の挨拶「例えば、今日は暑いですね」とか知的な挨拶ができたり、人工知能(AI)と言うのに相応しい機能を実装できるはずだ。明日、やってみようっと。