ARDUINO GyverBus, обсуждение библиотеки

Selya

✩✩✩✩✩✩✩
13 Окт 2021
3
0
Добрый день, уважаемые участники форума. Стоит задача: одно передающее устройство(передатчик)
должно по одно проводной линии опрашивать поочередно 5 адресных приемников и, в случае какого-либо условия
(например: нажата кнопка на приемном устройстве), обрабатывать это событие. Если событие не происходит,
опрашивается следующий приемник и так по кругу. Для приема и передачи данных использован код из примера библиотеки
GyverBus v2.4 softserial-softserial. Одно проводная линия организованна с помощью LIN-трансиверов MCP2004.
Система предназначена для управления затемнением окон в микроавтобусе. Как правильно организовать опрос приемных
станций?
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,969
632
44
должно по одно проводной линии опрашивать поочередно 5 адресных приемников
Обычно в таком случае не опрашивают, а слушают. Иначе шина сильно забивается от постоянных опросов.
Т.к. шина не помехозащищенная на аппаратном уровне (я бы сделал на RS-485) то делаем примерно следующее:
1) Головное устройство слушает шину.
2) На дальнем устройстве нажимается кнопка, посылает команду в шину.
3) Головное устройство принимает команду и отправляет в ответ, что приняло все в порядке.
4) Дальнее устройство после отсылки команды начинает слушать шину и ждать ответ от головного устройства, если через некоторое время ответ не пришел, то повтор с п.2.
 

Selya

✩✩✩✩✩✩✩
13 Окт 2021
3
0
Таких(дальних) устройств в нашем случае 5 шт. Они находятся под управлением разных пользователей. может возникнуть ситуация когда несколько удаленных устройств будут обращаться к головному одновременно. Это приведет к ошибке. Тогда придется создавать преоритетность устройств, проверку занятости шины, что приведет к усложнению кода. Скорость обмена данными не велика и пакеты данных небольшие, думаю, с помехами проблем не будет. Посылки можно отправлять, ну скажем, раз в 100мс. Шина сильно не будет загружена. Головное устройство не будет выполнять опрос другой станции, пока не получит ответ от опрашиваемой за определенный период времени контрольного.Само удаленное устройство в шину данные послать не может, если нет запроса от головного устройства.
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
472
133
@Selya,
Вы выше написали, как планируете опрашивать устройства. Что вы хотели узнать когда спрашивали в первом сообщении "Как правильно организовать опрос приемных станций?"
Дополнено позже. Мой вопрос не означает, что я считаю, что вы планируете неправильно.
 
Изменено:
  • Лойс +1
Реакции: Геннадий П

Геннадий П

★★★★★★✩
14 Апр 2021
1,969
632
44
@Selya, Очень многое зависит от того как часто будет изменяться состояние дальнего устройства. Если часто что возможно опрос с головного устройства будет получше вариант. Но если состояние будет изменяться относительно редко, то постоянный бесполезный опрос - не лучший вариант. Проблема одновременного обращения нескольких устройств решается проверкой шины на занятость перед отправкой.
 

Selya

✩✩✩✩✩✩✩
13 Окт 2021
3
0
Я опишу как я вижу этот проект. Это микроавтобус с электротонировкой стекл. На стекло подаётся напряжение до 100в и стекло становится прозрачным. У пассажира находится пульт-станция которая позволяет ему отрегулировать прозрачность непосредственно своего окна, окна напротив и в целом всех окон в салоне автобуса( четыре окна). Управление должно производиться по одно проводной линии. Регулировка напряжения на каждом стекле выполняется отдельным диммером под управлением одной Ардуино Нано. Я не опытный программист, прошу помощи по созданию оптимального алгоритма. Как бы Вы реализовали такой проект?
Я думал сделать так: головное устройство обращается к станции пользователя и, получая от нее ответ что ничего не происходит, опрашивает следующее устройство. В случае с ответом о событии, опрос прекращается и идёт обработка события до тех пор пока не придет ответ" ничего не происходит" . Далее головное устройство вновь продолжает опрос станций.
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,969
632
44
прошу помощи по созданию оптимального алгоритма. Как бы Вы реализовали такой проект?
Вас не понять. Вы просите совета по оптимальному алгоритму, вам предложили, а потом вы все равно предлагаете свой.
Ну, делайте по своему, в чем проблема?
 

adtut

✩✩✩✩✩✩✩
15 Сен 2023
1
0
Здравствуйте, есть ли возможность в библиотеке Gyverbus выдавать личное адреса по порядку, для новых устройств? Типо есть центральный проц и к нему подключается плата ЦП выдает плате адрес 1, подключаем еще плату её выдаем адрес 2 и так далее.
 

trir

✩✩✩✩✩✩✩
21 Май 2024
3
0
приветствую!
как ни странно, все вопросы по поводу двустороннего обмена с помощью GBUS, остаются без ответа.
Я вот тоже не смог разобраться как организовать связь даже между двумя ардуинами в режиме "запрос мастера с параметром - ответ с учетом принятого параметра". Соединение между платами рабочее. Если только отправлять с одной платы, а слушать другой, то все работает в оба направления, но как организовать ответ на запрос?

не работает даже с простым запросом sendRequest

мастер - atmega2560,
GBUS bus(&Serial1, 1, 9);
Serial1.begin(115200);
на Serial3 посажена CH340

слейв - atmega328pb
GBUS bus(&Serial, 2, 9);


вот предположим мастер (1) посылает слейву (2) и ожидает, что слейв ответит. 20 мс наверняка на это достаточно
C++:
void loop() {
  bus.sendRequest(2);
  delay(20);
  bus.tick();

  if (bus.gotData()) {
    char a[5];
    bus.readData(a);
    Serial3.println(a);
  }

слейв принял, отправляет ответ

C++:
char msg[]="asd";
void loop() {
  bus.tick();
  if (bus.gotRequest()) {
digitalWrite(BLED,!digitalRead(BLED));
    bus.sendData(1, msg);
  }
}
и тишина. это не работает. Я вижу по светодиоду, что реквест принят, но ответ не возвращается
Как же это все таки реализовывается?
возможно надо разобраться с waitAck()?
но запрос то нужен с параметром. как сделать с sendData?
 
Изменено:

poty

★★★★★★✩
19 Фев 2020
3,230
940
@trir, используйте примеры. Прерывание на приём настроено?
 

poty

★★★★★★✩
19 Фев 2020
3,230
940
@trir, примеры появляются в меню IDE после установки библиотеки. И там есть пример запроса и ответа на него, в том числе, с использованием аппаратных Serial.
 

trir

✩✩✩✩✩✩✩
21 Май 2024
3
0
Начинаю понимать, о чем Вы. С помощью аппаратного прерывания нужно ловить старт-бит на 45й ноге атмеги2560. То есть прерывание по спаду (заднему фронту фуу). Если этот момент упустить, то ничего принять не выйдет. Не использовал в своих проектах раньше аппаратные прерывания, опасался, что это повлияет на работу других библиотек или частей кода. попробую.