人感センサーHi-Link LD2410をHomeKitで使う

DIYする
FMCW Radar Sensor Hi-Link LD2410

24GHzのFMCW(周波数変調連続波)レーダーを使った人検出センサーを試してみました。AliExpressで送料別393円の部品です。詳細な感度調整も可能ですが、工場出荷時状態で適切に動作するので、電源を接続するだけで、人感知を反映した1ビットOn/Off信号が得られます。ESP32経由でHomeKitに接続したところ、応答が速く、確実に人を検出してくれました。

Raspberry Pi経由でHomeKit接続した記事は、こちらをご覧ください。

人感センサーLD2410をRaspberry Piに接続する
前回の記事で紹介した人感センサーLD2410を、Raspberry Pi 4 (RPi4) のGPIOピンに接続しました。GPIOピン状態をHomeKit人感センサーに橋渡しするHomebridgeプラグインを使用して、HomeKitから使...

Hi-Link LD2410

AliExpressのこちらのページで、Hi-LinkというメーカのLD2410という人感検知センサー部品を売ってます。

価格は、本体価格393円(送料549円)でした。24GHzの電波を使用したレーダーセンサーです。過去に、AqaraやTuyaのレーダーセンサーを使ってきました。Aqaraの人検出センサーFP1は、非常に安定して動作しました。でも価格は6,000円以上します。

ミリ波を使った人感センサーAqara FP1をHomeKitから使う
Aqaraのミリ波を使った人感センサをHomeKitから使いました。Zigbeeで通信するので、Zigbee2MQTTとHomebridgeを使用します。一般的なPIR(パッシブ赤外線)人感センサーと比較して、安定していて非常に使いやすいで...

一方、Tuyaは3,000円くらいと安いですが、人が静止していると検出されなくなるケースがたまにありました。確実に動作させるためには、人の方向を向くよう調整する必要があります。

Tuyaのミリ波人感センサー ZY-M100
Tuyaのミリ波センサーZY-M100を使ってみました。Aqara FP1の半額以下で買いやすいです。コスパが良くて十分に使えますが性能としてはFP1の方が良いです。 ZY-M100 TuyaのZY-M100は、AliExpressで300...

いずれも、安価なPIR(パッシブ赤外線)人感センサーとは比較にならないほど、確実に人の存在を検知してくれます。人が静止していても確実に検出します。人が居る時だけ照明をOnにする用途に、理想的なセンサーでした。

今回見つけたLD2410は、これらのセンサー製品の中に入っているレーダー部品に近いものが、バラ売りされているのだと思います。同じ性能がこの価格で得られるなら、使える場面が広がると期待しました。

FMCWレーダの仕組み

このセンサの使い方について、Youtubeに解説がありました。英語ですが、自動翻訳字幕で大体わかります。

このビデオで、FMCW(周波数変調連続波)レーダの仕組みがわかりやすく説明されています。簡単な日本語の説明はこちらにもあります。

FMCWレーダーは、時間と共に周波数が変化する電波を発信します(下の図で、青色の線)。これが静止した対象物に当たって、反射が戻ってくるとします(下の図の赤色の線)。反射波は遅れて戻ってくるので、送出中の電波と干渉して、差分の周波数のビートが発生します。ビート周波数は反射物体までの距離に比例するので、周波数分布から物体までの距離分布が判明します。

🟦青い線が送出電波周波数、🟥赤い線が反射して戻ってきた電波周波数

次に対象物が動いている場合はどうなるでしょう。対象物がレーダーに向かって動いている場合、反射電波の周波数はドップラー効果により上昇します。その結果、レーダー周波数が上昇する過程ではビート周波数が下がり、下降過程ではビート周波数が高くなります。

反射物体がレーダーに向かって移動している場合、🟥赤い線の反射波周波数が上昇する

逆に、対象物がレーダーから遠ざかりつつ動いている場合、反射電波の周波数はドップラー効果により降下します。その結果、レーダー周波数が上昇する過程ではビート周波数が高くなり、下降過程ではビート周波数が低くなります。

