Хорошо, был резок, простите.
Но вы тоже, не давайте дурацких советов.
Хорошо, был резок, простите.
Но вы тоже, не давайте дурацких советов.
Всем привет, признаю, столкнулся с проблемой и хз, что делать. Проблема подсчета импульсов от автосигнализации по одному каналу на внешний микроконтроллер 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, точное название уже не вспомню (могу дома посмотреть), но такой “большой/квадратный”
Да и код дома а там из последнего просто “обработчик” пытался настроить для получения верных значений, на основе нескольких повторов, щас на работе. Вопрос не про код, а про: отчего такое может быть со стороны сигналки и как это побороть.
PS. Паузы тоже гуляют.
Как измеряли? Вашей программой или независимым инструментом?
Не обижайтесь, прежде чем решать проблему - нужно же быть уверенным, где возникает нестабильность - в сигналке или вашем коде.
… просто мысли…
Измерял, хоть через ардуину, хоть через пико в мониторе порта ардуиноиде. Нет, нормального инструмента, кроме недорогого осцилла от фнирси за 3000р, у меня нет.
Да, если увеличить длительность - импульсов/пауз, можно добиться стабильного определения, но увеличиваются и задержки. Мне например для голосового модуля нужно получить 255 уникальных “адресов”, сколько секунд пройдет на передачу последней серии импульсов, скажем если импульсы будут по 50мс, паузы по 30, и столько то повторов?
Что-то я запутался… зачем столько импульсов и пауз? Вы же передаете номер длительностью импульса, верно? Зачем повторы?
Совет - купите ЛА за 600 рублей, без этого вы тыркаетесь в темноте, как слепой
Перечитайте условия, как и какие импульсы и паузы можно формировать.
Кодируйте номер трека двоичным числом, нулями и единицами. Выберите ноль и единицу с большим разбросом, например ноль - 5мс, единица - больше 20мс. Длительность пауз не важна, уменьшите их до предела, чтобы только ваш код успевал различать соседние импульсы.
Тогда самое большое число - 255 - будет передано 8 импульсами по 20мс плюс паузы - то есть порядка 0.2секунды
А с учетом того, что вы писали что у вас не 255, а 30-40 треков - разрядность числа можно снизить, передача будет еще короче
На счет 40 треков - да, но я и экспериментирую на будущее, мне этот голосовой модуль не сильно “вперся”, есть более интересные задачи, где может потребоваться гораздо больше “адресов”.
Спасибо за совет, доберусь до дома, как будет время займусь
логический анализатор
На Озоне 600-700р, привезут через пару дней.
Купите, с отладкой двоичного протокола он вам очень бы помог
PS
К машине только его напрямую не подключайте, у него входное напряжение 0-5в
МК не может обрабатывать такие сигналы.
Нужно тщательнее формулировать технические условия.
А зачем Вы делаете неверное округление?
И как Вы его вообще делаете? Где код?
Скорее всего, у Вас ошибка проектирования.
Должно быть как-то так:
от 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мс. И даже вроде бы стабильно, но прям стресс тест - пишешь сразу несколько сценариев (на сигналке), причем выдерживая паузы, чтобы команды не накладывались друг на друга - и бац, опять периодически включает не те треки. Там озвучка многих состояний, и было бы прикольно, что если вместо тревоги и оповещения о том, что сработал такой то датчик и отправлено оповещение владельцу, оно скажет “авторизация пройдена” или “двигатель разблокирован” Гламурно, но это и авто из этой серии.
Решили отказаться от одной не очень сильно нужной функции и освободить еще один доп канал, и перевести команды в 8 битный формат. Да и в будущем - если это упрощает процесс взаимодействия с мк, и черт с ним - на выходе я могу получить гораздо больше.
Я уже писал (у меня платный аккаунт)
Сейчас его уже нет, последний - там тупо был метод перебора разных вариантов “обработчика”, он его на ходу затирает и переписывает на новый. И да, задача для него оказалась не сильно очевидной, нужно максимально расписывать в промте все детали и условия, обязательно на что то подзабивает. Хотите проверить, качество - дайте задачу (из несложных конечно), выложу код (его работу) для оценки
Простейшая задача - скетч для получения и отправки данных с датчика температуры и влажности AHT-10 на сайт методом GET по защищённому протоколу с использованием сертификата сайта для ESP32 Dev module
а если запросить: прошу уточнить корневой сертификат сайта?
ЗЫ надо отметить, что логика работы с WIFI выстроена правильно и с этим скетчем уже можно работать
Корневой сертификат сайта может меняться, поэтому лучше получить его вручную. Чтобы уточнить корневой сертификат сайта xxx выполните следующие шаги:
xxx
в браузере.-----BEGIN CERTIFICATE-----
и -----END CERTIFICATE-----
.rootCACertificate
в скетче.Либо можно воспользоваться командой в терминале (Linux/macOS) для получения корневого сертификата:
bash
Копировать код
echo | openssl s_client -showcerts -servername xxxx -connect xxx:443 2>/dev/null | openssl x509 -outform PEM
Этот метод выведет корневой сертификат, который можно использовать в коде.
вот хитрец, я хотел проверить умеет ли он это делать в принципе, как получить корневой я в курсе