The Negligible Lab

Astray in the forest of electrical and electronic circuits. Adrift in the gap between time and frequency domains. 独立独歩を是とする。

ULPを活用した電池駆動ESP32雨センサシステムを作る

はじめに

明けましておめでとうございます🐇 とうとう昨年(2022年)の記事がただの1件から増えることがないまま2023年を迎えてしまいました。令和も何ともう5年です。さらにはもう2月ですね。

さて,新型コロナウイルスの流行が始まってから,筆者はほぼ在宅勤務となっています。その仕事机はちょうどバルコニー*1に通じる窓の直近に位置しています。このバルコニーには洗濯物も干しているのですが,雨が降り始めてもすぐ近くに座っている筆者がそれに気付かず,洗濯物を濡らしてしまうことが多々ありました。雨滴を検知して雨の降り始めをお知らせしてくれるシステムがあれば…いや,自分で作るのだ…! そこで,雨が降り始めたらLINEに通知を送ってくれる雨センサシステムを製作します。

まずは図1,2に完成形を示します。

図1: ESP32マイコンによる雨センサシステム

図2: “素”のESP32マイコンを搭載する基板

図1に示すように,防雨ケース内にESP32マイコンと電池ボックス(eneloop × 3本)を収納し,ゴムブッシングを介して2枚の雨滴センサを外部に引き出しています。図2は図1の中に搭載しているESP32マイコンを搭載するメイン基板です。これは本ブログでおなじみの十字配線ユニバーサル基板を用いて製作しています。後述しますが,ESP32マイコンを数ヶ月単位の長時間にわたって電池駆動しようとする場合,USBシリアル変換ICや三端子レギュレータの消費電力が無視できないため,それらを搭載しない“素”のESP32マイコンを使う必要があります。ESP32マイコンに搭載されている超低消費電力(ULP)コプロセッサを使って,電池の消費を極力抑えながら雨滴センサを監視し,雨滴を検知したらメインコアを起動してLINEに通知を送るようにします。

www.youtube.com
動画1: ESP32マイコンによる雨センサシステムの動作テスト

動画1に動作テストの様子を示します。動画の開始時ではESP32のメインコアはディープスリープしています。電流計を見ると,消費電流はほとんど零に見えますね。ここで雨滴センサに水滴を垂らすとULPコプロセッサがこれを即座に検知し(実際は1秒毎に監視しています),メインコアを起こしに行きます。すると消費電流が立ち上がって変動しつつ,メインコアはWiFiに接続してLINEに通知を送ります。スマートフォンの画面にLINEの通知が現れる様子が見えますね。そしてすぐにメインコアはディープスリープへと戻ります。

本記事ではこの雨センサシステムについて書いていきます。まずはアイディア出しや試作段階で考えていたことから始め,ESP32マイコンを搭載した市販の各種ボードについて述べます。またArduino IDEからULPコプロセッサを使用する方法や,ESP32マイコンからLINEに通知を送る方法,LINE Notifyの設定について述べることにします。

*1:Eテレの番組「マチスコープ」で最近知りましたが,上部に屋根などの覆いがあるものを「ベランダ」,ないものを「バルコニー」と称するようです。

続きを読む

ESP32マイコンで商用電源品質監視装置を作る

はじめに

本ブログも実質的に3年目に入りました。このところ半年以上も新しい記事を投稿できておりませんでしたが,一応,生存はしております。筆者が多忙を理由に怠惰ゆえに本ブログを放置していた間に,世界史を画するような大事件がいくつも起こりましたね…。そのような社会情勢から,今後,電力需給が逼迫する事態が頻発する可能性が高まってくるでしょう。電源品質監視装置に興味があるという方も増えてくるのではないかと思っています。

過去の試み ~浮遊静電容量を用いた周波数監視装置~

さて,本ブログでは以前に,浮遊静電容量を用いて電力系統の周波数を測る装置について書いております。

negligible.hatenablog.com

これは,M5Stackのアナログ入力端子に電位として浮いている電線や金属塊を繋げ,電力系統周波数と同じ周波数のいわゆる「ハムノイズ」を拾うことで商用電源の周波数を測ろうという試みでした*1。100 Vコンセントなどに接続することなく,完全に浮いた状態で周波数を測れるという面白さがありましたが,上記の記事にあるように,如何せん波形については正しく取得できないことから,この装置は周波数しか計測できません。やっぱり電圧波形そのものをきちんと取得して,実効値や高調波を観てみたい,つまり,「電力系統の息吹を感じたい」との思いから,変圧器を用いた新しい監視装置を作ろうと考えました。

