「Crystal Signal Pi(クリスタル・シグナル・パイ/以下、クリスタルシグナルPi)」連載3回目は、いよいよツール作成に挑戦!クリスタルシグナルPiと温度センサ(DS18B20)と連携させて、気温の変化に応じてアラートを発生させてみたいと思います。
この記事では、前々回セットアップしたラズベリーパイをそのまま使用します(本体:Raspberry Pi3/OS:Raspbian Jessie Lite)。
ブラウザからラズベリーパイのIPアドレスにアクセスしたところからスタートです!(この記事ではIPアドレス「192.168.0.9」としています)
カスタマイズの前に(sambaとbcのインストール)
sambaパッケージをインストールして、外部からファイルを直接編集できるようにしておくと便利に作業が進められます。
sudo apt-get update
sudo apt-get install samba
sudo nano /etc/samba/smb.conf
nanoエディタでsmb.confを開いたら、下記を追記します。
/etc/samba/smb.conf
[root]
path=/
read only=no
guest ok=yes
[scripts]
path=/var/lib/crystal-signal/scripts/
read only=no
guest ok=yes
[htmls]
path=/var/www/html/
read only=no
guest ok=yes
トップディレクトリを指定した「root」は、温度センサのデバイス名など、確認用に用意しておきました。リモート接続など、デスクトップ環境を使用せずに作業する場合(今回は「Raspbian Jessie LITE」を使用しているため)、このようにファイルを閲覧できる環境を準備しておくと便利に進めることができます。
「script」と「htmls」がクリスタルシグナルPi用のディレクトリです。「script」はボタン操作用のプログラムファイルのあるディレクトリ、「htmls」はミドルウェアの画面を構成しているファイルのあるディレクトリを指定しています。
それぞれのフォルダの中身はこのようになっています。
また、ファイルのアクセス権限を編集しておきましょう。既存ファイルの編集も行えるようにするには、下記のように実行します(※編集の必要が無いときは、権限は適切なものに変更してください)。
sudo chmod -R 777 /var/lib/crystal-signal/scripts/
sudo chmod -R 777 /var/www/html/
また、GitHubのページには、下記のような注意書きがあるので、スクリプトファイルは別名で作成するように注意しましょう。
注意: サンプルで用意されているスクリプトは、ミドルウェアのアップデート時に上書きされます。これらのスクリプトをカスタマイズしたい場合は直接編集せず、別名でコピーした上でご利用ください。
今回はシェルスクリプトを使ってソースコードを書いていきますが、小数を伴う計算には「bc」コマンドを使用するので、必要な場合は先にインストールしておきましょう。
sudo apt-get install bc
温度センサの準備
温度センサ(DS18B20)については、第18回「ラズベリーパイで手作り温度計!」で詳しく紹介しています。同様の手順で、まずは温度センサを使用できる状態に設定していきましょう。
クリスタルシグナルPiは、ラズベリーパイとの接続に12ピン分を使用するため、図3のように配線しました。今回は信号線の接続にGPIO23を使用します。
sudo nano /boot/config.txt
下記の1行を追記しましょう。末尾の数字は使用するGPIOの番号です(今回の場合は23)。
dtoverlay=w1-gpio-pullup,gpiopin=23
再起動後、1-Wireが有効になり、「 /sys/bus/w1/devices 」のディレクトリ内にファイルが生成されます。
図4は、先程「samba」で設定した「root」ディレクトリからたどって、ファイルを表示させてみたところです。温度を取得するには、ここで表示されているファイル名を使用していきます。今回の場合は「28-000006470bec」です。
温度を取得するコマンドは下記のようになります。
cat /sys/bus/w1/devices/28-000006470bec/w1_slave
2行目末尾の「t=」の後にある数値が、1000倍された温度の値で、図5の場合26.812℃となります。
プログラム作成
「scripts」ディレクトリにあるミドルウェアのスクリプトを参考に、プログラムを作成してみましょう!今回は、下記の条件で2種類のアラートを発生させるようなプログラムを書いてみました。
・27℃以上の場合→赤点滅
・20℃未満の場合→青点滅
/var/lib/crystal-signal/scripts/temperature.sh
#!/bin/bash DEVICENAME="28-000006470bec" MAX=27.0 MIN=20.0 SLEEP_TIME=5 #LED off /usr/bin/curl -s "http://localhost/ctrl/?ack=1" > /dev/null #LED start /usr/bin/curl -s "http://localhost/ctrl/?color=255,255,255&mode=2&repeat=0&period=5000&json=0" > /dev/null FLG=0 while [ $FLG -le 0 ] do #get temperature command=`cat /sys/bus/w1/devices/${DEVICENAME}/w1_slave` txt=${command##*t=} num=`echo "scale=3; $txt/1000" | bc` echo $num #set alert if [ `echo "$num > $MAX" | bc` -eq 1 ]; then /usr/bin/curl -s "http://localhost/ctrl/?color=255,0,0&mode=1&repeat=0&period=300&json=1&info=${num}" > /dev/null FLG=1 elif [ `echo "$num < $MIN" | bc` -eq 1 ]; then /usr/bin/curl -s "http://localhost/ctrl/?color=0,0,255&mode=1&repeat=0&period=300&json=1&info=${num}" > /dev/null FLG=1 fi #sleep sleep $SLEEP_TIME done
適温(この場合は20~27℃)の場合に何も起こらないのはわかりにくいので、「非同期点滅」を使ってグラデーションのように光らせるようにしています。
「Settings」画面で、クリスタルシグナルPiのボタンに処理を設定します。
今回は、消灯中の普通押しに「temperature.sh」を、点灯中の普通押しに「Ack.sh」(アラートを消す処理)を割り当てました。また、アラート停止と再起動を同時に行えるように、点灯中の長押しにも「temperature.sh」を設定しています。
- ボタンを押してtemperature.shをスタート(非同期点滅の状態)
- 温度を20℃以下にする→青色の点滅
- ボタンを押すとアラート停止(Ack.sh)
- ボタンを押してtemperature.shをスタート(非同期点滅の状態)
- 温度を27℃以上にする→赤色の点滅
- ボタンを押すとアラート停止(Ack.sh)
動画中の処理の流れはこのようになります。温度センサを保冷材で冷やしたり、指であたためたりして、温度を強制的に操作してテストしました。
また、「Log」画面はこのようになりました。
20℃以下と27℃以上でアラートが発生した際のログには、「Info」の列に温度の値が表示されています。
まとめ
クリスタルシグナルPi温度センサと連携させて、ツールに仕上げることができました!
ミドルウェアからスクリプトを選ぶだけで、ボタン操作との連携を簡単に実装できるのが魅力的!電子工作のむずかしい部分をカバーしてくれるので、ラズベリーパイ初心者の方にもオススメです。
そして、なんと言っても、ライトがきれい!なので、華やかさもプラスされた、一味違った電子工作を楽しむことができました。