カテゴリー別アーカイブ: Raspberry Pi

(94) 【連載1-4】初ラズパイ: 温度データをSCPで周期転送

(94) 【連載1-4】初ラズパイ: 温度データをSCPで周期転送

1. やりたいこと

「はじめてのラズパイ!」をメモして行きたい。この連載の最終目標は、
ラズパイで周期温度報告端末装置(WiFi経由)を作る
こと。

(91) 【連載1-1】初ラズパイ: 選定&入手編 では、ラズパイを入手した。
(92) 【連載1-2】初ラズパイ: WiFiで繋ぐ では、ラズパイに WiFi経由でSSH接続した。
(93) 【連載1-3】初ラズパイ: 温度センサーをつなぐ では、ラズパイで温度値を取得した。

今回は、ラズパイで取得した温度値を、WiFi経由で周期的に SCP送信できるようにする。

2. 方針

今回は実装方針で少々迷っている。

(1) 実装方法の候補

候補1) 周期的に取得した温度値を単発で送信する。
候補2) 周期的に取得した温度値を記録した今日一日分の温度データを送信する。
候補3) 周期的に取得した温度値を記録したデータを基に作ったグラフデータ or 画像を送信する。

どれにしようか…

候補1)はあんまりにも単純で不親切か?
候補3)は過剰サービスか?
候補2)ぐらいがよいのか?

(2) 方針を決定

1) 1日 1ファイルを作成する。
2) 周期処理では、このファイルに「時刻、温度」を追記していく。
3) 周期処理では、このファイルを更新後に SCP転送する。

まずはこれでやってみよう。

3. やってみる

(1) シェルスクリプトを作成

crondで周期実行するシェルスクリプトを書く。

処理フローは以下の通り。
1) 最新温度を取得する。 (Shell)
2) 今日の温度記録ファイルに情報を追記する。(Python)
3) このファイルを SCP転送する。 (Shell)

update_temp.sh

#!/bin/sh
cd /home/piuser/temperature

TEMPFILE=/sys/bus/w1/devices/28-0000086e3f47/w1_slave
DATETIME=`date +%Y_%m%d_%H%M`
 
# 1) measurement (Shell)
TEMPRAW=`cat $TEMPFILE | grep -e "t=" | awk -F "t=" '{print $NF}'`
TEMPDEG=`echo $TEMPRAW | awk '{printf("%.1f", $1 / 1000)}'`
 
# 2) update file (Python)
python update_temp.py $DATETIME $TEMPDEG
 
# 3) send (Shell)
for FILE in `find . -type f | sort -r`; do
  scp -i ./.my_private_key.ppk $FILE hoge@example.com:~/temperature
  break
done
#end

(2) Pythonプログラムを書く

Pythonでは、周期起動時に最新の温度情報を 1日分の温度記録ファイルに保存する処理を実装する。

update_temp.py

import sys
import os
import numpy as np

#---------------------------------
# argv[1] : date "yyyy_mmdd_hhmm"
# argv[2] : temperature "sxxxxxx.x"
if __name__ == '__main__':
    ary_argv = sys.argv
    a_datetime = ary_argv[1].split('_')
    a_date = '%s_%s' % (a_datetime[0], a_datetime[1])
    a_time = a_datetime[2]
    a_temp = ary_argv[2]

    fpath = a_date + ".csv"

    if True == os.path.isfile(fpath) :
        tempData = np.loadtxt(fpath, delimiter=',', dtype='|S8', ndmin=2)
        tempData = np.append(tempData, [[a_time, a_temp]], axis=0)
    else :
        tempData = np.array([[a_time, a_temp]], dtype='|S8')

    np.savetxt(fpath, tempData, delimiter=',', fmt='%s')

(3) 単発で実行してみる

$ ./update_temp.sh

OKだ!
意図した通りに CSVファイルがアップロードされていた。

(4) crondで周期実行する

$ crontab -e

10分ごとに実行する。

*/10 * * * * /home/piuser/temperature/update_temp.sh

4. 所感

ひとまず…
ラズパイで収集した温度データを、周期的に別マシンに転送するところまでは出来た。

これで本連載は終わりでよいのか?
やけに尻すぼみな終わり方になってしまうが…

意図せず 1-Wireのおかげでデバイス制御プログラムの実装工数がゼロになってしまった。
デバイス制御を Pythonでガリガリ書くつもりだったがこれが叶わず、最後のファイル出力処理で無理やり Pythonの出番を作ったかのようになってしまった。

これが教育用デバイスであるラズパイの長所なのであろう。
とにかく敷居が低くとっつきやすいと感じた。

センサー等のいろいろなデバイスを容易に接続できる。
Linuxベースの OSを使えば無数のソフトウェア資源も使える。
きっと少ない工数でやりたいことを実現できるのだろう。

