Category : IoT
こんにちは!
ゆってぃ(ぽぽんた)です!

※このブログは、もともとはバンド活動用として立ち上げたものですので、ここではバンド内での呼び名「ゆってぃ」として記事を書いています。ただ、SORACOM UGのLT時には「ぽぽんた」(SNSなどではぽぽんたと名乗っているので…)として自己紹介してしまったので、これからは名前を併記することにしました。

4/26(木)に大崎ブライトコアホールで実施されたSORACOM UG #10(SORACOM Technology Camp 夜の部)SORACOM UG #10(SORACOM Technology Camp 夜の部) で、僭越ながらわたくしゆってい(ぽぽんた)が、LTをさせて頂きました。
あの時の資料をまだ公開していなかったのと、回路の詳細説明も割愛してしまったので、本ブログでしっかりとご説明できればと思います。

スライド
LTの発表資料はここに置きました

はじめに
本記事では回路について説明しますが、現在の僕はソフトエンジニアであって、回路エンジニアではありません
(前職では5年程、回路エンジニア兼ソフトエンジニアをしておりましたが、ここ4年間はソフト一本でやってきています)
そのため、回路上に不適切な箇所が多々あるかと存じます
お気づきの際は、是非是非ご指摘をお願いします!
のっけから言い訳がましくて申し訳ないです…

それでは、回路の説明に入りたいと思います。

回路の説明
低消費電力回路


概要
この低消費電力回路は、二つのUSB端子を有しており、片方はバッテリーに、もう片方はWio LTE本体に接続されます。
Wio LTEの後段にはMOSFETがあり、このMOSFETをON/OFFすることで、Wio LTEへの電源を制御します。
このMOSFETは通常ではOFF状態ですが、口述する起動要因が入ることでON状態となり、Wio LTEへの電源が供給されるという仕組みです。
起動要因がなくなった時点で、再びOFF状態へ戻り、Wio LTEへの電源は遮断されます。

USBコネクタ
まず、左上のP11ですが、これはモバイルバッテリーと接続するためのUSBコネクタです。
今回は、ユニバーサル基板での実装だったので、ブレッドボード用マイクロBメスUSBコネクタDIP化キットを使用しています。
右上のP12は、Wio LTEとの接続になるので、基板取付用USBコネクタ(Aタイプ メス)を使用しています。
こちらはブレッドボード用ではなく、生のコネクタをユニバーサル基板に刺しています。
(ただし、コネクタ固定用の側面のピンはユニバーサル基板の穴に入らないので、ボール盤で基板に穴をあけて実装しました)
ユニバーサル基板用のコネクタも売っているのですが、これを使用するとWio LTEをマウントした時の高さが高くなってしまうため、大きさを重視する方は生のコネクタを使用することをお勧めします。

RTC
この回路のキモは、U21にあるRTC8564 (RTC IC)です。
このRTC ICはI2Cインターフェースとアラーム割り込みを持ち、予め設定しておいた時間になると、/INT端子からLowが出力されるという機能を持ちます。まぁ、よくある一般的なRTC ICですね。魅力なのは待機時の消費電力で、I2Cアクセスがなければ、330nAしか消費しません。
動作電圧も1.8V~5Vと広く、大変使いやすいです。
ただ、今回はWio LTEとI2Cで通信をするので、動作電圧をWio LTEに搭載されているSTM32F405と同様の3.3Vまで下げる必要があります。(こうしないと、I2Cの通信でSTM32F405に5Vが入ってしまうためです)
そのため、USB 5Vから3.3Vを生成するためのレギュレータであるU11が入っております。

電源駆動回路
Wio LTEの電源を最終的にON/OFFするのは、Q23にあるN-ch MOSFETのEKI04027です。
プレゼン資料では、皆さんに直感的に理解してもらうためにハイサイドスイッチ(負荷 = Wio LTEの上段に位置するスイッチ)としてFETを使用しているポンチ絵を描きましたが、実際の回路ではローサイドです。
そのため、このFETはWio LTEのGNDラインを制御する形になっています。

N-chなので、ONするにはゲートに電圧をかければよいのですが、MOSFETのゲートってあんまり強くないのです。
そのため、ON時の突入電流で、ゲートが壊れてしまうことがあります。
なので、R13とC21のようなRC回路を組んで、突入電流を抑えるようにしてください。
なお、Wio LTEのMOSFET回りも、ちゃんとその様に設計されています。

WioLTE抜粋

(余談ですが、僕の大学院時代の研究対象はMOS FETでした。それも超小型の。当時(2008年)の半導体業界は、28nmプロセスを実現するために躍起になっていたのですが、いまや10nm世代が誕生しようとしていますもんね…。技術の進歩は本当に早いものです)