完成イメージ

図1に完成した商用電源品質監視装置の写真を示します。

図1: 完成した商用電源品質監視装置

AC 100 Vという超高圧(?)を取り扱うことから,人が充電部に触ることができないよう,システム全体をアクリルケースに収めました。マイコンはM5Stackにも搭載されているEspressif Systems社のESP32で,秋月電子通商のモジュール(AE-ESP32-WROOM-32E-MINI)を使っています。ケース前面右上に240 × 240ドットの液晶ディスプレイを取り付け,周波数,実効値,波形,スペクトルを表示するようにしました。ディスプレイへの描画に関しては,らびやんさんのLovyanGFXを活用させて頂いております。

動画1に完成した装置の動作画面を示します。

youtu.be
動画1: 完成した商用電源品質監視装置の動作画面

スペクトルに関しては,本ブログでも以前に書きましたFFTのプログラムをそのまま活用しています*2マイコンで自作FFT関数がリアルタイムでうねうね動いている──こりゃ超気持ちいい!

この装置は,計測した周波数,実効値,スペクトル(3, 5, 7, 9, 11次高調波含有率とTHD)を10秒毎にGoogle スプレッドシートにPOSTします。図2にGoogle スプレッドシートに作った監視画面,いわゆるダッシュボードを示します。これは今まさに本記事の執筆時点での様子です(早く寝ましょう💧)。

図2: Google スプレッドシートダッシュボード

これまでに,2022年6月の電力需給逼迫に伴う周波数低め運用や,落雷に起因すると思われる電圧変動,また,宅内での家電機器の入切に伴う変動などを観測しております。

本記事の内容

本記事では,変圧器をいわゆるPT (potential transformer)として用いた電圧波形の検知方法に注目したESP32周りの回路構成について述べます。その後,周波数,電圧実効値,スペクトルの計算方法について書いていきます。さらに,Arduino IDEにて作成したC++でのプログラム,特に定周期割り込みなどについて説明します*3。また,例によって十字配線ユニバーサル基板を用いた実装について簡単に触れます。最後に,電力需給逼迫時や落雷発生時など,過去の特異な観測例をいくつかご紹介します。

*1:筆者よりも先行してのるさんが同様の装置を発表されています。M5Stackだけで商用電源周波数の変動計測 - | ProtoPedia

*2:FFTを訪ねて[後編]PythonとC++で作ってみる - The Negligible Lab

*3:ただしソフトの作りについては,本ブログ以上に詳しく記述されている方がいらっしゃり,例えば筆者はLang-shipさんの記事を大いに参考にさせて頂いております。ESP32の高精度タイマー割り込みを調べる | Lang-ship

続きを読む

Raspberry Piで地震計を作る ④ 十字配線基板・HAT化編

はじめに

晩秋から年末へと時が移ろいつつありますが,いかがお過ごしでしょうか? 今朝は筆者の住む街でも氷点下を記録しました。寒くなって参りましたね。今回も残念ながらぱわみのある記事ではありませんが,お付き合い下さい。

さて,前々々回*1,前々回,前回を通じて,Raspberry Piを用いたマイ地震計を作りました。これは,図1のようにブレッドボード上にモーションセンサMPU6050とOLEDディスプレイを置いたプロトタイプであったため,今回はこれを基板,すなわちRaspberry Piの“HAT”にします*2

f:id:s-inoue2010:20211119172634j:plain:w480
図1: ブレッドボードを使ったマイ地震計プロトタイプ

早速ですが,図2に完成イメージを示します。

f:id:s-inoue2010:20211129185914j:plain:w480
図2: 十字配線ユニバーサル基板を使ったマイ地震計HAT

モーションセンサMPU6050とOLEDディスプレイの各モジュールは後で取り外せるように,1列ピンソケットを介して実装しました。また,前回までのプロトタイプにはなかったタクトスイッチを2個追加しました。いずれ,このタクトスイッチで画面を切り替えて波形を表示するなど,工夫していきたいと思います。

*1:RADWIMPS感💦

*2:HAT = hardware attached on topの略ですが,Arduinoのshield(盾)を意識してHAT(帽子)と名付けられたのではないかと推測しています。

続きを読む

Raspberry Piで地震計を作る ③ センサ・全体構成編

はじめに