坂村さんが 「T-Engineでユビキタスコンピューティング」と盛んに仰っていた頃を思い出す。
IoTと名前を変え、今まさにそんな時代が本当に近づいているのだと感じる。

今回は尻すぼみで今一つ達成感の無い終わり方になってしまったが、またいつかラズパイに別のデバイスを接続して遊んでみようと思う。


(93) 【連載1-3】初ラズパイ: 温度センサーをつなぐ

(93) 【連載1-3】初ラズパイ: 温度センサーをつなぐ

1. やりたいこと

「はじめてのラズパイ!」をメモして行きたい。この連載の最終目標は、
ラズパイで周期温度報告端末装置(WiFi経由)を作る
こと。

(91) 【連載1-1】初ラズパイ: 選定&入手編 では、ラズパイを入手した。
(92) 【連載1-2】初ラズパイ: WiFiで繋ぐ では、ラズパイに WiFi経由でSSH接続した。

今回は、ラズパイに温度センサーを接続し、温度値を読み取れるようにする。

2. センサーを選定

いろいろとネット上で情報収集した結果、以下の2点に絞られた。
1)DHT11

・温度に加えて湿度も計測できる。
・測定範囲は不明… (0℃ ~ 40℃ ?)
・精度は 25℃で ±2度
・センサーは 10℃ ~ 40℃ の範囲内に置けと…
参考情報

2)DS18B20+

・測定範囲は -55℃ ~ 125℃
・精度は -10℃~85℃の範囲で ±0.5℃、この範囲外は ±2℃
参考情報

そもそもの目的が
水道管凍結対策のための温度監視
なので、動作環境 10℃ ~ 40℃を謳っている上記1)はダメだ…

よって…
今回は、上記2)を購入することになる。

周辺デバイスを簡単に付け替えられるのも Raspberry Piの魅力なので、今後もし気になったデバイスが現れたらそれに交換してみよう。

3. センサー&パーツを調達

この手の物の購入は秋月さんと私の中では決まっている。
20年近く前に AKI-H8 を購入して以来、秋葉に寄っては模型のギアなどの小物をいろいろと買わせていただいている。

今回は以下の 4点を購入した。送料込みで 1,900円ほどのお買い物。
1) 温度センサー
2) ブレッドボード(45mm x 35mm, プルアップ抵抗を挟むために簡単な回路を実装)
3) ジャンパー線
4) 抵抗

4. やってみる

(1) 全部つなぐ。

Raspberry Pi Zeroの GPIOのピン配置は下図の通り。


https://www.raspberrypi.org/documentation/usage/gpio/README.md

使用する温度センサーデバイスのピン配置は下図の通り。

https://datasheets.maximintegrated.com/en/ds/DS18B20.pdf

参考 m(_ _)m

上図は BOTTOM VIEW (=デバイスを下側から眺めた図)であることに注意!
平たい面を正面から見たとき、左下の足が Pin#1である。
ピン番号を間違えないように!

今回はラズパイと温度センサーの間で以下の 3本の線を接続する。
1) RaspPi GPIO Pin#1 ~ DS18B20 Pin#3 VDD
2) RaspPi GPIO Pin#6 ~ DS18B20 Pin#1 GND
3) RaspPi GPIO Pin#7 ~ DS18B20 Pin#2 DQ

また、上記の温度センサーのデータシートでは「DQ端子は High-Z」すなわち ACTIVE LOW な信号線 と書かれているので、電源ラインから 4.7kΩのプルアップ抵抗を繋いで DQ信号線アイドル時の HIGH状態を維持する。このためブレッドボード上に簡単な回路を組んでラズパイと繋げた。

https://datasheets.maximintegrated.com/en/ds/DS18B20.pdf

実物はこんな感じで繋げた。

(2) ラズパイで 1-Wireを有効化する。

1-Wire とは、GNDと信号線 1本の合計 2本の線でデバイスを制御するプロトコル仕様だそうな。
Raspberry Piはこのバスプロトコルをサポートしているのだそうな。

1) /etc/modules を書き換える。

sudo vi /etc/modules

システム起動時に 1-Wireデバイス用のモジュールを読み込ませるため、以下を追加する。

w1-gpio
w1-therm

2) /boot/config.txt を書き換える。

sudo vi /boot/config.txt

GPIO#4に対してラズパイ内蔵のプルアップ抵抗を有効にするため、以下を追加する。

dtoverlay=w1-gpio-pullup,gpiopin=4

3) ラズパイを再起動する。

sudo reboot

(3) 温度を参照する。

ラズパイによって 1-Wireデバイスが認識されると、システムディレクトリにその情報が出力される。

