トラ技Wi-Fi ESP-WROOM-32 搭載Arduino互換ボード IoT Express で天気予報表示

出かける前に今日の天気予報と、気温を確認してみよう!
トランジスタ技術2017年11月号(CQ出版社)に付属しているWi-Fi搭載Arduino互換ボード IoT Express で、天気予報表示機を作成してみました。
予報情報に変化があると、ブザー音(ピンポン)で知らせる機能や、履歴を保存する機能も搭載しました。
起動すると、NTPでNICTから取得した時刻情報と、Yahoo!天気・災害から取得した天気予報情報が表示される。右上には最高気温と最低気温の目安の棒グラフを表示した。
必要なハードウェア
・トランジスタ技術 IoT Express (CQ出版社)
・LCD Keypad Shield (DF Robot製、SainSmart製、D1 ROBOT製など)
・ACアダプタ(マイクロUSB、5V 500mA)
主要機能:
・Yahoo!天気・災害から天気情報を取得し、液晶シールド(LCD Keypad Shield)へ表示
・予報が雨や曇りに変わったらチャイムでお知らせ(雨=ピンポン、曇り=ブーン)
・最高気温と最低気温を棒グラフで表示
・現在時刻はNTPで取得
・取得した天気予報情報をSDカード(またはSPIFFS)へ保存
・ブラウザでアクセスすると保存した天気予報情報をダウンロードできる
また、本機へインターネットブラウザでアクセスすると、CSV形式で天気情報の履歴を取り出すことができます。
初期化ボタンはファイルシステムにSPIFSSを使った時のみ有効です(SDカードの場合は、予めパソコンなどでFAT16もしくは32で初期化しておく)。
スケッチは下記で公開中です。
Example 62 天気情報をLCDへ表示する
※IoT Express のほか、ESPduino 32 や WEMOS D1 32にも対応しています。IoT Express以外で使用する場合は、「#define CQ_PUB_IOT_EXPRESS」を削除し、IO12に10kΩのプルダウン抵抗を追加してください(https://blogs.yahoo.co.jp/bokunimowakaru/55905585.html)。
ボクにもわかるWi-FiモジュールESP32
https://bokunimo.net/blog/category/esp/
by ボクにもわかる電子工作
https://bokunimo.net/

トラ技Wi-Fi ESP-WROOM-32 搭載Arduino互換ボード IoT Express の起動が安定しない

トランジスタ技術2017年11月号(CQ出版社)に付属しているWi-Fi搭載Arduino互換ボード IoT Express の起動に失敗する場合がありました。コンデンサの変更などにより対策が可能であることが分かりましたので報告いたします。
なお、出版社の公式サイトではUSBシリアル変換モジュール上のリセッタブルヒューズ(ポリスイッチ)の改造による対策が案内されています。
CQ出版社
しかし、上記のような細かな半田付けが苦手な人もいるでしょう。
本ブログでは、部品の変更による対策を講じてみました。
具体的には、ショットキーD2をジャンパー線へ変更し、C4(100uF)とC9(10uF)を16SEPF1000M(1000uF)へ変更します。

起動が不安定となる原因

USBシリアル変換モジュールAE-FT234X上にはリセッタブルヒューズFEMTOSMDC010Fが実装されています。USBから供給された電源は、リセッタブルヒューズと、IoT Express基板上のショットキーダイオードD2、LDOタイプ電源レギュレータU3を経由して、ESP32モジュールの電源端子へ入力されます。
しかし、ESP32の起動時やリセット時には1Aもの突入電流が数十μ秒発生し、その後も起動処理のための電流200mAが10msの期間、流れます(同トラ技のP.43を参照)。また約1秒後に無線部の始動とともに200mAが100msの期間、流れます(下図)。
これらが起因し、リセッタブルヒューズ部で大きな電圧降下が発生し、ESP32の電源入力電圧が2.7V※を下回り、起動失敗の原因となっていました。
※仕様書上の最低動作電圧は2.8V
起動時の電流波形。起動直後と、約800ms後に大きな電流が流れる。
グラフの横軸は200ms/div、縦軸は約50mA/div

何故、コンデンサによる対策が有効なのか