起動要因のOR回路
ここは少しややこしいのですが、今回の低消費電力回路は、複数の条件で上記のMOSFETをONします。
具体的には、下記の①~③のいずれかが発生すると、MOSFETがONされます。

①RTC ICの割り込み出力
②プッシュボタン押下
③Wio LTEからの自己保持信号出力

①は当たり前なので、説明不要ですね(笑)
今回採用したRTC8564の割り込み出力はLow出力です。
つまり、設定した時刻になると、/INT端子がGNDレベルになります。
すると、Q12がOFFされて、MOSFETのゲートに5Vがかかり、ONされるという仕組みです。

②は、初回起動用のスイッチです。
初めて電源を投入した時は、RTC ICにアラーム時刻が設定されていないので、いつまでたってもWio LTEが起動しません。
そのため、電源投入後の初回起動だけは、プッシュスイッチで電源が入るような回路になっています。

③自己保持
これは②との組み合わせで使用します。
②だけだと、Wio LTEが起動しても、ボタンを離すと電源がOFFされてしまいます。
そこで、Wio LTEが起動後にGPIO電源をONしたタイミングで、その出力をGROVE経由(P21)で引っ張り込み、②のスイッチがオンされているのと同じ状況を電気的に作り出します。
結果として、初回起動時にボタンをポンっと押してあげれば、ボタンを離してもWio LTEの電源がOFFされないという仕組みです。
ここで、P21経由でWio LTEのGNDを低消費電力回路のGNDと接続しないようにご注意ください
先述のMOSFETにて、Wio LTEのGNDと低消費電力回路のGNDを導通させることでWio LTEへ電力を供給しているので、ここでGNDを繋いでしまうと、MOSFETとは関係なく、Wio LTEに電源が供給されてしまうためです。


以上が、この低消費電力回路の説明となります。
冒頭申し上げました通り、この回路には不適切な部分もあると思います。
お気づきの際は、是非メールやコメントなどを頂ければ幸いです。

あと、IoTゴミ箱としての制御用のソフトは下記においてあります。
https://github.com/poponta/WioLTEWithLowPowerConsumptionCircuit
ご参考まで。
(一部コメントが文字化けしてます…ごめんなさい)

最後までお読みいただいて、ありがとうございました!
スポンサーサイト
こんばんは!
ゆってぃです。

前回前々回に引き続き、またまたWio LTEネタです。
前回お話した低消費電力回路と制御ソフトが、ようやく完成しました。

こちらです。

top.jpg

Wio LTEと接続

open.jpg

Wio LTEをマウント

mount.jpg


まぁ、大した回路ではないので、見た目は地味ですね(笑)

課題であった非通信時の消費電流ですが

90μA(@5V)
を実現できました。

にっしっしっし…!やったね!(笑)

スタンバイモードに入れた時の消費電流が50mAということを考えると、おおよそ1/500になります。
この程度の消費電流であれば、モバイルバッテリー(10000mAクラス)に接続すれば、使い方によっては計算上は数年は持ちます。
(実際はバッテリー自身の自然放電があるので、そこまでは持たないと思いますが…)

この一週間、睡眠時間とドラクエ11をやる時間を削って作り続けた甲斐がありました(笑)

よーーーし!
パパ(※)嬉しいから、今日はお寿司(スシロー)を食べちゃうぞ!

(※ ゆってぃは独身です…)

この低消費電力回路は、USBの端子を2つ有しており(ホスト側、クライアント側(mini))、片方はバッテリーに、もう片方はWio LTEに接続されています。
VBUSはそのまま接続し、GNDはMOS FETを介して接続します。
MOS FETのゲートは、RTCの割り込み信号出力端子と接続します。
結果として、RTCの割り込みが入ったタイミングで、Wio LTEに電源が入るという仕掛けです。
(なお、今回作成した試作では、RTC ICのIRQ出力端子とMOS FETのゲートとの間にトランジスタを介しています)

また、初回起動時用のスイッチも搭載されています。
(※初回時はRTCのアラームがOFFなので、手動でMOS FETのゲートをONする必要があるため)

RTC ICとWio LTEはGroveコネクタを介してI2Cで接続してあります。
こうすることで、Wio LTEから次回起動時の時刻を設定することが出来るようになっています。
ただし、Grove経由でRTC ICに電源を供給してしまうと、Wio LTEのシャットダウン時にRTC ICも死んでしまうので、GroveのVDD/GNDは低消費電力回路とは未接続となっております。
また、I2Cの信号はWio LTE側でプルアップされているため、H信号は3.3Vになります。
そのため、RTC ICの電源も、5Vからレギュレータで作り出した3.3Vを供給しています。

