2022年9月30日金曜日

換気

会社で環境測定です。

「在宅ワーク、なにそれ?」「換気?ああ、アナウンスが流れてるね」状態で人の集まるフロアーです。ひょっとするとセンサーが反応して音が鳴るかも?と思いながら計測してみました。閾値は昨夜と同じ TVOC 100ppb 。

室外でキャリブレーションを行い、 SGP30 を持って入った次の瞬間に鳴り出しました。あ、これは失敗。薬品庫のある部屋でした。感度が良い。

気を取り直し、再測定。
鳴らないですね。室内はタバコ臭よりマシでした。
と思った数分後に鳴り出しました。うーん。タバコと同じレベルか。数字にするとキツイ。オジサンたちが集まって何を出しているのか。うーんキツイ。

換気、大事です。

2022年9月29日木曜日

Ambient の制限

Ambient からデータをダウンロードしてみると、4~6秒毎の蓄積、最小時間単位が秒になっています。1Hzで発信しているので、Wi-Fiかサーバー側の問題ですね。次はMEMSで振動を計測しようと考えていましたが、これではダメかな。

バッテリー電圧は、Ambient側では小数点以下2桁まで保存されていました。LCD表示は整数です。これは CO2濃度と同様に drawNumber を使用していたのが原因。

M5.Lcd.drawNumber(vbat, 120, 110, 4);

下2桁まで表示するにするには、カーソルを合わせてから print。

M5.Lcd.setCursor(96, 110, 4);
M5.Lcd.print(vbat);

drawNumber のx座標は中央配置用の指定になっています。setCursorは左端指定でした。


テストをクリアする最小限の実装が終わったので、いよいよ実験開始。
風上の窓をほんの少し開けて、その隙間風を計測できるよう、窓の鍵にUSBケーブルをかけてセンサーをぶら下げておきました。USBケーブルは数年前に100均で購入していたモバイルバッテリーにつないでおきます。

22:46 にスタートして流していると、1時前に反応がありました。外から入ってきたタバコでした。匂うよりも先にM5StickC-Plus の発する音と光で気づきました。音が小さいので昼間に別の部屋にいると気づかないかも。これは要改善点です。

※窓全開で換気中です。

窓際に立つと、外から入ってきたタバコの匂いがします。が、部屋全体には広がっていません。屋内にセンサーを設置する関係上、これ以上は早く感知できないでしょうね。窓を全開にしている流入量が多くてと使い物にならないか?流速が小さくなって同程度?
ま、いきなりタバコに反応するということが確認できただけでも収穫です。いったい、タバコには何が入っているのでしょうね。

翌朝、バッテリーが切れてM5は停止していました。
Ambient側の記録を見ると 4:30 までのデータが保存されていました。バッテリー電圧は降下していましたが、3.7V でしたのでまだ動くはず。おかしいなあと思い確認してみると、データ数制限のようでした。

https://ambidata.io/refs/spec/

  • 送信から次の送信まではチャネルごとに最低5秒空ける必要があります。それより短い間隔で送信したものは無視されます。
  • 1チャネルあたり1日3,000件までデーターを登録できます。平均すると28.8秒に1回のペースです。
  • 件数のカウントは0時に0クリアされます。
  • チャネルデーターを削除しても1日の登録件数のカウントは0クリアされません。

0時以降、3363件のデータが保存されていました。4~6秒毎も同様に制限に引っかかっていたのですね。これ、有料版だと50Hzサンプリングの記録をミリ秒単位で保存できるのでしょうか?
https://ambidata.io/samples/vibration/vibration/

電圧降下開始が4:08でしたので、そこから40分稼働するとすると、モバイルバッテリー追加で6時間稼働する事がわかりました。

初回から良い結果を得られたのですが、閾値を低くしていたので誤検知も多くなっている状態かと思われます。Ambient の限界?もわかりました。代替えクラウドを探してみましょうか。

あとは、RTCを使ったセンサー側の時刻付与、観測時のディスプレーoff(Aボタン押下で切り替え)、Bボタン押下で音と点滅の停止、余計な電力消費のカット、マルチモーダル化(音の取り込み)、そして閾値の調整(誤検知軽減)ですかね。コツコツ実装してまいりましょう。

M5.begin()

続きです。

まず、ソースを確認。