一方、定常状態でのESP32の消費電流は概ね150mA以下です。リセッタブルヒューズFEMTOSMDC010Fの定格電流は100mA、トリップ時間0.1秒、遮断電流は250mAにつき、実験目的で使用するのであれば、供給可能な範囲です。
つまり、起動が完了するまでの区間に必要なエネルギーをコンデンサへ蓄積しておくことや、定常動作時の瞬時電流を十分に平滑化しておくことで、対策が図れることが分かります。
起動時に250mAを超過している時間は、トリップ時間100msよりも十分に短いので、環境によっては未対策でも動作してしまうこともあります。しかし、ちょっとした環境の違いや部品の個別特性の違いで、挙動が一転します。例えば、一度でも起動に失敗すると、リセッタブルヒューズの温度が上昇し、以降、不安定な動作に陥るでしょう。

レギュレータの入力側と出力側の両方にコンデンサを入れる

コンデンサを追加する場合、ESP32モジュール側の3.3V電源にコンデンサを追加するのが基本的な対策方法ですです。しかし、入力側の5V電源への追加を併用することも重要です。5V側に追加することで、3.3V側に比べて約4倍のエネルギー供給が可能だからです。
さて、コンデンサに蓄積可能な最大エネルギーはコンデンサの容量に比例します。ところが実際に充電によって蓄積されるエネルギーは電圧の二乗に比例します。つまり、5Vと3.3Vでは2.3倍(5^2/3.3^2)も実蓄積量が異なります。
さらに、ESP32の電源電圧降下を救うために利用可能なエネルギーは、ESP32の最小動作電圧2.8Vまでに放電可能なエネルギーに限られます。
放電可能エネルギ = 1/2・C・Vin^2 – 1/2・C・(Vmin+Vdp)^2
Vin = 電源電圧 5V or  3.3V
Vmin = ESP32最小動作電圧2.8V
Vdp = LDOドロップ電圧 0.3V
上式より、LDOの電圧降下分を0.3Vとすると、5V側にコンデンサを追加した方が、3.3V側に追加したときに比べて、約4倍のエネルギーを利用できることが分かります。
ただし、LDOによる電流制限や応答速度を加味すると、瞬時(30usくらいの時間)については、3.3V側からしか十分に供給できません。また、リセッタブルヒューズによって電源ラインの全体的に電圧が低下した状態では、3.3V側に、より大きな容量が必要となります(リセッタブルヒューズが無ければ、定常電圧も上昇し、容量が低減できる)。したがって、5V側にコンデンサを追加したからと言って、3.3V側のコンデンサを減らすことは出来ません。
下図は、3.3V側に16SEPF1000Mを2つ入れた時(灰色)と、5V側と3.3Vに1つづつ入れた時(黒色)の比較です。合計の容量は同じですが、3.3V側に2つ入れた場合は、約10msの時間経過につれて電圧が下がってゆく様子が分かります。片方を5V側に入れた方は、電圧低下が少なく、まだまだ供給能力に余裕あることが分かります。
黒色 = 5Vと3.3Vに各1つのコンデンサ(C4とC9に16SEPF1000M)
灰色 = 3.3Vに計2つのコンデンサ(C2とC4に16SEPF1000M)
波線 = 起動可能な最低電圧 2.7V (ただし、仕様上は2.8V以上が必要)

その他の留意点

1.突入電流
容量の大きなコンデンサを使用する場合は、コンデンサに充電または放電されるときの突入電流が大きくなる場合があるので、コンデンサの最大許容電流仕様を確認しておく必要があります。
充放電電流が許容値を超過
した状態で使い続けると、性能が劣化するだけでなく、発煙・発火・爆発などの事故が発生する恐れがあるので、ご注意ください。
2.温度
リセッタブルヒューズの抵抗値は周囲温度によって上昇します。このためESP32の起動に失敗してリセッタブルヒューズの温度が上がってしまった場合や、環境温度が高かった場合や、動作時の基板の温度上昇、半田付け直後などといった場合に、大幅な電圧降下が発生し、起動しなくなる場合が考えられます。その場合、USBを抜き、数10秒から数分程度、冷ましてから電源を入れ直すと良いでしょう。
上図のとおり、実験を目的とした利用範囲であれば、十分なマージン(0.3V程度)を得ています。
3.他の部品との物理的干渉
コンデンサの物理的サイズが大きくなるので、コンデンサが他の部品と接触したり、シールドを取り付けた時に、シールド側の基板背面から飛び出したリード線などがコンデンサに接触する場合があります。
コンデンサ表面は絶縁されていますが、他の部品と接触する部分についてはポリイミドテープなどで絶縁を補強しておくとよいでしょう。シールド側でリード線が飛び出している個所については、ニッパーで切断し、ポリイミドテープで保護しておきます。
なお、コンデンサ16SEPF1000Mの上部にアルファベットの「K」のような凹凸が刻まれています。これはコンデンサに異常が生じして破裂する前に開口し、爆発を防止するための切り込みと思われますので、「K」の文字の部分をテープなどで覆わないように注意してください。
4.実験目的内で利用ください
大量生産するような場合や、屋外など様々な環境で使用する場合には、より詳細な検証が必要です。
本ブログ記事の公開にあたり、室温22℃の環境下で、20回の起動動作、リセット操作、30分の連続動作、さらに連続動作後のリセット操作を確認しました。
実験目的であれば十分な動作確認であると判断しておりますが、当方は不具合や事故による責任は負いません。自己責任で活用ください。
5.拡張シールドを使用する場合
Arduino用拡張シールドを使用する場合は、供給可能な電流にご注意ください。
例えば、LCD Keypad Shieldは約30mAの電流を持続的に消費します。これにより、リセッタブルヒューズに流れる電流は180mAに至り、動作が不安定になる場合があります。
可能であれば、定格200mA、切断400mAのリセッタブルヒューズに交換してください。
あるいは、BOOTボタンを押したままパソコンへUSB接続し、スケッチを書き込んだ後は、USB出力のACアダプタを使用するなど、使い方に工夫してください。
(ACアダプタによっては、電流が増大しても電圧低下の少ないものがありますので、お手持ちの5V出力のUSB用ACアダプタで試してみると良いでしょう)

