2023.04.04本記事はプロモーションが含まれています。こんにちは、ENGかぴです。ZigBeeモジュールであるトワイライト(TWELITE)はスリープを使用することで低消費電流で動作させることができるためエナジーハーベストによって生成した電源を使って動作させることができます。スリープを使って無線タグアプリを模擬しました。トワイライトを太陽光パネルで動作させたことやMWSTAGEの環境でソフト開発して無線通信したことなどについてまとめています。関連リンクスリープとウェイクアップを実装するIoTモジュールをエナジーハーベストによる電源や電池で運用する場合、間欠動作させて電池の消耗を抑えることが前提になります。そのためIoTモジュールをスリープ状態にさせることは運用上必須の条件になります。スリープ状態にすることで消費電流は数uA程度になります。TWELITEもスリープ機能を搭載しており無線タグアプリを使用することでかなり低消費電力での運用が可能になります。太陽光パネルによるエナジーハーベストで無線タグアプリを動作させた結果については下記にまとめています。the_twelite.sleep(u32ct);}スリープ機能はthe_twelite.sleep(引数)に数値を入力するとスリープされることができます。1を入力すると1msのスリープになります。この処理をまとめてsleepNow()という関数で管理しています。スリープ時間の設定をu32ctに設定していますrandom(0,2000)は0から2000までの乱数をとなるのでスリープ時間は9000~11000msの間になります。通信する機器が増えると同じタイミングでスリープからウェイクアップ機能して通信を行うと干渉を起こすリスクがあるのでタイミングが一定にならないようにしています。モノワイヤレス社のHPにもこの対策の意味について説明されています。スリープの時間が経過するとwakeup()関数に遷移します。wakeup()関数は他のファイルで定義されていますが、内部の処理はwakeup()をユーザーが実装することで処理を追加することができます。crlf;ウェイクアップした時にLEDの点灯と消灯の状態を切り替える処理を実装しています。今回はスリープさせた後にボタンを押すことでウェイクアップされる機能を実装してスリープとウェイクアップの動きを確認します。LEDが消灯したタイミングでスリープした場合の消費電流を測定すると1.2uA~1.3uAとなっておりデータシートと一致しているためスリープできていることが分かりました。「書けるが先で、理解が後」を体験しよう!動作確認用の回路図スリープの動作確認用の回路図TWE-EH-Sを使ってTWELITEに電源を供給します。電気二重層コンデンサに電荷をフルチャージしてもLEDを点灯させる電流によっては長持ちしませんが、短時間の動作であれば供給は可能(この条件下の実測では30秒が限界)です。TWELITEに電源が供給されるとLED1が点灯と消灯を繰り返します。SW1を押すとTWELITEがスリープ状態(今回は9秒から11秒のランダム)になります。スリープ状態の時間が経過するとウェイクアップしてLED2を点灯と消灯を切り替えます。LED2はウェイクアップした時に切り替えるようにしています。スリープ状態になるとDIDO情報が維持されるためLED1が点灯したままスリープ状態になることがあります。今回のソフトはスリープの状態が分かることを目的にしているためLEDを消灯するような処理を入れていません。スリープは消費電流を抑えるために使用するので実運用時はスリープする前にLEDを消灯するなど消費電流を抑えることが必要です。DIPのピン番号は異なります。DIPのシルクを見ると番号が書いてありDIDOピンの番号と一致するようになっているのでピン配置図でDIDOピンの場所が分かります。回路図で使用しているDOとDIは、赤枠で囲っているものはDOに割り当てた番号、青枠で囲っているのはDIに割り当てた番号です。広告DIDO機能の設定MWSTAGEではDIDOの設定が簡単にできるようにpinMode()関数が実装されています。WAKE_FALLING_PULLUP);DIDOはpinMode()関数に引数を指定すると使用できます。VScode上でpinModeの上にカーソルを置き右クリックして定義へ移動を選択すると関数の詳細が分かります。pinMode()関数の詳細pinMode()関数の詳細が分かるのでこの中でPIN_DIGITALとE_PIN_MODEについて確認することで引数の詳細が分かります。PIN_DIGITALの詳細PIN_MODEの詳細PIN_DIGITALの定義を見るとDIO0からDIO19の番号を引数に指定する必要があることが分かります。下から4つのものはDIOの合計数とDOの合計値になっています。DIO0からDIO19を特殊な使い方をしない限り気にする必要ありません。E_PIN_MODEは指定したDIDOピンに対しての機能を割り当てる際に使用する引数の詳細です。DOを使用しないE_PIN_MODEの設定詳細PIN_DIGITALを参照して定数を宣言してpinMode()への引数として使用する例は以下の通りです。WAKE_FALLING_PULLUP);ピン設定を変更したいとき定数の箇所のみの変更になるため間違い変更ミスによるリスクを低減できます。広告ボタンのDIフィルタ(チャタリング防止)ボタン通したときONとOFFが安定しない期間(チャタリング)が発生します。この対策としDIフィルタを作ることで対策を行います。下記記事のDIフィルタの考え方と基本的には同じです。PICマイコン(PIC12F675)のDIピンのフィルタの考え方MWSTAGEにおいてはButtons()関数でチャタリングの防止ができるように関数(ライブラリ)が準備されています。Buttons.setup(5);Buttons.begin(pack_bits(PIN_DI1,PIN_DI2),5,10);Buttons()はsetupとbeginを同時に使用する必要があります。begin内でsetupでメモリを確保した値を参照している構造となっているため先にsetupを行い、beginで対象のDIを指定するように使用します。今回はボタンが2つあるため以下のようにソースコード書きたくなります。10);この場合はPIN_DI1のフィルタがPIN_DI2による処理が上書きされPIN_DI1のDIが動作しなくなってしまいます。ボタンを1つ以上する際は、複数のDIに対応したpack_bitsが実装されているので使用します。対象のDIを指定することでまとめて使用することができるようになります。Buttons.setup(5);Buttons.begin(pack_bits(PIN_DI1,PIN_DI2),5,10);Buttons.begin()の引数である5はDI情報が5回一致すると採用するための回数であり、10は10ms毎のインターバルでDIを確認する意味の引数になります。動きを確かめるために引数の10を200にすると1s間ボタンの状態が維持されないと反応しない動きになります。Buttons()関数はボタンのチャタリング防止のために準備されていますが、DIフィルタとしても使えるので用途としてはボタンに限らずスイッチやフォトカプラなどによる信号のフィルタリングにも使用できそうです。以下のソースコードはコンパイルして動作確認をしております。コメントなど細かな部分で間違っていたりやライブラリの更新などにより動作しなくなったりする可能性があります。参考としてお使いいただければと思います。crlf;}関連リンクトワイライトを太陽光パネルで動作させたことやMWSTAGEの環境でソフト開発して無線通信したことなどについてまとめています。最後まで、読んでいただきありがとうございました。組み込みエンジニアPICマイコン(PIC16F1827)のI2C通信を実装するPIC16F1827はI2C(MSSP)通信機能を持っておりLCD等の外部機器と通信することができます。MCCによるI2C通信の実装例とLCDを使用したストップウォッチのソフトを作り経過時間を表示して動作確認しました。組み込みエンジニアArduinoのDO制御で7セグメントLEDを表示するArduinoの標準ライブラリでDOを制御してLEDなどを簡単に点灯消灯させることができます。DO制御の応用例として7セグメントLEDに数値を表示できます。複数のDOの制御をパターン化して7セグメントLEDに表示する方法をまとめています。電気電子部門の試験において発電設備に関する計算問題が出題されています。水力発電の水頭に関するベルヌーイの定理(公式)が分かっていれば難しくありません。ガスタービンの効率も排熱と回収の関係を正確につかめれば難しくありません。電子回路設計において電源が切れてもSRAMやRTCなどのデータを保持するために電気二重層コンデンサを使ってバックアップすることがあります。電気二重層コンデンサの容量と電圧の関係からバックアップ時間の計算の仕方についてまとめました。XIAO31ESP32-WROOM-32E37TWELITE(トワイライト)26PIC16F182731PIC12F67522ノウハウ(体験談)36趣味と生活29その他6タグオペアンププロフィールENGかぴ当ブログの運営者のENGカピです。組み込みエンジニアとして10年以上の経験を活かしてセンサーモジュール等の動作確認したことをまとめています。広告、アフィリエイト収益で当ブログを運営させていただいております。defined.")}))})()タイトルとURLをコピーしました。