#1 2020-10-17 00:10:25

Bogdan1999
Участник
Зарегистрирован: 2020-10-16
Сообщений: 10

Синхронная работа 8 ардуино Мега

Есть такой проект, через радиомодуль подаётся сигнал на 8 ардуино, и они должны работать по прописанному коду синхронно включать выключать диоды на костюмах ws2812b. Часы реального времени дают задержку каждые 5 секунд. Пытались менять код и mills и delay. Но разсрнхронизация все равно есть. Сначала диоды загораются при подаче сигнала синхронно. Но в процессе кода начинаются сбои и рассинхрон. В чем может быть проблема ? Ардуино итальянское не китайское. Думаю перейти на esp32 или nodemcu на базе eap8266 и через mqtt протокол запустить все 8 костюмов. Но в esp вообще не разбираюсь. Кто то вообще  сталкивался с синхронной работой ардуино от 5 шт. Код прописан по секундам.

#2 2020-10-17 00:37:45

vvr
Участник
Зарегистрирован: 2015-04-12
Сообщений: 670

Re: Синхронная работа 8 ардуино Мега

в каждой дуне своя программа вкл-выкл или головное всем рулит.

#3 2020-10-17 00:43:00

Bogdan1999
Участник
Зарегистрирован: 2020-10-16
Сообщений: 10

Re: Синхронная работа 8 ардуино Мега

От радио модуля вкл а выкл через reset или перезапуска питания. В каждой ардуине прописан один и тот же код. Они начинают разсинхронизацию жесткую после 20 иногда с 10 секунды работы. А с момента запуска все нормально. Есть видео кому интересно могу кинуть

#4 2020-10-17 08:32:04

vvr
Участник
Зарегистрирован: 2015-04-12
Сообщений: 670

Re: Синхронная работа 8 ардуино Мега

хотите полной синхронизации - головное даёт команды вкл-выкл, а костюмы выполняют.

#5 2020-10-17 09:54:49

Bogdan1999
Участник
Зарегистрирован: 2020-10-16
Сообщений: 10

Re: Синхронная работа 8 ардуино Мега

Надо именно, такая логика как описана. Что бы сбоев небыло при передаче. Может на stm32 переделать все ?
Кто то может сталкивался именно с таким порядком ?

#6 2020-10-17 10:13:30

renoshnik
Участник
Зарегистрирован: 2017-04-03
Сообщений: 768

Re: Синхронная работа 8 ардуино Мега

Костюмы из какой ткани пошиты ?

#7 2020-10-17 10:48:17

Bogdan1999
Участник
Зарегистрирован: 2020-10-16
Сообщений: 10

Re: Синхронная работа 8 ардуино Мега

Обычная, ткань трикотаж на кофте, а штаны джинс. Но тут точно не в ткани дело. Пытались без подключения к костюму мигать отдельно диодом который на плате стоит. Все равно задержка

#8 2020-10-17 15:33:56

leons
Участник
Зарегистрирован: 2019-10-14
Сообщений: 32

Re: Синхронная работа 8 ардуино Мега

нужно обнулять данные перед приходом новых

#9 2020-10-17 16:07:33

Bogdan1999
Участник
Зарегистрирован: 2020-10-16
Сообщений: 10

Re: Синхронная работа 8 ардуино Мега

А через что это сделать лучше ? Через код ?

#10 2020-10-17 16:14:24

Bogdan1999
Участник
Зарегистрирован: 2020-10-16
Сообщений: 10

Re: Синхронная работа 8 ардуино Мега

А это вообще можно сделать не прерывая код ?

#11 2020-10-17 18:04:15

KAS
Участник
Зарегистрирован: 2020-10-05
Сообщений: 16

Re: Синхронная работа 8 ардуино Мега

То есть на всех одинаковый код и они получают только сигнал начала выполнения алгоритма и потом никак не связаны между собой?

#12 2020-10-17 18:31:01

MikeM
Участник
Из Киев
Зарегистрирован: 2017-11-03
Сообщений: 111

Re: Синхронная работа 8 ардуино Мега

Разбить программу на фрагменты, в пределах которых рассинхронизация не проявляется и запускать каждый фрагмент отдельным внешним воздействием.
Я когда увидел такое в начале сезона "Танців з зірками", тоже загорелся подобной идеей, но не нашёл единомышленников среди служителей Терпсихоры и отложил идею до лучших времён

#13 2020-10-17 18:35:54

MikeM
Участник
Из Киев
Зарегистрирован: 2017-11-03
Сообщений: 111

Re: Синхронная работа 8 ардуино Мега

Причина рассинхронизации может быть в способе реализации управления ws2812b. На них нужно передавать довольно много информации и если эта информация различается между костюмами, то я знаю одного человека, который эту проблему успешно решил )))

#14 2020-10-18 11:57:34

Bogdan1999
Участник
Зарегистрирован: 2020-10-16
Сообщений: 10

Re: Синхронная работа 8 ардуино Мега

KAS пишет:

То есть на всех одинаковый код и они получают только сигнал начала выполнения алгоритма и потом никак не связаны между собой?

Да правильно

#15 2020-10-18 11:58:55

Bogdan1999
Участник
Зарегистрирован: 2020-10-16
Сообщений: 10

Re: Синхронная работа 8 ардуино Мега

MikeM пишет:

Причина рассинхронизации может быть в способе реализации управления ws2812b. На них нужно передавать довольно много информации и если эта информация различается между костюмами, то я знаю одного человека, который эту проблему успешно решил )))

Можете мне дать Контакты этого человека? Или какими способом он это решил ?

#16 2020-10-18 17:37:11

MikeM
Участник
Из Киев
Зарегистрирован: 2017-11-03
Сообщений: 111

Re: Синхронная работа 8 ардуино Мега

Контактная информация этого человека "странным образом" совпадает с моей.
А решил я эту проблему написанием кода, время выполнения которого не зависит от соотношения количеств передаваемых нулей и единиц.

Редактировался MikeM (2020-10-18 17:38:00)

#17 2020-10-18 20:14:08

Bogdan1999
Участник
Зарегистрирован: 2020-10-16
Сообщений: 10

Re: Синхронная работа 8 ардуино Мега

MikeM пишет:

Контактная информация этого человека "странным образом" совпадает с моей.
А решил я эту проблему написанием кода, время выполнения которого не зависит от соотношения количеств передаваемых нулей и единиц.

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

#18 2020-10-19 15:41:25

Mishka
Участник
Зарегистрирован: 2019-11-18
Сообщений: 55

Re: Синхронная работа 8 ардуино Мега

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

Скорее всего проблема в задержках обусловлена обработкой прерываний от радио части. Особенно это будет заметно, если код написан на основе 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)

Быстрое сообщение

Введите сообщение и нажмите Отправить

Подвал раздела