slava68: (Default)
[personal profile] slava68
Решил разработать.

Канва байды:
- Центральная станция всё пишет на карточку с привязкой к "реальному времени".
- неограниченное количество remote-сенсоров, которые сами регистрируются в системе.
- протокол связи запрос-ответ и также возможность remote-сенсора инициировать сеанс связи.
- адаптация скорости передачи данных по радиоканалу (5 градаций), а также мощности передатчика (9 градаций) в зависимости от условий связи. Изменение частоты в случае помех на основной рабочей частоте.
-------------------
возможно, когда всё заработает, и если останется свободное место в памяти, прикручу шифрование радиоканала.

-------------
разрабатываю протокол радиообмена:

- размер пакета 200 байт (цифру взял с потолка) , можно менять в любую сторону. Буфер COM-порта 64 байта, неплохо бы уложиться.
- любой разумный пакет начинается на символ '+' , любые другие цифры в эфире - не наши.
- следом идёт контрольная сумма пакета.
- каждое устройство генерит random число из диапазона 10000-60000, которое будет служить идентификатором сессии и временем задержки для ответа на броадкаст пакеты, для устранения коллизий.
- каждое устройство и центральное устройство хранят параметры крайнего удачного сеанса связи (скорость, мощность, частоту).
- при проблемах связи пытаются установить контакт на минимальной скорости-максимальной мощности.
- обязательное подтверждение всех запросов-ответов.
- в пакете от центральной станции передаётся идентификатор адресата или "0" для всех.

---------------------------
пока сложности с float параметрами. Например, -12.625 градуса Цельсия. Для преобразования число->текст->число требуется привести к целому, и передавать отдельно "множитель".
Использую функцию: long data[i] = inputString.substring(pos + 1, semicolon).toInt(); для разборки пришедшей строки данных.
--------------------------
Уже немного "оживил" систему:
Пакеты шлются, подтверждаются. Т.к. UART занят передатчиком, то информацию для отладки пока вывожу на LCD индикатор.
кусочек кода: http://pastebin.com/qruDAXu8

Date: 2015-01-04 11:14 pm (UTC)
From: [identity profile] nepeanois.livejournal.com
а зачем float, все равно количество знаков после запятой ограничено двумя-тремя?

Date: 2015-01-04 11:34 pm (UTC)
From: [identity profile] slava68.livejournal.com
вот и неизвестно, двумя или тремя ... или четырьмя-пятермя :-(

Кто знает, для чего я эту систему буду применять.
Может быть это будет следующий диплом для моих студентов.
А может на завод ВПК продам :-)

Date: 2015-01-04 11:39 pm (UTC)
From: [identity profile] nepeanois.livejournal.com
а это можно менять при компиляции например

Date: 2015-01-04 11:48 pm (UTC)
From: [identity profile] slava68.livejournal.com
пока сделаю *100 /100, а потом подумаю, когда решу, что измерять.

У меня есть 6 "сейсмодатчиков" (акселерометр-магнитометр-гироскоп), и каждые 15 минут землетрясение 3-4 балла (живу возле железной дороги). Вот попробую сделать карту распространения ударной волны.

Date: 2015-01-04 11:52 pm (UTC)
From: [identity profile] nepeanois.livejournal.com
не надо делать "пока 100", потом менять по всему коду придется. лучше сразу делать 100 параметром для make или хотя бы const. :)

Date: 2015-01-05 12:02 am (UTC)
From: [identity profile] slava68.livejournal.com
мне нравится #define :-)))

Date: 2015-01-05 11:15 am (UTC)
From: [identity profile] whoozle.livejournal.com
Почему сто? Сделайте fixed point с варьируемым количеством бит. Тогда можно будет обойтись без деления, только сдвигом. Например 24.8 (8 бит после запятой).
Например, для случая 8
a + b, a - b, так же.
умножение: (a * b) >> 8
получение из целого : a << 8;
округление: (a + (1 << 7)) >> 8

Деление во всяких рисках может быть в сотню раз медленнее чем арифметика/сдвиги.

Date: 2015-01-05 11:25 am (UTC)
From: [identity profile] slava68.livejournal.com
да, я это знаю, но как уже понял по прошлому году, 99% студентов битовый сдвиг не могут понять.
Я даже выкинул его из программы в этом году. Если кому-то понадобится - найдут в интернете.
В данном проекте, самые основные затраты времени будут на передачу данных по радиоканалу.
Так что экономить время на делении, вероятно, придётся в самую последнюю очередь :-)

Date: 2015-01-05 05:07 pm (UTC)
From: [identity profile] whoozle.livejournal.com
Не могу согласиться, если что-то трудно и непонятно, это и надо объяснять, иначе как научиться-то? :( Мне всегда казалось что биты и возня с ними, это фундамент без которого ничего нельзя делать :(

Date: 2015-01-05 07:58 pm (UTC)
From: [identity profile] slava68.livejournal.com
Я сейчас перекопал весь интернет - такое ощущение, что никому не требовалось изменять NET ID и NODE ID на передатчиках APC220N-47A

В даташите написано, что можно менять, но в реале не работает, в тоже время специализированная программа их меняет.
Можно организовать "аппаратный роутинг" меняя ID "на ходу" и эта фича описана в даташите. Так и не нашёл реализацию :-(

Сейчас ставлю сниффер COM-порта, буду смотреть, что шлёт в порт эта специализированная программа.
-------------
Написано так:

Write command: WR_ Freq_NetID_Address↙

а работает так:

The command of writing parameters: WR_frequency_ RF data rate_output power_UART rate_series_check↙

Date: 2015-01-06 10:54 am (UTC)
From: [identity profile] whoozle.livejournal.com
http://www.control.aau.dk/~jdn/edu/courses/13-2/cansat/arduino-code/apc220Cfg/apc220Cfg.ino
А вот тут уже кто написал весь конфигурационный код

Date: 2015-01-06 11:37 am (UTC)
From: [identity profile] slava68.livejournal.com
Спасибо, этого я не видел, но этот код не меняет NET ID и NODE ID, а они сбрасываются в "0" при изменении параметров с помощью такой конфигурационной строки. Связь сразу же прерывается и не восстанавливается, пока не запрограммируешь их обратно с помощью специальной программки.

Вот, вчера пытался вытащить из протокола обмена , что она там делает...
----------
Image
немного разные программы , по разному опознают модуль APC220
Image
мне кажется, что нижняя более правильная.
Обе программы непрерывно шлют какой-то мусор в COM-порт, когда нажимаешь "Write" , появляется разумное зерно.
Но вот, как кодируется NET ID и NODE ID , я пока не понял.

Раз они его меняют, значит это можно сделать и посылкой пакета в COM-порт.

Date: 2015-01-06 11:44 am (UTC)
From: [identity profile] slava68.livejournal.com
Глянул на скриншот и увидел - NET ID от 0000 до FFFF :-)))
А NODE ID - 6 байт от 00 до FF последовательной записью :-)
Сейчас проверю ....

и точно :-)
Image

осталось теперь впихнуть это в передатчик через канал настройки из Ардуинки.

Edited Date: 2015-01-06 11:53 am (UTC)

Date: 2015-01-05 07:24 am (UTC)
From: [identity profile] hondetz.livejournal.com
А протокол, которым обмениваются устройства систем "умный дом" тебя не устраивают?
Мне кажется, что ты изобретаешь велосипед...

Date: 2015-01-05 08:09 am (UTC)
From: [identity profile] slava68.livejournal.com
Ну это и затевается не как серьёзное устройство, а как "изобретение велосипеда", учебное пособие.
Но за идею спасибо :-)
Edited Date: 2015-01-05 08:12 am (UTC)

c Хабры

Date: 2015-01-05 08:21 am (UTC)
From: [identity profile] slava68.livejournal.com
Z-Wave является запатентованным беспроводным протоколом связи, разработанным для домашней автоматизации, в частности для контроля и управления на жилых и коммерческих объектах. Технология использует маломощные и миниатюрные радиочастотные модули, которые встраиваются в бытовую электронику и различные устройства, такие как освещение, отопление, контроль доступа, развлекательные системы и бытовую технику.