反射物体がレーダーから遠ざかっている場合、🟥赤い線の反射波周波数が低下する

このビート周波数の差異を利用して、動体の移動方向と移動速度を検出をします。例えば、周波数上昇・下降区分で、それぞれビート周波数分布を求めて、周波数をシフトしながら相関をとることで、物体の速度分布が得られます。

開封する

今回購入したものは、LD2410本体と、変換ケーブルのセットです。本体価格は393円ですが、ケーブル付きは485円です。これに送料549円がかかるので、合計1,034円です。本体にはピンヘッダがついているのですが、間隔が1.25mmと狭いです。なのでハンダ付けも大変なので、変換ケーブルを買いました。

冒頭の写真にもあるように、プリント基板の表面にはアンテナパターンが作られてます。その中間に、本体チップがあります。S3KM1110と書いてあります。これが24GHzのFMCWレーダのチップです。

こちらにこのチップの技術資料があります。

产品中心 | S3KM111L (1T1R | K-band Smart mmWave Sensors )
矽典微致力于实现射频技术的智能化,专注于研发高性能无线传感器技术相关芯片,可用于毫米波雷达传感器,机器人避障,人体传感、毫米波芯片,地磁传感器,下一代移动通信,卫星通信等无线领域,欢迎咨询。

基板の裏側には、マイククロコンピュータチップがあります。

Youtubeの動画によると、マイコンチップの仕様は不明だったようです。このほか、裏側には、5Vから3.3Vに変換する電源レギュレータもあります。供給電圧は、5V~12Vまで対応しているようです。LD2410は、Bluetooth (BLE) にも対応しています。どこかにBLE関係チップがあるか、もしくはこのマイコンチップがBLEも担当しているはずです。

ESPHomeでの利用

冒頭の動画でも紹介されていますが、ESPHomeでも実験的にサポートされているようです。後述する詳細設定も、ESPHomeの設定から行えるようです。HomeAssistantを使用している人は、こちらも参考にされると良いと思います。

LD2410 Sensor
Instructions for setting up LD2410 sensors.

以下の動画では、類似のセンサーLD1125HをESPHomeで使用してます。シリアル接続して、感度や応答時間などをHomeAssistantから調整できるようです。おそらくLD2410も、同じように使用できると思います。

HomeAssistantユーザーがちょっとだけ羨ましいですが、この記事では頑張ってHomebridgeでなんとかしたいと思います。

動作確認

動かすのはとても簡単です。VCC(電源)とGNDを接続すれば、人感知の結果に従って、OUTの端子がHigh/Lowになります。人感知されればHigh, 感知されなければLowです。VCCは5V~12Vですが、OUTの端子は3.3V出力なので、ESP32やRaspberry Piなどに直結できます。

動作確認のために、VCCに5V, GNDに0Vを接続しました。また、OUTには220Ω抵抗を介してLEDを取り付け、GNDに接続しました。

LEDが光ってますが、これは人を検知しているからです。このままの状態にして、部屋から出てそっと覗き込んでみたら、LEDが消えてました。部屋に入り近づくとすぐに点灯します。ということで、応答良く、確実に人を検知しているようです。

シリアル経由で詳細設定

今回は使用しませんが、シリアル通信用のピンが2本あります。UART Rx, Txです。

こちらに英語のマニュアルがあります。シリアル通信のプロトコルも説明されてます。

HLK-LD2410/LD2410B - Google ドライブ

これに従ってデータを読み書きすれば、感度設定などを変更し、検出状態をモニターすることが可能です。

シリアル端子をUSB-シリアル変換チップに接続して、PCとUSB接続するためのアダプターが、上記のAliExpressのページで売られてます。本体とアダプタのセットで857円です。

これを購入し、Windowsマシンと接続し、こちらのソフトウェアをダウンロードすれば、WindowからGUIを使って検知パラメータを設定して、検出状況を視覚的にモニターできるようです。前述のYoutube動画でその様子を見ることができます。

BLE経由で詳細設定