https://github.com/m5stack/M5StickC-Plus/blob/master/src/M5StickCPlus.cpp
void M5StickCPlus::begin(bool LCDEnable, bool PowerEnable, bool SerialEnable) {
    //! UART
    if (SerialEnable) {
        Serial.begin(115200);//省略
}
    // Power
    if (PowerEnable) {
        Axp.begin();
    }
    // LCD INIT
    if (LCDEnable) {
        Lcd.begin();
    }

https://github.com/m5stack/M5StickC-Plus/blob/master/src/AXP192.cpp
void AXP192::begin(void) {
    // Set LDO2 & LDO3(TFT_LED & TFT) 3.0V

今は M5.begin(true,false,false)。AXP が begin されないと、各種電源関係が初期化されません。これでしょう。そもそも、false はどのようなケースで使用するのでしょうか?

M5.begin() = デフォ true*3 だと、電源を落とせます。USBケーブルでPCや電源につなぐと、自動で起動します。そういう仕様なのでしょう。
M5.begin(true,true,false)でも同様です。

調べてみると、M5.begin()の引数 はM5シリーズ内で異なるようです。純正のサンプルコードが誤っているのでしょうか?ま、意図したように電源が動作するようになったので解決です。

さらに続く。


M5StickC Plus + SGP30 + Ambient

続きです。
Ambient を使用するコードを転送。

書き込めましたが、Wi-Fiがダメ。
アクセス先の 5GHzを 2.4GHz に切り替えるとつながりました。M5Stick 側で 5GHz を指定する方法はないのでしょうか?後回しにして、進めます。

サンプルコードを足しただけですので、動きました。TVOC, eCO2, 電圧が1秒毎に更新されます。バッテリー電圧の表示が一桁なのは御愛嬌。この修正も後回し。

Ambient を確認。
測定できています。グラフが書かれています。時間が経つと更新されます。素晴らしい。
この部分はPython並みにライブラリ依存ですので、間違いようがないのでしょう。

そのまま測定を継続すると、開始後40分で電圧が急降下し始め、電源が切れました。ほぼデフォで1時間持ちませんでした。残念。ま、粗々の流れは確認できましたので、良しとしましょう。

安心して再起動すると、LCDが暗いまま。
あれ?転送中の問題じゃなかった?

つづく。

2022年9月28日水曜日

M5StickC Plus + SGP30

今回購入したモノ

※イヤホンは購入していません。サイズ比較用です。小さい!

1.マイクロボード: M5StickC Plus
https://shop.m5stack.com/collections/m5-controllers/products/m5stickc-plus-esp32-pico-mini-iot-development-kit
このサイズで3軸加速度センサー、ブザー、マイク、Wi-Fi、LCDなどの欲しい機能が一通り実装されています。そして、この価格。さすが中国発。まさかの手作り?
https://wirelesswire.jp/2019/08/71960/

2.測定モジュール: TVOC/eCO2 Gas Sensor Unit (SGP30)
https://shop.m5stack.com/products/tvoc-eco2-gas-unit-sgp30
TVOCセンサーはいくつかありますが、SGP30 の感度が良さそうでした。https://www.jaredwolff.com/finding-the-best-tvoc-sensor-ccs811-vs-bme680-vs-sgp30/
価格が安く、ケーブル付きで繋ぐだけ。電圧調整も不要な M5 純正ユニットを選択。ケースに入っている分だけ反応は弱くなりそうですが。これらの組み合わせはネットでもいくつか紹介されています。
eCO2 への換算式は載っていません。テストがエタノールと水素ですので、測定された H2 と TVOC=エタノールとみなして C2H6O+3O2→3H2O+2CO2 から推定しているのかもしれません。おまけみたいなモノと捉えておきましょう。
https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/docs/datasheet/unit/Sensirion_Gas_Sensors_SGP30_Datasheet.pdf

電源を入れるとFactoryTest が 始まるようです。ボタンを押すと、ジャイロ?による立方体の表示や音声のFFTが切り替わります。
用意していたHellowWorldの表示コード、加速度の表示コードでも正常動作を確認できました。
初期不良はないようです。一安心。

SGP30を使用するコードをコンパイルし、転送。
動きました。SGP30も大丈夫みたいですね。

次に Ambient を使用するコードを転送。
と思いきや、転送途中でラップトップの電源が切れました。M5はどうなった?
電源をoff にした後、起動しなくなりました。ありゃ。

異なるラップトップにつなぐと認識します。ディスプレーがoffってるだけでしょうか?

再度、FactoryTestを転送すると、動きました。
USBケーブルを外して、もう一度電源 off, on。大丈夫です。

危なかった。


2022年9月27日火曜日

Arduino IDE その2

Arduino IDE で SGP30 のライブラリを検索すると、3つ引っかかりました。M5社のサンプルコードでは"Adafruit_SGP30.h"が使用されていますので、これをインストール。https://github.com/m5stack/M5StickC-Plus/blob/master/examples/Unit/TVOC_SGP30/TVOC_SGP30.ino

サンプルコードをコンパイルできるか?
通りました。問題ないようです。

次は Wifi に繋いで、Ambientにデータをアップする部分。
図書に記載してあるので、常套手段なのでしょう。Ambient さんのサンプルコードを利用します。https://github.com/AmbientDataInc/Ambient_ESP8266_lib/blob/master/examples/M5Stack_ESP32/Ambient_BME680/Ambient_BME680.ino
Arudino IDE では、Ambient_ESP32_ESP8266_lib をインストール。これでインクルードできました。

コンパイルできるか?
ダメ。wifiで引っかかります。
原因は私の記載ミス。WiFi.h を Wifi.h と記載していたので、どのライブラリを入れても認識してくれしなかっただけ。何も追加する必要はなく、素直にコピペしておけば最初から通っていました。これを修正すれば、通りました。

ひとまず、環境構築は終了。後追いだとサンプルコードが豊富にあるので楽ですね。

2022年9月24日土曜日

Arduino IDE

Arduino の開発環境です。
Arduino IDE
公式:https://docs.m5stack.com/en/quick_start/m5stickc_plus/arduino

まずは driver。これはリンクから exe 版を利用しました。

次に Arduino IDE。
インストール後に追加のURLを設定すると、依存関係を含むボード特有のライブラリを引っ張ってきてくれます。この点が支持される理由でしょう。

ボードマネージャーからボードを指定、必要なファイルをインストール。

ライブラリマネージャーも同様。GitHub から検索しているようです。引っかかったので、install を押しました。が、途中でエラー発生。

Error: 13 INTERNAL: Library install failed: moving extracted archive to destination

作成されたフォルダが読み取り専用になっていたため解除。IDE 再起動後にもう一度インストールで成功。https://github.com/arduino/arduino-cli/issues/723

この IDE では、sketchという単位でコードを管理するようです。inoファイルができていましたが、c++もインクルードされています。

'Hellow World' を sketch として保存、再読み込み、ボードを指定して検証・コンパイル。OKです。

つづく。