четверг, 19 марта 2015 г.

Протокол обмена

Надо придумать протокол обмена между управляющей программой (УП) и блоками. Напомню, связаны они по ethernet. 
Я остановился на tcp. Соединение устанавливает УП в начале работы и держит его постоянно. Когда УП нужно включить реле или диммер, она отправляет соответствующую команду.  Когда меняется значение входа, блок отправляет команду УП.
Пакеты с командами будут бинарными. Я вначале хотел использовать ascii формат, но парсить их не так удобно, а вручную к устройству проще обращаться по http через браузер.
Формат придумался такой - байт длины, байт команды, данные и crc16. 
Данные представляют собой простые упакованные структуры (а на avr выравнивания как раз нет). На питоне для упаковки/распаковки можно использовать встроенный модуль struct. Для расширяемости достаточно договориться, что смысл и размер имеющихся полей не меняется, а новые поля добавляются в конец пакета и игнорируются старыми версиями устройств.
Crc в tcp есть свое собственное, но оно обрабатывается отдельной платой (w5100 в ethernet шилде), а процессор от нее получает только данные. Вот для защиты от помех на spi crc и пригодится.
Реализовал описанное для реле и входов.

Ардуино

Штука очень симпатичная. Есть плата, к которой "бутербродиком" подключаются платы расширения, причем их полно всяких разных - ethernet, радио, что-то для роботов и т.п.
И есть среда разработки, в которой полно готовых примеров и библиотек для работы с самой ардуинкой и платами расширения. Там используется некий язык processing - по факту это с++ с некоторыми библиотеками и скрытой от пользователя функцией main()
В плату ардуино встроен usb-usart преобразователь, компьютер определяет ее как com-порт. В процессоре уже сидит загрузчик, который позволяет залить свою программу с компьютера без использования аппаратных программаторов.
Все это очень удобно для быстрого старта.

Однако редактор очень уж примитивный  - даже до нотепад++ не дотягивает. Нет фолдинга, нет перехода от ошибок к строчке кода, я уже молчу про автокомплит и подобные фичи.
Ну и программа состоит из 1 файла и библиотек, что не всегда удобно.

На работе для мег я пользуюсь связкой eclipse + scons + avrstudio. Но дома у меня отладчика нет, avrstudio не нужна. Для заливки программы в ардуино воспользуемся avrdude.

Итак, задача минимум - сделать программу вывода "hello world" в порт, построить проект, залить его на плату. Дальше прикрутить eclipse - и уже можно жить.

scons - это аналог make. В отличие от make - это программа на питоне и билд-файл также является программой на питоне, в которой доступны примитивы сконса. Это приводит к некоторым тормозам в процессе выполнения билд-файла, однако открывает широчайшие возможности - нам доступны все возможности языка программирования общего назначения и куча готовых библиотек для питона.

Компилятор и avrdude можно взять из установленной среды arduino, я скачал актуальные версии. avr-gcc у меня 4.9.2, со всей мощью с++11 :)

Сразу перейдем к результату.
Файл Sconstruct очень простой
e = Environment(tools=[(
                    'build', {
               'board':'UNO'})],
                toolpath=["../common"],
                COM='COM8')

e.ObjectH("test.cpp")
e.Libraries(['Ethernet', 'SPI'])

e.Prog('test')


Команда  scons в папке с проектом собирает программу. scons write=1 собирает программу и записывает ее на плату. Также эклипс настроен так, что информацию о путях и макросах он берет автоматически, вызывая тот же scons. Эклипс фактически используется как (очень) продвинутый редактор, все настройки компиляции - через scons.

Основная работа делается в файле build.py. Я выдрал из установленной среды файлы библиотек и ядра - мне так проще с точки зрения последующих модификаций. Также я вручную преобразовал в питоновские структуры информацию о платах из файла boards.txt. Можно было бы пойти по другому пути и сделать разбор файлов среды - брать оттуда ключи компиляции и т.п. - но мне пока это не нужно.

Готовый реп со всем этим добром доступен по ссылке

воскресенье, 25 января 2015 г.

Архитектура