RTC ICとしては、入手が容易なRTC8546を使用しました。
Arduinoから制御できるライブラリを作ってくださった方々も何名かいて、大変参考になりました。
特に、写真で見る工作室さんの制御プログラムは、大変参考になりました。
ありがとうございます。

最後までお読みいただいて、ありがとうございました!
こんばんは、ゆってぃです。
今、2/2(木)の午前2時30分です。
眠いです…。
なので、若干テンションも低めです。
明日、朝イチで打合せあるんだよなぁ…(笑)

前回の記事で、Wio LTE搭載のマイコン、STM32F405をスタンバイモードに入れました。
しかしながら、それだけでは期待値とは程遠い結果となってしまいましたね。

まぁ、よく考えたらリセットボタンを押している時でさえ50mA程度流れていたので、マイコンとは関係のない部分でそれぐらいの消費電流があることは明らかだったんですねどね。

あまりに悔しかったので、外付けの低消費電力回路を手作りで作りはじめました。
(まだ完成してませんが、簡易的な動作確認はOKでした)
試作中の回路はRTCタイマを搭載しており、Wio LTEからI2Cでアラームの制御をすることが出来ます。
アラーム設定時刻になると、RTC IC回路が電源回路を動作させ、FETを通して5VがWio LTEに供給される仕組みです。
Wio LTEはサーバとの通信完了後、このRTC ICに次回起動時の時刻をセットして、現在のアラームを消せば、5V供給が止まり電源がOFFになる仕組みです。
(ただし、初回起動時だけはスイッチで起動する必要があります)

測定したところ、待機時の消費電流は100μA以下でした。
つまり、通信さえしなければ、モバイルバッテリーでも数年は持つ計算になります。
(モバイルバッテリーの自然放電にもよりますが)
通信も、起動から約20秒ほどで終了するので、通信回数が少なければ数カ月は持つでしょう。

週末には完成させたいと思います。
おやすみなさーい。
お久ぶりでございます。

記事を書かな過ぎて、FC2のログインパスワードを失念していたゆってぃです!

今月に入り、話題のWio LTEを買いました。
このモジュールの素晴らしさは言うまでもありませんが、Wio LTE + SORACOMという組み合わせで
誰でも手軽にIoTを楽しめるようになります。

でも複数台買うには高いんだよね…。
seeedさん…!今後のディスカウント、期待しています!
LTEモジュールとアンテナが高いのはわかっていますし、マイコンも豪華だし、すでにかなり頑張ってる価格なのは承知していますけど…でもほらcat.1だし、何とか6000~7000円台で…!(笑)

さて、そんな素晴らしいWio LTEの最大の欠点は、その消費電力にあります。
モバイルバッテリーで長時間動かしたいのに、これじゃあ…と思っていました。
皆さんも、せっかくのIoT機器なのに、バッテリーが数時間や1日2日しか持たないのは物足りないですよね?
僕も物足りないです。

<ゆってぃが作りたいもの>
・ 据え置き型のセンサーデバイス(屋外使用を想定。AC100V電源の確保は不可)
・ 15分に一度、MQTTでサーバにセンサ値を送信する(JSONで100Byte程度)
・ 1日の稼働時間はAM6時~AM0時(1日あたり18時間)
・ 10000mAhのモバイルバッテリーで、1カ月稼働(目標)

少し調べてみるとseeed jpの人のブログで、Wio LTEを低消費電力で動かす手段の紹介をしてくれています。
消費電力の大半はLTEモジュールなので、この方法でもかなりの省電力化がみこまれます。
ただ、測定したところ、非通信時でも85~95mA程度の電流が流れ続けていました。
常時通信と比較すると消費電力は大きく減りましたが、それでも5000mAのモバイルバッテリーでは、約55時間(2日半)の駆動が限界という計算になります。

IoT機器の多くは、数十分(あるいは数時間)毎にちょこっとデータを送るケースが多く、大半は通信をしていない待機状態です。
必然的に、この待機状態の消費電力をいかに減らすかと言うことが、長寿命化のポイントとなります。
(Seeedの人も、マイコンをスリープさせる方法は次のステップで書いてくれるようですが、ゆってぃは待ちきれませんでした)

ラッキーなことに、メインマイコンのSTM32F405には、複数のスリープモードがついています。
まずは下記のドキュメントを参照してください。

STM32F405のマニュアルページ
データシート
リファレンスマニュアル
リファレンスマニュアル(日本語)

