DY-HV8F голосовой модуль, проблема с режимом One_line

Хорошо, был резок, простите.

Но вы тоже, не давайте дурацких советов.

Всем привет, признаю, столкнулся с проблемой и хз, что делать. Проблема подсчета импульсов от автосигнализации по одному каналу на внешний микроконтроллер GPIO 1 (в моем случае pi pico RP2040), который в свою очередь подключен 8ю. GPIO2 - GPIO9 к IO0-IO7 и в зависимости от их комбинаций, включает трек от 1 по 255 голосового модуля. По UART не стал заморачиваться, так мне нужно именно аналоговое управление (для других проектов). Проблема в обработке импульсов. Обработчик часто ошибается. Выход сигнализации имеет такие настройки. Первый импульс: минимум 10мс или выше до 60000мс, пауза от 0 до 60000мс, второй импульс от 0 до 60000мс, вторая пауза от 0 до 60000мс. Этой комбинации можно задать от 1 до 100 повторов. Проблема номер один: Фактическое время импульсов и пауз расходится с заданным. Округление полученного значения (если подсчитывать в 1мс) дает неверное значение из за погрешности пришедшего значения. Пробовал увеличить разрядность в пять раз, задать диапазоны по 2.5мс в каждую сторону и сделать сравнение полученных значений. Т.е например команда 10и - 5п - 25и - 5п повторенная 5 раз, если хотя бы 3 серии совпали - выводим результат! Все равно ошибается! Теперь думаю уйти от длительности, а как то перевести просто в подсчет импульсов и конвертировать в бинарный вид. Но тогда получаются лютые задержки. Может кто подскажет иные варианты?

Любой последовательный (импульсный ввод) - это задержки.

не изобретайте велосипед. Используйте любой готовый протокол, например UART

Уточните - вы имеете в виду, что сигнализация выдает импульс неверной длины, или что ваш код его неправильно измеряет?

Измерить длительность входящего импульса с точностью 2.5мс для РП2040 явно по силам - похоже тут дело не в протоколе, а в программисте.
Может покажете код, как измеряете?

Еще раз, я не изобретаю велосипед, UART мне не куда воткнуть в других проектах (аналоговых ведрах), где все входы/выходы автосигнализации уже используются по назначению и допов не остается. Имеется ввиду либо отсутствие вообще, либо скудность информации по СAN. Но путем добавления МК, я могу легко увеличить количество выходов.
Второе, “дело в программисте”. Посмотреть в монитор порта, что вообще приходит - это уровень уже программиста? С подтяжкой, без, уже даже мысли про оптопару были, но да не зачем.
Длина импульса гуляет, вместо например 10мс, может прилететь 7.234 (в микросекундах), что уже ниже диапазона 5 разрядности, и причем это и в другую сторону. Другой тест, импульс 10мс пауза, скажем 5мс - 100 повторов. Результат - 103, 100, 98, 99, 100. Толи это зависит от загруженности самой сигналки, но проверял и на “столе”, кроме логики ничего более не запускается. Проц в самой сиге стоит Stm32, точное название уже не вспомню (могу дома посмотреть), но такой “большой/квадратный” :slight_smile:
Да и код дома а там из последнего просто “обработчик” пытался настроить для получения верных значений, на основе нескольких повторов, щас на работе. Вопрос не про код, а про: отчего такое может быть со стороны сигналки и как это побороть.
PS. Паузы тоже гуляют.

Как измеряли? Вашей программой или независимым инструментом?

Не обижайтесь, прежде чем решать проблему - нужно же быть уверенным, где возникает нестабильность - в сигналке или вашем коде.

… просто мысли…

  • если сигналка управляет периферией именно длительностью импульса - там не может быть такого разброса. Может вы не разобрались в протоколе и точность 2-3мс туда-сюда вообще не имеет значения?
  • а если поставить шаг еще больше - например 10мс или 20?

Измерял, хоть через ардуину, хоть через пико в мониторе порта ардуиноиде. Нет, нормального инструмента, кроме недорогого осцилла от фнирси за 3000р, у меня нет.
Да, если увеличить длительность - импульсов/пауз, можно добиться стабильного определения, но увеличиваются и задержки. Мне например для голосового модуля нужно получить 255 уникальных “адресов”, сколько секунд пройдет на передачу последней серии импульсов, скажем если импульсы будут по 50мс, паузы по 30, и столько то повторов?

Что-то я запутался… зачем столько импульсов и пауз? Вы же передаете номер длительностью импульса, верно? Зачем повторы?

Совет - купите ЛА за 600 рублей, без этого вы тыркаетесь в темноте, как слепой

Перечитайте условия, как и какие импульсы и паузы можно формировать.

  1. Первый импульс всегда минимум 10мс и выше
  2. Первая пауза от 0мс и выше
  3. Второй импульс от 0мс и выше
  4. Вторая пауза от 0мс и выше
    И вот последовательность этих значений можно повторить от 1 до 100 раз.
    Повторы нужны для сравнения, чтобы победить разную длину и на основе нескольких совпадений - вывести верное значение. Но выше писал, что пробовал с 5 разрядностью - все равно ошибается.
    Путем увеличения импульсов/пауз, мы снижаем погрешность, но и с каждым новым адресом в порядке роста, растет сумма всех = задержка.
    Фактически, в моей сфере это практически нигде не используется (нужна разрядность примерно в 100мс, ниже уже прям уникальность, да и вообще сомневаюсь, что кто то заморачивался так) По этому, разрабы могли подзабить.
    А так, есть еще какой то BUS, но он закрыт, да и к сценариям отношения не имеет.
    PS. простите, что такое ЛА?