Windowsからの詳細設定は、Youtubeの動画を見ていただくことにして、この記事では、Androidスマホからの設定を試しました。LD2410には、Bluetooth LE (BLE) も搭載されていて、スマホアプリでも詳細設定と動作確認が可能です。

アプリをインストールする

AliExpressの販売ページによると、スマホアプリは、Android用とiPhone用に提供していると書いてありましたが、iPhoneアプリは見つかりませんでした。Androidアプリは以下にあります。

蒲公英
HLKRadarTool 1.1.15(21)

このQRコードをAndroidスマホのカメラで写して、リンク先を開くと、アプリをダウンロードできます。Androidは不慣れな上に、中国語の広告がどんどん出てきて苦労しましたが、なんとかダウンロードできました。

ダウンロードに成功すると、Android画面にこんなアプリができていました。

センサーをペアリングする

起動すると、BLE経由でLD2410が検出されていました。アプリの表示は中国語ですが、以下のスクリーンショットでは、文字認識してGoogle翻訳した日本語を書き加えておきました。

動作状態概要の表示

検出されたLD2410の項目をタップすると、動作状態が表示されます。ここでは、52cm先に静止目標が検出されていると表示されています。

3個のグラフのうち、1番目と2番目はそれぞれ、動体と静止体の感度設定です。縦軸は、人検知の閾値となる数値です。横軸の0から8までの数字は、これもセンサーからの距離で分割した領域番号です。センサーから0cmの領域が0、75cmまでの領域が1で、75cmごとに番号が増え、一番遠い場所が8です。

この感度の数値は、後述する詳細設定で設定できます。現在は、工場出荷時状態の値が設定されてます。この感度数値よりも強い反射があった場合に、人が居ると判定します。

3番目のグラフは、縦軸が物体までの距離で、横軸が時間です。センサに手を当てると、距離が0になる様子を確認できました。

動作状態詳細の表示

右上の「工程模式」というスイッチをOnにすると、エンジニアリングモードになって、詳しい表示になります。ゾーン毎の動体・静止体感度グラフには、実際に検出された値が、動的に重ねて表示されるようになります。設定感度を超えた強度が検出されると、人が居ると判断します。下のスクリーンショットに見えている1番目のグラフは、静止目標の反射の様子です。紫色の線が、設定感度で、青色の線が反射波のエネルギーです。領域2、3で、設定感度を超えているので、静止物体が存在すると判定されています。

「工程模式」を選ぶと、測定結果と光感度が表示される

このモードでは、光感度グラフも表示されます。どうも光センサも内蔵されているようです。部屋の照明をOn/Offすると少し変化します。

モジュールの再起動も行えます。再起動に伴い、Bluetoothの接続が解除されます。

詳細な設定をする

画面右上の、「更多(更に多く)」のボタンをタップすると、詳細設定が可能になります。

前述の、75cm単位に分けた0から8までの領域

の、それぞれに対する、動体・静止体検出の閾値(〜感度)を、ここで設定します。また、照度との連携もOn/Offできるようです。工場出荷時状態に復帰することもできます。

以上のように、シリアル接続・Bluetooth接続により、Windows PCやAndroidスマホから細かい設定が可能です。ただし、工場出荷時設定で問題なく動きますので、大抵の場合、このような詳細設定を行う必要はないと思います。電源接続するだけで設定無しで使用可能です。

ESP32に接続する

LD2410をESP32に接続しました。といっても、LD2410のOUTピンを、ESP32のデジタル入力ピン(ここではGPIO-13を使いました)に直結しただけです。また5VとGNDも接続しました。

ブレッドボードの上で接続して、LD2410はブレッドボードの端に粘着剤(ひっつき虫)で仮固定しました。

人検知をMQTTパブリッシュ

人の検知をMQTTブローカーにパブリッシュするプログラムを書きました。MQTTについては以下をご覧ください。

MQTTブローカーMosquittoを設置する
今回はMQTTブローカーをインストールします。MQTTがあると、スイッチ、センサ、リレー、サーボモータなどを接続したArduinoのようなコンピュータを、ネットワーク越しにIP接続したい時にとても便利です。また、MQTTを使うスマートホーム...

