環境センサーを作る
目次:
環境センサーを作る
マイコンの選択 Arduinoとmbed
Arduinoが動くWi-Fiモジュール ESP8266で環境センサーを作る
ARDUINOで消費電流モニターを作る
ESP8266の消費電流を調べる
seen from United Kingdom
seen from South Africa
seen from United States

seen from United Kingdom

seen from United States

seen from Türkiye
seen from France
seen from Argentina
seen from United States
seen from United States
seen from China

seen from United States
seen from United States
seen from Argentina

seen from United Kingdom
seen from United States
seen from United States
seen from Norway
seen from United States
seen from Argentina
環境センサーを作る
目次:
環境センサーを作る
マイコンの選択 Arduinoとmbed
Arduinoが動くWi-Fiモジュール ESP8266で環境センサーを作る
ARDUINOで消費電流モニターを作る
ESP8266の消費電流を調べる

Anya is live and ready to show you everything. Watch her strip, dance, and perform exclusive shows just for you. Interact in real-time and make your fantasies come true.
Free to watch • No registration required • HD streaming
ESP8266の消費電流を調べる
2016/8/17:IoT用クラウドサービスAmbientを使い、ESP8266の消費電流についてさらに詳細に調べました。詳しくは「ESP8266の消費電流の徹底調査」をご覧ください。
自作の消費電流モニターを使ってESP8266の消費電流を調べました。測定対象にしたのはESP8266を使った温度・湿度ロガーです。このロガーは単三乾電池3本を電源にして3端子レギュレーターで3.3Vを作り、ESP8266を駆動しています。消費電流モニターで使っている電流計モジュールINA226PRCの説明書を参考に、乾電池と3端子レギュレーターの間に消費電流モニターを接続しました。回路図を示します。回路図右下にあるのが電流計モジュールINA226PRCで、この図では省略してありますが、さらにこの右側に消費電流モニターがつながります。
消費電流モニターの回路図は「Arduinoで消費電流モニターを作る」をご覧ください。測定対象と消費電流モニターをつなぐとこんな感じになりました。
立ち上がり部分の消費電流
まず最初に、立ち上がってすぐDeep sleepモードに移行するプログラムを作り、ESP8266の立ち上がり部分の消費電流を調べました。
void setup() { ESP.deepSleep(60 * 1000000, RF_DISABLED); delay(1000); } void loop() { }
測定結果は次のようになりました。
縦軸の単位はmA、横軸は1目盛が5m秒、200目盛で1秒になります。ESP8266のスタート直後には200~300mAの電流が流れるようです。
Wi-Fiアクセスポイント(AP)接続までの消費電流
次は立ち上がりからWi-Fi APに接続するまでの消費電流です。
void setup() { wifi_set_sleep_type(LIGHT_SLEEP_T); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); } ESP.deepSleep(60 * 1000000, RF_DISABLED); delay(10000); } void loop() { }
測定結果です。
この測定では立ち上がりからWi-Fi AP接続までに約6.5秒かかっており、その間の消費電流(累積消費電流と呼ぶことにします)は427mA秒でした。Wifi.begin()の中ではWi-Fi APへの接続とDHCPでIPアドレスなどの取得をおこなっており、その処理に427mA秒の電流を消費していることになります。
Deep sleep版温度・湿度ロガーの消費電流
次は温度・湿度ロガーの消費電流です。温度・湿度ロガーのプログラムは次のような流れです。
Wi-Fiアクセスポイントに接続
温度、湿度を測定
クラウド上のサーバーに接続
測定データをサーバーに送信
5分間Deep sleep
5分後にリセットがかかり、1から処理を繰り返す
実際のプログラムはGithubに公開してありますので、そちらをご覧ください。消費電流の測定結果は次の通りです。
このロガーは5分周期で測定・データー送信を繰り返していますが、なるべく長期間ロガーを動かすために、データーを送信した後はCPUをDeep sleepモードにしています。Wi-Fi APに接続してから、温度・湿度を測定し、クラウド上のサーバーに接続し、データーを送信し、Deep sleepモードに移行するまでに約9.5秒かかっています。Deep sleepモードに入ると1.2~1.3mAしか電流を消費していないことが分かります。
5分間の累積消費電流を計算すると835mA秒でした。1時間に2.78mAhの電流を消費します。電池の持続時間は、温度や連続して放電するか間欠的に放電するかなどの使い方などの条件によって変わってくるようですが、仮にアルカリ単三乾電池から2000mAh引き出せるとすると、このロガーは719時間、つまり30日程度動く計算になります。実際には、この原稿を書いている時点でロガーは50日間連続で動き、まだ動き続けています。 ESP8266のDeep sleepはスリープから復帰するときにCPUがリセットされ、プログラムの先頭から実行を繰り返します。つまり周期の先頭で毎回Wi-Fi APに接続します。ここで430mA秒程度の電流を消費する代わりに、Deep sleepに入ると消費電流は1.2~1.3mA程度に下がります。 もう一つの実現方法として、Deep sleepを使わず、Light sleepを設定した上でloop()関数の中でdelay()で待ち時間を設定する方法があります。これについても消費電流を調べました。
Light sleep版の消費電流
プログラムはこんな感じです。
void setup() { Wi-Fi APに接続 } void loop() { 温度・湿度を測定 サーバーに接続し、データーを送信 delay(周期); }
測定結果を示します。
立ち上がりから6.5秒ほどでWi-Fi APに接続し、loop()処理にはいっているようです。delay()している間は少ないときは3mA程度の消費電流ですが、グラフでわかるように結構な頻度で70mAぐらいの電流消費があります。Wi-Fiルーターから周期的に発信されるビーコンを受信しているのではないかと思います。delay()中の消費電流を計算すると15mA秒程度でしたので、Light sleep版を5分周期で動かしたときの5分間の累積消費電流は4,760mA秒程度、1時間で16mAh程度になると思います。5分周期ならLight sleepよりDeep sleepの方が消費電流が低く抑えられます。スリープが32秒以上ならDeep sleepの方が消費電流が低くなると思います。
Arduinoで消費電流モニターを作る
センサー端末のようなIoT機器をバッテリーで長期間動かすために、センサー端末の消費電流の振る舞いが知りたくなります。そこで、ミリアンペア単位の電流値を数ミリ秒間隔で測定し、数十秒記録できるような消費電流モニターを作りました。
2016/7/28: データーをIoT用クラウドサービスAmbientに送信するようにしました。詳しくは「AmbientとESP8266でマイコンの消費電流モニターを作る」をご覧ください。
電流計モジュール INA226PRCを使う
電流値の測定にはストロベリー・リナックス社のINA226PRCというモジュールを使いました。
これは電源ラインの中に小さな値の抵抗(シャント抵抗)を入れ、その両端の電圧を測ることでそこを流れる電流を測定するものです。INA226PRCのシャント抵抗は25mΩで、分解能は0.1mAとのことです。このモジュールに使われている電流センサーはテキサス・インスツルメント社のINA226というチップです。マニュアルによると、チップ自体に複数回測定してその平均をとる機能があり、回数は1回から1,024回まで設定できます。また1回の測定時間も140μ秒から8.244m秒まで設定できます。測定時間を長め目にしたほうがノイズの影響が低く抑えられるようです。ノイズ影響を極力抑えるためには、測ろうとする間隔の範囲内で測定時間×平均回数がなるべく長くなるようにするとよいとありました。例えば20m秒間隔で測定するなら、シャント抵抗両端の電圧値測定と電源電圧測定の時間を共に588μ秒にして16回測定して平均をとるようにすると、トータルの測定時間が(588μ秒 + 588μ秒) * 16 = 18.8m秒と20m秒以内で長くなり、いいようです。ESP8266とINA226とはI2Cで通信します。回路図はとても単純です。
できあがった消費電流モニターの写真です。写真右下がESP8266、左下がUSBシリアル変換モジュール、写真上側が電流計モジュールINA226PRCです。ESP8266とINA226PRCをジャンパーワイヤーでつないでいます。INA226PRCの上に測定対象を接続します。
プログラムはGithubに公開しました。INA226にはキャリブレーションレジスターというレジスターがあります。名前からすると測定値の校正ができそうですが、INA226のマニュアルを見ると単に定数を書き込んでおくと、シャント抵抗両端の電圧から電流値に変換してくれるだけの機能です。INA226をマイコン制御するなら、このレジスターを使う必要はなく、シャント抵抗両端の電圧を読み、プログラムで電流値に変換すればすみます。プログラムはこの電流値を一定間隔で測定し、測定値をバッファーに記録するようにしました。電流値が±0.3mA以上になったら測定対象が動き出したと判断して記録を開始し、バッファーが一杯になったら測定値をシリアルポートにプリントしています。PC側のシリアルモニターでこの出力を表示し、手作業でcsvファイルにして処理するようにしました。
ESP8266のRAMはプログラムで使える領域が50kB程度です。INA226のシャント抵抗電圧値を保持するレジスターは16ビットですので、バッファーはshortの配列にしました。配列サイズを変えながらプログラムをビルドすると、配列サイズが7,000のところで以下のような警告メッセージがでました。
Low memory available, stability problems may occur.
そこで、配列サイズは4,000にしました。測定間隔5m秒で20秒間、10m秒で40秒間の電流値が測定・記録できるようになります。
次はこの消費電流モニターを使ってESP8266の温度・湿度ロガーの消費電流を調べます。
Arduinoが動くWi-Fiモジュール ESP8266で環境センサーを作る
電力モニターで自宅の電気の使用状況が分かるようになったので、室温や湿度と電気使用の関係を調べることにしました。温度や湿度は、居間など人がいる場所に近いところで測定したいのですが、測定場所の近くに電源コンセントやLANの口があるとは限りません。そこで温度や湿度を測定するセンサー端末は電池駆動にして、データーは無線で送るようにしようと考えました。当初想定した全体像は次の図のようなものです。
センサー端末を制御するマイコンも近距離通信モジュールも低消費電力のものを検討し、マイコンはmbed LPC1114、近距離通信はZigBeeを候補にしました。
ESP8266ベースに設計変更
その後、ESP8266というArduinoでプログラムが書けるWi-Fiモジュールが登場しました。Wi-Fiは消費電力がやや多めと言われます。ZigBeeですと例えばモノワイヤレス社の超小型無線モジュール TWE-Liteの消費電流は送受信時15~17mAですが、ESP8266の消費電流は平均80mAだそうです。しかしWi-Fiは無線LANルーターと直接通信ができてゲートウェイが不要になりますし、ESP8266自体の価格も1,000円未満と、全体に安価に環境センサーが作れます。そこで当初の方針を変更し、ESP8266で環境センサーを作ることにしました。全体像は次の図のようになります。
ベースとなるハードウェア構成やArduinoの開発環境は前回の記事「ESP8266で電力モニターを作る」をご覧ください。センサーはボッシュ社のBME280という1チップで温度、湿度、気圧が測れるものを使いました。回路図を次に示します。
できあがったセンサー端末の写真です。単三乾電池3本で動かしています。
前回の電力モニターの記事と同様、プログラム開発時はUSBインターフェース付きのボードを使い、USB経由でプログラムのダウンロードやプリント文でのデバッグをおこない、プログラムが動いたらこちらのボードにESP8266を移してパソコンなしで動作させます。
プログラム
センサー端末とサーバーとのやりとりには二つの方法があります。一つはサーバー側からセンサー端末に「現在のセンサーの値を教えて」というリクエストを出し、センサー端末がそれに答えてサーバーにセンサーの値を返す方法。もう一つはセンサー側から「現在のセンサーの値はこれです」というリクエストを出す方法です。
サーバーからリクエストを出す方法は、センサー端末が常にリクエストを待っていて、リクエストが来たら答えを返す必要があります。制御用のマイコンにはDeep sleepという非常に消費電力の少ない仮死状態のようなモードがあります。通常はスリープする時間を指定してこのモードに入り、スリープしている間は何もできません。Deep sleep状態になるとサーバーからリクエストを出す方法ではリクエストに反応できなくなります。そこでこのセンサー端末は端末側からリクエストを出してセンサーの現在値を送信し、それが終わったら決められた時間Deep sleepするという構造にしました。
プログラムはGithubに公開しました。5分ごとに温度、湿度、気圧を測定し、データーをサーバーに送信しています。Arduino-ESP8266-BME280.inoというファイルがプログラム本体です。プログラム中で#define VERBOSE という行をコメントアウトしてあります。このコメントを外すと立上げ時やデーター送信時に状況をシリアルに出力し、データー送信時にはLEDが点滅するようになり、動作状況が確認できるようになります。動作が確認できたらこの行をコメントアウトすれば、シリアル出力もLEDの点滅もなくなります。一見動いているかどうか分からなくなりますが、少しでも消費電力が抑えられます。
ESP8266のスリープモード
先ほども書きましたが、測定と測定の間はなるべく電力を消費したくないので、ESP8266をDeep Sleepモードに移行させています。「ESP8266 Sleep Mode Function Description」というマニュアルを見るとESP8266にはModem sleep、Light sleep、Deep sleepという三つのスリープモードがあると書かれています。
Modem sleepとLight sleepはESP8266のWi-Fiがステーションモードの時、実行すべき処理がなくなるとESP8266が自動的にこのどちらかのモードに移行します。どちらのモードに移行するかはwifi_set_sleep_type()という関数で指定します。Modem sleepはWi-Fi部分がオフになり、CPUは動作しているのに対し、Light sleepはWi-Fi部分とシステムクロックがオフになりCPUがペンディング状態になってModem sleepよりも更に消費電流が少なくなります。DTIMはWi-Fiルーターから端末に送られるビーコンのことですが、これは話が長くなるので今回は触れません。
一方、Deep sleepはプログラムから明示的にこのモードに移行することができ、消費電流は20μA程度と非常に少なくなります。Deep sleep時に指定したスリープ時間が経過するとESP8266にリセットがかかり、プログラムの先頭から再度動き始めます。つまり、Deep sleepは寝ているときはほとんど電力を消費しませんが、起きたときに毎回ルーターに接続するため、ここで大きな電力を消費します。Deep sleepが電力消費上有利かどうかはスリープする時間に依存することになります。本来は消費電力を測定して決めるべきですが、今回は測定と測定の間はDeep sleepさせることにしました。
サーバー側 IoT用シンプルサーバー「Ambient」
センサー端末は測定した温度、湿度、気圧データーをサーバーに送ります。サーバー側はデーターを受信して蓄積し、グラフ化するシンプルなサーバーを開発しました。サーバーにユーザー登録すると「チャネル」が作られます。端末はこの「チャネル」を指定してデーターを送信します。サーバー側は送られたデーターを「チャネル」ごとに保存し、グラフ化します。次のグラフは12月のある日の我が家の室温、湿度、気圧です。
このサーバーは「Ambient」という名前を付けて https://ambidata.io というアドレスに公開しました。「as is」でよければ使ってみてください。
環境センサーを作る:マイコンの選択 Arduinoとmbed
使ってみて感じるArduinoのいい点と弱い点
電力計はArduinoというマイコンボードを使って作りました。開発環境がとてもよくできていて、ArduinoのWebサイトから開発環境であるArduino IDEをPCにダウンロードすればすぐに使えます。サンプルプログラムも豊富で、ArduinoボードをUSBでPCに接続しておいて、サンプルプログラムをコンパイルすると自動的にプログラムがArduinoボードに送られ、実行されます。LEDを光らせるようなプログラムを送り込めば、すぐに動作が確認できます。さらにArduinoサイトにはデーター入力やインターネット通信などの大量のサンプルプログラムが公開されています。加えて、Arduino Playgroundというコーナーがあり、ユーザーが作ったプログラムなどが公開されています。また、温度や赤外線などのセンサー、イーサーネットなど、Arduinoに接続可能な様々な周辺モジュールも販売されており、周辺モジュールを制御するプログラムも公開されています。
このようにArduinoは開発環境が使いやすいこと、サンプルプログラムが豊富なこと、周辺モジュールが充実していることから、組み込みシステムの専門家でなくても速く、簡単にアイデアをプロトタイプ化できます。
このようなメリットのあるArduinoですが、弱いところもあります。一つはCPU速度で、特に浮動小数点(float)の計算が遅いです。Arduinoで一番ポピュラーなボードであるArduino UNOのCPUでは、floatの変数xとyに対して
y = x / 1023.0;
という計算だけで35μ秒かかりました。センサーから得られるデーターは普通に考えると小数点のある値になりますが、Arduinoではそれを扱うfloatの計算が遅いので、プログラムを書くときには気を使う必要があります。例えば電力計の場合は交流の電流値を250μ秒間隔で測定して電流値を計算しましたが、250μ秒ごとの処理の中ではfloatの計算をしないようにしました。
もう一つ弱いと感じたのはメモリーサイズです。Arduino UNOではプログラムのデーターエリアとして使われるSRAMが2kBしかありません。こちらもプログラムを書くときに気を使う必要があります。
Arduinoボードには私が使ったArduino UNO以外にも多くのプラットフォームがあります。詳しくは以下のサイトなどを参照願いたいのですが、ボードによってはCPUが速いものやメモリーサイズが大きいものがあるようです。
Arduinoシリーズ15種類の違い|まとめ比較表
プロトタイプ開発に適したマイコンとしては、プログラム開発環境が簡単で分かりやすいこと、サンプルプログラムが豊富なことが重要です。センサーや通信などの周辺モジュールが充実していることも重要なポイントです。Arduino以外にプロトタイプ開発に向くマイコンとしてはmbed、Raspberry Pi、Intel Edison、Tesselなどがあります。環境センサーでは低消費電力のボードが提供されていて、開発環境も充実しているmbedを使ってみることにします。
mbed (エンベッド)
mbedは英ARM社のプロセッサーを使ったワンボードマイコンとプログラム開発環境です。ARM社のプロセッサーは低消費電力、高性能で知られ、iPhoneなど多くのスマートフォンやゲーム機などで使われています。ARM社は技術をライセンス提供し、半導体メーカーがライセンスを受けてプロセッサーを製造しています。mbedも同様で、ポピュラーなボードはNXP社が開発したLPC1768を搭載したボードです。
このボードはスイッチサイエンス社のサイトなどで購入できます。価格は2015年7月時点で5,940円です。
mbedの開発環境はWeb上に用意されています。画面は次のような感じです。
ここでプログラムを書き、コンパイルすると実行形式のファイルがパソコンのダウンロードフォルダーにダウンロードされます。mbedボードをUSBケーブルでパソコンにつなぐと、mbedボードがUSBメモリーとして認識されるので、実行形式のファイルをそのメモリーにコピーするとファイルがUSB経由でmbedにダウンロードされ、実行されます。開発環境には豊富なサンプルプログラムがありますが、その中にはmbedボード上のLEDを点滅させるプログラムもあります。それをコンパイルしてボードに送ると動作確認ができます。最初に開発環境を使うときにはユーザー登録が必要ですが、それを含めても10分もあればLEDを点滅させることができます。ユーザー登録からサンプルプログラムの動作確認までは以下のサイトに詳しい説明があります。
mbedを始めましょう!(“Let’s get started!” in Japanese)
Arduinoと同様にmbedもmbedサイトに大量のサンプルプログラムやQ&Aのコーナーがあり、開発者コミュニティーが充実しています。サンプルプログラムを自分の開発環境に取り込んで、それを参考にしてプログラムを作るのも簡単です。例えばHTTPでデーターをGET、PUTするプログラムを作るとすると、mbedサイトに行って「HTTP」で検索すると「HTTPClient_HelloWorld」というそれらしいプログラムが見つかります。そのページにいって、ソースコードなどを調べ、参考になりそうだと思ったら「Import this program」をクリックすると、このプログラムが自分の開発環境にコピーされます。あとはそのコピーを元に自分なりに修正することでプログラム開発がおこなえます。コミュニティーの充実と、コミュニティーの成果を参考にして自分のアイデアを積み上げられる仕組みがmbedの大きな魅力だと思います。
mbedボードにもいろいろなバリエーションがあります。
https://developer.mbed.org/platforms/
高速なもの、低消費電力なもの、周辺インタフェースが豊富なものなどいろいろですし、今でもmbed対応のボードが追加されています。写真は左が一番ポピュラーなLPC1768、真ん中が低消費電力で安価なLPC1114FN28、右はBluetoothを搭載したHRM1017です。
環境センサーでは、電池で動かすセンサーモジュールにはLPC1114FN28が、インターネット経由でクラウドにデーターを送信するゲートウェイにはイーサーネットインタフェースを持つLPC1768がよさそうです。
次はセンサーモジュールとゲートウェイ間の通信を調べます。

