Подключение и настройка датчика присутствия людей LD2410C

Материал из Wiren Board
Это утверждённая версия страницы. Она же — наиболее свежая версия.


Описание

Статья создана членом сообщества и может не совпадать с позицией компании Wiren Board. Используйте приведённые инструкции на свой страх и риск.

Автор статьи: Paul Strong

Здесь будет рассмотрен весь процесс подключения, настройки и интеграции с Wiren Board / Home Assistant китайского датчика HLK-LD2410C от компании Hi-link, работающего по принципу радара.

Что это за датчик

Цитирую из блока aliexpress:

HLK-LD2410 – радарный датчик присутствия человека с возможностью измерения расстояния и детектирования как движущихся, так и неподвижных объектов.

HLK-LD2410 работает по принципу FMCW радара и способен обнаруживать движущиеся и неподвижные объекты. HLK-LD2410 способен рассчитывать расстояние до объекта, максимальное заявленное расстояние обнаружения составляет 5 метров. Он имеет интерфейс UART для конфигурации и вывод GPIO, состояние которого меняется при обнаружении цели в соответствии с настройками чувствительности. Логический уровень UART и GPIO 3.3 в.

Угол обнаружения объекта по горизонтали и вертикали составляет 120 градусов. Размер модуля всего 35*7 мм. Интерфейс UART и пин GPIO выведен на 5 контактную колодку с шагом 1,27 мм, разъемы с таким шагом распространены не широко, поэтому для отладки имеет смысл сразу заказать интерфейсную плату. Она содержит USB-Uart конвертер CH340 и стабилизатор напряжения AMS1117. Для подключения к компьютеру предусмотрен разъем micro-usb. Интерфейсная плата универсальна и подходит для разных радарных модулей, выпускаемых Hi-Link.

Материалы для изучения

В процессе изучения темы я подглядывал в "чужие" посты, должен сослаться на них.

Подключение к PC

  1. Подключаем TX датчика к RX конвертера
  2. Подключаем RX датчика к TX конвертера
  3. Подключаем GND и VCC соответственно

Windows

Нам нужна софтина LD2410 Tool на английском языке (к сожалению, есть версия только для Windows), качнуть можно тут - https://drive.google.com/drive/folders/1p4dhbEJA3YubyIjIIC7wwVsSo8x29Fq-

После подключения в диспетчере устройств должен появиться новый COM-порт.

Теперь открываем софтину, выбираем нужный COM-порт и жмём "Connect", если ошибок не вылезло - значит Serial-подключение установлено успешно.

Если подключение установить не удалось - нужно разбираться с COM-портом, возможно поможет рестарт софтины, или возможно вы уже открыли этот COM-порт в другой софтине, ошибка подключения будет выглядеть примерно так:

8c5607a51462e4b110f6527fb88de774b963a13d.png

Теперь нам нужно отрегулировать расстояние, в пределах которого будет работать датчик. По умолчанию датчик работает диапазонами по 0.75м, всего есть 8 диапазонов:

нижняя граница, м верхняя граница, м
1 0 0.75
2 0.75 1.5
3 1.5 2.25
4 2.25 3
5 3 3.75
6 3.75 4.5
7 4.5 5.25
8 5.25 6

Мы можем настраивать расстояние между 2 и 8 включительно, то есть отключить сканирование расстояния меньше 1.5m невозможно чисто технически, оно всегда сканируется.

Например, если мы хотим "мониторить" расстояние не более 3м, тогда записываем значения:

настройка значение
Moving Max. RG 4
Motionless Max. RG 4

Теперь можем жать кнопку Start и сможем наблюдать за изменениями на графиках - по ним можно понять как датчик реагирует на ваше присутствие:

если круг зеленого цвета - значит датчик вас не видит

Снимок экрана 2024-01-29 184202.jpg


если пурпурный - значит датчик видит ваше присутствие

Снимок экрана 2024-01-29 184347.jpg

если красный - значит датчик видит ваше движение

Снимок экрана 2024-01-29 184518.jpg

  • в верхней части есть также расстояние до вас, вы можете постепенно удаляться от датчика и в какой-то момент отсчёт расстояния прекратится, спустя несколько секунд круг станет зеленым, т.к. датчик больше вас не видит (ранее мы настроили датчик на максимальное расстояние 3м)

У датчика есть также тонкие настройки чувствительности во всех 8ми зонах, но я не вникал в это очень глубоко, настроек по умолчанию мне хватило чтобы решить свою задачу.

Linux

Есть вот такая хорошая страничка - https://ld2410.albert.nz/ - вместо софта можно пользоваться этим сайтом для настройки датчика.

Настройка через bluetooth

Вобще-то я рассчитывал получить модуль с синим зубом, но не то заказал. Есть хочется без ноута на месте через мобилу расстояние поднастроить, то надо брать такое:

