2019 年度 OSS リテラシ 3 : センサーの較正 (超簡易版)

はじめに

センサーの出力値には必ず誤差が含まれる. 基準からの絶対誤差を精度 (Accuracy) と言い, センサーのデータシートで確認することができる. 例えば Si7021 のデータシート からは, 温度の絶対誤差は ± 0.4℃であることがわかる.

利用するセンサーの 1 つ 1 つについて特性を調べて補正式を作ればセンサー同士の「相対的な精度」を上げることができる. 例えば京都大学の酒井教授のグループでは 利用するセンサーについて徹底的に較正を行い, センサ同士の相対的な精度を精度の 1/10 程度まで押さえ込んでいる.

しかしながら, 今回は較正にかける時間的余裕がないため, 「センサーが壊れていないか」「精度がデータシート通りになっているか」を把握することを目的とする.

前準備

ラズパイを起動したときにセンサーからデータを取得してサーバに送るスクリプトを 自動的に起動するようにする. 以下の例ではホームディレクトリに置かれた sensor.sh を起動する方法である. 起動したあと, 2 分ほど時間を開けてからスクリプトを実行すると良い.

$ crontab -e

  (末尾に追加)
  @reboot  sleep 120; bash sensor.sh

テスト方法

3 名程度で 1 チームとする. 全員のセンサーを隣接させ, ほぼ同じ場所の温度・湿度の計測を行う. センサーがある付近の空気をよくかき混ぜるために, 団扇や下敷きなどで風を送ると良い.

比較検討を行う上で, 全員のデータを 1 つのサーバに送ると都合が良い. 教員のサーバに送るよう設定してみよ. 以前に作成した sensor.sh において 以下の行を追加すれば良い. パスワードはかかっていないので, curl コマンドの -u オプションは必要ない. 同様にして, チームの代表者のサーバにデータを送るような設定を入れておくのも良いだろう.

$ vi sensor.sh

   ...(略)...
   url0=iot-50.epi.it.matsue-ct.jp/~hogehoge/php/monitoring.php (変数 url0 を追加)

   ...(略)...
   curl -u user:passwd "https://$url?hostname=$hostname&time=$time&temp=$temp&humi=$humi"    (既存の行)
   curl "https://$url0?hostname=$hostname&time=$time&temp=$temp&humi=$humi"   (追加する行)
   ...(略)...

もし, ケーブルが短くてセンサー同士を隣接させづらい場合は, 1 m の長いケーブルを使うと良い. 但し, センサーによっては長いケーブルを使う場合には値が取れないことがあるのに注意せよ (i2c はノイズに弱いため). その場合は長いケーブルを使う人を交代するなど, 臨機応変にうまく対応して欲しい.

また, 時間的な余裕があれば, センサーをドライヤーで温めたり, センサーを保冷剤に近づけてみること (決してセンサーを保冷剤に触れさせないこと. 水に濡れると壊れる).

データの確認 (1)

grafana でチーム全員のデータを時系列プロットし, その値が大きくずれていないことを確認する. 教員の grafana はログインしなくてもダッシュボードが作れる設定になっているので, 各チームで適宜ダッシュボードを作成して構わない. ダッシュボードには少なくとも 温度と湿度の 2 つを示すこと.

教員の grafana サーバ

得られた結果から, センサー間の誤差がどの程度か把握すること. また, もし値の大きく外れるセンサーがあれば教員に報告すること.

データの確認 (2)

較正を行う際は時系列プロットで比べるよりも, 散布図を作る方が一般的である. どれか 1 つのセンサーを基準として, 横軸を基準センサーの値, 縦軸を基準センサーからのずれとする. 較正に使う物理量は温度と湿度の 2 つは必須とする. 他の物理量は任意とする. なお, センサーごとに散布図に打つ点の色を変えること.

テストした結果, 各人のサーバの DB や教員の DB にセンサーのデータが格納されるはずである. grafana では散布図は作れないため, 各人のデータを csv ファイルに出力すると良い. もちろん, Ruby の mysql2 や ActiveRecord から DB 内のデータを取り出しても良いが, csv を作るだけなら以下のような簡易的な方法を取ることができる.

なお, 散布図の作成には Windows 上のエクセルを用いても構わない. もしくは, UNIX の伝統的描画ツールである gnuplot を使うと良い. Ruby から gnuplot を使う方法は, gnuplot のインストールとグラフの描画 を参照のこと.

csv の出力方法 (1) : データベース (MySQL) からテーブルの値を CSV 出力

mysqldump コマンドを使って csv ファイルを出力することができる. このコマンドは mysql ユーザ権限でファイルを作成するので, /tmp などの全ユーザに書き込み権限があるディレクトリに出力する必要がある. --tab オプションで出力先のディレクトリを指定する.

$ mysqldump -u hogehoge -p --tab=/tmp --fields-terminated-by=, iotex monitoring

上記の例では, /tmp/monitoring.txt というファイルが作成される. mysqldump ではテーブルの全データをダンプするので, テーブルのデータの一部のみを csv ファイルに保存する用途には向かない.

csv の出力方法 (2) : grafana を使う場合

grafana でグラフのタイトル部分を右クリックすると, データを csv に出力することができる (下図). また Windows PC で "CSV export" を行うとファイルが Windows 上に保存されるので, エクセルなどで解析したい場合は手間がかからない. Export CSV で "Mode : Series as rows" を選ぶと良い.

csv からの散布図作成での注意事項

本来は次週以降に行う平均値の計算を行ってから散布図を作るべきである. 現時点では各センサーのデータの時刻が揃っていないという問題があるが, 多少の時刻のずれには目を瞑ることにする.

grafana から "Mode : Series as rows" で CSV を作った場合, series カラムの番号でセンサーが区別されている. 適宜データを折り返して ごく近傍の時間帯で差を取れば良い. Excel ファイルの例を学内の wbt に置くので, それを参照して欲しい.

課題

上記で作成したダッシュボードのスナップショットと散布図, さらにはそれらの図から言えることを文書にまとめて wbt にて提出せよ. チームメンバー全員同じ図を提出するので構わない (代表者のみ提出する形にしないこと).

時間的な余裕があれば, センサーをドライヤーで温めたり, センサーを保冷剤に近づけてみること (決してセンサーを保冷剤に触れさせないこと. 水に濡れると壊れる). 温度湿度以外の物理量も比較してみること.