• モノづくりとアイデアで暮らしを豊かに。『STAGEA』

    ここでは、H10の制御方法について説明します。

    まずは全体の仕組みを理解しよう
    はじめに

    STAGEA H10には、2つのMCUが搭載されています。

    MCUとは、センサーの値を読んだり、クラウドにアップロードするなどといった、設計者の意図(プログラム)通りに接続されているデバイスやセンサー類を制御する電子部品で、マイコン(Micro-controller Unit)と呼ばれます。

    2つのMCUのうち1つは、内蔵センサから値を読み出したり省電力制御を行うなど、システム維持に必要な処理を行います。
    温度や湿度、加速度は、単にある命令(1行のプログラムコードで完遂できるファンクション)を実行すれば取得できるというものではありません。
    電子回路の特徴や性質をしっかりと理解できていて、加えて接続されているセンサー類の仕様を完全理解できていないと確実に制御することはできません。
    例えば、センサー駆動に必要な電気をセンサーに送電する際、流して良い電気の量や通電時間などが正確にプログラミングしないと、センサーが起動しないばかりか、損壊につながることもあります。
    センサーに通電したら、決められたタイミングで読み出さないと、誤差が大きくなります。
    他のセンサーやデバイスの処理タイミング(割り込みなど)と重複すると、システムがフリーズすることもあります。
    これでは扱いにくいため、当社が開発したプログラムが実装されています。

    もう一方のMCUは、H10ご利用者が作った処理を書き込むことができるMCUとなります。
    前者を主MCU、後者を副MCUと呼びます。

    主MCUからは、以下の2つのデータが副MCUに対して送信されます。
    ・1秒が経過したことを知らせるデータ(*1)
    ・測定データ

    副MCUは、以下のデータを主MCUに対して送り返します。
    ・主MCUから送られてきた「1秒が経過したことを知らせるデータ」を受け取ったことを知らせるデータ

    約20秒間、主MCUからのデータに返信しない場合、ユーザープログラムがフリーズしたとみなして強制リセットを掛けます。
    この点に注意しながら、主MCUから送られてきたデータを活用して、自分自身がやりたいことをプログラミングしていきます。
    主MCUから送られてきたデータをバッファに取り込む処理だけ作れば良いため、エレクトロニクス特有の難しさを意識することなく、オリジナルの見守り装置を作ることができます。

    この2つのMCUの連携(対話のルール=プロトコル)を理解することが、H10をカスタマイズする一歩となります。

    複雑そうで実は単純。
    動作シーケンス

    動作フロー(通常モード)

    (1)1秒に1回、主MCUから副MCUに、1秒経過を知らせる時報データが送信されます。
    時報データの中には、温度や湿度、騒音量などの測定データの領域がありますが、(送信データフォーマットについては後述します)副MCUから返事をするまでは新規の測定を行わないため、最後に測定したデータ内容が送信されます。(起動直後は全てゼロとなります。)

    (2)主MCUから時報を受け取ったら、0.8秒以内に副MCUから主MCUに返事をします。
    ※返事をしないと、新規の測定はしません。

    主MCUから時報を受け取ってから、クラウドに問い合わせを行う必要があるなど、0.8秒以内に返事することができない場合、一旦返事を無視して、次以降の時報が送られてくるのを待ち、そこから0.8秒以内に返事をすれば大丈夫です。

    主MCUから副MCUにデータが送られてから30秒以内に返信がないと、副MCUがフリーズしたと判断して、主MCUから自動的に副MCUの電源を切断して3秒後に再投入します。(ウォッチドッグタイマー)
    長くても25秒以内に処理を終えるようにしてください。
    ウォッチドッグタイマーの時間を延長する場合は、オーダーメイドをご検討ください。

    (3)返事をすると、主MCUから直ちに最新の測定データが送られてきます。

    ここまでがH10の基本的な測定フローです。
    ただ、これだけでは測定結果をアップロードする処理もなければ測定結果を判断してリレースイッチを動かす操作もないため、電気の無駄使いをしているだけになります。
    何かをさせる必要があります。
    これ以降の説明は、基本編と用途別のカスタマイズ編に分けるか迷いましたが、初心者の方が混乱してしまうため、続けて書こうと思います。

    (4)例えば、部屋の温度が30度を超えたら換気扇をONする動作をして欲しい場合は、副MCUに温度データが30度以上になったら5バイト目を1にして返事をすれば、リレースイッチをONにすることができます。
    (何バイト目がどう言う役割をするかなどのデータフォーマットについては、本ページ文末に記載しております。)
    インターネットに測定データをアップロードしたければ、その処理もプログラミングします。

    スマートフォンをセキュリティのセット/解除のリモコン替わりにしたい場合は、現在セット状態か解除状態かを問い合わせる処理も必要になります。

    動作フロー(停電モード)
    停電モード概要

    H10には、ACアダプタなどからDC電源が供給されている時の「通常モード」と、DCジャックから電源供給されない時の「乾電池モード」の2つのモードがあります。
    普通のホームセキュリティシステムは、H10と同じく停電に備えてバックアップバッテリを内蔵しているが、持って1日程度となります。
    これでは自然災害などで通信インフラと電源が数日間停止し復旧した後、遠く離れた場所から自宅が安全であるかどうかを確認する手段がありません。
    H10は、電力インフラの回復を相当期間待つことができるよう、1週間程度は乾電池で動作させることを目標に開発しました。
    インターネット回線が復旧しなくても、バッテリーで数日スタンバイできるモバイルWiFiがあれば、自宅の様子を確認することができます。
    H10で採用されているバックアップ電源は、単三アルカリ乾電池4本と、一般的なホームセキュリティシステムと比較して非常に小さな電源となります。
    これで1週間連続動作させる必要があるため、乾電池で動作している時は必要最低限の機能に絞ったり、特に電力消費の激しいWiFi内蔵のMCUの主電源を間欠動作させるなどして、徹底的に電力の消費を抑えています。
    これに加えて、主MCUの電力消費を抑えるため、動作クロックも最小限に抑えています。
    ※H10が対話をしながらシステムの恒常性を維持する設計になっている理由は、割り込みを前提に設計すると、低クロックであるが故に処理が重複してフリーズさせる危険があるためです。

    動作シーケンス

    DCジャックからプラグが抜けたり、災害等で電源供給が途絶えた場合、自動的に電池に切り替わります。
    停電モードでは、限りある電源を最大限持たせるため、以下の機能制限を行います。

    ・副MCUへの電源供給を2分に1回、20秒間に制限します。
    ・においセンサー、一酸化炭素センサー、二酸化炭素センサーのデータ取得を行いません。
     (測定に触媒を使用しており、ヒーターで加熱する必要があるため、電池寿命に大きく影響するからです。
      停電モードの場合、測定値は0になります。)
    ・リレーの制御はできません。停電前にリレーがONだった場合は、OFFになります。

    電源を入れても、110秒が経過するまで変化はありません。
    ※副MCUに通電されている場合のみ、10秒経過時点で電源供給をOFFにします。
    110秒が経過すると、副MCUに通電します。
    起動・WiFi接続・IoTクラウドへの初期化が完了したと見込まれる120秒経過時点(電源投入後10秒)で、時報データを主MCUから副MCUに送信します。

    このシーケンスにオリジナルの処理を追加するには、主MCUから送られてきたセンサーデータを副MCUで受信して10秒以内にすべての処理を終わらせる形でMCUのプログラミングを行います。
    ※通常モードでは1秒ごとに時報データの送信を行いますが、停電モードでは1度しか送りません。

    主MCUからセンサーデータが送られてきて10秒後(サイクルタイムで130秒目=次のサイクルの10秒目)には通信成否の確認をすることなく副MCUの電源を落としますので、サーバー上のフラグを確認して動きを変えるような待ちが生じる処理は、思い通りに動かない場合があります。

    信頼できるデータセンター(スループットが高いデータセンター)をクラウドにしている場合は、余程高度な処理を行わない限り、処理に10秒以上も時間がかかることはほぼありません。
    殆どの場合は、ネットワークの遅延を考慮しても長くて3~5秒程度だと思います。
    しかし、本機への電源供給が途切れた原因の一つとして、災害が原因である確率は非常に高いことも考慮しなければなりません。
    災害が発生した場合、クラウドの安定性が損なわれることはもちろん、クラウドまでのネットワーク経路も非常に混雑することから、10秒で処理しきれなくなることも想定する必要があります。
    非常時でも、可能な限り平時に近い機能を維持したいと誰もが考えると思います。
    多くの機能を詰め込んでも、通信できなければ意味がありません。
    例えば、普段は別荘のホームセキュリティ(兼)自動換気制御装置として使用していたとしましょう。
    別荘が立つ場所が山間部で、大地震が発生したとします。
    このような状況下では、ホームセキュリティシステムや自動換気システムを使う以前に、建物がまっすぐ建っているかが最大の関心事だと思います。
    やるべきことの優先順位を検討してプログラムすることが肝要です。

    なお、有事の際も普段と変わらない機能を希望される場合は、ポータブル電源の採用も検討してください。

    停電が発生すると、通信機器(モデムやブロードバンドルータ等)の電源が切れるため、使用できなくなります。
    無停電電源装置を接続して停電に備えるか、モバイルルータなど、バッテリを搭載した通信機器のご使用をお勧めします。
    電文(パケット)のフォーマット

    主MCU→副MCU

    バイト目データ内容固定値(10進数)固定値(16進数)
    0予約2550xFF
    1予約2550xFF
    2においセンサーの値(上位バイト)
    3においセンサーの値(下位バイト)
    4温度(上位バイト)*1
    5温度(下位バイト)*1
    6湿度
    7照度(上位バイト)
    8照度(下位バイト)
    9ピーク騒音値(上位バイト)
    10ピーク騒音値(下位バイト)
    11空間活動量*2
    12一酸化炭素量(上位バイト)
    13一酸化炭素量(下位バイト)
    14二酸化炭素量(上位バイト)
    15二酸化炭素量(下位バイト)
    16DCジャックからの入力有無
    17押しボタンスイッチAの状態
    0:押されていない
    1:押されている
    18押しボタンスイッチBの状態
    0:押されていない
    1:押されている
    19加速度センサーX軸(上位バイト)
    20加速度センサーX軸(下位バイト)
    21加速度センサーY軸(上位バイト)
    22加速度センサーY軸(下位バイト)
    23加速度センサーZ軸(上位バイト)
    24加速度センサーZ軸(下位バイト)
    25接点入力1の状態
    0:短絡していない
    1:短絡している
    26接点入力2の状態
    0:短絡していない
    1:短絡している
    27連続通電時間(時・HOUR)
    ※上限255
    28計測震度の10倍値(*4)
      5〜14 ・・震度1
     15〜24 ・・震度2
     25〜34 ・・震度3
     35〜44 ・・震度4
     45〜49 ・・震度5弱
     50〜54 ・・震度5強
     55〜59 ・・震度6弱
     60〜64 ・・震度6強
     65〜  ・・震度7
    29フリーメモ(*5)
    30コマンド250 or 2550x0A or 0xFF
    31チェックデジット(*6)

    *1)温度の測定値は0.1度単位です。
    初心者でもプログラミングしやすくするため、小数点を避ける処理をしております。
    そのため、10倍の値で送信されます。
    副MCU側またはクラウドで10で割る処理をしてください。

    *2)空間活動量は、1秒ごとに人感センサーの反応の有無をチェックし、反応があれば1を加算していきます。
    60秒ごとにゼロリセットします。

    *3)1秒定期送信の場合は250を、1分定期送信の場合は255を送信しています。

    *4)プロフェッショナル版のみ実装。
      正確に測定するためには、70センチ角以上のコンクリートブロックまたはこれと同等の堅牢な石状の土台を2/3以上土中に埋設した上部に固定して設置する必要があります。
      それ以外は、参考値となります。

    *5)フリーメモは、副MCUの補助記憶として使用します。
    H10は、ユーザープログラムがフリーズしても復帰できる機会を提供するため、1時間に一度、主MCUから再起動処理を行っています。
    これは、プログラムの作りが不安定になりがちな初心者の方でも安心してご利用いただけるように、実装した機能です。
    再起動が行われると、例えばH10の押しボタンスイッチでON/OFFを切り替えるプログラムを使っている場合、副MCUが再起動されるタイミングで意図せず初期状態に戻ってしまいます。
    これを回避するため、服MCUが再起動されても覚えておかなければいけない設定などを、この部分に記録します。
    0〜255までの整数か、8ビット分のON/OFF情報を持たせることができます。
    副MCUから主MCUに一度送信すると、送信した値が繰り返し主MCU→副MCUに送信されます。
    この領域は、クラウドやCGIなどと連携して設定情報を保存することができない初心者の方を想定した機能です。
    より多くの情報を記録する必要がある場合は、クラウドやCGIなどと連携させる仕組みを構築してください。

    *6)チェックデジットは、0バイト目から30バイト目までの全ての値を足して256で割った余りです。

    ・データはビッグエンディアンで送信しています。
    ・本製品は、値の変化で異常を検知することを目的に作られているため、温度、湿度、空間活動量以外の値は、各センサーのアナログ出力値をそのまま出力しています。
    SI単位系に代表される万国共通の値ではありませんのでご注意ください。
    ご希望によりオーダーメイドで校正(cd、ppm、db、m/s^2等で出力)を行ってお届けすることも可能ですので、ご相談ください。

    副MCUは1時間ごとにリセットしています。
    データ保持が必要な内容はフラッシュに保存してください。
    不意にWiFiが切断された時やIoTクラウドとの接続が切断された時、復帰する処理を行わなければなりません。
    この処理は、初心者にはハードルが高いため、このような作りにしております。
    (逆にこれらの処理を作るスキルのある方は、ESPのプログラム保存領域をフラッシュに割り当てて、そこに変数内容を保存する処理を作ることは難しいことではないはずですので、ビギナーの方にとっての使いやすさを優先しています。)
    副MCU → 主MCU
    バイト目データ内容固定値(10進数)固定値(16進数)
    0予約2550xFF
    1予約2550xFF
    2押しボタンスイッチのフラグリセット
    押しボタンスイッチが押されたことを副MCUが検知したら(押しボタンスイッチが押された時に行う処理が完了したら)、このフラグを1にして主MCUに受け取った旨を伝えます。
    0のままでは新たにボタンが押されても副MCUに送信されません。
    1のままにした場合、時報への返答をするたびにフラグリセットがかかるため、ボタンが押された事実を取りこぼす現象が多発します。
    ボタンが押されたことを受け取った際に行われる処理の中でフラグリセットの処理を行ってください。
    3予約00x00
    4予約00x00
    5リレーON/OFF
    0:何もしない(現状維持)
    1:ON
    2:OFF
    6フリーメモ(*1)
    7液晶表示1行目表示内容
    0:非表示
    1:温度/湿度
    2:騒音値
    3:加速度(X/Y/Z)
    4:照度
    5:臭気
    6:二酸化炭素/一酸化炭素濃度
    7:人感センサ反応値
    8液晶表示2行目表示内容
    0:非表示
    1:温度/湿度
    2:騒音値
    3:加速度(X/Y/Z)
    4:照度
    5:臭気
    6:二酸化炭素/一酸化炭素濃度
    7:人感センサ反応値
    9予約00x00
    10予約00x00
    11予約00x00
    12予約00x00
    13予約00x00
    14予約00x00
    15予約00x00
    16予約00x00
    17予約00x00
    18予約00x00
    19予約00x00
    20予約00x00
    21チェックデジット(*2)

    *1)フリーメモは、副MCUの補助記憶として使用します。
    H10は、ユーザープログラムがフリーズしても復帰できる機会を提供するため、1時間に一度、主MCUから再起動処理を行っています。
    これは、プログラムの作りが不安定になりがちな初心者の方でも安心してご利用いただけるように、実装した機能です。
    再起動が行われると、例えばH10の押しボタンスイッチでON/OFFを切り替えるプログラムを使っている場合、副MCUが再起動されるタイミングで意図せず初期状態に戻ってしまいます。
    これを回避するため、服MCUが再起動されても覚えておかなければいけない設定などを、この部分に記録します。
    0〜255までの整数か、8ビット分のON/OFF情報を持たせることができます。
    副MCUから主MCUに一度送信すると、送信した値が繰り返し主MCU→副MCUに送信されます。
    この領域は、クラウドやCGIなどと連携して設定情報を保存することができない初心者の方を想定した機能です。
    より多くの情報を記録する必要がある場合は、クラウドやCGIなどと連携させる仕組みを構築してください。

    *2)チェックデジットは、0バイト目から20バイト目までの全ての値を足して256で割った余りです。