Снимок экрана 2024-01-29 210801.jpg

Далее нужно использовать мобильное приложение HLKRadarTool для подключения к датчику.

Подключение к ESP32

Далее будет рассмотрен процесс прошивки контроллера ESP32, для этих целей у меня всегда есть полноценная dev-плата ESP32 WROOM32 Devkit 38P.

Подключаем пины датчика к esp32 (да, я использовать не стандартные RX/TX пины, мне так надо было, вы можете использовать другие пины по своему усмотрению):

  1. 5V контроллера к VCC датчика
  2. GND
  3. GPIO27 - RX датчика
  4. GPIO26 - TX датчика

Далее подразумевается, что у вас уже есть система Home Assistant с подключенным ESPHOME.

Создаём новое устройство с базовым конфигом (адрес 192.168.0.100 указан с учетом IP-адреса, закрепленного на роутере за MAC-адресом WiFi интерфейса платы с ESP32):

esphome:
  name: esp-garderob
  friendly_name: esp-garderob

esp32:
  board: esp32dev
  framework:
    type: arduino

# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: "ylD7gSnCct8R2g+Ff2nlYZJCOesBngFNln0ulJGOnwM="

ota:
  password: "2d292b8425334046760b741090ee1c3f"

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  use_address: 192.168.0.100

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Esp-Garderob Fallback Hotspot"
    password: "FKaeqKHsRMdF"

captive_portal:

Далее открываем и изучаем документацию https://esphome.io/components/sensor/ld2410.html

Я перепробовал там все вариации конфигов, лично у меня так и не взлетело редактирование настроек из Home Assistant, а точней, там даже текущие значения не считываются после рестарта esp32, в итоге я выкинул всё лишнее - оставил только бинарный сенсор присутствия:

uart:
  tx_pin: 27
  rx_pin: 26
  baud_rate: 256000
  parity: NONE
  stop_bits: 1

ld2410:
  throttle: 300ms

binary_sensor:
  - platform: ld2410
    has_target:
      name: Presence

что здесь можно увидеть:

  1. мы указали настройки UART, соответствующие тем пинам, на которые мы подключили наш датчик
  2. создаём платформу ld2410 и указываем таймаут для цикла, который опрашивает датчик
  3. на базе платформы ld2410 создаём бинарный сенсор с датчиком присутствия

после заливки прошивки появится новое устройство с соответствующим сенсором, его можно найти тут "Настройки > Устройства и службы > Устройства"

Снимок экрана 2024-01-29 210041.jpg

Интеграция с Wiren Board

Для трансляции значений в контроллер Wiren Board нам понадобится виртуальное устройство, чтобы мы могли в его топики передавать значения через MQTT.

Создаём виртуальное устройство

defineVirtualDevice('virtual-garderob', {
    title: 'virtual-garderob' ,
    cells: {    
      presence_sensor: {
        title: "датчик присутствия",
        type: "alarm",
        value: false,
      },         
    }
})

Получаем имя топика

В веб-интерфейсе Wiren Board в разделе "Настройки -> MQTT топики" ищем наше виртуальное устройство и копируем значение топика (например, /devices/virtual-garderob/controls/presence_sensor)

Добавляем в конфиг esphome

ранее мы описывали бинарный сенсор - его нужно дополнить полем id (это нужно чтобы в lambda-функции можно было получение значение сенсора):

binary_sensor:
  - platform: ld2410
    has_target:
      name: Presence
      id: esp_garderob_presence
      on_state:
        then:
          - mqtt.publish:
              topic: /devices/virtual-garderob/controls/presence_sensor
              payload: !lambda |-
                return id(esp_garderob_presence).state ? "1" : "0";

mqtt:
  broker: 10.50.0.253

что мы сделали:

  1. добавили id к сенсору
  2. описали mqtt-брокера
  3. создали триггер on_state, срабатывающий при изменении значения сенсора, используем функцию mqtt.publish для отправки данных в Wiren Board

Теперь можно пойти в раздел устройств в интерфейсе Wiren Board и увидеть такое:

Screenshot from 2024-01-29 13-17-22.png

Когда датчик сработает, то будет выглядеть так:

Screenshot from 2024-01-29 13-17-47.png

Таким образом, можно использовать wb-rules для автоматизации, или какой-то другой софт.

Автоматизация освещения

