CO2センサを検証

SensirionがPhotoacoustic sensor technology PASens®を使用したCO2センサを発売しています。日本語訳では「光音響センシング」。
NDIR(Non-Dispersive InfraRed(非分散型赤外線吸収法))と全く違う方式のセンサとその性能に興味を持ちました。

PASensはSensirionのホームページに以下のような説明があります。

光音響検出原理
SCD4x製品ラインは、光音響測定原理に基づいており、センサーの性能を損なうことなく光学測定セルを大幅に小型化できます。狭帯域光が測定セルに照射され、その光をCO2分子が吸収します。その結果、分子の並進運動エネルギーが増加し、それに応じて光学セル内の圧力も増加します。光源を変調することで、光音響信号と呼ばれる光学セル内の圧力に周期的な変化が生じ、これをマイクロフォンで測定します。

https://sensirion.com/jp/products/technology/

PASensのSCD40、SCD41とNDIR方式の4メーカー5種類のセンサを検証してみました。

検証したセンサは以下の5種類です。

メーカーSensirionSensirionSensirionAmphenol
Telaire
SenseairWinsen
型式SCD40SCD41SCD30T6703S8MH-Z19E
方式PASensPASensNDIRNDIRNDIRNDIR
参考価格
¥4,300
mouser
¥5,380
mouser
¥9,021
mouser
¥8,286
DigiKey
参考価格
AliExpress
$18$24$25$26$25$13

検証結果

絶対的な基準測定器があるわけではないので相対評価になりますが、
Winsen の MH-Z19E 以外はほぼ誤差の範囲の様な測定結果となりました(各々の測定値から5%以内程度)。
Winsen の MH-Z19E は過大な計測結果(15%ほど)となっています。

今回、検証の動機であった、PASens®を使用したCO2センサはどうか?
については、NDIR方式と特に差を感じない測定性能を持っているという結果となりました。

SCD4xはNDIR方式に比べて体積が小さく、また、価格面でも安価なグループに入り、性能も良い、と、非常に競争力のあるセンサでした。

カテゴリー: Micon関連, 海外通販 | コメントする

ESP32でWindowsの「arp -a」の様な事をしたい

ESP32でWindowsの「arp -a」の様な事をしたいと思い、調べた結果を書いておきます。

結論としては、ESP32ではwindowsの「arp -a」の様な事は出来ません。

ESP32はTCP/IPのプロトコルスタックとして、lwIP(Lightweight IP stack)を使用しています。このlwIPは自分が通信に使ったmac addressと静的に設定したmac addressしか保持しません。
また、Arduino+ESP32の初期設定では、保持されるエントリーは最大10です。
10台以上の機器が接続されるネットワークでは全ては保持されるエントリーに残りません。

promiscuous mode
で、
arp Who has
を取得するか

アドレス範囲にping等で通信を行い
etharp_get_entry()
でエントリーのmac addressを拾う…という方法

などをするしかなさそうです。

カテゴリー: ESP32 | コメントする

WordPressをバージョンアップ (Version6.1へ)

WordPressをWordPress 6.1にバージョンアップしました。

カテゴリー: WordPress, このサイト全般 | コメントする

M5Stamp C3+Arduinoで書き込みができない

M5Stamp C3+Arduinoで久しぶりにプログラムを作成し書き込みをしようとしたところ

Property 'upload.tool.serial' is undefined

とエラーが出て書き込みができません。

Arduinoをアンイストールしたりといろいろを試みましたが、現時点解決方法が見つかりませんでした。
Arduino 1.8.19、2..0.0共に同じ現象です。

他のマイコンでこのエラーが出たことがあること、
arduino-cli.exe が関係していそうなこと、
まではわかりました。

使用しているPC環境固有なのかどうかわかりませんが、記録として残しておきます。

ATOM Liteでは問題は起きていません。

カテゴリー: Arduino関連, Micon関連 | コメントする

Arduino ide 2.0.0 リリース

Arduino ide 2.0.0 の正式版がリリースされました。

モダンな画面になり、使いやすくなりました。

Arduino ide 2.0.0 はVisual Studio Codeが元にTypeScriptで実装された、フリーでオープンソースの統合開発環境フレームワークのEclipse Theiaを用いて開発されているとのことです。

どことなく、Visual Studio Codeの香りが残っている感じです。

Arduino ide 1.x はProcessingをベースとしたJavaアプリケーションでした。

カテゴリー: Android | コメントする

Xiaomi 120W 充電器 MDY-13-EG

Xiaomi 120W 充電器 MDY-13-EG。
この充電器はUSB Type-A ポートを1つ持ち、専用のケーブルでスマホとはUSB Type-C ポートで接続します。

