自室環境モニタシステム

自室の環境モニタシステムを作製中なので、現時点までにやったことをメモ。

やろうとしていること

  • 自室の環境 (温度、湿度、気圧、照度、消費電力など) をモニタリングするシステムを作りたい。
  • これらのデータを記録することで、例えば以下のような応用が考えられる:
    • 温度・湿度・気圧データ => 熱中症や乾燥などへの注意喚起、体調との相関関係の調査
    • 温度・湿度・照度データ => 在室状況や行動推定 (在室 or 不在、起床 or 睡眠くらいは区別できるかも?)
    • 消費電力データ => サーバの監視
  • また、これまでに使ったことのない種類のセンサ (気圧センサなど) やバス (I2C, SPI) などに触ってみて勉強する、という目的もある。

f:id:sobataro:20151029224858j:plain ↑環境モニタシステムの試作機の一部。ブレッドボード中央の緑色が温度・湿度・気圧センサ BME280。このままではブレッドボード上のスペースも余っているし、もう少しセンサを追加したい……

システムの概要

  1. 各種センサを Raspberry Pi に繋ぎ、データを収集する
    • I2C, SPI などのバスでセンサを接続する。
  2. データを蓄積する
    • CSV, RDB などの再利用できる形式でデータを保存・蓄積する。
  3. 収集・蓄積したデータを可視化する
    • データのグラフを確認できるようにする。
    • データの応用については、ひとまず本システムでは考えないことにする (応用を考える場合、本システムはそのためのインフラとして位置づけられる)。

検討事項と現在の試作状況

いまのところ、システムの試作を行っていて、ハードウェアは試作機が用意済み、ソフトウェアはこれから、という状況。その上で検討(した|これからする)事柄について書く。

収集するデータの種類と、利用するセンサについて

  • センサの種類としては、いまのところ以下のものを試用している。
    • 温度・湿度・気圧センサ: BME280
    • 電流センサ: CTL-10-CLS
      • 本当はもっと安いやつ (1000円未満の) でいいんだけど、試作段階ではそのへんに転がっていたやつを利用。
  • また、以下のセンサについても購入および使用を検討中。
    • 照度センサ: フォトトランジスタ NJL7502L または I2C 対応照度センサ IC TSL2561 あたり?
    • ガスセンサ: TGS2450 など (においで在室検知とかできそうな気はするけど、できてしまったらそれはそれでショックかもしれない。。。)
    • その他: ドア開閉センサ、ガイガーカウンタ、など。おもしろい応用があって、安価に入手できるセンサがあれば追加したい。

消費電力データの収集とリアルタイム処理について

  • 消費電力データ (電圧[V]・電流[A]・有効電力[W]・皮相電力[VA]) を収集するためには、電圧・電流の瞬時値を用いた計算が必要なため、少なくとも数百Hz*1のサンプリングレートが必要になる。この実現にはリアルタイム処理が必要になる。
  • Raspberry Pi でリアルタイム処理を行うには、(1)リアルタイムカーネルを利用する、(2)外付けのリアルタイム処理ユニットを追加する、の2種類の方法がある。
(1) リアルタイムカーネルを利用する場合
  • たとえば EMLID の Raspberry Pi 向けリアルタイムカーネルなどを利用して、 Raspberry Pi 自身にリアルタイム処理を行わせる方法。

    • 上記ページによると、このリアルタイムカーネルclock_nanosleep(2) のレイテンシが最小値12usec, 最大値77usec程度で収まるようだ。これを仮に、レイテンシの平均値を45usec, ジッタの最大値を+-33usecとし、さらにサンプリングレートの1%までのジッタを許容するものとすると、サンプリングレートは300Hzまで実現できる、ということになる*2
  • 利点

    • 外付けユニットが不要で低コスト
  • 欠点
    • Raspberry Pi の OS カーネルに手を入れる必要がある
    • ある程度 (数10usec程度) のジッタを防げない
(2) 外付けリアルタイム処理ユニットを利用する場合
  • Raspberry Pi 自体には手を加えず、リアルタイム処理ユニットとして適当なマイコン (Arduino や mbed など) を外付けする方法。
  • この場合、理想的には水晶発振子のジッタ程度しか気にしなくてよい……はず (不勉強のため嘘を言っているかもしれないが……)。

  • 利点

    • Raspberry Pi 側の OS カーネルはそのままでよい
    • ジッタはほとんど意識する必要がない (はず)
  • 欠点
    • 外付けユニットが必要で高コスト
結局どうするか
  • Raspberry Pi のカーネルをいじりたくなかったので、試作時点では arduino を利用したリアルタイム処理ユニットを外付けした。
  • また今回は消費電力データ収集という目的があり、AC100Vの商用電源を引き込んだ回路を作る。このため感電防止と機器保護の観点から、Raspberry Pi とGPIOで直結する回路でAC100Vを扱いたくない、という事情もある。

データの保存形式について

  • いまのところ、温度[℃]、湿度[%]、気圧[hPa]、消費電力 (電圧[V]、電流[A]、有効電力[W]、皮相電力[VA]) のデータを1分に1度収集して、CSV に保存している。
  • 仮にこの「1分に1度」という頻度でデータを収集して、1度のデータが100Byte*3だとすると、1年分のデータは 100 * 60 * 24 * 365 ~= 53MB ということになる。このくらいだとギリギリ CSVJSON でも良さそう。
  • データ収集頻度を1Hzとかにすると、1年分のデータは3.2TBということになってしまって、こうなるとテキストフォーマットは明らかに不向き。
  • とりあえずこのまま CSV でやって、時間があればちゃんとした DB を導入したい。

Raspberry Pi のストレージについて

  • Raspberry Pi のストレージは microSD なので、ここにデータを追記しまくるとすぐにぶっ壊れる。microSD への書き込み回数をできるだけ減らすため、一時ファイルを ramdisk (tmpfs) に保存 + 定期的にファイルサーバに転送、としている。

データの可視化について

今後

  • いろいろと書いたが、11月中にいったん完成させて、自室の環境を外からでもモニタリングできるようにしたい。

*1:電源周波数 (50 or 60Hz) の2倍以上; 有効電力と皮相電力をまともに計算するには少なくとも10倍程度が必要

*2:ここで出した数値にはあまり根拠がないことに注意。たとえばリンク先ページのグラフによると、上記カーネルのジッタの分布には偏りがあり、最頻値は25usec程度のように見える。また5%までのジッタを許容すれば、1500Hzでのサンプリングが可能になる

*3:上記の CSV 1行が100Byte程度