Совсем коротко про автоматизацию (как это сделал я):

  • всё освещение у меня уже прокинуто в Home Assistant при помощи wb-engine (https://github.com/4mr/wb-engine)
  • установлен node red с модулем node-red-contrib-home-assistant-websocket и node-red-contrib-wirenboard

Добавляем компонент Снимок экрана 2024-01-29 194609.jpg (отлавливает изменение состояния выбранного объекта)

Screenshot from 2024-01-29 13-40-40.png

если вы используете компонент первый раз - нужно добавить сервер home assistant (если NR крутится внутри HA, тогда, по идее, это можно пропустить)

Screenshot from 2024-01-29 13-32-32.png

указываем объект сенсора

Screenshot from 2024-01-29 13-42-59.png

добавляем второй компонент - Снимок экрана 2024-01-29 194624.jpg

Screenshot from 2024-01-29 13-40-02.png

если вы используете компонент первый раз - нужно добавить сервер wiren board

Screenshot from 2024-01-29 13-38-30.png

указываем "светильник"

Screenshot from 2024-01-29 13-44-41.png

соединяем компоненты:

Screenshot from 2024-01-29 13-57-36.png

Далее жмём "Deploy". Теперь при обнаружении присутствия человека в гардеробе будет зажигаться соответствующая группа освещения.

Автономное подключение

У датчика есть OUT-пин, на котором появляется напряжение 3V в случае обнаружения объекта, таким образом, можно приколхозить какое-то реле и управлять освещением автономно, без контроллера УД, мне это было не нужно - поэтому особо не изучал, но эта задача кажется сильно проще чем подключение к HA/WB.

Например, может подойти один из модулей реле (тут надо смотреть, что в действительности выдаёт датчик на пине OUT):

Подключение по RS-485 / Modbus RTU

Для этого понадобится модуль MAX485

Max485.jpg

Подключение делаем так:

ld2410 esp32 описание
VCC 3V max485 питается от 3V
GND GND земля
DI IO32 передача по uart от esp32 в сторону max485
RO IO33 передача по uart от max485 в сторону esp32
DE/RE IO25 пин контроля направления приёма/передачи

моя breadbort плата в момент разработки выглядела так:

Ld2410c-modbus-rtu МП.png

Прошивка в этом случае будет уже не от ESP32, будем делать свой скетч (весь код загружен сюда https://github.com/goosecrew/ld2410-modbus-slave.git)

Использовал три разных Serial:

  • Serial - uart на microUSB (можно смотреть логи и посылать команды для просмотра показаний датчика в консоли, настраивать датчик, перезапускать, делать сброс и т.д.)
  • Serial1 - uart max485
  • Serial2 - uart ld2410

Описание input-регистров (показания датчика):

№ регистра тип регистра описание
0 input метрика "присутствие"
1 input метрика "неподвижность"
2 input метрика "движение"
3 input расстояние до неподвижного объекта
4 input энергия неподвижного объекта
5 input расстояние до движущегося объекта
6 input энергия движущегося объекта

Описание holding-регистров (чтение и изменение настроек):

№ регистра тип регистра описание
100 holding modbus serial slave id
101 holding modbus serial stop bits
102 holding modbus serial baudrate
103 holding максимальное расстояние до движущегося объекта
104 holding максимальное расстояние до неподвижного объекта
105 holding idle time

ВАЖНО! После изменения настроек modbus необходимо перезапустить esp32!

Шаблон для Wiren Board

Шаблон для контроллера Wiren Board лежит на гитхабе в папке wirenboard (https://github.com/goosecrew/ld2410-modbus-slave/blob/main/wirenboard/LD-2410.json).

Вот что получилось на выходе:

Изменение параметров подключения к Modbus

Изменять параметры можно как с помощью веб-интерфейса Wiren Board (настройка Serial-устройств), так и с помощью modbus_client.

Изменение адреса - регистр 100, значение по умолчанию 1 - https://wirenboard.com/wiki/Wiren_Board_Device_Modbus_Address#Изменение_адреса_устройству_с_известным_адресом.

Изменение количества стоповых бит - регистр 101, значение по умолчанию 2.

Изменение скорости - регистр 102, значение по умолчанию 96 (значение скорости делим на 100 перед записью, то есть 9600 посылать как 96, а 115200 посылать как 1152 и т.д).

Питание от 12/24V

С учётом того, что в Wiren Board обычно используется напряжение 12/24V, чтобы запитать ESP32 - нужно будет еще добавить модуль для понижения постоянного напряжения до 5V, здесь я это не рассматриваю, но нужно обязательно помнить:

!!! ESP32 работает от 5V, датчик работает от 5V, MAX485 работает от 3.3/5V !!! Не подавайте на ESP32 12/24V - сожжёте! :)


Печать корпуса для беспроводной версии

В конечном счёте я решил свою задачу - как датчик работает мне очень нравится, всё точно, никаких ложных срабатываний по сравнению с PIR датчиком, поэтому я решил финализировать решение, заказал себе ESP32C3 (на свой страх и риск, т.к. разработчики ESPHOME не гарантируют корректную работу на C3, но вроде пишут что всё норм встаёт) и нашёл на просторах сети пару халявных схем для 3D-принтера, отдал другу, и вот какой результат получился:

ссылки на схемы: