|
10.04.2012, 13:13 | #1 |
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823 |
Описание протокола "Умный дом"
Протокол конечно можно заимствовать у Z-Wave или Smart-Bus
но это позже , сейчас на этапе тестирования и отладки буду использовать более простой самописный протокол. Если есть идеи и пожелания пишите Код:
[старт байт] [инднтнфикатор пакета] [ID узла] [команда] [состояние] [состояние] [состояние] [состояние] [стоп байт] FF '#' 1-FF 'D' 0-FF 0-FF 0-FF 0-FF FF Стартовый и стоповый байты служат для снижения ошибок при случайном возникновении помехи на линии Идентификатор направления пакета нужен для того что бы узлы понимали от кого идет пакет, от центрального или от второстепенного узла Правда я не уверен что это нужно, но пускай будет по взрослому *-пакет от второстепенного узла #-пакет от центрального узла ID узла-назначается центральным узлом в процессе настройки системы, так как устройств на шине не может быть больше чем 255 то и адресацию нет смысла делать больше чем 255. Тем более нет смысла делать адреса фиксированными(32 бита) так как это усложнит процесс настройки системы и увеличит длину пакета. Описание некоторых Команд: D-Управление Dimmer, Выключателями, Жалюзи, Розетками. Для Dimmer состояние может изменятся от 0-выкл до 255 -вкл. с шагом 10 Для выключателя используется статус с двумя состояниями 0 и 255 Для спаренного выключателя используется два статуса Для Жалюзи тоже самое что и для выключателя S-Команда для получения состояния устройства, устройство должно отправить центральному узлу пакет со своими состояниями 4 байта состояния потому что может быть спаренный выключатель плюс датчик тока в одном флаконе первые два байта это состояние диммеров или выключателей, а третий и четвертый байт состояния, это потребляемая мощность или ток нагрузки . M-Датчик движения, используется только для запроса статуса датчика. Датчик движения можно будет ассоциировать с любым выключателем( выключателями ) в сети, то есть датчик движения сможет включать любые источники. I-ИК предатчик для управляющего кода использует 4 байта состояния ИК предатчик можно будет ассоциировать с любым выключателем( выключателями ) в сети, то есть пульт от телевизора сможет включать любые источники. R-ИК приемник для управляющего кода использует 4 байта состояния T-Термостат, в статусе задается температура термостата C-Датчик температуры А-Датчик атмосферного давления W-Датчик влажности О-Датчик освещенности P-Датчик присутствия U-Ультразвуковой датчик приближения L-Датчик протечки E-Конец связи, после этой команды на шине на 10 сек. наступает тишина и это даст возможность устройствам в порядке своей адресации (очередности) отправлять статусы центральному узлу или обмениваться с другими узлами. Например вы включили выключателем свет, а центральный узел об этом не будет знать в течении 10сек., то есть до следующего опроса статусов центральным узлом . В общем эта команда дает устройствам разрешение самим отправлять статус не дожидаясь запроса центрального узла. |
01.11.2012, 19:37 | #2 |
Senior Member
Регистрация: 16.09.2012
Адрес: Irkutsk
Сообщений: 555
Вес репутации: 1605 |
Modbus RTU
А я вот все думал над этой темой и решил все-же применить промышленный протокол MODBUS RTU. Благо с нуля писать не нужно есть хорошая библиотека. Ссылка для закачки
Автор: Stéphane Raimbault Можно обвязывать в сеть несколько Ардуин по RS485, собрав простую схему на МС max485. Для отладки можно использовать Free QModbus. Для роутера(ов) на базе OpenWrt можно также применить готовую библиотеку этого автора, в репозитариях уже есть полноценная библиотека libmodbus для работы как по Modbus RTU, так и по Modbus TCP/IP. Есть описание и примеры использования. https://github.com/stephane/libmodbus https://github.com/stephane/libmodbu...ive/master.zip Единственный не приятный момент, для написания сервера или клиента на Си нужно делать кросс-компиляцию под роутер. Хотя настоящих джидаев это не остановит Думаю скоро выложу программку под роутер Последний раз редактировалось andr128; 11.11.2012 в 09:00. |
05.06.2014, 11:18 | #3 |
Senior Member
|
Re: Modbus RTU
Теперь этого не нужно. Настоящие джедаи всё делают из shell'а
__________________
Россия навсегда! |
01.11.2012, 21:24 | #4 |
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823 |
Спасибо!
Очень интересная находка, а главное не нужно изобретать велосипед |
10.11.2012, 14:12 | #5 |
Senior Member
Регистрация: 16.09.2012
Адрес: Irkutsk
Сообщений: 555
Вес репутации: 1605 |
тестирование Modbus на Arduino
Мои эксперименты с Modbus
В arduino залита следующая программа: Код:
/* Test Modbus RTU - Arduino Для простоты и уменьшения потребления памяти поддерживается только две следующие функции Modbus: - read holding registers (0x03) - write multiple registers (0x10) */ #include <SoftwareSerial.h> #include <Modbusino.h> const int RL0 = 22; const int RL1 = 24; const int RL2 = 26; const int RL3 = 28; const int rl_arr[] = {RL0,RL1,RL2,RL3}; const int regs = 10; // количество регистров const int ID_slave = 25; uint16_t tab_reg[regs]; //задаем массив регистров // Инициализация SLAVE, идентификатор (адрес) в сети ID = 25 ModbusinoSlave modbusino_slave(ID_slave); // на цифр. выходы сразу записываем значение регистров // любое значение > 0 это HIGH, 0 - LOW void SetRelay() { int i; for (i = 0; i < 4; i++) { digitalWrite(rl_arr[i], tab_reg[i]); } } void setup() { modbusino_slave.setup(115200); pinMode(RL0, OUTPUT); // установка цифровых вх/вых в режим выхода pinMode(RL1, OUTPUT); pinMode(RL2, OUTPUT); pinMode(RL3, OUTPUT); } void loop() { modbusino_slave.loop(tab_reg, regs); SetRelay(); tab_reg[9] = analogRead(A0); //запись аналогового значения в 9-ый регистр } здесь я щелкаю реле а здесь читаю аналоговый вход На время эксперимента я специально подключился с помощью стороннего преобразователя TTL-USB к serial порту RX0, TX0 т.к. планирую сделать TTL-RS485 преобразователь на MAX485. Чтобы все было "по взрослому" вот планируемая схема ttl-rs485.zip Последний раз редактировалось andr128; 17.12.2012 в 05:50. |
23.11.2012, 07:36 | #6 |
Senior Member
Регистрация: 02.04.2012
Адрес: Питер
Сообщений: 1,125
Вес репутации: 1311 |
Савсем не могу понять как это будет работать!
Вот к примеру у меня дома на каждое помещение стоит по ардуине. Прихожая, ванна, кухня, две комнаты. Итого пять штук. Это к примеру!!! В прихожей стоит мегаардуина, она будет главной и подключена к домашнему серверу. Сначала думал сервером будет роутер, но потом решил что будет роутер, а за ним полноценный комп-сервер, формфактор пока неважен (ноутбук например), просто хочу чтоб в прихожей на стене был монитор с тачскрином. На нём будет включаться/отключаться сигнализация и выводится всякие данные. Также вся инфа и управление будет доступна через инет (web-браузер), чтоб можно было и с андройдтелефона и с айпада всем рулить откуда угодно.Так же планируется пара IP-вебкамер, и в прихожей камера напрямую к серверу подключенная. В общем здесь всё просто, соединить мегаардуину с сервером, написать веб интерфейс, настроить apache. GSM-сигнализация, подключается к мегаардуине. В случае отключения электроэнергии ноутбуку-серверу это не повредит, равно как и мегаардуине подключённой к нему по USB, вот для остальных ардуин и GSM нужно делать автономное питание, какой-то аккумулятор. Я немного отвлёкся от протокола, но с другой стороны от части из организации железа вытекает понимание как всё это связать. Ардуины размещённые в разных помещениях следят за разными датчиками, показаниями и управляют устройствами (свет, жалюзи, медия, розетки и ещё чёрте что). Квартира у меня сейчас находится в затяжной стадии ремонта, посему с проводами проблем нет! Но вот как проложить эти самые провода? А больше всего интересует как все ардуины будут общаться меж собой по RS-485? Вот предположим все они находятся в режиме приёма. Выключатель на кухне ( к примеру инфракрасный ) http://cyber-place.ru/showthread.php?t=237 ,работает через "кухонную ардуину" , он дал сигнал и свет зажёгся. По идее "кухонная ардуина" должна сообщить об этом основной мегаардуине. (тут наверно ещё стоит добавить базу MySQL на сервер, чтоб мегаардуина записала в неё что свет на кухне включен). (хотя всё можно и в мегаардуине хранить без базы, но с базой мне кажется лучше, значения никуда не потеряются в случае чего.....) А "ванная ардуина" в этот момент пытается сообщить мегаардуине что протечка воды. И в тот же момент, жена сидя в комнате, нажимает кнопку на айпаде выключить свет. Этот сигнал идёт на сервер, с сервера на мегаардуину, а та в свою очередь пытается отправить сигнал на "комнатную ардуину", чтоб та выключила свет. После чего "комнатная ардуина" выключая свет пытается отправить сигнал на мегааардуину о том , что она выключила свет, далее мегаардуина должна сообщить серверу что, свет в комнате погашен и чтоб сервер отправил сигнал об этом жене на айпад! Тут тоже получается , что страница должна постоянно обновляться или как-то по другому? А я в тот же момент со своего андройдфона, выключаю свет в другой комнате, после чего произойти должно тоже что и у жены на айпаде. Конечно некоторые действия могут подождать чутка, но другие требуют оперативности! И начинается такая чахорда от которой у меня голова кругом идёт))))) правда щас уже 7 утра , а я ещё не спал))))) Вопщем с этим RS-485 салат какой-то........))))) И это всего лишь маленькая-маленькая часть функций "умного дома" )))))))) Извиняйте за ошибки, спать охота.....)))) Последний раз редактировалось stD; 23.11.2012 в 08:12. |
23.11.2012, 08:08 | #7 |
Senior Member
|
вот честно говоря все тоже самое у меня в голове сейчас происходит
|
23.11.2012, 20:29 | #8 |
Senior Member
Регистрация: 16.09.2012
Адрес: Irkutsk
Сообщений: 555
Вес репутации: 1605 |
Мда, много написали и сами запутались.
1. Все управляемые ардуины в сети должны иметь свой уникальный ID адрес. 2. Ардуины должны работать только в режиме прослушивания, т.н. режим помощник и не чего ни куда не передавать без команды от головного ПК (Роутера). 3. Главный ПК работает в режиме - мастер. По его инициативе происходит периодический опрос и управление помощниками. Он в цикле перебирает всех помощников сохраняет переменные их состояния в свою базу (таблицу переменных), а также по инициативе пользователя либо по алгоритму меняет состояние выходов помощников т.е. управляет ими. Вот собственно и весь алгоритм. Что будет у вас работать в режиме мастера, решать вам. Эту роль может выполнять ПК или роутер. Для Ардуины эту роль поручать не стоит, ввиду низкой производительности, малого объема памяти и т.д., а быть просто посредником между более мощным железом нет смыла. На роутере или ПК можно уже "городить" сайт и т.д. и т.п. чтобы управлять уже по более "высокому уровню". Последний раз редактировалось andr128; 23.11.2012 в 20:40. |
23.11.2012, 21:59 | #9 | |
Senior Member
Регистрация: 02.04.2012
Адрес: Питер
Сообщений: 1,125
Вес репутации: 1311 |
Цитата:
Далее по пунктам: 1. Это само собой! 2. ? 3. К главному пк как предполагаешь подключаться? Я перед ним хотел мегаардуину поставить на случай если комп глюканёт и потребуется перезагрузка!!! Мне кажется имеет смысл оставить её как посредника! А если глюканёт ардуинную сеть, то можно все состояния взять с сервера из БД. По второму вопросы ещё не сформировал! Последний раз редактировалось stD; 23.11.2012 в 22:07. |
|
24.11.2012, 00:02 | #10 |
Member
Регистрация: 23.11.2012
Сообщений: 47
Вес репутации: 184 |
Скажите, а почему вы не расматриваете например протокол 1-wire вместе с RS 485? ведь легко на 1-wire повесить чтение и управление устройствами и датчиками , а на RS 485 взаимодествие между собой ардуин например?
|
Здесь присутствуют: 8 (пользователей: 0 , гостей: 8) | |
|
|