Кодируйте номер трека двоичным числом, нулями и единицами. Выберите ноль и единицу с большим разбросом, например ноль - 5мс, единица - больше 20мс. Длительность пауз не важна, уменьшите их до предела, чтобы только ваш код успевал различать соседние импульсы.
Тогда самое большое число - 255 - будет передано 8 импульсами по 20мс плюс паузы - то есть порядка 0.2секунды

А с учетом того, что вы писали что у вас не 255, а 30-40 треков - разрядность числа можно снизить, передача будет еще короче

На счет 40 треков - да, но я и экспериментирую на будущее, мне этот голосовой модуль не сильно “вперся”, есть более интересные задачи, где может потребоваться гораздо больше “адресов”.
Спасибо за совет, доберусь до дома, как будет время займусь

логический анализатор
На Озоне 600-700р, привезут через пару дней.

Купите, с отладкой двоичного протокола он вам очень бы помог

PS
К машине только его напрямую не подключайте, у него входное напряжение 0-5в

1 лайк

МК не может обрабатывать такие сигналы.
Нужно тщательнее формулировать технические условия.

А зачем Вы делаете неверное округление?
И как Вы его вообще делаете? Где код?

Скорее всего, у Вас ошибка проектирования.
Должно быть как-то так:
от 4 до 8 воспринимается как 1,
от 12 до 16 воспринимается как 2,
от 20 до 24 воспринимается как 3,

Длительности 0-4, 8-12, 16-20… недопустимы и трактуются как ошибка.
На приемном конце все это с некоторыми зазорами, например, 3-9 - единица, а 0-2 и 10-11 - ошибка.

Я лишь передал то, что вижу в интерфейсе программы настройки автосигнализации. Понимаю, что такое ноль. и он нужен если нужно увеличить время до максимального импульса 60000мс 0 пауза 60000мс 0 пауза и к примеру 100 повторов = 200 минут. Ну вдруг кому потребуется такое значение. Там есть иной вариант - просто включить канал в бесконечность (а прерывать уже по каким то другим событиям)

Я делал округление в микросекундах до целого значения. Т.е типа пришло 3.654 - округляем до 4мс - да, наивно полагая, что этого будет достаточно. Но разброс пошел такой, что сначала увеличил разрядность на два порядка, потом до 5 с диапазоном уже в +/- 2.5 мс, т.е От 13.5 до 17.5 - результат 15мс. И даже вроде бы стабильно, но прям стресс тест - пишешь сразу несколько сценариев (на сигналке), причем выдерживая паузы, чтобы команды не накладывались друг на друга - и бац, опять периодически включает не те треки. Там озвучка многих состояний, и было бы прикольно, что если вместо тревоги и оповещения о том, что сработал такой то датчик и отправлено оповещение владельцу, оно скажет “авторизация пройдена” или “двигатель разблокирован” :grinning: Гламурно, но это и авто из этой серии.

Решили отказаться от одной не очень сильно нужной функции и освободить еще один доп канал, и перевести команды в 8 битный формат. Да и в будущем - если это упрощает процесс взаимодействия с мк, и черт с ним - на выходе я могу получить гораздо больше.

Я уже писал (у меня платный аккаунт)

Сейчас его уже нет, последний - там тупо был метод перебора разных вариантов “обработчика”, он его на ходу затирает и переписывает на новый. И да, задача для него оказалась не сильно очевидной, нужно максимально расписывать в промте все детали и условия, обязательно на что то подзабивает. Хотите проверить, качество - дайте задачу (из несложных конечно), выложу код (его работу) для оценки

Простейшая задача - скетч для получения и отправки данных с датчика температуры и влажности AHT-10 на сайт методом GET по защищённому протоколу с использованием сертификата сайта для ESP32 Dev module

а если запросить: прошу уточнить корневой сертификат сайта?
ЗЫ надо отметить, что логика работы с WIFI выстроена правильно и с этим скетчем уже можно работать

Корневой сертификат сайта может меняться, поэтому лучше получить его вручную. Чтобы уточнить корневой сертификат сайта xxx выполните следующие шаги:

  1. Откройте сайт xxx в браузере.
  2. Нажмите на значок замка в адресной строке и выберите опцию “Просмотреть сертификат” или “Подключение защищено”.
  3. Перейдите в раздел “Цепочка сертификатов” и найдите корневой сертификат (обычно он последний в цепочке).
  4. Нажмите на корневой сертификат и экспортируйте его в формате PEM (.crt или .cer).
  5. Откройте полученный файл с сертификатом в текстовом редакторе и скопируйте содержимое между -----BEGIN CERTIFICATE----- и -----END CERTIFICATE-----.
  6. Вставьте это содержимое в переменную rootCACertificate в скетче.

Либо можно воспользоваться командой в терминале (Linux/macOS) для получения корневого сертификата:

bash

Копировать код

echo | openssl s_client -showcerts -servername xxxx -connect xxx:443 2>/dev/null | openssl x509 -outform PEM

Этот метод выведет корневой сертификат, который можно использовать в коде.

вот хитрец, я хотел проверить умеет ли он это делать в принципе, как получить корневой я в курсе

Их несколько штук, и иногда надо менять, один быстрей, другой логичней/умней, третий вчено чушь порет и память как у рыбы. А бывают у всех тупняки - так понимаю зависит от текущей нагрузки.

Спойлер