この充電器は本体に刻印で
出力: 5V3A、9V3A、11V6A、20V6A
と表示されています。

Xiaomiの対応スマートフォンに接続すると120W充電できますが、Quick Charge 2.0、Quick Charge 3.0、USB PD 3.0にも対応します。
USB PDでは5V 3A、9V 3A、15V 3A、20V 3.25A 出力となり、最大でも65Wです。

このMDY-13-EGはXiaomiスマートフォン専用の充電器ではなく、汎用的なQuick Charge 2.0、Quick Charge 3.0、USB PD 3.0対応充電器として使用できます。

カテゴリー: その他 | コメントする

ATOM ECHOでESP8266Audio

ブログ等でESP8266Audioの記事を書かれている方は、普通に開発できている様ですが、試したところ簡単にはうまくいかない状況だったので、共有のためにメモとしてこちらに書いておきます。

コンパイル出来ない組み合わせ

  • Arduino 1.8.19
  • ボード : M5Stack 2.0.3
  • ESP8266Audio 1.9.7

この組み合わせでは、コンパイルが終わらなくなってしまいます。
30分ほど放置しましたがCPU負荷がかかったまま完了しませんでした。

コンパイルが出来る組み合わせ

  • Arduino IDE 2.0.0-rc8
  • ボード : M5Stack 2.0.3
  • ESP8266Audio 1.9.7

この組み合わせでは、コンパイルが完了出来ます。

コンパイルには時間がかかり、5分ほどです。
いろいろと試すための再コンパイルに時間がかかるので、この組み合わせでの開発は進みが遅くなります。

カテゴリー: Arduino関連, ESP32 | コメントする

M5Stamp C3+ArduinoのWi-Fi接続不具合3

同じコードでも、バージョン2.0.1で動いていて、バージョン2.0.2以降でコンパイルした場合に接続できなくなる現象を自宅環境では問題解決する事ができましたのでこちらに書いておきます。

以下、Core debug levelをveboseでコンパイルした場合のログです。

[   124][V][WiFiGeneric.cpp:283] _arduino_event_cb(): STA Started
[   124][D][WiFiGeneric.cpp:852] _eventCallback(): Arduino Event: 2 - STA_START
[   245][V][WiFiGeneric.cpp:96] set_esp_interface_ip(): Configuring Station static IP: 0.0.0.0, MASK: 0.0.0.0, GW: 0.0.0.0
[  2297][V][WiFiGeneric.cpp:300] _arduino_event_cb(): STA Disconnected: SSID: xxxxx, BSSID: 00:00:00:00:00:00, Reason: 201
[  2298][D][WiFiGeneric.cpp:852] _eventCallback(): Arduino Event: 5 - STA_DISCONNECTED
[  2306][W][WiFiGeneric.cpp:873] _eventCallback(): Reason: 201 - NO_AP_FOUND
[  2313][D][WiFiGeneric.cpp:889] _eventCallback(): WiFi Reconnect Running
[  2374][V][WiFiGeneric.cpp:96] set_esp_interface_ip(): Configuring Station static IP: 0.0.0.0, MASK: 0.0.0.0, GW: 0.0.0.0
[  4425][V][WiFiGeneric.cpp:300] _arduino_event_cb(): STA Disconnected: SSID: xxxxx, BSSID: 00:00:00:00:00:00, Reason: 201
[  4426][D][WiFiGeneric.cpp:852] _eventCallback(): Arduino Event: 5 - STA_DISCONNECTED
[  4434][W][WiFiGeneric.cpp:873] _eventCallback(): Reason: 201 - NO_AP_FOUND
[  4441][D][WiFiGeneric.cpp:898] _eventCallback(): WiFi AutoReconnect Running
[  4449][V][WiFiGeneric.cpp:96] set_esp_interface_ip(): Configuring Station static IP: 0.0.0.0, MASK: 0.0.0.0, GW: 0.0.0.0

「Reason: 201 – NO_AP_FOUND」が返ってきて接続できません。
延々と繰り返していきます。

対処方法は

  WiFi.mode(WIFI_STA);

の前に

  WiFi.setMinSecurity(WIFI_AUTH_WPA_PSK);

を入れることにより無線LANの暗号化方式のレベルを下げる指定ができ、この方法でバージョン2.0.3でも接続できる様になりました。
MinSecurityのデフォルト値がバージョン2.0.2以降、WIFI_AUTH_WPA_PSKからWIFI_AUTH_WPA2_PSKに変更になった様です。

