DIY или Сделай Сам / Умный дом с web-интерфейсом на perlxstut

в 20:24, , рубрики: perl, php, pic, распознавание речи, умный дом, метки: , , , ,

DIY или Сделай Сам / Умный дом с web-интерфейсом на perlxstut
В какой-то момент стало очень лениво отрывать свою пятую точку, чтобы перед сном выключить свет в комнате. И решил это дело автоматизировать. В итоге был изобретён свой велосипед для удалённого управления силовой нагрузкой – программно-аппаратный комплекс, обладающий следующими особенностями:* Возможность управления силовой нагрузкой, питаемой напряжением 220в, из любого места, где есть доступ к сети Интернет, независимо от территориальной удалённости.* Управление силовой нагрузкой через web-сайт* Клиент-серверная архитектура* Доступ к web-сайту системы с мобильных устройств, в том числе через сотовые телефоны с поддержкой WAP* Использование широко распространённого протокола RS232 физического уровня для связи аппаратной составляющей системы с компьютером.* Аппаратная составляющая основана на микроконтроллере PIC micro. (PIC18F452 в dip-корпусе).
Т.е. благодаря такой нехитрой штуке появляется возможность управлять _любыми_ устройствами (правда, только на уровне «вкл-выкл»), будь то чайник, утюг, телевизор, холодильник, свет в комнате и т.д., при наличии доступа в Интернет. Управлять можно с _любого_ устройства, имеющего выход в Интернет и html/wap-браузер – мобильник, iPhone, iPad, ноут, комп, телевизор и прочие девайсы. Свой «умный дом» реализовал на языках PHP (клиентская часть), Perl (серверная часть), Си (серверная часть, библиотека низкоуровневых функций), ассемблер (mpasm, прошивка микроконтроллера).
Варианты доступа к системе следующие:
1) web-сайт для стационарных и мобильных устройств пользователя с поддержкой html
2) wap-версия сайта для обеспечения доступа к системе с мобильных устройств с поддержкой WAP.
3) telnet-доступ для консольного доступа к системе
А теперь – общая структура системы:
Рассмотрим детально уровни реализации системы:
1) Высший (клиентский) уровень — является точкой входа в систему для пользователей. Web-сайт (см. картинку ниже) и его wap-версия, работающие под управлением системы управлением контентом сайта (CMS) CMSBuilder, написанной на языке Perl, в связке MySQL+Apache, принимают запросы пользователей как с компьютерных, так и сотовых устройств.
2) На среднем (серверном) уровне располагается демон, представляющий собой мультипроцессный tcp-сервер с предварительным ветвлением, также написанный на языке Perl. Взаимодействие с высшим уровнем осуществляется при помощи собственного протокола прикладного уровня. Для связи с низшим, физическим, уровнем предназначена библиотека низкоуровневых функций, написанная на Си. Библиотека подключена к демону посредством средства perlxstut, позволяющего подключать к приложениям на языке Perl библиотеки, написанные на языке Си. Библиотека на Си, используемая на данном уровне, реализует работу с rs232-портами компьютера при помощи стандартной библиотеки termios.h.
3) Низший (аппаратный) уровень (см. картинку ниже, нарисовано в Proteus'е) реализован на микроконтроллере PIC18F452, который подключается к компьютеру через rs232-интерфейс. Управление подключенной нагрузкой осуществляется коммутированием силовых линий напряжением 220В через подключённые к микроконтроллеру через транзистор реле.
Вот как выглядит девайс вживую (без шнура rs232 и реле):
Работает только под *nix. Архив со всем необходимым можно скачать отсюда. Для использования нужно собрать APM (мейкфайл прилагается), запустить prefork_pipe.pl (по умолчанию будет слушать порт 8080 для приёма через сокет команд управления нагрузкой). Понимает команды WRITE [значение] и READ. (значение пишется сразу в 8-битный порт, т.е. управлять можно только всеми восемью релюшками сразу). Клиентская часть в архиве – на PHP. Если хотите использовать модуль с сайта на PHP – подключаете apm.inc, пример использования в index.php. Для реализации взаимодействия с устройствами, имеющими WAP-браузер, предназначен файлик wap.php. В Web.pm – реализация на Perl протокола взаимодействия системы команды read/write) на серверной стороне. Как видим, ничего сложного. В реальности клиентская часть реализована в виде модулей к CMS, написанной на Perl.
Возможно, кому-то покажется серьёзным минусом необходимость иметь постоянно включённый компьютер, чтобы управлять техникой через Интернет. Но никто не мешает использовать миниатюрный raspberry pi. Либо приспособить роутер с Linux.
Второй недостаток, который вы можете увидеть – это необходимость в наличии rs232-порта. Но эта проблема легко решается покупкой usb-rs232 адаптера. Либо вы можете прикупить микроконтроллер с аппаратной USB-периферией. Например, за примерно 1500 рубликов можно купить готовый набор, в который входит отладочная плата с микроконтроллером pic18f14k50 (встроенный usb на борту) и внутрисхемным программатором/отладчиком PicKit2:
— уже распаянные порты usb, ком-порта + поле для макетирования + ещё одна такая же плата, нераспаянная. В комплекте среди прочего идет лабораторная работа с библиотекой, реализующей USB CDC класс (что это такое – см. ниже) – т.е. довольно посто можно свой «умный дом» заделать.<br
И не надо бояться USB в плане программирования – ничего сложного тут нет. Дело в том, что вообще случаи, когда необходимо лезть в USB на низком уровне (писать драйвера, оперировать конечными точками со стороны МК) и т.д. случаются крайне редко. Для большинства нужд имеются готовые классы USB, которые позволяют не вникать в работу USB на низком уровне, не писать драйвера, а сразу решать нужную вам задачу. В данном случае таким классом является CDC – со стороны микроконтроллера вы используете готовую библиотеку, реализующую этот класс, и оперируете функциями работы с ком-портом. Со стороны компьютера вы в системе видите виртуальный ком-порт. Таким образом, вы продолжаете работать с rs232, хотя реально взаимодействие ведётся через USB.Распознавание и синтез речи
Есть и другой способ реализации взаимодействия с системой, кроме как нажимать на кнопки сотового / компьютера и иного устройства, имеющего выход в Сеть – можно для получения команд реализовать распознавание речи, а для получения отклика – синтез. Например, говорите «жена, выключи утюг» — система по ключевому слову «жена» понимает, что сейчас последует команда. После получения команды – запрос к микроконтроллеру на управление одним (или всеми) каналами с реле, после чего – голосовое подтверждение выполнения (синтез речи).
Пути реализации здесь три:
1) Используется подключение к Интернет и компьютер. Наиболее популярным решением является использование API от Google – при распознавании речи записываем с микрофона звук в файл, перекодируем во flac, отсылаем в Google, получаем текстовый ответ – парсим его и даем команду микроконтроллеру. При синтезе речи текст отсылаем в Google, получаем ответ с mp3-данными, выводим на динамик. Подробнее можно почитать здесь: habrahabr.ru/blogs/hardware/129936/
2) Локальное распознавание и синтез речи, без Интернет, но опять же с компьютером. Для синтеза речи часто используют festival (русский языковой пакет к нему ), для распознавания – голосовой движок Sphrinx c поддержкой распознавания русской речи
3) Существуют ещё решения для встраиваемых систем, без использования внешнего компьютера для распознавания и синтеза речи. В качестве примера можно привести микросхему распознавания речи HM2007 (увы, уже снятую с продажи). Вкратце – замыкаем ей ногу, задаем код, которому будет поставлена в соответствие команда, говорим команду, размыкаем ногу, и так для каждой команды. Далее когда её используем – если микросхема распознаем команду, которую говорим, на выходе она устанавливает соответствующий ей двоичный код. Для робототехники – самое то. Существует ещё библиотека от Microchip для dsPIC30F – Microchip Speech Recognition Library. Минус – такие однокристальные решения плохо дружат с русским языком. Приходится давать команды на англоязычный манер.
При помощи описанных выше решений вполне реально доработать приведенный в статье пример с pic18f452, реализовав самому коммерческое решение, описанное на habrahabr.ru/blogs/startup/128656/ (управление техникой через IR-канал голосом) – причем если в промышленном исполнении (home sapiens) не предусмотрено управление нагрузкой напрямую (только через IR-адаптеры), то здесь получаем возможность напрямую взаимодействовать с нагрузкой и сэкономить свои кровные деньги. Жаль только, что не создать решение, которому можно будет сказать «Жена, исполни супружеский долг» и получить желаемый результат. Так и придётся оставаться монахом в миру. :)
P.S. Что-то в последнее время стало лениво ходить в сортир. Вот как бы это дело автоматизировать… :-)


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js