У меня будет центральный сервер, в котором реализована вся логика, и простые исполнительные устройства. 
Хотелось бы, чтобы все это было по максимуму сосредоточено в шкафу.  Провода от каждой люстры и каждого выключателя сходятся в шкаф и там уже коммутируются. Т.е. мне нужны управляемые от компьютера входы и выходы. Основная масса входов - логические, выходы - реле и диммеры.  Также у меня есть 1wire термодатчики (температура в комнатах, подачи и возврата в коллекторе, пола), а еще аналоговые входы от датчиков освещенности. Аналоговый сигнал от датчика освещенности на большое расстояние передавать нельзя, его обрабатываем по месту и дальше отправляем в более устойчивом к помехам виде.
Как я вычитал на сайте ab-log.ru (автор - большой поклонник 1wire), этот сигнал хорошо передается на расстояния.
Итого - в щитке нужны логические входы, реле, диммеры, адаптеры 1wire. Вместе с датчиком освещенности ставим блочек с микропроцессором. К этому же блочку можно добавить вход ИК (управление от пульта ДУ) и выход ИК (управление кондиционером).
Я подумал и решил блочки сделать на базе ардуино (С пайкой у меня все плохо, поэтому платы должны быть уже готовые) .
* китайские клоны довольно дешевы - рублей 400
* есть готовые платы расширения
* быстрый старт - ставишь среду, подключаешь плату по usb и можно записывать программу. Есть много готовых библиотек
* возможностей меги328 хватит на все
Связь с этими блочками я думаю сделать через ethernet - просто подключать к компьютеру, а для ардуины есть готовая плата расширения и библиотека.
Теперь встал вопрос о блоках в шкафу. Нашел управляемые розетки для серверных - весьма недешевые, нет входов. 
На сайте ab-log есть готовый блок: 7 входов, 7 реле, управляется по ethernet, может работать автономно, крепится на динрейку. Я купил один на пробу. Что не понравилось
* довольно громоздкий.
* мне надо порядка 40 выходов и 90 входов - придется покупать 13 блоков,  часть выходов будет болтаться без дела
* очень неудобно сделано подключение. Клеммы под отвертку и маленькие - наконечник 1,5 засовывается с трудом, а сдвоенный уже не засунешь - расключение делать неудобно.
* нет диммеров
И тут я вспомнил, что мой работодатель как раз и занимается электроникой :)
В результате мне сделали вот такое чудо-юдо - 4 диммера, 32 входа, 16 реле, 1wire и ebus(для котла), крепление на динрейку. 3 блока в шкаф и один на замену. Мозги блока - те же ардуины, только на меге2560. Подозреваю, уместилось бы и в меги328, но на всякий случай сделал запас. 
 У такой меги 256к флеша, 8к ОЗУ и 4к епрома - есть где развернуться. Особенно если учесть, что сетевая библиотека почти ничего не весит - стек реализован в плате расширения.
Клеммники разъемные - mstb для выходов и более мелкие (забыл как называются) для входов. В mstb влезает сдвоенный 1,5 наконечник или одинарный 2,5.

суббота, 24 января 2015 г.

Дом, милый дом

В прошлом году у меня была стройка дома.  И еще на начальном этапе захотелось прикрутить что-то из "умного дома".

Освещение
* входим в туалет/поднимаемся по лестнице - включается свет, если слишком темно
* выключатели в комнате как при входе, так и рядом с диваном :)
* поднимаюсь на второй этаж - могу выключить весь свет на первом. Аналогично - ухожу из дома - выключаю все
* управление яркостью (диммеры)  в комнатах
* статистика по лампочкам - сколько часов проработала, сколько циклов включений

Отопление
Установка желаемой температуры по комнатам, снижение температуры при отсутствии в доме.

Вода
Контроль утечки и автоматическое перекрытие воды.

На все это конечно есть готовые решения, Но
* цены негуманны. К примеру панель для котла стоила тысяч 12, но чтобы достучаться к ней удаленно, нужен отдельный блок, тысяч за 9. При этом система работает через сторонний сайт. А если я сменю модель котла, то все эти блоки можно выкинуть
* на освещение есть много готового, но между собой оно не совместимо. Затачиваться под вендора не хочется. Из бюджетных стандартных я нашел х10 - управляющий сигнал передается по электрической сети. Однако передача медленная и односторонняя (нельзя запросить выключатель/лампочку о своем статусе). Нужно специальное оборудование для прослушивания, подключения компьютера, сопряжения разных фаз
* хочется иметь единый сайт дома, на котором будет все
* и самое главное - я ж программист, а какой програмист откажется сделать велосипед