Raspberry Piによるマイ地震計を作るため,前々回にて計測震度計算プログラムを,前回にてタイマ割込みやマルチプロセッシングなどリアルタイム処理を作って参りました。今回は,Raspberry Piに加速度センサとOLEDディスプレイを接続し,プログラム全体を組み上げていきます。

前々回,前回挙げた開発課題を再掲します。

  1. 震度計算プログラムの実装
  2. システムコールsetitimerを活用したタイマ割り込み
  3. マルチプロセッシングとキュー
  4. タイマ割り込みとマルチプロセッシングの組み合わせ
  5. 加速度センサからの加速度取得
  6. OLEDディスプレイへの表示
  7. マイ地震計全体のプログラムの組み立て

今回は,上記5,6,7にあたる処理をPythonにて作って行きます。また,加速度センサ(モーションセンサ)の分解能やノイズについて,初歩的な実験を行って確認しました。

続きを読む

Raspberry Piで地震計を作る ② リアルタイム処理編

はじめに

前回と今回で,Raspberry Piを用いたマイ地震計について書いております。前回は加速度の時系列データから計測震度を計算するPythonプログラムについて述べました。

前回挙げた開発課題を再掲します。

  1. 震度計算プログラムの実装
  2. システムコールsetitimerを活用したタイマ割り込み
  3. マルチプロセッシングとキュー
  4. タイマ割り込みとマルチプロセッシングの組み合わせ
  5. 加速度センサからの加速度取得
  6. OLEDディスプレイへの表示
  7. マイ地震計全体のプログラムの組み立て

今回は,上記2,3,4にあたる処理をPythonにて作って行きます。これは,マイ地震計を作るために必要なリアルタイム処理です。

続きを読む

Raspberry Piで地震計を作る ① 震度計算編

はじめに

世界の地震の10%以上が日本で発生している──。巷間よく言われていることですが,先日も東京23区と埼玉県で10年ぶりに震度5強を観測したばかりであり,地震について考えない日はないと言っても過言ではないでしょう。

地震が発生した際に,気象庁のホームページやNHKなどで各地の震度が発表されます。しかし,これを待たずして自作の地震計で震度が分かったら,さらに,震度が分かるだけでなく加速度の波形も記録できたら面白そうです。昨今は加速度センサが簡単に手に入るので*1地震計というのは電子工作やプログラミングの練習にもちょうどいい題材になるのではないでしょうか?

今回,次回,次々回を合わせて,筆者がマイ地震計を作ろうと思い至った経緯や,開発にあたっての課題,Raspberry Piでの実現方法について書いていきます。今回はその第一弾として,加速度の時系列データから計測震度を求める計算方法について書いていこうと思います。

加速度センサから定周期でデータを読み出しながら震度計算するといったリアルタイム処理については次回に,加速度センサとそのI2C接続,プログラムの全体構成については次々回に譲ります。

観測例

いきなりですが,実際に起きた地震を捉えた観測例を示します。図1に,試作中のマイ地震計プロトタイプを示します。マルチプロセッシングを活用するので,4コアのCPUを持つRaspberry Pi 3 Model A+を使うことにし,ブレッドボード上にInvenSense社のモーションセンサMPU6050とOLEDディスプレイを置きました。いずれもI2CバスにてRaspberry Piに接続されますので,Raspberry PiのGPIO2 (SDA)とGPIO3 (SCL)に並列に接続しました(もちろん電源も必要です)。ジャンパワイヤの配線はいたってシンプルです。[追記: 2021-11-19]同じI2CバスにモーションセンサMPU6050とOLEDディスプレイを繋げると,加速度の定期的な読み出しのサイクルが乱される可能性があることが判りました。[追記: 2022-03-15]同じI2Cバスに接続してもOLEDディスプレイのためのフレームの隙間にMPU6050のためのフレームがほぼ10 ms周期で挿入されており,ほぼ問題ないという結論に至りました。詳しくは次々回の付録をご覧下さい。

f:id:s-inoue2010:20211115185649j:plain:w480
図1: Raspberry Pi 3 Model A+とモーションセンサMPU6050によるマイ地震計プロトタイプ

試作中のPythonプログラムは10 ms毎に加速度をサンプリングしつつ,加速度データが300点集まった時点で(つまり,3秒毎に)短時間計測震度を計算します。

