Сеть из Ардуин

rigl
Offline
Зарегистрирован: 15.10.2014

Хочу построить сеть из микроконтроллеров, задача котрых будет сообщать данные на сервер. А все логику возложить на сервер. Собрал сеть на UART 1 master 3 slave. Мастер опрашивает слэйвы они ему отвечают. Вроде бы идилия. Но только до тех пор, пока не нужно опреативно получать данные. Одна из них keypad, пока мастер опрашивает 3 устройства выпадают 2-3 нажатия.  Потенциометр тоже рывками инфу шлет. А нужно не пропустить не одного бита.
Можно конечно все складывать в буфер, то тогда все логика теряется.
Я просмотрел i2c, wire, rs485 все по той же логике.
Может есть проводные релизации, где устройства шлют данные не спрашивая мастера об разрешении и при этом как-то разрешают коллизии?

toc
Offline
Зарегистрирован: 09.02.2013

сделайте сеть на радио модулях nrf24l01+ и библиотеке RF24 от maniacbug.

"мастер" - всегда на приёме.

остальные отправляют когда угодно. Автоповтор и автоподтверждение включены по умолчанию.

_Shmel
Offline
Зарегистрирован: 22.09.2014

rigl пишет:

Хочу построить сеть из микроконтроллеров, задача котрых будет сообщать данные на сервер. А все логику возложить на сервер. Собрал сеть на UART 1 master 3 slave. Мастер опрашивает слэйвы они ему отвечают. Вроде бы идилия. Но только до тех пор, пока не нужно опреативно получать данные. Одна из них keypad, пока мастер опрашивает 3 устройства выпадают 2-3 нажатия.  Потенциометр тоже рывками инфу шлет. А нужно не пропустить не одного бита.
Можно конечно все складывать в буфер, то тогда все логика теряется.
Я просмотрел i2c, wire, rs485 все по той же логике.
Может есть проводные релизации, где устройства шлют данные не спрашивая мастера об разрешении и при этом как-то разрешают коллизии?

Признаться, не совсем понял ваши потребности, но если есть необходимость некоторые ус-ва опрашивать регулярно, а другие по их инициативе, то можно заиметь отдельную линию "Запрос на обслуживание", которую любое из ведомых может установить в состояние "Активно" и тогда мастер бросает текущие дела и оправшивает всех ведомых на предмет "не ты ли меня звал" и при получении положительного ответа опрашивает устройство. Если ведомых немного, то можно каждому по линии дать и тогда не надо опрашивать "кто звал", а сразу опросить того кому надо.

rigl
Offline
Зарегистрирован: 15.10.2014

toc пишет:

сделайте сеть на радио модулях nrf24l01+ и библиотеке RF24 от maniacbug.

"мастер" - всегда на приёме.

остальные отправляют когда угодно. Автоповтор и автоподтверждение включены по умолчанию.

Мне бы по проводам, но возможно все же сделаю на радио.

_Shmel пишет:

Признаться, не совсем понял ваши потребности, но если есть необходимость некоторые ус-ва опрашивать регулярно, а другие по их инициативе, то можно заиметь отдельную линию "Запрос на обслуживание", которую любое из ведомых может установить в состояние "Активно" и тогда мастер бросает текущие дела и оправшивает всех ведомых на предмет "не ты ли меня звал" и при получении положительного ответа опрашивает устройство. Если ведомых немного, то можно каждому по линии дать и тогда не надо опрашивать "кто звал", а сразу опросить того кому надо.

Отдельный пин на устройство жаба душит.

Дергать все по запросу конечно лучше, чем постоянно всех опрашивать.  Кстати можно по этой линии сразу и передать адрес устройства, и его опросить. Но тут опять мне кажется возможна коллизия, а вдруг 2 одновременно запросят.

inspiritus
Offline
Зарегистрирован: 17.12.2012

Когдатто давно, когда еще не было коаксиального  эзернета, я делал сеть типа токен ринг, только с дополнительным общим сигналом о передаче. 

Логика такая : все слушают. Один хочет говорить, если линия занятости в единице, значит никто сейчас не говорит и можно ее выставить в ноль и начинать передачу. Пока линия в нуле никто другой не начинает передавать. Главное не забыть ее выставить в ежиницу после окончания трансляции. У каждого слушающего свой адрес , передача может быть адресована только ему, при указании широковещательного адреса слушают все. За один сеанс говорящий можнт послать много пакетов разным адресатам ( у меня было не более 10). Всего устройств было 32, сигнал занятости передавался 20ма токовой петлей, расстояние устойчивой работы было около 200м, если рядом не электросваривали. 

Да, передача велась сом портом с уровнями (не , наврал не 12в) нулем с ок и монтажным или на диодах, 1200 бод, контроль четности. При большей частоте дальность уменьшалась.

rigl
Offline
Зарегистрирован: 15.10.2014

inspiritus пишет:

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

Логика такая : все слушают. Один хочет говорить, если линия занятости в единице, значит никто сейчас не говорит и можно ее выставить в ноль и начинать передачу. Пока линия в нуле никто другой не начинает передавать. Главное не забыть ее выставить в ежиницу после окончания трансляции. У каждого слушающего свой адрес , передача может быть адресована только ему, при указании широковещательного адреса слушают все. За один сеанс говорящий можнт послать много пакетов разным адресатам ( у меня было не более 10). Всего устройств было 32, сигнал занятости передавался 20ма токовой петлей, расстояние устойчивой работы было около 200м, если рядом не электросваривали. 

Да, передача велась сом портом с уровнями +-12в, 1200 бод, контроль четности. При большей частоте дальность уменьшалась.

Интересно, а на сколько вероятно, что 2 устройства сразу начнут передачу. Между чтением и записью проходит некоторое время, и другой мог начать чтение в этом промежутке.

inspiritus
Offline
Зарегистрирован: 17.12.2012

Каждый, не начав еще передавать проверяет линию занятости на предмет нуля, если есть ноль, передача откладывается.

rigl
Offline
Зарегистрирован: 15.10.2014

inspiritus пишет:

Каждый, не начав еще передавать проверяет линию занятости на предмет нуля, если есть ноль, передача откладывается.

Все верно, если запросы на проверку линии приходят с разницей более 1900 мкс (столько я прочитал на хабре длится DigitalRead(), а нужно время еще и на запись ), а если меньше, то 2 контроллера начнут передачу. Может конечно дискретность ниже, но все равно она есть.

inspiritus
Offline
Зарегистрирован: 17.12.2012

В те времена далекие, теперь почти былинные, писалось на ассемблере и вероятность коллизий была малозначительная.

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

_Shmel
Offline
Зарегистрирован: 22.09.2014

rigl пишет:

Отдельный пин на устройство жаба душит.

Дергать все по запросу конечно лучше, чем постоянно всех опрашивать.  Кстати можно по этой линии сразу и передать адрес устройства, и его опросить. Но тут опять мне кажется возможна коллизия, а вдруг 2 одновременно запросят.

Чем-то надо жертвовать. Если у вас устройств не много, то опрос всех на предмет выявления позвавшего времени много не займёт, а коллизий не будет. Будет очередь без приоритетов.

art100
Offline
Зарегистрирован: 09.03.2014

человек не понимат разницу между коммутацей звезда и шина

и такой длинный баян

шиза