以下のプログラムでは、MQTTサーバが192.168.xxx.xxx番地で動作していると仮定してます。WiFiのSSID/パスワード、MQTTのユーザ・パスワードは必要に応じて変更・追加してください。

//MQTT Occupancy Sensor Hi-Link HLK LD2410 using ESP32 dev. board.
#include <EspMQTTClient.h>

EspMQTTClient *client;

//input & output pins
const int OCCUPANCY=13; //Occupancy presense sensor LD2410
const int MONITOR=2; //On board LED (Blue) on the dev kit

//WiFi
const char SSID[] = "XXXXXXXX"; //WiFi SSID
const char PASS[] = "xxxxxxxx"; //WiFi password
//MQTT
char CLIENTID[] = "ESP32_xx:xx:xx:xx:xx:xx"; //MAC address is set in setup()
//for example, this will be set to "ESP32_84:CC:A8:7A:5F:44"
const char  MQTTADD[] = "192.168.xxx.xxx"; //Broker IP address
const short MQTTPORT = 1883; //Broker port
const char  MQTTUSER[] = "";//Can be omitted if not needed
const char  MQTTPASS[] = "";//Can be omitted if not needed
const char  PUBTOPIC[] = "mqttthing/LD2410/getOccupancyDetected"; //true or false
const char  PUBDEBUG[] = "mqttthing/LD2410/debug"; //for debug message

int currentOccState; //current state of occupancy. 0 or 1.
int counter; //counter for the main loop

void setup() {
  //Digital I/O
  pinMode(MONITOR, OUTPUT);
  pinMode(OCCUPANCY, INPUT);
  digitalWrite(MONITOR, LOW);  //off the Blue LED
  //starting Serial
  Serial.begin(115200);        //  ESP standard speed 115200
  while (!Serial);            //  wait for serial port to connect.
  Serial.println("ESP32 Occupancy sensor started.");
  //making a unique CLIENTID from MAC address
  String wifiMACString = WiFi.macAddress(); //WiFi MAC address
  wifiMACString.toCharArray(&CLIENTID[6], 18, 0); //"ESP32_xx:xx:xx:xx:xx:xx"
  Serial.print("SSID: ");Serial.println(SSID);
  Serial.print("MQTT broker address: ");Serial.println(MQTTADD);
  Serial.print("MQTT CLIENTID: ");Serial.println(CLIENTID);
  //starting MQTT
  client = new EspMQTTClient(SSID,PASS,MQTTADD,MQTTUSER,MQTTPASS,CLIENTID,MQTTPORT); 
}

void onConnectionEstablished() {
  Serial.println("MQTT connection established.");
  delay(10); //10ms delay
  client->publish(PUBDEBUG, "ESP32 Occupancy sensor is ready.");
  currentOccState= -999; //force to report first status
}

void publishOccupancy(int sw){
  if(sw==HIGH) {
    client->publish(PUBTOPIC, "true");
    digitalWrite(MONITOR, HIGH);  //turn on the Blue LED
  } else {
    client->publish(PUBTOPIC, "false");
    digitalWrite(MONITOR, LOW);  //turn off the Blue LED
  }
}

void loop() {  
  client->loop();
  int newOccState=digitalRead(OCCUPANCY);
  if(currentOccState!=newOccState) { //occupancy state has changed
    counter=0; //reset counter
    currentOccState=newOccState; //update current state to new one
    publishOccupancy(currentOccState); //update
  }
  if(++counter % 6000 == 0) //at every 6000 loops (60sec),
    publishOccupancy(currentOccState); //update anyway.
  delay(10); //10ms delay
}

このプログラムは、人感レーダーセンサの感知状態が変化したら、MQTTの

mqttthing/LD2410/getOccupancyDetected

というトピックに、trueまたはfalseをパブリッシュします。また、それとは別に、60秒ごとに、現在の感知状態を定期的にパブリッシュします。

