Наверное, это такое психическое расстройство — стремление во что бы то ни стало реализовать что-то свое, желательно с нуля. Особенно приятно предварительно разрушить до основания сделанное предшественниками. Неуемное желание построить собственный велосипед объясняется и тем, что все существующие на текущий момент решения обязательно обладают фатальными недостатками — слишком мало колес, чрезмерное количество педалей, неудобно рулить при посадке задом наперед и так далее. Тут включается буйная фантазия, и через некоторое время мировая общественность оказывается осчастливлена принципиально новым транспортным средством, эксклюзивно адаптированным для двух рептилоидов и одного енота.
Это я собственно к тому, что мне всегда хотелось построить свою систему домашней автоматизации. Наподключать кучу датчиков и исполнительных устройств, настроить нужную непосредственно мне логику работы, и наслаждаться затяжным отловом интересных багов. Конечно, можно воспользоваться готовыми решениями. Сейчас на рынке немало интересных устройств для «умного дома», а уж если подходить к вопросу монументально, то почему бы не построить систему на базе промышленных ПЛК и модулей ввода-вывода? Завести все это добро в SCADA-систему… Довольно заманчиво. Но творческий зуд не позволяет воспользоваться многолетними наработками сотен и тысяч других людей, именно так начинается капоэйра на граблях.
Немного здравого смысла у меня еще осталось. К тому же, из шкафов и с полок на меня периодически с немым укором посматривают незаконченные устройства, до которых я должен добраться «когда-нибудь». Так что, надо поставить себе относительно реальную задачу, решение которой можно довести до логического завершения. Итак, начнем с управления освещением в небольшой городской квартире.
Отталкиваюсь от следующих тезисов:
1) Капитальный ремонт. В плане силовой и слаботочной проводки руки полностью развязаны.
2) Хребет системы — только проводной. Ни на Wi-Fi, ни на 433 МГц в критичных областях не полагаюсь.
3) Минимальное использование готовых устройств и блоков. Для самообразования, прокачки навыков разработки, монтажа, программирования.
Теперь конкретизирую.
1) Основное освещение — светодиодная лента. Лампочки отправляем на свалку истории. Дополнительное освещение — люминесцентные лампы. Это для птичек. Их зрение от нашего изрядно отличается, поэтому для того, чтобы им было хорошо и комфортно, применяются полноспектральные лампы с некоторым количеством ультрафиолета.
2) Включение-выключение (для всех осветительных приборов) и регулировка яркости (для лент) должны осуществляться как вручную, так и программно.
3) Для нештатных ситуаций необходим «железный» обход системы. Грубо говоря, «мозги» отрубились — переходим на ручное управление.
Сейчас я сосредоточен на втором пункте. Здесь выделены следующие задачи:
1) Формирование списка исполнительных устройств. Всего два. Драйвер светодиодной ленты и «реле». В кавычках — потому что по факту оно симисторное.
2) Список управляющих устройств. Тоже два. Регулятор с кнопкой и просто кнопка.
3) Выбор способа связи. На нем нужно остановиться подробнее.
Раз уж я решил, что будут использоваться провода, то вариантов немного. Можно использовать Ethernet. Одна сеть, все на TCP/IP. Заманчиво. Но когда я себе представил микроконтроллер с Ethernet и единственной кнопкой, мне стало немного грустно. Идем дальше, в сторону уменьшения количества проводов и минимизации требований к железу. Готовое решение — DMX512. На низком уровне RS-485, все достаточно просто в реализации, но нет обратной связи. Что еще? CAN? Хороший промышленный вариант, но хочется еще проще. Modbus по RS-485? Уже теплее. Но как же велосипедостроение? К тому же, я уже настроился на использование дешевых микроконтроллеров с минимальной обвязкой. И вот оно, решение. Возьму-ка я RS-485, да придумаю для него свой эрзац-протокол. При этом, правда, надо оставить путь к отступлению. Если закопаюсь, то снова вернусь к рассмотрению Modbus.
Так что, сеть RS-485, мастер — компьютер (малинка, скорее всего), все остальные устройства — ведомые. В плане железа — ATmega328 + MAX485. Контроллер именно такой по причине наличия нескольких штучек, при удачном раскладе в «серийном» устройстве заменяется на ATmega8. Пакет состоит из пяти байт. Адрес устройства, код команды, два регистра данных и контрольная сумма. Ведущий отправляет пакет, все ведомые его принимают и разбирают. Если адрес совпадает и контрольная сумма верная — выполняются определенные действия и отправляется подтверждение. По-моему, проще уже некуда.
За дело я решил взяться «с середины». Силовая разводка и всякие устройства защиты — это потом, поскольку тут все относительно понятно. А вот в проектировании и отладке новых для меня устройств будет много веселых открытий, поэтому я начинаю с железа. А точнее — с двух устройств, регулятора и драйвера светодиодной ленты.
Регулятор
Механический энкодер с кнопкой, микроконтроллер, адаптер RS-485. Сначала реализую связь, потом собственно обработку энкодера. Связь работает следующим образом:
1) При включении устройства значения регистров устанавливаются в 0. Позднее будут загружаться из EEPROM. Адрес забит в коде, и тоже в дальнейшем будет храниться в энергонезависимой памяти (заглушка процедуры смена адреса имеется).
2) В процессе инициализации настраивается режимы работы UART и таймера (используется для прекращения приема по таймауту)
3) На соединенных вместе пинах ~RE и DE адаптера MAX485 низкий уровень — это режим приема.
4) Ожидание приема первого пакета. Как дождались — запускаем таймер и принимаем еще четыре байта.
5) В случае успеха приема пятибайтового пакета и корректной контрольной суммы (это действительно просто сумма, не CRC) пакет можно парсить.
6) При совпадении адреса в пакете с адресом устройства проверяем код команды (второй байт пакета), в зависимости от него выполняем требуемые действия (например, записываем в переменные значения третьего и четвертого байта). В рамках описываемой системы я называю эти переменные регистрами устройства.
7) Отправляем подтверждение: на ~RE и DE высокий уровень, разрешение передачи, отправка пакета (с адресом мастера, каким-то кодом команды и текущим значением регистров устройства).
8) GOTO 3
Таймаут приема отслеживается просто: изначально флаг таймаута — 0. По прерыванию таймера он устанавливается в 1. Этот флаг проверяется в цикле ожидания четырех байтов пакета.
Теперь обработка энкодера. Принцип я почерпнул отсюда.
Вкратце — храним текущее состояние энкодера, по прерыванию таймера считываем новое. В зависимости от того, что изменилось — определяем, куда повернулась ручка и нажималась ли кнопка. Так что, в пункт 2 вышеприведенного списка добавляется инициализация Timer2 с расчетом на то, что прерывание будет происходить примерно с частотой 1 кГц. Плюс, чтобы гарантированно не мешать работе UART, в процессе чтения или записи в 0 выставляется флаг разрешения опроса энкодера (проверяется в обработчике прерывания второго таймера).
Собственно, больше ничего регулятору уметь не нужно.
Я не описываю ошибки в разводке и другие мелкие неприятности. Отмывать плату тоже пока ни к чему — пару тычков паяльником она еще получит
О граблях на данном этапе
С энкодером у меня была только одна неприятность. Она вообще была связана со всеми устройствами. Периодически в сети возникал лишний нулевой байт, который сильно портил картину. При условии наличия отсутствия осциллографа и логического анализатора, проблему пришлось искать теоретически. Оказалось достаточным подтянуть TX к Vcc, чтобы при переключении «прием-передача» не происходило ненужных процессов.
Драйвер
Задачу со связью мы уже решили. Берем то, что касается RS-485 из реализации регулятора и добавляем ШИМ на одном выходе посредством Timer2. Первый регистр устройства отвечает за яркость, второй за включение и выключение выхода как такового. В плане железа — использую уже проверенную схему из двух биполярных транзисторов (раньше были BC639 и BC640, сейчас использую SMD BCP53 и BCP56), на выходе — IRF540. Интересных приколов с драйвером не было, если не считать таковым глючный 12-вольтовый источник питания, работа которого приводила к зависанию всей системы разом.
Тут тоже немало монтажного безобразия. Ранний прототип, что уж там.
Общие замечания по «железу»
Микроконтроллеры тактируются на 8 МГц без внешнего кварца. Обвязка по питанию состоит из единственного конденсатора на 100 нФ. Вывод ~RST подтянут к питанию через резистор в 10 кОм. Я уже упоминал о том, что стабильность работы кардинально улучшилась после подтяжки TX к линии питания. При сооружении регулятора я не стал полагаться на внутренние подтягивающие резисторы (на пинах, к которым подключен энкодер), а использовал внешние. Больше никаких ухищрений (пока?) не потребовалось. Линия RS-485 подтянута к Vcc (A) и GND (B) через резисторы в 560 Ом со стороны ведущего адаптера, с двух концов терминирована резисторами в 120 Ом.
Проект доступен на гитхабе, структура следующая:
— avr-dimmer — прошивка драйвера (проект Eclipse+AVR);
— avr-encoder — прошивка регулятора;
— host — софт мастера сети (Python), о нем в следующий раз;
— в корне лежат схемы (Eagle) и разводки печатных плат (Sprint Layout 6).
В следующий раз я расскажу о том, что происходит на стороне хоста (мастера сети).
UPD. 2015-07-19 вторая часть, в железе тоже есть изменения.
Комментарии (26)
Zibx
15.07.2015 01:13+4Слаботочную воду ещё хорошо заложить в стену пока не поздно, иначе полив растений и автонаполнение поилок для домашних животных нормально не автоматизировать.
eta4ever
15.07.2015 01:16А это эпичная идея, кстати. Записываю в TODO. Начало боевого внедрения всего прогнозируется на следующую весну, так что, обдумать и подготовиться успею.
Zibx
15.07.2015 14:26+1В идеале это 3 трубы. Горячая, питьевая, канализация. Выход в канализацию нужен для возможности создания систем очистки поверхностей или подключения стиральной\посудомоечной\кофе машины в любой части дома. Опять же, горячая вода не будет сразу горячей и будет возможность сливать её до нужной температуры. Главное разумно подойти к выбору коммуникаций и выбрать то что имеет запас прочности хотя бы в 100 лет.
eta4ever
15.07.2015 15:20Ну, это совсем в идеале. Тогда еще добавить трубу с вакуумом — центральный пылесос.
Gordon01
15.07.2015 09:04Ничего так не радует в хорошем ремонте, как хорошая, многофункциональная вентиляция с кондиционером, скрытая за фальшпотолком и не шумящая.
eta4ever
15.07.2015 11:50С потолком 2.55 особо не разгуляешься, к сожалению.
safari2012
15.07.2015 12:46По любому, стоит заложить в стены кабели питания, межблочные кабели и медные трубки для сплитов. Кабели с запасом, т.к. питание может подаваться как к внутреннему блоку, и так и к внешнему. Также можно заранее заложить трубки для слива конденсата в канализацию.
eta4ever
15.07.2015 15:31Сейчас прикинул, действительно, бутербродная конструкция будет выглядеть очень неплохо
А при переходе на два слоя, так и вообще.ssg1712
15.07.2015 16:47Я бы «умял» верхнюю и сделал ее шилдом. А нижнюю уже под конкретную задачу и как основную делал с радиаторами клеммниками и т.д.
Посмотрите как выглядит микроконтроллерный модуль coolrf и диммер habrahabr.ru/company/coolrf/blog/208396. У них там на диммере посадочное место для старого модуля, но, я думаю, суть понятна.eta4ever
15.07.2015 18:14Я так прикинул, что в моем случае функциональные платы будут совсем небольшими. Поэтому, наверное, остановлюсь на «большой» основе.
safari2012
15.07.2015 20:38Ежели хозяин или его домочадцы интересуются аквариумистикой, то можно ещё заложить трубы для смены воды/протоки.
dsd_corp
15.07.2015 22:49А зачем нужны два биполярника перед полевиком? В чем их роль? Почему нельзя(ну, из схемы, видимо, это следует) оставить только полевик, оставив R3 между ним и ногой МК и дополнительно притянув затвор к земле чем-то более высокоомным «килограмм на пиисят»(да и то подтяжка на случай ноги в режиме аппаратного ШИМ, когда при выключенной генерации нога болтается в воздухе, так-то и она, наверное, не нужна)?
Я не умничаю, мне действительно интересно, у меня пока еще проблемы с пониманием ключевых цепей «нафига эти лишние детальки», усиленные фактами того, что встречаю разную схематику, как где их ставят, так и где их не ставят…eta4ever
15.07.2015 22:59+1По-моему, я вдохновлялся вот этим постом: joost.damad.be/2012/09/dimming-12v-led-strip-with-mosfet-and.html
Глубинным знанием темы похвастаться не могу, но, насколько понимаю, идея в том, чтобы обеспечить больше тока на затворе полевика, чтобы он резче открывался. И быстрый же «спуск» заряда с затвора для закрытия.dsd_corp
15.07.2015 23:44Вот когда надо ускорить полевик, к примеру, в DC-DC ШИМ-преобразователях, я понимаю.
Но для управления светодиодами, в т.ч. через аппаратный ШИМ, сам юзаю обычно IRLML2502, IRLML5203 либо их связку, в зависимости от требуемого поведения. Резисторы [нога_МК/подтяжка] обычно порядка 150Ом/10-50кОм. Даже на высоких частотах(4kHz) ШИМить светодиоды их скорости хватает, ничего вроде не греется и видимая яркость весьма плавненько меняется. Правда я прям здоровенные гирлянды светиков не юзаю, мож при больших нагрузках и будет греть транзисторы за счет медленного перехода пограничного состояния, не знаю…
Еще вот тут схему подтяжки D+ 1.5k в USB не очень понимаю ( github.com/leaflabs/maplemini/blob/master/maplemini.pdf ), хотя догадываюсь, что шина USB 5V между транзисторами вставлена для того, чтоб если питалово платы в данный момент не от USB, то подтяжка автоматом не включалась, ибо будет неоткуда.
dsd_corp
15.07.2015 23:51P.S. спасибо за ссылку. Многое объясняет. Действительно, при большой нагрузке это вполне имеет смысл. Ну и про шунтирующий кондер особенно понравилось )
eta4ever
16.07.2015 00:04+1Ага, с конденсатором у него там целая поэма (если следующие посты посмотреть).
По maple вот что нашел: forums.leaflabs.com/topic.php?id=1284, второй и третий посты сверху.dsd_corp
16.07.2015 01:26>> с конденсатором у него там целая поэма (если следующие посты посмотреть).
Посмотрю, спасибо. Ну интересен там не столько сам кондей, сколько причины его установки. Сам на осциллографе регулярно наблюдал этот «звон» на спадах, но как-то никогда не заострял на нем внимание. Типа работает схема и фиг с ней. Теперь буду в курсе что это и что с этим делать в случае надобности. Полезно.
>> По maple… второй и третий посты сверху.
Ага, теперь ясно, ради спеков USB на наличие VBUS завязка. В общем-то только третий сверху пост значимый. Примечательно, что ссылка на картинку в нем ведет на сайт DIHALT'а )))
progchip666
15.07.2015 00:26+1По моему вы экономите не совсем на том, на чём следует. В последнюю очередь в подобной схеме это делать на блокировочных конденсаторах.
eta4ever Автор
15.07.2015 00:32Можно конкретизировать? Я даже не обижусь на обвинение в том, что «чукча апноутов не читатель». Реально, нужно больше и лучше конденсаторов по питанию? С учетом того, что длинных линий 5В не будет. Скорее всего, у каждого устройства будет свой стабилизатор с обвязкой или DC-DC преобразователь.
ssg1712
15.07.2015 11:37+1Нужно собрать стабилизатор с конденсаторами из даташита и рядом с каждой ногой, к которой подходит питание, каждой микросхемы поставить по 0,1мкФ. Причем максимально близко. Поисковая фраза decoupling capacitors.
Пользуясь случаем, если позволите добавлю пару рекомендаций. Наверняка вам будет очень удобно развести единый универсальный модуль микроконтроллера, а к нему уже подключать дочерние платы с разным функционалом. Вы сможете сделать очень маленькую, хорошую, двустороннюю плату и заказать за 10-20 долларов партию в Китае с шелкграфией и маской. Все равно у вас этот дизайн будет кочевать из проекта в проект. Примерно так делают COOL RF.
И еще могу порекомендовать сделать гальваническую развязку RS485.eta4ever Автор
15.07.2015 11:54По конденсаторам понял, спасибо. Идея сделать бутербродную конструкцию (а-ля Arduino с шилдами) была, возможно, действительно стоит посмотреть в этом направлении. По гальванической развязке — с одной стороны, вроде, с ней лучше чем без нее. С другой — наблюдаю уже лет 5-10 несколько промышленных решений, там оно вполне себе работает на сотнях метров линии в соседстве с частотниками на киловатты и десятки киловатт, на тех же простейших MAX-что-то-там. Поэтому в острой необходимости не уверен.
Zibx
15.07.2015 01:13+4Слаботочную воду ещё хорошо заложить в стену пока не поздно, иначе полив растений и автонаполнение поилок для домашних животных нормально не автоматизировать.
eta4ever Автор
15.07.2015 01:16А это эпичная идея, кстати. Записываю в TODO. Начало боевого внедрения всего прогнозируется на следующую весну, так что, обдумать и подготовиться успею.
Zibx
15.07.2015 14:26+1В идеале это 3 трубы. Горячая, питьевая, канализация. Выход в канализацию нужен для возможности создания систем очистки поверхностей или подключения стиральной\посудомоечной\кофе машины в любой части дома. Опять же, горячая вода не будет сразу горячей и будет возможность сливать её до нужной температуры. Главное разумно подойти к выбору коммуникаций и выбрать то что имеет запас прочности хотя бы в 100 лет.
eta4ever Автор
15.07.2015 15:20Ну, это совсем в идеале. Тогда еще добавить трубу с вакуумом — центральный пылесос.
Gordon01
15.07.2015 09:04Ничего так не радует в хорошем ремонте, как хорошая, многофункциональная вентиляция с кондиционером, скрытая за фальшпотолком и не шумящая.
eta4ever Автор
15.07.2015 11:50С потолком 2.55 особо не разгуляешься, к сожалению.
safari2012
15.07.2015 12:46По любому, стоит заложить в стены кабели питания, межблочные кабели и медные трубки для сплитов. Кабели с запасом, т.к. питание может подаваться как к внутреннему блоку, и так и к внешнему. Также можно заранее заложить трубки для слива конденсата в канализацию.
eta4ever Автор
15.07.2015 15:31Сейчас прикинул, действительно, бутербродная конструкция будет выглядеть очень неплохо
А при переходе на два слоя, так и вообще.ssg1712
15.07.2015 16:47Я бы «умял» верхнюю и сделал ее шилдом. А нижнюю уже под конкретную задачу и как основную делал с радиаторами клеммниками и т.д.
Посмотрите как выглядит микроконтроллерный модуль coolrf и диммер habrahabr.ru/company/coolrf/blog/208396. У них там на диммере посадочное место для старого модуля, но, я думаю, суть понятна.eta4ever Автор
15.07.2015 18:14Я так прикинул, что в моем случае функциональные платы будут совсем небольшими. Поэтому, наверное, остановлюсь на «большой» основе.
safari2012
15.07.2015 20:38Ежели хозяин или его домочадцы интересуются аквариумистикой, то можно ещё заложить трубы для смены воды/протоки.
dsd_corp
15.07.2015 22:49А зачем нужны два биполярника перед полевиком? В чем их роль? Почему нельзя(ну, из схемы, видимо, это следует) оставить только полевик, оставив R3 между ним и ногой МК и дополнительно притянув затвор к земле чем-то более высокоомным «килограмм на пиисят»(да и то подтяжка на случай ноги в режиме аппаратного ШИМ, когда при выключенной генерации нога болтается в воздухе, так-то и она, наверное, не нужна)?
Я не умничаю, мне действительно интересно, у меня пока еще проблемы с пониманием ключевых цепей «нафига эти лишние детальки», усиленные фактами того, что встречаю разную схематику, как где их ставят, так и где их не ставят…eta4ever Автор
15.07.2015 22:59+1По-моему, я вдохновлялся вот этим постом: joost.damad.be/2012/09/dimming-12v-led-strip-with-mosfet-and.html
Глубинным знанием темы похвастаться не могу, но, насколько понимаю, идея в том, чтобы обеспечить больше тока на затворе полевика, чтобы он резче открывался. И быстрый же «спуск» заряда с затвора для закрытия.dsd_corp
15.07.2015 23:44Вот когда надо ускорить полевик, к примеру, в DC-DC ШИМ-преобразователях, я понимаю.
Но для управления светодиодами, в т.ч. через аппаратный ШИМ, сам юзаю обычно IRLML2502, IRLML5203 либо их связку, в зависимости от требуемого поведения. Резисторы [нога_МК/подтяжка] обычно порядка 150Ом/10-50кОм. Даже на высоких частотах(4kHz) ШИМить светодиоды их скорости хватает, ничего вроде не греется и видимая яркость весьма плавненько меняется. Правда я прям здоровенные гирлянды светиков не юзаю, мож при больших нагрузках и будет греть транзисторы за счет медленного перехода пограничного состояния, не знаю…
Еще вот тут схему подтяжки D+ 1.5k в USB не очень понимаю ( github.com/leaflabs/maplemini/blob/master/maplemini.pdf ), хотя догадываюсь, что шина USB 5V между транзисторами вставлена для того, чтоб если питалово платы в данный момент не от USB, то подтяжка автоматом не включалась, ибо будет неоткуда.
dsd_corp
15.07.2015 23:51P.S. спасибо за ссылку. Многое объясняет. Действительно, при большой нагрузке это вполне имеет смысл. Ну и про шунтирующий кондер особенно понравилось )
eta4ever Автор
16.07.2015 00:04+1Ага, с конденсатором у него там целая поэма (если следующие посты посмотреть).
По maple вот что нашел: forums.leaflabs.com/topic.php?id=1284, второй и третий посты сверху.dsd_corp
16.07.2015 01:26>> с конденсатором у него там целая поэма (если следующие посты посмотреть).
Посмотрю, спасибо. Ну интересен там не столько сам кондей, сколько причины его установки. Сам на осциллографе регулярно наблюдал этот «звон» на спадах, но как-то никогда не заострял на нем внимание. Типа работает схема и фиг с ней. Теперь буду в курсе что это и что с этим делать в случае надобности. Полезно.
>> По maple… второй и третий посты сверху.
Ага, теперь ясно, ради спеков USB на наличие VBUS завязка. В общем-то только третий сверху пост значимый. Примечательно, что ссылка на картинку в нем ведет на сайт DIHALT'а )))
progchip666
По моему вы экономите не совсем на том, на чём следует. В последнюю очередь в подобной схеме это делать на блокировочных конденсаторах.
eta4ever
Можно конкретизировать? Я даже не обижусь на обвинение в том, что «чукча апноутов не читатель». Реально, нужно больше и лучше конденсаторов по питанию? С учетом того, что длинных линий 5В не будет. Скорее всего, у каждого устройства будет свой стабилизатор с обвязкой или DC-DC преобразователь.
ssg1712
Нужно собрать стабилизатор с конденсаторами из даташита и рядом с каждой ногой, к которой подходит питание, каждой микросхемы поставить по 0,1мкФ. Причем максимально близко. Поисковая фраза decoupling capacitors.
Пользуясь случаем, если позволите добавлю пару рекомендаций. Наверняка вам будет очень удобно развести единый универсальный модуль микроконтроллера, а к нему уже подключать дочерние платы с разным функционалом. Вы сможете сделать очень маленькую, хорошую, двустороннюю плату и заказать за 10-20 долларов партию в Китае с шелкграфией и маской. Все равно у вас этот дизайн будет кочевать из проекта в проект. Примерно так делают COOL RF.
И еще могу порекомендовать сделать гальваническую развязку RS485.
eta4ever
По конденсаторам понял, спасибо. Идея сделать бутербродную конструкцию (а-ля Arduino с шилдами) была, возможно, действительно стоит посмотреть в этом направлении. По гальванической развязке — с одной стороны, вроде, с ней лучше чем без нее. С другой — наблюдаю уже лет 5-10 несколько промышленных решений, там оно вполне себе работает на сотнях метров линии в соседстве с частотниками на киловатты и десятки киловатт, на тех же простейших MAX-что-то-там. Поэтому в острой необходимости не уверен.
eta4ever
И max485 свой конденсатор поставить стоит?