出力された温度情報を見てみる。

cat /sys/bus/w1/devices/28-0000086e3f47/w1_slave

こんな感じで出力される。

センサーが取得した温度値は 0.001℃単位で出力される。
上図の最終行の 20812 は 20.8℃と読めばよい。

実際にセンサーの近くに温度計を置いてみると…
だいたい同じ温度を示している。

水道管凍結監視目的であれば問題の無い精度だろう。(と期待している)
実際に外気温が氷点下になった頃に精度チェックをしてみよう。

(4) 温度値を整形する。

生データが 20812 であれば 20.8 と表示させたい。
Pythonで書くほどのものではないので、Shell Scriptで書いてみる。

#!/bin/sh
TEMPFILE=/sys/bus/w1/devices/28-0000086e3f47/w1_slave
TEMPRAW=`cat $TEMPFILE | grep -e "t=" | awk -F "t=" '{print $NF}'`
TEMPDEG=`echo $TEMPRAW | awk '{printf("%.1f", $1 / 1000)}'`
echo $TEMPDEG
#end

℃で表示できた。

5. 所感

少々拍子抜けしてしまった…
・温度センサーデバイスを初期化し、
・ポーリング or 割り込みで温度値を取得し、
等々、I/O制御するいわゆる制御系プログラミングを想定していたのだが、1-Wireなるバス規格のおかげで楽々実装できてしまった。というかほぼ何もしていない…

組み込みプログラミングの楽しみは、別デバイスで遊ぶ時まで取っておこう。

次回 (94) 【連載1-4】初ラズパイ: 温度データをFTPで周期送信 へ続く…

6. 謝辞

こちらのページを参考にさせていただきました。
先人の出し惜しみない情報に感謝感謝です。ありがとうございます。 m(_ _)m
http://blog.livedoor.jp/victory7com/archives/33399310.html
https://qiita.com/masato/items/2d07d4bc8e66bf4e5ec1
http://deviceplus.jp/hobby/raspberrypi_entry_018/
http://denpa-shinbun.com/entry/raspberrypi-ds18b20
http://www.denshi.club/pc/raspi/5raspberry-pi-zeroiot161.html
https://qiita.com/MagurosanTeam/items/f76a65f7eb4e27d44b5f


(92) 【連載1-2】初ラズパイ: WiFiで繋ぐ

(92) 【連載1-2】初ラズパイ: WiFiで繋ぐ

1. やりたいこと

「はじめてのラズパイ!」をメモして行きたい。この連載の最終目標は、
ラズパイで周期温度報告端末装置(WiFi経由)を作る
こと。

(91) 【連載1-1】初ラズパイ: 選定&入手編 では、ラズパイを入手した。

今回は、ラズパイを起動し、WiFi経由で屋内LANに繋げ、SSH接続するまでをやってみる。

2. やってみる

(1) NOOBSを SDカードに入れる

NOOBSとは、Raspberry Pi財団の公式 OSである Raspbian OSをインストールするためのソフトのこと。

Raspberry Pi財団のサイトから無償でダウンロードできる。

今回購入したセットの場合、付属の micro SDカードにすでに NOOBSが入れられていた。
よってこの作業は省略する。

必要な場合は、上記の Raspberry Pi財団のサイトからダウンロード&解凍したファイル一式を micro SDカードにコピーすればよい。

(2) 諸々を接続

写真の右下に USB端子が二つ並んでいる。
・右側USBは、電源用の USB micro B端子
・左側USBは、通信用の USB micro B端子(当然電源供給もできる)
 よって、左側に USBハブを接続し、これにキーボードとマウスを接続する。

写真左下のHDMI端子には HDMIケーブルを接続し、そのままディスプレイに繋ぐ。
上側にあるゲジゲジにはいずれ温度センサーを接続するが、今は使わない。

(3) 初回起動 & OSインストール

初回電源投入直後、こんな画面が表示された。
上記(1)で SDカードに入れた NOOBS が表示している画面だ。

Raspbian OSをインストールしたいので、上側にチェックを付け、[i]キーを押してインストールを始める。

インストール中…
Raspbian OSは debian linuxをベースにしているのだそうな。

インストールが完了したので Raspberry Piを再起動する。

小さな本体からは想像できないリッチな UIが現れた!

(4) WiFi設定

画面右上の WiFiマークを右クリックし [Wireless & Wired Network Settings] を選択する。

自宅の WiFiルーターの情報を設定する。
今回は DHCPを無効にし、Raspberry Piに固定IPを割り付けた。
  SSHでしばしばアクセスするのに都合がよいため。

この時点で WEBブラウザを開いて Yahoo!とか見られるようになる。
7cm x 3cmぐらいの小ささだけど、立派なパソコンです!