ある夜,寝る前にプログラムを走らせておいたところ,早朝に発生した地震による加速度が記録されており,また,加速度から震度も(単に「それらしい値」ですが)計算されておりました。図2に結果を示します。この地震でマイ地震計プロトタイプが計算した計測震度の最大値は2.8であり,震度階級では震度3に相当します。

f:id:s-inoue2010:20211116083500p:plain
図2: 実際の地震の観測例(2021年11月8日03時08分頃の地震

これは,2021年11月8日03時08分頃に発生した茨城県南部を震源とするマグニチュード4.3の地震です*2気象庁のデータによれば,筆者の住む街では震度2を記録しています。一方,マイ地震計プロトタイプでは震度3を計測しました。恐らくですが,2階に置いてあったため,家屋での共振によって大きめの加速度を観測したのではないかと推測します。

なお,筆者のマイ地震計プロトタイプは,震度1以下の地震では反応しないようにしました。と言うのも,次々回で詳述しますが,モーションセンサMPU6050のノイズが大きいため,全く揺れていない状態と震度1を区別できないためです。より高精度の加速度センサが手に入れば,震度1以下も測れるのではないかと思います。

*1:後から分かりましたが,地震計として本格的に使うためには,1 galを下回るような小さな加速度を精度よく測れる必要があり,趣味の電子工作で手に入るような加速度センサでは,本来は対応できないと考えます。

*2:https://www.data.jma.go.jp/multi/quake/quake_detail.html?eventID=20211108031241&lang=jp

続きを読む

FFTを訪ねて[後編]PythonとC++で作ってみる

はじめに

11月に入っていよいよ秋が深まって参りましたが,いかがお過ごしでしょうか? さて,前記事にて,高速フーリエ変換(Fast Fourier Transform, FFT)に対する筆者なりの理解の仕方をまとめました。周波数間引き(decimation-in-frequency)型のCooley-Tukeyアルゴリズムや,その中で要となるバタフライ演算について述べた他,α-β変換やd-q変換など,電気屋としての思考の道具との関連性について考えてみました。

negligible.hatenablog.com

その続きとなる本記事では,FFTを実現する関数*1PythonC++で実装した様子や,それぞれのアルゴリズム

にて動かしてみた結果について書いていこうと思います。また,FFTの威力を実感するため,普通の離散フーリエ変換(Discrete Fourier Transform, DFT)も同様に実装して比較することとしました。

なお,PythonC++を選んだ経緯ですが,まず,(i) JupyterLabでアルゴリズムを対話的に確認したかったためPythonで作った,(ii) 単体でも動くようにJupyter Notebook (.ipynb)ファイルではなく単体の.pyファイルとした,(iii) M5StackやESP32 DevKit Cなどのため,Arduino IDEでも使えるようにC++に移植した(Mbedでも使えるかも)。また,複素数ライブラリについて若干の改造が必要ながら,C++Raspberry Piでも使える,と言ったところです。

本記事でも前記事と同様に,下記のインターフェース誌の記事を参考にさせて頂きました。とは言え,PythonC++に合わせて最初から作り直しています。

  • 星野秋人:「マイコンと音声信号で体験! フーリエ変換プログラムの実装」,インターフェース,2021年9月号,p. 49-57

特に,上記記事のp. 53に記載のリスト1,2を参考にさせて頂いており,本記事では略して「イ誌リスト1」,「イ誌リスト2」として言及することにします。

動作風景

まずは実際に動いているところをご覧下さい。M5Stackのアナログ入力端子(GPIO35)に三角波矩形波の信号を入力し,analogRead関数でサンプリングしています。得られた信号の時間領域での波形と,それをFFTしたスペクトルを液晶ディスプレイに表示するプログラムを作ってみました。動画1をご覧ください*2

www.youtube.com
動画1: M5StackでFFT

それぞれ奇数次高調波と思われるスペクトルを確認できますね。

f:id:s-inoue2010:20211113024440j:plain:w480
図1: Nucleoを信号源として使う

図1に示すように,Nucleo L476RGを信号源として使いました。本記事ではNucleoにはFFTを実装しませんでしたが,Mbedに移植してみても良いかと思います。

*1:プログラミングにおけるfunctionを「関数」と呼ぶのって,やっぱり変ですよね…。引数も戻り値も数値で,計算以外の処理(画面の表示などの入出力)をしないならば納得ですが…。慣れとは怖いもので,違和感を感じなくなっていました。

*2:動画1,図1ではNucleoで作った信号の周波数や振幅をきちんと制御していませんので,機会を見て作り直したいと考えています。

続きを読む