また、ESP32 dev基板に実装されている青色LED(GPIO-2番に接続されてます)を検出表示に使用してます。レーダー検出された場合にLEDが点灯します。

HomeKitに接続する

このESP32を、HomeKitで使用します。今回使用したMQTTブローカーは、Raspberry Pi 4で動作しているMosquittoです。同じRaspberry Pi 4で、Homebridgeも動作してます。またこのHomebridgeには、Mqttthingというプラグインを入れて、MQTTブローカに接続しています。全体は以下のような構成です。

Mqttthingプラグインのために、以下のようなHomebridgeの設定を用意しました。ここではOccupancy Sensorアクセサリを追加してます。MQTTトピックス名を、上記のプログラムに合わせてあります。

{ 
    "accessory": "mqttthing", 
    "type": "occupancySensor", 
    "name": "LD2410", 
    "topics": { 
        "getOccupancyDetected": "mqttthing/LD2410/getOccupancyDetected" 
    } 
},

設定ファイルを保存し、Homebridgeを再起動すると、iPhoneとMacのホーム.appに以下のように人感センサーが表示されました。

HomeKitで使う

このブレッドボードを、パソコン机の脇の棚に設定しました。椅子に座った時の頭部あたりに向けてます。人が静止した状態でもかなり確実に検出できる位置です。

次に、ホーム.appに、「人を検知したら照明をOn」と「人の検知を停止したら照明をOff」のオートメーションを設定しました。

動作を確認したところ、部屋に入るとすぐに(1~2秒で)照明が点灯します。また、部屋から出ると6~7秒で照明が消灯します。無人になってからの応答時間は、おそらくは前述の詳細設定の「無人継続時間」で設定できると思います(出荷時では5秒です)。Aqara のFP1では、入室に対して10秒から15秒程度の応答、部屋を出る場合には10秒から30秒程度の応答でした。FP1も設定で調整できるのかもしれませんが、少なくとも出荷時設定では、今回使用したセンサーの方が応答が早いです。

ただ、レーダー正面から少し外れた場所で、長時間静止していると、たまに人の検知を失敗することがありました。TuyaのZY-M100センサーでも同様の現象があり、センサーの設置方向は重要なようです。一方でAqara のFP1は、高価格なだけに確実に動作します。

買い物ガイド

AliExpressの販売ページを見ると、複数のモジュール選択、付属品の組み合わせが可能です。冒頭で述べたように、今回はその中から、LD2410とケーブルのセットを購入しました。

PCに接続するための、USBシリアルアダプタをセットにした製品もありますが、設定はスマホからBluetoothで可能ですし、そもそも設定自体がほとんど不要ですので、これは購入する必要はありません。

電源電圧が3.3Vらしいバージョンもあるようです。もしかするとBluetoothが無いのかもしれません。でも、ピンは通常の2.54mm間隔なので使いやすそうです。3.3V電源のESP32やRaspberry Piに工場出荷時設定のまま接続するなら、こちらの方が簡単で良かったかもしれません。

また今回の試作では、センサをESP32 devボードに接続して、HomeKitに接続しました。ESP32はAliExpressで496円(送料198円)くらいです。なので、HomeKitで使うセンサーとして組み上げるには、この価格も必要です。スマート赤外線リモコンをESP32で自作しているので、そのESP32に組み込むことで、ESP32を共用して節約するのも良いかと思ってます。

Homebridgeを動作させているRaspberry Piは、今回実験した同じ棚の上に置いてあります。なので、このセンサをRaspberry Piに接続しても良いと思ってます。そのうち試します。

まとめ

AliExpressで格安で売られている人感センサーを試しました。工場出荷時の設定のままで、確実に人の存在を検知し、応答も高速です。電源、GNDと状態出力を接続するだけで使える安価なセンサーなので、色々なDIYに気軽に使えると思います。

コメント

  1. masahiro より:

    とってもわかりやすいです。
    FP1は便利なのですがすべての部屋につけるには価格問題があったので助かります。

    ぜひ真似させてください!

タイトルとURLをコピーしました