むすび

 IoT Express の起動が不安定になる問題に対し、コンデンサの変更による手軽な対策方法を考案し、またその動作原理の一部を示すことが出来ました。
ボクにもわかるWi-FiモジュールESP32
by ボクにもわかる電子工作
https://bokunimo.net/

「OK Google, LEDをつけて」 Wio Nodeで未来の家へ! 超簡単実験

Google Homeを使えば音声で家電をコントロールできます。しかし、対応家電の普及はこれからです。
そこで、家電を改造して、Google Homeから制御するといった需要が考えられます。
ここでは、Seeed Studio社のWio Nodeを使って、超簡単にLEDを制御する実験方法について、説明します。
写真左=Google Home、右=Wio Node + LED(実験用)
Google Home(写真左)を使って、Wio Nodeに接続したLED(写真右)を制御する実験の様子

5分で設定できる「Wio Node」とは

Wio Nodeとは、Seeed Studio社が開発したIoTモジュールです。同社が提供するクラウドサービスを利用することで、遠隔地に設置したWioNodeをインターネット経由で制御することが出来ます。
Wio Nodeには、2つのGrove端子が搭載されており、市販の様々なGroveモジュールを使って機能を拡張することが出来ます。
今回の実験では、Grove LEDモジュールをGrove端子へ接続しました。LED部を自作する場合は、Grove端子のSIG信号へ、負荷抵抗とLEDを直列接続してください。

Wio Node 本体の大きさは28mm程度しかない。

Wio Nodeをセットアップするには、iOSかAndroidが動作するスマートフォンかタブレット端末が必要です(Google Homeの設定にもスマートフォンが必要)。この実験にパソコンは無くてもスマートフォンで代用できますが、その反対にスマートフォンをパソコンで代用するには、Android開発に関する知識が必要です。
App Storeなどからアプリ「Wio Link」をダウンロードし、アカウントを登録してください。Wio Nodeの左側のFuncボタンを4秒以上、押すとペアリング状態になります。Wio Linkとのペアリングが完了したら、下図のような画面から、LEDを設定してください。
注意しなければならないのは、この図はWio Node本体を裏側から見た図であることです。どちらの端子に設定しても、かまいませんが実際のLEDを接続する端子を間違わないようにしてください。
設定が完了したら、ファームウェアをWio Nodeへダウンロードし、画面最下部の「View API」ボタンにタッチします。下図のようなWio Node用のAPIが表示されます。
Test Requestの枠内に、0または1を入力し、[POST]ボタンにタッチするとLEDの制御が出来るでしょう。

Google HomeとIFTTTのセットアップ