「まずは」じゃねーよ!
1700ページあるぞ馬鹿野郎!


ひーーーーーー!!!ごめんなさい!

ですので、掻い摘んでポイントだけ説明します。
かくいう私も、RTCと低消費電力モードの章以外は全く読んでいません。

マニュアルよると、低消費電力モードには

・スリープモード:CPUの電源は切るが、ペリフェラルは動いている。割り込みでwake可能。
・ストップモード:SRAMの状態を保持したまま、マイコンを停止するモード。発振子も止める。
・スタンバイモード:SRAM保持もせず、マイコンを停止するモード。内部レギュレータ(1.2V系)を完全にOFFする。

の3種類があり、スタンバイモードが最も低消費電力のようです。
なんか語感的にはストップモードが一番低消費電力モードな気がしますが、細かいことは気にしないでいきましょう

リファレンスマニュアルに詳しい説明がありますが、この機能自体はCortex-M4のdeepsleepモードをベースとしています。
それに加え、バックアップ系以外のペリフェラル電源および発振部を、すべてOFFにしている訳ですね。
この時、RTCのレジスタ部はOFFされないため、こことバックアップSRAMだけは生き続けるという仕組みです。

スタンバイモードからの復帰方法は
①外部リセット
②内部ウォッチドッグリセット
③WKUPピンの立ち上がりエッジ
④RTCイベントの発生
の4種類です。

復帰時に外部から信号が入ることは想定していないので、必然的に②か④ですが、④が妥当でしょう。

スタンバイモードへの入り方

無駄話導入部が終わったので、さっそくスタンバイモードへの入り方を説明します。
リファレンスマニュアルによると、スタンバイモードへは下記の方法で入ります。

次の条件下での WFI(Wait for Interrupt)または WFE(Wait for Event) – Cortex™-M4 with FPU システム制御レジスタの SLEEPDEEP ビットをセット – 電源制御レジスタ(PWR_CR)の PDDS ビットをセット – 電源制御/ステータスレジスタ(PWR_CSR)の WUF ビットをクリア – 選択されたウェイクアップソース(RTC アラーム A、RTC アラーム B、RTC ウェ イクアップ、タンパ、タイムスタンプフラグ)に対応する RTC フラグをクリア

ただし、マニュアルには「安全なウェイクアップフラグクリアシーケンス 」として、下記シーケンスが推奨されています。

PWR ウェイクアップフラグ(WUTF)がクリアされる前に選択された RTC 代替機能がセットされた 場合、検出は立ち上がりエッジで一度だけ行われるため、次のイベントで検出されることはありませ ん。
RTC 代替機能がマッピングされているピンでの検出ミスを避け、STOP モードおよび STANDBY モー ドを正しく終了するには、STANDBY モードに入る前に以下の手順に従うことを推奨します
RTC アラームを使用してデバイスを低電力モードからウェイクアップさせる場合は、次の設定 が必要です。
 a) RTC アラーム割り込みを無効にします(RTC_CR レジスタの ALRAIE または ALRBIE ビット)。
 b) RTC アラーム(ALRAF/ALRBF)フラグをクリアします。
 c) PWR ウェイクアップ(WUF)フラグをクリアします。
 d) RTC アラーム割り込みを有効にします。
 e) 再び低電力モードに移行します。


まぁ、当たり前のことを言っているだけですが、多くの割り込み系の不具合というのはこういうイージーな所から発生し、原因がわからず猛烈な残業を何日も強いられるハメになる訳です。


RTCの設定

スタンバイモードからの復帰には、RTCイベントを使用します。
STM32F4シリーズの内蔵RTCは、以下のマスク可能なRTCを有しています。

– アラーム A
– アラーム B
– ウェイクアップ割り込み
– タイムスタンプ
– タンパ検出

今回は、日中は15j分毎に起動を繰り返し、深夜は翌朝まで再起動しないというものが作りたいので、アラーム機能を使いましょう。
これは、指定した時間になるとRTCのアラーム割り込みが発生するという、名前の通りなんの捻りもない機能です。
RTC関連機能は、RTClockというライブラリが提供されているので、これを使えば簡単に制御できます。

サンプル
以上を踏まえて、低消費電力モードへの入り方を説明します。
なお、僕が作成中のコード全部をここに乗せるのは難しいので、全体はGitHubに乗せました。
そっちは少しクラスが多くてわかりづらいので、ここではポイントだけお話しします。
下記コードのEnergyManager::EnterStandbyMode()は、低消費電力モードに入るための自作メソッドです。
なお、引数は次回起動時の時刻です。

