Ви не увійшли.
Сторінки 1
Есть такой проект, через радиомодуль подаётся сигнал на 8 ардуино, и они должны работать по прописанному коду синхронно включать выключать диоды на костюмах ws2812b. Часы реального времени дают задержку каждые 5 секунд. Пытались менять код и mills и delay. Но разсрнхронизация все равно есть. Сначала диоды загораются при подаче сигнала синхронно. Но в процессе кода начинаются сбои и рассинхрон. В чем может быть проблема ? Ардуино итальянское не китайское. Думаю перейти на esp32 или nodemcu на базе eap8266 и через mqtt протокол запустить все 8 костюмов. Но в esp вообще не разбираюсь. Кто то вообще сталкивался с синхронной работой ардуино от 5 шт. Код прописан по секундам.
Неактивний
От радио модуля вкл а выкл через reset или перезапуска питания. В каждой ардуине прописан один и тот же код. Они начинают разсинхронизацию жесткую после 20 иногда с 10 секунды работы. А с момента запуска все нормально. Есть видео кому интересно могу кинуть
Неактивний
Надо именно, такая логика как описана. Что бы сбоев небыло при передаче. Может на stm32 переделать все ?
Кто то может сталкивался именно с таким порядком ?
Неактивний
Обычная, ткань трикотаж на кофте, а штаны джинс. Но тут точно не в ткани дело. Пытались без подключения к костюму мигать отдельно диодом который на плате стоит. Все равно задержка
Неактивний
А через что это сделать лучше ? Через код ?
Неактивний
А это вообще можно сделать не прерывая код ?
Неактивний
Разбить программу на фрагменты, в пределах которых рассинхронизация не проявляется и запускать каждый фрагмент отдельным внешним воздействием.
Я когда увидел такое в начале сезона "Танців з зірками", тоже загорелся подобной идеей, но не нашёл единомышленников среди служителей Терпсихоры и отложил идею до лучших времён
Неактивний
Причина рассинхронизации может быть в способе реализации управления ws2812b. На них нужно передавать довольно много информации и если эта информация различается между костюмами, то я знаю одного человека, который эту проблему успешно решил )))
Неактивний
То есть на всех одинаковый код и они получают только сигнал начала выполнения алгоритма и потом никак не связаны между собой?
Да правильно
Неактивний
Причина рассинхронизации может быть в способе реализации управления ws2812b. На них нужно передавать довольно много информации и если эта информация различается между костюмами, то я знаю одного человека, который эту проблему успешно решил )))
Можете мне дать Контакты этого человека? Или какими способом он это решил ?
Неактивний
Контактная информация этого человека "странным образом" совпадает с моей.
А решил я эту проблему написанием кода, время выполнения которого не зависит от соотношения количеств передаваемых нулей и единиц.
Остання редакція MikeM (2020-10-18 17:38:00)
Неактивний
Контактная информация этого человека "странным образом" совпадает с моей.
А решил я эту проблему написанием кода, время выполнения которого не зависит от соотношения количеств передаваемых нулей и единиц.
Написал вам на почту кинул контактные данные. Готов заплатить за решение этой проблемы
Неактивний
Источником нарушения синхронизации могут выступать разные причины. Часы реального времени, скорее всего, имеют относительно высокую точность хода, поэтому смещение сигналов будет наблюдаться лишь по прошествии нескольких часов, а то и дней. Хотя если и кварцы, и сами часы на разных модулях разные, то это может стать заметным в несколько быстрее.
Скорее всего проблема в задержках обусловлена обработкой прерываний от радио части. Особенно это будет заметно, если код написан на основе delay() или usleep(). Радио протокол, будь то WiFi или BLE подразумевает достаточно жесткий тайминг: если в него не успевать вкладываться, то задержки будут приводить к сбоям в соединении. Поэтому эти прерывания имеют обычно самый высокий приоритет, и delay() будет вынужден ждать, пока не закончится обработка такого прерывания.
Чтобы решить эту задачу, включение светодиодов можно синхронизировать с одним из аппаратных таймеров (RTC вполне подходит). Если сигнал строго периодический, то достаточно выровнять фазу включения по некоторому опорному значению таймера. Например, если светодиод должен зажигаться каждую секунду, а значение таймера измеряется в миллисекундах, то достаточно выполнять проверку остатка от деления значения таймера на 1000. Однако при этом нужно учесть, что в момент, когда значение таймера станет кратным 1000, может выполняться обработка другого, более приоритетного прерывания. Поэтому, вероятно, имеет смысл предусмотреть эту возможную задержку и "догонять" реальное время, например, как-то так (извините, код не совместим с Ардуино):
#define TRIGGER_TIME 1000
void
on_rtc_evt()
{
/* the trigger counter follows RTC, but incremented in steps of TRIGGER_TIME */
static uint32_t trigger_counter = 0;
/* how many triggers were overdued and needed to be consumed */
static uint16_t trigger_overdue = 0;
if (RTC->COUNTER - trigger_counter + trigger_bias >= TRIGGER_TIME) {
trigger_overdue += (RTC->COUNTER - trigger_counter) / TRIGGER_TIME;
trigger_counter = RTC->COUNTER - RTC->COUNTER % TRIGGER_TIME;
};
/* XXX the following code is usually better to keep out of an interrupt handler */
while (trigger_overdue-- > 0) {
ledctl(...);
}
}
Здесь глобальная переменная trigger_bias задает смещение в диапазоне (0; TRIGGER_TIME-1) и устанавливается в соответствии с неким распределенным протоколом синхронизации времени между устройствами. Для этого проекта, как мне думается, протокол может быть достаточно простым, на манер RBS: время от времени высылается серия широковещательных пакетов, и часы всех распределенных устройств подстраиваются под эту рассылку. Можно сделать так, чтобы рассылку осуществлял любой узел сети, но он должен это делать строго в момент срабатывания триггера - необходимо иметь референтное время, чтобы все устройства, которые получили этот пакет, понимали, как их таймер смещен относительно часов передатчика.
Остання редакція Mishka (2020-10-19 15:48:24)
Неактивний
Сторінки 1