今後はGoogle Home側のセットアップです。こちらもApp Storeなどからアプリ「Google Home」をダウンロードし、アカウントを作成(または入力)して設定を行います。
また、Google Homeから入力した音声を Wio Nodeへ橋渡しする必要があります。IFTTT(https://ifttt.com/)はクラウド間の橋渡しを行うのに便利なサービスです。
「If THIS then THAT」の「THIS」にトリガ項目を、「THAT」にアクション項目を設定し、トリガが発生した時に、アクションを動作させます。ここでは、Google Homeから音声で「LEDをつけて」と話したことをトリガにして、Wio NodeのLEDの点灯アクションを行います。
IFTTTの画面右上のアカウント表示から「New Applet」を選択し、「this」の部分をクリックし、「Google Assistant」を選択してください。次に、GoogleのアカウントをIFTTTと連携すると、下図のような画面が表示されるので、「Say a simple phrase」を選択してください。
選択すると、設定画面(下図の左側)が開きます。これらの設定方法について、図の後で説明します。

Google Assistant 左図の画面

最初の枠には認識させたい音声を入力します。ここでは、「led をつけて」と入力しました。「led」の後には半角スペースが必要です。「つけて」は全角ひらがなです。2番目と3番目の枠への入力は必須ではありませんが、命令となる言葉を入れておきます。
最後から2番目の枠には、音声認識に成功した時に応答するメッセージを入力します。ここでは、「led をつけました」と入力しました。
最後に「Japanese」を選択し、「Create trigger」をクリックしてください。

Maker Webhooks 右図の画面

こんどは、期待の音声が入力された時の動作内容を設定します。アクション用のサービスには「Webhooks」を選択します。以前は「Maker Webhooks」と呼んでいたと思うのですが、「Maker」がとれて単に「Webhooks」と呼ぶようです(URLは以前と同じhttps://ifttt.com/maker_webhooks)。
Webhooksの画面では、上図の右のように入力すると、Wio Nodeへデー
を送信することが出来ます。最初の枠には、Wio Nodeの「View API」で表示されたURLを入力します。URLには、ON/OFFの指示と、個々のWio Nodeを特定するためのトークン(token)が含まれています。下記のように「1」を指定すると点灯、「0」で消灯です。
Methodの部分で「POST」を選択してから、「Create Atction」をクリックして入力を完了させてください。
「OK Google, エルイーディーをつけて」と音声で命令すると、Wio NodeのLEDが点灯します。Groove LEDの場合、半固定の可変抵抗がついているので、精密ドライバーなどで回して輝度を調整してください(位置によっては点灯しない場合もあります)。
LEDが点灯したら、こんどは消してみましょう。点灯の時と同じように、IFTTTへ「led を消して」「led 消して」「led 消灯」を追加登録します。「led」の後には半角スペース、「消して」は、ひらがなでは無く漢字を使用してください。また、WebhooksのURLには消灯用の「0」を指定してください。

手持ちの家電へ組み込む

超簡単でしたね。Wio Nodeを手持ちの家電へ組み込み、音声でコントロールすることも容易であることが分かったと思います。ただし、実際の家電に組み込むときには、いくつかの注意が必要です。
まず、Wio Nodeへ供給する電源です。当然ですが、AC 100Vを供給してはいけません。DC 5Vが必要です。多くの家電の内部には5Vの電源回路が含まれているので、それを利用する方法が考えられます。ただし、Wio Node用に60~100mAほどの余力が必要です。また本来であれば、電源容量の合計や電源回路の発熱などを考慮しなければなりません。少なくとも、動作時に電圧が低下しないかどうかの確認をしておきましょう。
信号の接続先は、家電製品内のEnable信号やスイッチ、ボタンなどの回路になるでしょう。この場合、信号電圧の確認も必要です。Wio Nodeの電源入力は5Vですが、Grove端子の入出力信号は3.3Vです。必要に応じて変換回路や論理和回路を追加しましょう。
なお、家電の改造によって人命にかかわる火災などの事故が発生する恐れがあります。そのような場合であっても、当方は一切の責任を負いません。本ブログなどに書かれた情報に誤りがあったとしても同様です。
ボクにもわかるWi-FiモジュールESP8266
by ボクにもわかる電子工作
https://bokunimo.net/

セキュリティに関するご注意
ここでは、インターネットから宅内の機器を制御する手段として、Wio Nodeを使用しましたが、アクセス用のTalkenが流出するとサイバー攻撃の対象になる可能性があります。この場合、外部から対象機器が制御されるだけにとどまらず、家庭内の全てのネットワーク機器が危機にさらされる可能性も(少ないが)在りえます。Wio Nodeに限らず、Blinkやngrokなどを使った場合も、同様です。
Talkenの流出には十分に注意するとともに、攻撃者が乱数を使って適合するTalkenを探し当てる可能性もあることも知ったうえで、ご利用ください。現時点では、多くのシステムが、親切にもTalkenが適合したかどうかを知らせてくれるので、攻撃者にとってTalkenを探し当てやすくなっています。
なお、ゲートウェイ(ブロードバンドルーター)の設定を変更する方法も考えられますが、ネットワークセキュリティに関する知識が不十分なまま、家庭内の機器をインターネットへ曝すような行為は、極めて危険です。少なくとも、Wio NodeやBlink、ngrokなどを用い、外部からのアクセスが必要な機器ごとに、対象機器から外部サービスへのトンネルを生成する、またはVPNで接続するといった方法を利用しましょう。

声だけで操作!「OK Google」でIchigoJamの7セグメントLED制御

日本語に対応したGoogle Homeを使って、IchigoJamに接続した7セグメントLEDの制御を行ってみました。
「OK Google, 数字の7を送信」と話すと、「数字の7を送信しました」と答え、7セグメントLEDに「7」の数字が表示されます。

日本語に対応したGoogle Home            IchigoJamへ接続した7セグメントLED

IchigoJam側は、以前に紹介したAmbientを利用した方法を使用しました。ハードウェア構成と製作方法、IchigoJam BASIC用のプログラムについては、下記をご覧ください。
クラウドサービスAmbientからIchigoJamのLEDを制御する
Google Home側は、IFTTTと連携し、Google Homeが認識した数値を、Ambientへ送信するようにしました。
音声認識した数値データは、以下のような経路で7セグメントLEDへ到達します。
Google Home —> IFTTT —> Ambient —> Mixjuice —> IchigoJam —> LED
本ブログでは、Google HomeとAmbientとの連携方法(アンダーライン部)について、説明します。
IFTTT(https://ifttt.com/)では、Triger入力側(This)に「Google Assistant」を、Action出力側(That)に「Maker Webhooks」を選択します。まずは、Thisにタッチして、Google Assistantを選択してください。GoogleのアカウントをIFTTTと連携すると、下図のような画面が表示されるので、「Say a phrase with a number」を選択してください。
選択すると、設定画面(下図の左側)が開きます。これらの設定方法について、図の後で説明します。

Google Assistant 左図の画面

最初の枠には認識させたい音声を入力します。ここでは、「数字の # を送信」と入力しました。「#」の前後には半角スペースが必要です。最後から2番目の枠には、音声認識に成功した時に応答するメッセージを入力します。ここでは、オウム返しで「数字の # を送信しました」と入力しました。
最後に「Japanese」を選択し、「Create trigger」をクリックしてください。

Maker Webhooks 右図の画面

こんどは、期待の音声が入力された時のアクション内容を設定します。アクション用のサービスには「Webhooks」を選択します。上図の右画面のように入力すると、Ambientへデータを送信することが出来ます。
最初の枠には、AmbientのURLを入力します。「725」はボクが公開しているチャネル番号です。動作確認用として、使っていただくには問題ありませんが、頻繁にアクセスするのは避けてください。
Methodは、POST、Content Typeはapplication/jsonです。Bodyの部分に、Ambientで取得したライトキー(writeKey)と、Ambientへ送信するデータを記述します。
ここでは、データd7番に、音声認識した数字 NumberField を指定しています。NumberField の部分は「Add ingredient」から選択するか「{{NumberField}}」のように二重の{{と}}で囲います。
以上で、設定は完了です。
「OK Google, 数字の7を送信」や「ねぇ、グーグル、数字の3を送信」と音声で命令すると、IchigoJamの7 セグメントLEDに数字が表示されます。

気になる消費電力

24時間つけっぱなしになるGoogle Home。気になる消費電力と月間電気代(1分間の積算電力量から24円/kWで換算)を測定してみました。
待機時(音声待ち受け時) 1.6~2.2 W  月間電気代 33.7円 
待機時(ミュート)        1.9~2.2W  月間電気代 35.6円
動作中             2.0~2.4W
音楽再生(音量5)       2.2~2.8W  月間電気代 40.8円
音楽再生時には、そこそこ大きな重低音が響くので、もっと大きな電力を消費するのかと思いましたが、24時間、音楽をかけっぱなしでも月間40円程度でした。

おわりに

部屋に置くスマートスピーカーによる音声認識は、家で過ごしている時なら、いつでも手軽に使えます。スマートフォンとの最大の違いは、カバンなどから取り出す必要が無いことでしょう。
操作したいときに、手元に何のデバイスも保持せずに、声だけで機器を操作することが出来るのです。
また、マイクの性能も高く、通常の広さの室内であれば、部屋の端から話しても認識してくれます。目の前にあるときは、小声でも認識しました。自宅に居るときであれば、スマートフォンの音声認識よりも、ずっと実用的だと感じました。
IchigoJam + MixJuiceの組み合わせによるIoT端末の一例。プログラムはBASIC言語で作成した(関連リンク参照)
関連リンク:
クラウドサービスAmbientからIchigoJamのLEDを制御する
https://blogs.yahoo.co.jp/bokunimowakaru/55744431.html
by ボクにもわかるIchigoJamマイコンボード

乾電池で連続340日間動作するESP8266搭載ワイヤレスセンサ

単3アルカリ電池3本で1年間の連続動作を目標に、Wi-FiモジュールESP-WROOM-02によるワイヤレスセンサの長期動作実験を行いました。目標には達しませんでしたが340日(相当)の動作検証が行えましたので、その方法を紹介いたします。
ハードウェアはESP-WROOM-02へ温湿度センサモジュールAE-HDC1000(秋月電子通商・販売終了)をI2C接続し、電源にはレギュレータXC6202P332(TOREX)および合計2500μFの低ESRコンデンサを使用した。電池には単3電池の約半分の容量である単4アルカリ電池3本を使用。
実験では、単3電池の半分の容量に相当する単4電池を使用し、連続170日間の動作を確認しました。
また単4の方が内部インピーダンスが高い点も考慮すると、単3だと1年を超える可能性もあります。

IoTセンサ用クラウドサービスAmbientへ送信

まずは、この実験に活用したクラウドサービスの紹介をさせていただきます。実験中の測定結果をクラウドサービスAmbientへ送信することで、スマホやパソコンなどで簡単にグラフ表示することができます。意外と手間のかかるデータの蓄積もAmbientに任すことが出来る点も大きな利点です。公開チャネルにすることで、実験に対する信憑性についても、向上するかもしれません。
下図は、実験終了時(2017年10月2日)の様子です。

長期間動作のポイント

長期間動作に欠かせないのは、(1)ワイヤレスモジュール動作時間の抑制と、(2)センサなどの間欠駆動、(3)電源の高効率化です。
本ブログでは、それぞれについて簡単に説明します。

温度が変化した時だけ送信する

ワイヤレスモジュールの動作時間を短くするために、温度が変化した時にだけ送信を行います。下図は、横軸に送信間隔(10分)、縦軸に温度変化(%)をプロットした散布図です。
10分間隔で温度を確認し、温度の変化率が1%以上となった時に、送信を行っていることが分かります。360分(6時間)以上経過したときは、温度変化に関わらず送信を行います。
温度の確認と送信以外の期間は、ディープスリープモードで待機します。
ESP-WROOM-02用のスケッチ(最新・改良中):
https://github.com/bokunimowakaru/esp/tree/master/2_example/example09m_hum
今回の測定に使用したスケッチ(2016/11/12):

センサ等の回路を間欠駆動

ESP-WROOM-02のディープスリープ中は、LEDや温湿度センサへの電源供給も止めて、節電しました。本センサの消費電流は0.2mA程度と低いのですが、待機電流で0.2mAというのは乾電池駆動にとっては、とても大きな電流です。
例えば、2000mAhの電池で1年間もたせるには平均0.23mA以下にする必要があるので、センサの待機電流に0.2mAも要してしまうことは許されません。
そこで、センサをスリープモードにするか、電源を切って節電を行います。ここではGPIO 13の出力をセンサおよびLED用の電源に使用し、間欠駆動させました。

電源レギュレータ XC6202P332による超低待機電力化

電源レギュレータの待機電力にも注意が必要です。500mA以上の高出力に対応したレギュレータや、古いレギュレータの中には、待機電流が1mA以上のものがあります。前述のとおり、待機電流1mAというのは、乾電池駆動のワイヤレスセンサには、全く受け入れられない大電流です。
今回、使用したTOREX製の電源レギュレータXC6202P332の待機電流は、0.01mA(10μA)で、実力的には6μA程度しかありません。これなら、乾電池での長期動作に使うことが可能です。
一方、このレギュレータの最大出力は150mAです。ESPモジュールの消費電流80mAについては、十分に供給することができるものの、ESPモジュールのスリープ復帰時にレギュレータ内の電流制限回路が作動してしまいます。そこで、レギュレータの出力側のコンデンサを1000μFに変更しました。これで、単3アルカリ乾電池の終止電圧まで安定したスリープ復帰が行えます。
ところが、半年前の検証で、単4アルカリ乾電池だと、電池を使い切る前に(電池の内部インピーダンスによる)電圧降下でスリープ復帰に失敗することが判明しました。今回は、コンデンサの容量を2倍以上の2500μFにすることで、終止電圧まで動作できるように対策しました。
なお、容量の大きなコンデンサの中にはリーク電流の大きなものもあります。かえって寿命が短くなることもあるので、注意してください。とはいえ、コンデンサのデータシートを見てもリーク電流は書かれていないことが多く、また書かれていたとしても実力よりも大幅に大きい値が示されています。製造や印加電圧などの条件によって偏差が大きいことが予想されるので、実測してから使うのが良いでしょう。一例として、3μA未満のものを選別すると良いでしょう。

実験結果

実験では単4アルカリ乾電池を使用しました。前述のとおり単3の約半分の容量なので、実験期間を短縮することが出来ます。下図は170日間の動きです。
6月の中旬に大きな電圧低下が見られます。これまでも長期間の試験では似たような現象が生じていましたが、原因は分かっていません。乾電池を直列接続した場合の他の電池との相互作用ではないか、あるいは特定の電圧でESPモジュール側の消費電流が増大するのではないか、何らかの一過性の化学変化が発生しているのではないか、などが考えられますが、未確認です。
単3電池の半分の容量である単4アルカリ電池で、2017/4/15~2017/10/2の170日間、動作した。これは単3で340日間に相当する。
下図は、温度が1%以上変化した時の測定間隔を横軸に、頻度を縦軸に示したヒストグラムです。10分以内が1サンプルしか無く、最低送信間隔は20分くらいで良いことが分かりました。
測定間隔50分を超えると、急速に送信した頻度(サンプル数)が下がりますが、100分を超えてからは頻度の変化が横ばいになります。100分以上の区間の累積頻度の割合は全体の47%であり、また平均測定間隔は140分でした。
以上の通り、本方式によって平均送信間隔を10倍以上に伸ばせることが分かりました。
ところで、本方式では、温度変化しか見ていません。温度が一定で、湿度だけが変化すると、温湿度センサの測定としては不適切です。そこで、湿度の変化率を確認してみました。下図では、温度が1%以上、変化したときに測定したサンプルを用い、サンプルの半数(50%)が湿度変化率1%、大半(80%)が湿度変化率2%以内となっていることが分かりました。人間にとって、湿度変化は、温度変化に対して何倍も鈍感です。その点も考慮すれば、湿度に変化があるときは、概ね温度変化をともなうと言ってよいでしょう。

今後の実験予定

今回は惜しくも目標に到達されることが出来ませんでした。実験を行った時期としても、電池への負担の少ない春季~夏季にかけての実験でした。今回、得られた知見から、次は単3アルカリ電池で実時間1年の試験を行いたいと考えています。次回の試験に向けて、以下のパラメータ等を変更する予定です。
  • 最小測定間隔=20分 (今回は10分)
  • 測定間隔調整=20分/30分/60分の自動切り替え
    (前回の送信から60分以上経過したら30分間隔、90分以上で60分間隔)
  • 閾値      =0.3℃ (今回は1%、平均0.28℃に相当)
  • 電源      =単3アルカリ乾電池×3本 (今回は単4)
  • コンデンサ   = 1500μF (今回は2500μF)
  • 温湿度センサ =検討中 (今回はHDC1000だったが、販売終了のため)
  • ESPモジュール=ESP-WROOM-02 (ESP32では1年動作の目途が立たないため)
  • その他、電源配線の半田付けなどによる接触抵抗の低減を行う予定。
最小測定間隔を広げた理由は、ESPモジュールの起動時の消費エネルギーの削減です。前述のとおり、実測による平均送信間隔が140分(平均換算34μA)とESPモジュール待機電流(20μA)、レギュレータ待機電流(6μA)、コンデンサリーク電流(3μA)、電圧測定用の分圧抵抗(20μA)から、合計の平均電流は83μAしかありません。目標の230μAに対して十分なマージンがありました。
この齟齬の原因は起動時の過渡期に発生しているものと考え、温湿度測定のみの起動頻度を減らすことにしました。

むすび

温度が変化した時にだけ送信を行う手法を用いることで、平均送信間隔140分、単3電池で340日相当の長時間動作が行えることが分かりました。引き続き、1年・365日動作の実現に向けて取り組む予定です。
by ボクにもわかる電子工作
https://bokunimo.net/

DOIT ESPduino 32やWEMOS D1 R32でLCD Keypadシールドを使用する

Wi-FiモジュールESP-WROOM-32を搭載したArduino互換機がArduino UNOよりも安価に売られており人気を集めています。
ここでは、DOIT ESPduino 32やWEMOS D1 R32でArduino用の液晶LCDシールドを使用する方法について説明します。(ハードウェアについては、簡単なハンダ付けによる改造が必要です。)
液晶と5個の操作ボタンを搭載したLCD Keypadシールド(左上)と、Wi-FiモジュールESP32を搭載したArduino互換機 Wemos D1 R32。LCD Keypadシールドを使えば、手軽に表示とボタンが利用できるようになる。

最新ESP32チップ内蔵ESP-WROOM-32搭載のArduino互換機

使用したArduino互換機は、Espressif製の最新Wi-FiチップESP32(を内蔵したESP-WROOM-32モジュール)を搭載した DOIT ESPduino 32 、WEMOS D1 R32です。国内で使用するには、技適を受けたESP-WROOM-02モジュール搭載品を使用する必要があります。ESP32搭載Arduino互換機は1500円~2500円前後、液晶シールドも1000円前後で入手することが出来ます。
下記は、Arduino互換機と、Arduino用の液晶シールドの情報リンクです。
ESP-WROOM-32を搭載したArduino互換ボード
DOIT ESPduino 32 (製造元販売ページ・短縮URL):
WEMOS D1 R32 (販売ページ):
Arduino用の液晶ディスプレイLCD Keypadシールド
SKU-20-011-901(サインスマート製):
LCD Keypad Shield For Arduino (DF ROBOT製):
Arduinoでの使用例:

ハードウェアの改造方法

Arduino用の液晶シールドLCD Keypadを、DOIT ESPduino 32や WEMOS D1 R3で使用するには、GPIO 12(Arduino用 Digital 8ピンの位置)を10kΩ程度の抵抗でプルダウンする必要があります。
また、Keypadを使用するには、Arduino用 Analog 0ピンと Analog 2ピンをショートし、Keypad信号を ESP 32のGPIO 35へ入力する必要があります。
下図に液晶側の改造例を示します。液晶シールドの上部に10kΩの抵抗を取り付けました。
液晶の上部に10kΩの抵抗を実装する。この抵抗を実装しないと、ESP32が適切に起動しないことがある。
下図は、Keypad用の改造です。A0とA2とをショートしました。
Keypad信号をESP32へ入力するためのジャンパーをA0とA2にハンダ付けする。入力したキーの情報は電圧値で出力される。Arduino環境で動作するESP32のアナログ入力ポートGPIO 35(ADC1_7)へ入力した。

ソフトウェアの製作方法

液晶についてはArduino標準ライブラリのLiquidCrystalを使用します。以下に表示を行う場合のスケッチ例を示します。赤文字部分が、ESP32ボード用のGPIOピン設定です。
#include <LiquidCrystal.h>
void setup(){
    LiquidCrystal lcd(12,13,17,16,27,14);   // ESP32ボード用
    lcd.begin(16, 2);                       // 液晶表示サイズの設定
    lcd.clear();                            // 文字消去(beginで消去されるので不要)
    lcd.setCursor(0,0);                     // 文字位置の設定(beginで設定される)
    lcd.print("Hello!");                    // 「Hello!」を表示
    lcd.setCursor(0,1);                     // 文字位置を2行目へ
    lcd.print("Wataru KUNINO");             // 「Wataru KUNINO」を表示
}
void loop(){
}
キーパッドについては、下記のソースコードを参考にしてください。

LCD Keypadの液晶とキーパッドを使った製作例

下図は、製作例です。Wi-FiモジュールESP-WROOM-02やESP-WROOM-32などを使用したワイヤレス・センサから、UDPでセンサ値を送信し、それを受信してみました。上部の棒グラフの左側が温度、右側が湿度の目安が表示され、右下で数値がスクロールします。
[UP]と[DOWN]で過去の受信履歴を表示することも出来ます。一番左側の[SELECT]を押すと、本機のIPアドレス表示、長押しで、表示モードの切り替えです。
製作したサンプルはGitHubで公開しています。トランジスタ技術2016年9月号および2017年3月号で紹介した各種のセンサやWi-Fiカメラなどに対応しています。
製作したサンプル・スケッチ

その他

本ブログでは、市販のESP32搭載Arduino互換機を使用しましたが、来月号のトランジスタ技術2017年11月号では、白阪 一郎さんが開発したESP32を搭載可能なArduino互換機のプリント基板が付属します。白阪さんのボードでは、無改造でLCD表示が可能です。Keypad入力については、上記とは異なる改造が必要です。
ボクにもわかるWi-Fiモジュール ESP32
by ボクにもわかる電子工作
https://bokunimo.net/