ここで、変数のrtc_はライブラリにあるRTClockクラスのインスタンス、pwr_ctrl_は自作のPowerCtrlクラスのインスタンスです。


--- EnergyManager.cpp 抜粋 ---

void EnergyManager::EnterStandbyMode(time_t wakeup_time) {
struct tm dbg = *gmtime(&wakeup_time);

// see STM32F405xx Reference manual

// アラームA割り込みを禁止
rtc_->turnOffAlarmA();

// アラームA割り込みフラグをクリア
rtc_enter_config_mode();
RTC_BASE->ISR &= ~(1 << RTC_ISR_ALRAF_BIT);
rtc_exit_config_mode();
*bb_perip(&EXTI_BASE->PR, EXTI_RTC_ALARM_BIT) = 1;

// WUFクリア
pwr_ctrl_->ClearWUF();

// 次回起動時間をセット
rtc_->setAlarmATime(wakeup_time);

// 次回起動時間の表示
SerialUSB.print("next wake up time: "); // for debug
SerialUSB.println(asctime(&dbg)); // for debug
delay(100); // for debug

// スタンバイモードへ遷移
pwr_ctrl_->EnterStandbyMode(); // enter standby mode
}



--- PowerCtrl.cpp 抜粋 ---

// UWFをクリアする
void PowerCtrl::ClearWUF() {
// clear WUF bit
PWR_BASE->CR |= (1UL << PWR_CR_CWUF);
}

// Standbyモードへ遷移
void PowerCtrl::EnterStandbyMode() {

// set PDDS bit
PWR_BASE->CR |= (1UL << PWR_CR_PDDS);

// clear WUF bit
ClearWUF();

// WUPがクリアされるまで待つ
while(PWR_BASE->CSR & (1UL << PWR_CSR_WUF)) {
}

// set sleep deep bit
SCB->SCR |= (SCB_SCR_SLEEPDEEP_Msk);

// 割り込み待ち(Standbyモード)
__WFI();
}


上記処理にてスタンバイモードに入れると、待機時の電流は5Vで40~50mAです。
実装前のおおよそ半分といったところですが、まだ結構食いますね…。
寿命が倍になったとはいえ、そもそも2~3日の倍ですから、まだまだ実用途には耐えられません。

個人的には、非通信時は1mAとかまで持っていきたいけど、外付けの電源回路作らないと難しいかな。。。
外付けで低消費電力(マイクロアンペアオーダー)のRTC ICを付けて、アラーム出力でMOS FETかませて電源制御して…ってすれば、リーク含めても1mA切れるかな。
でも、大きくなっちゃうのは嫌だし…悩ましいです。

注意点

ソフトを書いていてわかったのですが、
libmaple/pwr.h
にはインクルードガードがついておりません。
ほかのヘッダにはついているので、単なるつけ忘れか、それとも何か意味があるのかはわかりません。
ただ、ゆってぃは深く考えずにインクルードガードを付けました。
ビルドされる際はご注意ください。

以上です。
長くなってしまいましたが、最後までお読みいただいて、ありがとうございました!!
プロフィール

ゆってぃ

Author:ゆってぃ
経歴8年の組み込み系エンジニアです。
ソフトウェア開発経験ゼロの状態から、なんとか実務がこなせるようになってきた現在に至るまでの経験を、備忘録代わりに綴っていきたいと思います。
入門者の方、大歓迎!
(上級者の方、ごめんなさい…)

<守備範囲>
言語:C/C++(C++03/C++11)、一部アセンブラ
マイコン及びSoC:PIC、SH、FM3、R-Car
PoC基板:Arduino、RaspberryPi、Wio LTE
OS:OSレス、ITRON、Linux(Yocto)
サーバ技術:Docker、nginx
プロトコル:MQTT、DMX
その他:CAN、J1939

あと、ブログには全然関係ないですが、Bumpy Headというバンドのギターをやっています。
ライブ情報なんかも書いたりすることがあるので、その時に「行ってもいいよ~」といった感じのコメントを戴けると、泣いて喜びます(泣)
ブログ読んでくださってる方なら、チケット代サービスしちゃいます!

最後に…滅多に流用することは無いでしょうが、このブログに書かれているソースは、特に指定の無い限りMITライセンスとします。ただし、一部それ以外のものもございますのでご注意下さい。
※ブログのリンク先にあるコードに関しては、リンク先のポリシーに従ってください。

最新記事
最新コメント
カテゴリ
RSSリンクの表示
メールフォーム

名前:
メール:
件名:
本文:

twitter
リンク
ブロとも申請フォーム