[    37][D][WiFiGeneric.cpp:852] _eventCallback(): Arduino Event: 0 - WIFI_READY
[   123][V][WiFiGeneric.cpp:283] _arduino_event_cb(): STA Started
[   124][D][WiFiGeneric.cpp:852] _eventCallback(): Arduino Event: 2 - STA_START
[   225][V][WiFiGeneric.cpp:96] set_esp_interface_ip(): Configuring Station static IP: 0.0.0.0, MASK: 0.0.0.0, GW: 0.0.0.0
[   432][V][WiFiGeneric.cpp:295] _arduino_event_cb(): STA Connected: SSID: xxxxx, BSSID: 08:10:86:15:f4:de, Channel: 1, Auth: PSK
[   434][D][WiFiGeneric.cpp:852] _eventCallback(): Arduino Event: 4 - STA_CONNECTED
[   999][V][WiFiGeneric.cpp:305] _arduino_event_cb(): STA Got New IP:192.168.1.2
[   999][D][WiFiGeneric.cpp:852] _eventCallback(): Arduino Event: 7 - STA_GOT_IP
[  1002][D][WiFiGeneric.cpp:914] _eventCallback(): STA IP: 192.168.1.2, MASK: 255.255.255.0, GW: 192.168.1.1

自宅環境の無線LANアクセスポイントはWPA/WPA2対応の機器、設定ですが、なぜかデフォルトの「WPA_WPA2_PSK」設定では接続が出来ませんでした。

WiFi.setMinSecurity() で指定できる値は、「esp_wifi_types.h」にあります。

typedef enum {
    WIFI_AUTH_OPEN = 0,         /**< authenticate mode : open */
    WIFI_AUTH_WEP,              /**< authenticate mode : WEP */
    WIFI_AUTH_WPA_PSK,          /**< authenticate mode : WPA_PSK */
    WIFI_AUTH_WPA2_PSK,         /**< authenticate mode : WPA2_PSK */
    WIFI_AUTH_WPA_WPA2_PSK,     /**< authenticate mode : WPA_WPA2_PSK */
    WIFI_AUTH_WPA2_ENTERPRISE,  /**< authenticate mode : WPA2_ENTERPRISE */
    WIFI_AUTH_WPA3_PSK,         /**< authenticate mode : WPA3_PSK */
    WIFI_AUTH_WPA2_WPA3_PSK,    /**< authenticate mode : WPA2_WPA3_PSK */
    WIFI_AUTH_WAPI_PSK,         /**< authenticate mode : WAPI_PSK */
    WIFI_AUTH_MAX
} wifi_auth_mode_t;

暗号化種類の中にWAPI_PSK (WLAN Authentication and Privacy Infrastructure (WAPI))もあります。興味深いですね。

カテゴリー: Arduino関連, ESP32 | コメントする

WordPressをバージョンアップ (Version6.0へ)

WordPressをWordPress 6.0にバージョンアップしました。

カテゴリー: WordPress, このサイト全般 | コメントする

ESP32+Arduino+HttpsClient

ESP32+Arduino+HttpsClientで状況がよくわからずハマった事象を書いておきます。

WiFiClientSecure *client = new WiFiClientSecure;
if(client) {
    client -> setCACert(rootCACertificate);
    {
        // Add a scoping block for HTTPClient https to make sure it is destroyed before WiFiClientSecure *client is 
        HTTPClient https;
        Serial.print("[HTTPS] begin...\n");
        if (https.begin(*client, "https://jigsaw.w3.org/HTTP/connection.html")) {  // HTTPS
            Serial.print("[HTTPS] GET...\n");
            // start connection and send HTTP header
            int httpCode = https.GET();
            // httpCode will be negative on error
            if (httpCode > 0) {
                // HTTP header has been send and Server response header has been handled
                Serial.printf("[HTTPS] GET... code: %d\n", httpCode);
                // file found at server
                if (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY) {
                    String payload = https.getString();
                    Serial.println(payload);
                }
            } 
            else {
                Serial.printf("[HTTPS] GET... failed, error: %s\n", https.errorToString(httpCode).c_str());
            }

            https.end();
        } 
        else {
            Serial.printf("[HTTPS] Unable to connect\n");
        }
    }
    delete client;
} 
else {
    Serial.println("Unable to create client");
}

元コードはこちら

こんなコードでhttps通信を行おうとしましたが、その時にエラーとして
「[HTTPS] GET… failed, error: connection refused」
が出ました。
root Certificateに問題があるのかと思いましたが、他のスケッチでは動いていたので原因となるのはおかしいと思い、Core debug levelをveboseで実行してみると、原因がわかりました。
エラーメッセージは「connection refused」ですが、ヒープメモリ不足でこのエラーになっていました。

接続先やroot Certificateでも差があると思いますが、https通信を行う直前で

ESP.getFreeHeap()

で、
約60,000ではエラー
約90,000では正常
でした。

HttpsClientはヒープメモリを十分に確保して使いましょう。

カテゴリー: Arduino関連, ESP32 | コメントする