Anya is live and ready to show you everything. Watch her strip, dance, and perform exclusive shows just for you. Interact in real-time and make your fantasies come true.
Free to watch • No registration required • HD streaming
環境センサーを作る
Arduinoで電力計を作り、家の電力使用パターンが分かるようになりました。次は気温や室温、湿度などが電力使用とどう関係しているのか調べたくなりました。温度、湿度などのセンサーを作ることにします。
やりたいことの整理
生活環境を数値化できるようなデーターをとりあえず調べることにします。温度、湿度、照度といったところでしょうか。また、人がいるかいないかも電力利用に関係していそうなので、人の動きも調べることにします。定期的にこれらのデーターを調べ、クラウドに送信、蓄積して、可視化したり分析したりできるようにします。人が活動する居間などの場所の状況を調べたいので、センサーは目につくところに置くことになります。電源コードやLANケーブルなどがあると不格好です。電池で動き、データーは無線で送信できるようにします。また、将来的には温度、湿度の計測だけでなく、エアコンや照明の制御もできるといいと思います。箇条書きにすると次のようになります。
温度、湿度、照度、モーションを測り、定期的にサーバーに送信する
センサーはコードレス(電池稼働、無線でデーター送信)
エアコン、照明の制御
実現イメージ
センサーをコードレスにするために、低消費電力のマイコンを使い、BluetoothやZigBeeのような方法でゲートウェイまで送信し、ゲートウェイで中継してインターネット経由でサーバーに送信することにします。図にするとこんな感じです。
ソフトウェアについてはセンサーモジュールとゲートウェイ、Webサーバー間の通信プロトコルをどうするか、データーをどのように蓄積するかなどを考える必要がありそうですが、それはプロトタイプを作りながら考えることにします。
次はマイコンの選択です。