(5) ネットに繋がったのでソフトをアップデート

sudo apt-get update
sudo apt-get upgrade

(6) SSH接続可能にする

Raspberry Pi上で SSHサーバを動かし、外部から WiFi経由で SSH接続できるようにする。

1) terminalを開き raspi-configを起動する。

2) Interfacing Options を選択する。

3) SSH を選択し、Enableを選択する。

4) 念のためにデフォルトユーザー(pi)のパスワードを変更する。
・ちなみにデフォルトユーザーの初期値は以下の通り。
 ID: pi
 PW: raspberry

5) Windowパソコンから SSH接続してみる。

ここでは puttyで接続してみる。IPアドレスは上記(4)で固定 192.168.1.16に設定済み。

SSHでログインできた!

3. 所感

・小さくても立派な Linuxマシンだ!
・embeddedな匂いがまったくしない。
・勉強のために電源投入直後からの H/W制御を学びたい人は AKI-H8とかを選んだ方がよいかも。

次回 (93) 【連載1-3】初ラズパイ: 温度センサーをつなぐ へ続く…


(91) 【連載1-1】初ラズパイ: 選定&入手編

(91) 【連載1-1】初ラズパイ: 選定&入手編

1. やりたいこと

「はじめてのラズパイ!」をメモして行きたい。この連載の最終目標は、
ラズパイで周期温度報告端末装置(WiFi経由)を作る
こと。

(1) 動機

今年の冬はとっても寒かった。
気温が氷点下になる日も多く、水道管の破裂が心配な毎日だった。

そこで…
家の中の任意の場所の温度を常時計測し、その値をモニタリングしたいと思った。

ぱっと思い浮かんだのが、温度センサーを搭載した何かしらの端末装置から、WiFi経由で温度を周期的に送信させ、それをモニタリングすること。

この「何かしらの端末装置」の候補として Raspberry Pi(=ラズパイ) を使おうと思った。

(2) 方針

しかし…
ラズパイの名前は聞いたことがあるけれども、それ以上の知識は一切持たない。

ちょっと調べてみると、Linuxが載せられて Python でプログラムを書いて動かせるとのこと。
ということであれば百聞は一見に如かずでやってみようと思った。
※Raspberry Piの pi は Python の pi のこと!

すんなりうまくは行かないかもしれないが、これから数回に分けて
Raspberry Piで周期温度報告装置を作る
をやってみることにした。

素人考えでは以下の手順で実現できるはず。
1)ラズパイの I/Oポートに温度センサーを接続する。
2)ラズパイ上で温度センサーを制御するプログラムを動かす。
3)温度センサーから取得した温度値を WiFi経由で別マシンに送る。

回路設計、プログラム設計などは次回以降に置いておき、まずはラズパイの入手と基本的な設定をやってみる。

2. 道具の調達

(1) 選定

前述のような方針なので、まずはラズパイ本体だけを購入し、実際に使ってみる。
「温度監視」という今回のライトな使用目的の場合、高機能な物は要らない。

そこで選んだのがこちら。
Raspberry Pi Zero WH

上記のリンク先は Raspberry Pi Zero W だが、今回はこれの汎用 I/O部分にコネクタを付けた Raspberry Pi Zero WH (2018年1月発売)を使用することにした。

今後 I/Oにいろいろな周辺デバイスを繋げて遊んでみたくなるだろうし、その度にはんだ付けするのは面倒なので、簡単に付け外しができる GPIOコネクタを実装した物にした。

この Raspberry Pi Zero WH の仕様は以下の通り。

https://www.raspberrypi.org/products/raspberry-pi-zero-w/

個人的には、
・WiFiが使える。
・温度センサーがつなげる。
で必要十分なのだ。

(2) 購入

購入したのはこちらのセットだ。

電源、USB変換コネクタ、HDMI変換コネクタなど、初心者がとりあえず動かしてみるのに必要な物一式がセットになっているのだそうな。

(3) 開封

ネット上では「品薄」なる情報が多かったが、すんなりと注文翌日には手元に届いた。

入っていたのは全6点だ。

[1] Raspberry Pi Zero WH

[2] micro SDHCカード
・OSを入れたりする。
・パソコンでいうところのHDDに相当する。

[3] 電源(ACアダプター)
・ラズパイ側の入力は USB micro Bだ。

[4] USB変換ケーブル
・USB Aから USB micro Bに変換する。

[5] HDMI変換コネクタ
・HDMI Standard A から HDMI mini C に変換する。
・映像をディスプレイに出力するのに使う。

[6] ラズパイ格納ケース
・実運用時には基盤を裸では使わない。

これから遊んでみようっと!

次回 (92) 【連載1-2】初ラズパイ: WiFiで繋ぐ へ続く…