Предисловие
Любого инженера (или просто любителя электроники) когда-либо посещала мысль подключить свой дом, офис, серверную или рабочее место к компьютеру. Это тёплая ламповая мысль заложена в наши мозги со времен первых компьютеров. Больших и ламповых! Стремление к роботизации, облегчению существования себя любимого, комфорт за счет автоматизации. Или, говоря проще, «лень – двигатель прогресса!». Меня такие мысли конечно же стороной не обошли. И не обходили они меня долгие годы. И все вот эти годы воплотились в данном устройстве.
И так, ComDev представляет собой относительно простую систему диспетчеризации и управления. Ты, дорогой мой любитель роботизации, спросишь «управления чем именно?». Да хоть протезом головного мозга! Всё что питается от электричества, можно включить / выключить / переключить. Такова философия данного устройства. Если рассмотреть любое устройство с точки зрения «черного ящика» с входами и выходами, то данная философия станет очевидной. Область применения конечно промышленная, но, если включить воображение, можно и «умный дом» себе организовать. И так по порядку.
Глава 1. Hardware
Аппаратно наш девайс состоит из центрального блока управления и исполнительных устройств, соединяющихся 3х проводной линией по принципу «звезда». Ну и что бы было веселей, конечно имеем связь с компьютером по USB, шину 1-wire, шину I2C и много ещё чего. В общем концепция следующая:
Мозгом тут выступает простой контроллер PIC18F4550. Выбрал я его потому, что на тот момент это был один из самых доступных мне контроллеров с аппаратным USB и количеством портов, позволяющим подключать до 10 устройств по входу и выходу параллельно. А поддержка этим контроллером бутлодера, вообще решала кучу проблем с перепрошивкой и отладкой устройства. Контроллер довольно «нежный» и не любит перегрузки по портам и грязного питания. Именно поэтому в схеме можно обнаружить такие сложности в схеме питания и кучу защитных элементов типа блокировочных конденсаторов и защитных диодов. Поверь, я сжег ни один такой контроллер, чтобы понимать о чём говорю. Кстати! Схема:
Но если ты думаешь «на кой чёрт мне устаревший нежный контроллер?», ты ошибаешься. Контроллер по сей день есть в продаже, а схема за столько лет отлажена и отточена на столько, что можно, к примеру, подключить компьютер к 25 метровому USB и не переживать, что девайс глюкнет или отвалится. Ну а в качестве исполнительных устройств можно использовать кнопки, реле, датчики. В общем всё что имеет принцип «сухой контакт» и толерантно (модное нынче слово) к напряжению 12 вольт. Все эти пироги подключаются через оптроны и сборки дарлингтона, для развязки и защиты портов.
Не используй дешевые и поддельные микросхемы ULN2003. Они имеют свойство не выдерживать заявленный ток и сгорать, прихватывая соседние ключи, а иногда и порты контроллера. Об этих ключах можно было бы написать целый трактат, но тут ограничимся тезисом «ищи фирменные ULN2003».
Исходя из выше описанной концепции, получаем систему простую и надежную, как велосипед. Итого, аппаратные возможности:
- Два входа питания, развязанных через сдвоенный диод. У нас тут промышленный девайс, помним? Резервироваться нужно.
- Надёжное проверенное подключение по USB, на расстоянии до 25 метров.
- 10 входов и 10 выходов. Управляются вручную или автономно. Как те или иные входы и выходы должны взаимодействовать, программируется заранее с помощью программы Конфигуратора, а после мы полностью самостоятельны.
- 1wire для подключения до 10 датчиков температуры типа DS18B20. Замер 10 температур и вывод их на компьютер с построением суточных графиков.
- Порт AUX. Например, для взаимодействия с охранными системами. Железяка позволяет взаимодействовать с любыми охранными, пожарными, инженерными системами. Для этого необходимо подключить вход AUX к релейному выходу типа «сухой контакт». В этом случае, при замыкании релейного выхода мы можем принимать решения о включении выключении выходов и можем попищать для порядка и т.д.
- I2c интерфейс, на который можно подвесить дисплей типа LCD2004 с интерфейсом PCF8574T. Пока мы можем выводить на него тревоги, но эту часть можно развивать.
Если вдуматься, то по аппаратным возможностям в общем то и всё. Так что пихаем всё это в печатную плату, долго курим книги по помехозащищенным устройствам и т.д. в итоге получаем следующее:
Отдельно нужно поговорить про PCB. Версий за много лет было невероятное множество, но именно эта версия первая, прошедшая этап сериализации. Т.е. переход от прототипа к серийному выпуску. Это версия адаптирована под производство где ни будь в промышленном масштабе, но не утратила возможности собрать устройство при помощи ЛУТ. В исходниках проекта ты, дорогой читатель, можешь найти уже сформированные и проверенные файлы Gerber. Так что если по каким-то причинам, тебе не хочется или не можется возиться с двух сторонней печатной платой и «лазерным утюгом», ты всегда можешь отправить gerber файлы в Китай
(например, я заказывал в JLCPCB) и тебе пришлют вот такую плату:
Глава 2. Firmware
Прошивка контроллера в нашем случае начинается с бутлодера. Если ты, мой дорогой изобретатель, собрал устройство и готов уже включать свет с ноутбука, то не торопись. Для начала потребуется программатор для нашего контроллера. Сразу скажу, что программатор потребуется 1 раз и бежать покупать из-за этого PicKit 3 совсем не обязательно. Можно воспользоваться самодельным простым программатором. Схем в этих ваших интернетах полно. Я начинал с программатора ART2003 и программы к нему WinPic800. При наличии в компьютере LPT порта, этого вполне достаточно, но в современном компьютере такой порт отыскать сегодня сложно. Но, допустим ты нашел чем и как прошить наш микроконтроллер. В архиве проекта ты найдешь файл прошивки бутлодера «bootloader.hex». Вот его нам и нужно прошить в контроллер в режиме LVP. После прошивки, если всё исправно и правильно прошито, наш девайс должен весело заморгать поочередно красным и зеленым цветом. Это означает, что наш контроллер ожил, вошел в режим бутлодера и готов прожевать основную прошивку уже через USB. С этого момента и далее программатор не нужен. Любая перепрошивка контроллера осуществляется через USB программой HIDBootloader (она так же лежит в папке проекта). Достаточно подать питание на контроллер с зажатой кнопкой “BTL” и он перейдет в режим программирования. И так, ты лезешь в эту папку, запускаешь HIDBootloader и с удивлением обнаруживаешь, что самой прошивки ComDev_v5.4 там нет…
Тут я должен извиниться перед тобой, мой маленький любитель контроллеров, и прояснить ситуацию. С учетом вложенных в этот проект трудов и занятых в нём людей, я опасаюсь бесконтрольного клонирования данного устройства. Поэтому каждая прошивка имеет свой внутренний ID и работает с конкретным экземпляром программы, имеющей тот же ID. Но не переживай!
Я не собираюсь брать с тебя деньги или предлагать чего-либо еще «без регистрации и смс». Просто напиши мне на support@unicaster.ru, что ты собрал устройство (можно приложить фото) и я вышлю тебе прошивку и ПО с твоим собственным ID.
Пожалуй, это самая сложная часть в сборке. Если ты справился, то дальше начинается веселье и магия автоматизации…
Глава 3. Software – Config
Основная концепция программной части, это консольный сервис, реализующий WEB-интерфейс и связь с устройством. С довольно большим функционалом программной части я предлагаю знакомиться по мере настройки системы при помощи утилиты ComDevConfig.
Вкладка «Система»:
Из основных настроек видим следующие:
- Имя системы – Это имя, которое будет отображаться в WEB-интерфейсе и произноситься синтезатором речи, если нужно.
- Размер логов – это размер текстового файла журнала, в который пишется всё что происходит в системе. Размер указывается в килобайтах.
- Порт сервера – порт на котором будет работать WEB-интерфейс. По умочанию это порт 8888. Т.е. что бы попасть в управление, нужно набрать в браузере http://127.0.0.1:8888
- Кол-во подкл. – количество одновременных подключений к WEB-интерфейсу.
- Пароль user – это пароль для входа в WEB-интерфейс под именем user. Данный пользователь может только просматривать происходящее, выключать/включать звук, таймеры и выходы.
- Пароль moder – это пароль для входа в WEB-интерфейс под именем moder. Данный пользователь может то же что и user, а так же включать/выключать блокировки.
- Пароль admin – это пароль для входа в WEB-интерфейс под именем admin. Данный пользователь имеет полные права.
*пароли пользователей по умолчанию такие же как и имена.
*если зайти на WEB-интерфейс с локального адреса, логин/пароль не требуется. - Порт модема – это номер COM порта, на который можно подключить GSM модем, для рассылки СМС оповещений.
- № телефона – как раз номер, на который будут приходить СМС с оповещением.
- Голос – список установленных в системе движков синтеза голоса. Выбранным голосом система будет говорить с тобой. Из проверенных мной, рекомендую Nuance Vocalizer Milena или Yuri. Да, понимаю, что они платные, но на момент публикации, это наиболее правильные по произношению локальные синтезаторы голоса.
- Google API key – система может распознавать твои голосовые команды. Но что бы она это делала, нужно завести себе ключ Google Speech API. Как это сделать, можно спросить в том же Google. Процедура не сложная. Можно найти в интенетах и уже сгенерированные ключи, но Google накладывает ограничения на них в 50 распознаваний в сутки. И сколько пользователей висит на таких ключах и сколько команд ты сможешь дать системе в день, неизвестно.
- RSS погода – это адрес RSS рассылки погоды. Существует для того, чтобы ты мог по голосовой команде «погода» услышать текущее положение дел на улице. Не плохо работает RSS от RP5.ru
- RSS новости – это адрес RSS рассылки новостей. Принцип тот же: говоришь «новости» и синтезатор голоса читает тебе новости по ссылке. Не плохо работает с https://lenta.ru/rss/top7
Заглянем в следующий столбец «голос»:
- Галочка «включить» – понятное дело, включает или выключает голосовые функции.
- Выход – это номер выхода, который можно задействовать для включения колонок во время синтеза речи. Помогает бороться с раздражающим шумом и помехами в звуковых картах и колонках. Но нужно понимать, что колонки за частую включаются не сразу и можно пропустить слова.
- Время «с» и «по» – указывает, когда можно говорить, а когда лучше помолчать.
- Запуск системы – это фраза которую будет проговаривать синтезатор при каждой загрузки приложения.
- Отключение mute – это фраза которую будет проговаривать синтезатор при активации голоса, после разрешения ему говорить. (при наступлении времени или при нажатии кнопки в WEB-интерфейсе.
- Отработка таймера – это фраза которую будет проговаривать синтезатор при срабатывании таймеров.
- Ошибка термометра – это фраза которую будет проговаривать синтезатор если с датчиком температуры что-то пошло не так.
- Ошибка управления – это фраза которую будет проговаривать синтезатор если по каким-то причинам система не смогла выполнить команду.
- Ошибка internet – думаю понятно и так. Нет интернета – нет распознавания речи.
- Неизвестная команда – это фраза которую будет проговаривать синтезатор если ты сказал не существующую команду.
- Включение и отключение охраны – это фразы которые будет проговаривать синтезатор при срабатывании контакта AUX.
* все голосовые фразы имеют ограничение в 50 символов.
* некоторые фразы имеют ключи %n или %t (описание в подсказках).
* вместо голосовых фраз можно указать текстовый файл словаря (*.txt) сохранённый в папке ext (находится внутри папки с программой). В этом случае, при каждом срабатывании такой фразы, система будет читать произвольно выбранную фразу из указанного словаря. (фразы пишутся каждая с новой строки). Это придает более осознанный вид и подобие искусственного интеллекта.
Вкладка «Входы», «Выходы» и «Термометры»:
- Идентификаторы – Это названия входов. Они будут отображаться в WEB-интерфейсе, журнале, проговариваться синтезатором и т.д.
- Нормальное состояние – эта галка определяет нормальное состояние входа замкнут или разомкнут. Противоположное состояние, естественно, будет считаться тревогой.
- Таймер повтора (для входов) – это время, через которое тревога будет повторяться, пока состояние не перейдёт в норму. Если установлен 0, то повторов не будет. Тревога срабатывает только один раз.
- Авто Таймер (для выходов) – это время в минутах. Если установлено, то после переключения выхода из нормального состояния в состояние тревоги (не важно каким образом), автоматически запускается таймер на указанное число минут, по истечении которого система вернёт выход в нормальное состояние.
- Нормальная температура (для термометров) – это температура, выход за пределы которой будет означать тревогу.
Вкладка «SNMP»
Система умеет общаться с внешними устройствами по протоколу SNMP и собирать с них те или иные показатели (например, напряжения с ИБП) и строить суточные графики.
- Идентификаторы – имена, под которыми будут отображаться показатели в WEB-интерфейсе.
- IP адреса – думаю понятно. Адрес устройства в сети, на котором работает сервис SNMP
- OID параметров – это адрес параметра внутри протокола SNMP.
- Тесты – при нажатии кнопки тест, если OID и IP были введены верно, в окне теста появится считанное значение.
- Нормальные значения – значения, выход за пределы которых будет означать тревогу.*Во всех вые указанных вкладках есть кнопки Открыть / Сохранить. Так можно открыть ранее созданный файл с настройками и сохранить его в текущую конфигурацию.
Вкладка «тревоги»
В данной вкладке создается список реакций на состояния тревоги и нормальных состояний всех входов, выходов, термометров и параметров SNMP.
- Объект – выбор из списка входов, выходов, термометров и параметров SNMP для обработки
- Состояние – реакция на тревогу или норму.
- Тип тревоги – это вид реакции. СМС, голос или Ярлык. Если с первыми двумя всё понятно, то про ярлыки нужно пояснить. Если вы положите в папку ext любой ярлык (*.lnk), то его можно будет использовать как реакцию на тревоги.
- Сообщение – Собственно текст который будет отправляться в СМС или проговариваться синтезатором речи. А в случае выбора в предыдущем списке типа «ярлык», тут открывается выпадающее меню со списком ярлыков, найденных в папке ext.
- Добавить / удалить – кнопки, добавляющие тревогу в список или удаляющие выделенную тревогу из списка.
- Открыть / очистить / сохранить – соответственно открывают файл ранее созданных тревог, очищают список и сохраняют список в текущий файл.
Вкладка «планировщик»
В данной вкладке можно запланировать некоторые действия по времени. Принцип тот же, что и в тревогах, но с небольшими отличиями в интерфейсе.
- Условие – периодичность, с которой будет выполняться задание.
- Дата и время – тут всё и так понятно.
- Тип – выполнить (голосовую команду или ярлык из папки ext) или сказать (просто указанную фразу).
- Объект – список доступных для выполнения команд и ярлыков или просто текст голосового сообщения.
- Открыть / очистить / сохранить – соответственно открывают файл ранее созданных задач, очищают список и сохраняют список в текущий файл.
Вкладка «Программатор»
Это по сути тот же планировщик, но для устройства. Задачи, указанные тут, будут работать не зависимо от компьютера, т.к. они прошиваются в память контроллера.
- Входы – выбор входа устройства.
- Условия – должен быть замкнут или разомкнут выбранный вход.
- Выходы – выбор выхода который будет связан с указанным входом.
- Поведения – что именно должен сделать выход при срабатывании выбранного входа.
* выход можно включить, выключить, переключить, включить на время (включится на секунду) или включить при включенной охране (вход AUX). - Добавить / удалить – кнопки, добавляющие реакцию в список или удаляющие выделенную реакцию из списка.
- Загрузить / сохранить – загрузить и сохранить реакции из файла или в файл.
- Считать / стереть / прошить – кнопки, управляющие памятью устройства.
Глава 4. Software – Console & WEB
И так, мы прошлись с тобой по всем настройкам, можно сохранить их и запускать сам сервис WebComDev.
Первое, что можно увидеть при запуске, это порт на котором подвешен наш WEB-интерфейс. Если программа при запуске не обнаружила устройство (или устройство не с тем ID что у нее), то ты увидишь сообщение в консоли про демо режим. В этом режиме программа полнофункциональна, но закроется через 10 мин. Всё что отображается в консоли пишется в файл журнала. При желании из этой консоли можно и управлять устройством. Полный список команд можно получить командой help.
- sw – переключает выбранный выход (например sw 1 – переключит состояние первого выхода).
- clr – очищает журналы (например clr 1 – очистка журнала, clr 2 – очистка суточных графиков).
- bl – переключает состояние блокировки выходов (bl 0 – переключает состояние блокировки управления звуком и очистки).
- vcc – симуляция голосовой команды (например «vcc погода» – равнозначна произнесению команды «погода» голосом).
- sms – отправка сообщения на указанный в настройках номер (например «sms привет» – отправит сообщение «привет»).
- st – установка таймера на выход (например st1=5 установит таймер на первом выходе на 5 минут).
- help – отображает все возможные команды в консоли.
- webptt – симулирует состояние клавиши PTT (например webptt 1 – нажмёт клавишу PTT на 2 секунды, а webptt 0 – немедленно отпустит её).
- thermal – выдает показания термометров.
- i2ctext – отправляет текст на дисплей устройства, если он подключен.
- mute – переключает состояние звука.
И раз уж речь зашла о командах, не плохо было бы рассказать про полный список голосовых комманд. В качестве голосовой команды можно использовать:
- указанное в настройках название любого входа – ответит состоянием данного входа
- указанное в настройках название любого выхода – переключит состояние выхода
- указанное в настройках название любого термометра – ответит температурой на данном термометре
- «температура» – расскажет о всех термометрах и температурах
- указанное в настройках название любого датчика snmp – ответит параметром данного датчика
- название любого ярлыка (*.lnk), лежащего в папке ext – запускает требуемый ярлык (название должно быть на русском языке)
- «звук» – включит / выключит звук системы
- «дата» – сообщит текущую дату
- «время» – сообщит текущее время
- «погода» – прочитает RSS погоды
- «новости» – прочитает новостной RSS
Ну что, подходим к десерту. Давай заглянем наконец то в WEB-интерфейс:
Тут мы увидим несколько вкладок, название системы (указанное в настройках) и строку состояния. В нормальном режиме она сообщает нам текущее время, а при отключении устройства или сервиса, сообщает о произошедшем. На главной вкладке можно наблюдать за суточными графиками и журналом всего, что происходит в системе. Так же можно очищать графики и журнал, вызвать голосовую команду, управлять звуком и блокировать эти функции по желанию.
На вкладке входов можно просмотреть состояния всех входов в реальном времени.
На вкладке выходов функций побольше. Тут можно не только переключить состояние выходов, но и управлять таймерами и при наличии прав, блокировать управление.
На вкладке термометров можно отслеживать состояние температур в реальном времени.
На вкладке snmp можно отслеживать состояние сторонних датчиков в реальном времени.
Заключение
История данного проекта – это, наверное, история меня. Зародился он на почве моей тяги к электронике и рос вместе со мной. Начиная от далекой версии 1.0 (2002 год), когда я просто решил порулить светом с компьютера, и заканчивая современной версией 5.4 (2017 год), где квинтэссенция возможностей напоминает фарш из отрыжки единорога, мяса кота Шредингера и чёрт знает, чего ещё, мне всегда помогали множество друзей и иных вовлеченных. Так что назвать этот проект «моим» у меня язык не повернется. Тут я хотел бы отметить всех, кто так или иначе участвовал в этой разработке:
- Necros – бессменное название устройства, первые версии программ управления им, и тонны вдохновения.
- Gudron – основной вклад в разработку прошивок, драйверов и ПО. Человек, без которого проект загнулся бы в далёком 2005г и не воскрес бы.
- KipdbIk – помощь в познании C#, лекии о говнокодерстве и разработка части ПО.
Если кто-то из Вас это читает: Спасибо вам за вот это вот всё.
Я не бросил его и до сих пор пилю…
А для читателей: В общем, пользуйтесь своими мозгами правильно.
Офигенная “story of my life”. Добавить бы ещё исторических фото. В корпусе от des-3010 хотя бы. Или с армейскими разъёмами.
Да я бы и рад!Но нет фоток то… давно ж это было)))
От фото плат получил эстетический оргазм. Силуэты компонентов на белой маске — это круто.