Первое и пожалуй самое главное отличие тут — это то, что Z-Wave — протокол беспроводной. То есть, теперь мы абсолютно не привязаны к чему-либо (кроме розеток для некоторых устройств, пожалуй). Почти все девайсы питаются от батареек и по заявлениям, живут на них годы. Некоторые микромодули питаются прямо от сети 220В.
Так же, несомненным плюсом является то, что это mesh-сеть, в которой каждый узел или устройство может принимать и передавать управляющие сигналы другим устройствам сети, используя промежуточные соседние узлы. Mesh — это самоорганизующаяся сеть с маршрутизацией, зависимой от внешних факторов — например, при возникновении преграды между двумя ближайшими узлами сети, сигнал пойдет через другие узлы сети, находящиеся в радиусе действия.
Цены на железо нынче уже не особо кусачие.

Теперь о минусах (куда же без них). Самый главный и злейший минус для меня, как для разработчика своей системы, является закрытый протокол. Желающим получить спецификацию придется отвалить 10 килобаксов. Но, как оказалось, все не так плохо. Народные умельцы отреверсили протокол по самое немогу и написали опенсорсную реализацию под названием open-zwave. На С++. Есть биндинги к питону.

Re: c Хабры

Date: 2015-01-05 08:30 am (UTC)
From: [identity profile] hondetz.livejournal.com
Да-да. Я просто забыл его название...
Мне кажется, что вполне подойдёт, как основа для твоих игрушек.

Re: c Хабры

Date: 2015-01-05 11:01 am (UTC)
From: [identity profile] slava68.livejournal.com
Я задумался об использовании remote-блоков в качестве ретрансляторов. Это не сложно, введу в пакет данных запрос на ретранслятор и буду формировать таблицу маршрутизации.

Re: c Хабры

Date: 2015-01-05 11:05 am (UTC)
From: [identity profile] hondetz.livejournal.com
Попробуй... Если ещё будут нужны дурацкие и банальные идеи - обращайся! :)))))

Re: c Хабры

Date: 2015-01-05 11:35 am (UTC)
From: [identity profile] slava68.livejournal.com
Сетевой уровень

Протокол Z-Wave определяет алгоритм маршрутизации, позволяющий передавать данные между устройствами вне прямой видимости. Все постоянно работающие узлы сети (бывают ещё спящие и «часто слушающие» узлы) могу участвовать в пересылке пакетов между другими участниками сети. Z-Wave использует механизм Source Routing, т.е. маршрут следования определяется отправителем. Broadcast и multicast пакеты не маршрутизируются. При невозможности найти нужный узел по маршрутам, записанным в памяти, существует механизм поиска узла по всей сети путём посылки специального пакета Explorer Frame (см. ниже) всем узлам сети. После успешного нахождения узла новый маршрут записывается отправителем в память для последующего использования.

Re: c Хабры

Date: 2015-01-05 11:43 am (UTC)
From: [identity profile] hondetz.livejournal.com
А ещё есть готовые решения Z-Wave to USB и Z-Wave to Ethernet...

Re: c Хабры

Date: 2015-01-05 12:27 pm (UTC)
From: [identity profile] slava68.livejournal.com
Но я уже подумал поиграться с:

•ZigBee — очень популярный промышленный протокол. Используется в некоторых странах как стандарт для сбора данных с счётчиков и доставки до концентратора
•Плюсы — хорошо развит, имеет динамическую маршрутизацию (самоорганизующаяся сеть, где каждый узел хранит лишь таблицу с со списком кластеров и ближайшего соседа, который может доставить туда пакет — почти как в IP сетях), принят на вооружения многими телекомами и управляющими компаниями.
•Минусы — использует более загруженную полосу 2.4 ГГц (есть полоса 868 МГц, но она реже используется), стандартизирован лишь до транспортного уровня, что делает устройства разных производителей несовместимыми на прикладном уровне.

Тем более, на будущее, для Ардуинки есть такие шилды.

Profile

slava68: (Default)
slava68

February 2026

S M T W T F S
1234567
891011121314
15161718192021
22232425262728

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Feb. 13th, 2026 03:16 am
Powered by Dreamwidth Studios