Последнее время на Хабре всё больше статей на тему «Умный Дом», «Сделай Сам», и меня это радует. Внесу и я свой скромный вклад в развитие цивилицазии. Добро пожаловать в мир умных вещей!
Краткая предистория
Сначала был хаос… Пропустим этапы сотворения мира и эпоху динозавров и перейдём сразу к 21 веку. Кругом беспроводные технологии, электроника повсюду, космические корабли летят к Марсу…
Открыв для себя китайские интернет-магазины разных товаров, я накупил всякого добра. В частности, были куплены наборы для дистанционного управления лампочками: пультик и к нему несколько коробочек. В результате я сделал дома 4 управляемые розетки и теперь, лёжа вечером на диване и читая Хабр, можно зажечь или погасить свет в комнате и в коридоре, не вставая с дивана. Удобно.
Ещё были куплены совершенно чудесные маленькие дешёвые WiFi-роутеры. Один из них использован как «удлинитель» для беспроводного интернета в детской, а другой оставался в резерве. Кстати, рекомендую, весьма неплохие характеристики за сумму менее 600 рублей.
В «закромах Родины» лежало много разных хороших вещей, и были большие новогодние выходные. И родился проект…
Цель и средства
Решено, что совершенно необходимой вещью в моём «умном доме» является электрическая розетка, которой можно управлять через интернет. Для этого были собраны в кучу необходимые детали:роутер
плата с микроконтроллером AtMega16 от старого проекта
твердотельное реле
2-строчный ЖКИ-дисплей
корпус
провода и прочие расходные материалы
Техническое задание
Устройству было дано имя «MZ-switch», и оно должно было делать следующие вещи:принимать команды от хозяина через интернет
работать как реле управления нагрузкой и как реле времени
работать как «пинговалка» и уметь перезагружать роутер и отключать нагрузку при отсутствии пингов
программировать параметры работы из командной строки и сохранять их в своей памяти
показывать статус на дисплее
радовать хозяина своим существованием
Инжекция кода в роутер
Когда я получил роутер, то, разумеется, сразу полез внутрь. Сначала я полез туда не механически, а метафизически, через телнет.
Выяснилось, что внутри у него неонка Линукс, и даже можно при желании написать и запустить собственный скрипт. Можно даже сохранить его в памяти роутера, но вот как заставить скрипт автоматически запускаться при старте?
Несколько дней было убито на то, чтобы найти возможность запуска скрипта. Основная идея была в «инжекции кода» в запуск какого-то стартового скрипта, и такой скрипт был найден! Инжекция выглядит так:
Теперь мой роутер при старте извлекает из своей памяти сохранённые там скрипты и запускает их. Следовательно, можно реализовать свой алгоритм взаимодействия с окружающим миром.
Добившись от роутера запуска скриптов, я полез в него механически. Внутри обнаружился последовательный порт, через который можно получить доступ к консоли. Припаяв 3 штырька к нужным точкам платы, я получил возможность управлять роутером через последовательный порт с помощью микроконтроллера.
Микроконтроллер и программа управления
Микроконтроллер должен уметь общаться через последовательный порт с роутером, управлять нагрузкой, отображать на дисплее результаты работы и вообще делать всю грязную работу. От предыдущего проекта оставалась плата с микросхемой AtMega16, имеющая нужный функционал. Она и пошла в дело.
Базовый алгоритм работы микроконтроллера выглядит так: получаем строку с командой, анализируем, выполняем, возвращаем строку с ответом. Это напомнило мне логику работы аналоговых модемов: S-регистры с данными и AT-команды управления.
Уважая копирайты и вообще для разнообразия, алгоритм оперирует понятиями R-регистров и MZ-команд. Регистры хранят числа и строки, а команды позволяют изменять регистры и управлять логикой работы.
Пример команды настройки контраста дисплея: "MZ+R0=200"
Умный алгоритм
Алгоритм работы микроконтроллера состоит из нескольких отдельных задач:передача данных из буфера передачи
приём данных и сохранение их в буфере приёма
анализ принятых данных и определение команд
чтение и запись внутренних R-регистров
управление нагрузкой и логикой работы
индикация режимов работы
отсчёт интервалов времени
Всё это удалось разместить в объёме 8К кода и 512 байт данных, использовав всего половину ресурсов микроконтроллера. Так что можно ещё чего-нибудь придумать и напрограммировать. Например, показывать на дисплее время, погоду, играть музыку и передвигаться по квартире.
Управляющая программа была написана и отлажена на обычном терминале. При этом не пострадало ни одно устройство.
В результате получился следующий функционал устройства:пауза после включения: позволяет дождаться загрузки роутера и не реагировать на «мусор», который он при этом выдаёт в консоль
если требуется авторизация, то ввод логина и пароля в ответ на запрос от роутера
запуск скрипта, позволяющего настроить конфигурацию роутера для работы с устройством (init)
запуск основного скрипта, который будет выполняться роутером при работе (loop)
приём команд от роутера и передача ответных сообщений
сторожевой таймер для перезагрузки роутера при отстутсвии активности
запуск скрипта, перезагружающего роутер (halt)
включение и выключение нагрузки с помощью оптоизолированного реле
возможность настраивать все параметры и хранить их в памяти микроконтроллера
Шайтан-машина
Почему-то очень часто реализация функционала какой-нибудь простой вещи напоминает мне задачи из игры Incredible mashine. Ну как может цель «включить лампочку» состоять из таких затейливых вещей и действий? А вот как:Чтобы роутер мог выполнять наши скрипты, сделаем «инжекцию кода» в один из его собственных скриптов.
Инжектированный код создаёт в папке /tmp несколько служебных скриптов, которыми мы потом воспользуемся.
Роутер не позволяет создавать файлы с атрибутом «исполняемый» и, благодаря заботливым китайцам, не имеет команды chmod.
Но мы элегантно обходим эту неприятность: сначала копируем какой-нибудь исполняемый скрипт под нужным нам именем в папку /tmp, а затем перезаписываем его содержимое!
Роутер имеет WEB-интерфейс для управления, но изменить/добавить свою страничку нельзя: всё read-only
Но мы элегантно обходим эту неприятность: оказывается, есть страничка для запуска любой команды, но на неё нет прямых ссылок. Набираем адрес этой странички вручную, и можем запускать свои скрипты! Хоть и не красивой кнопкой, а олдскульной командной строкой.
Чтобы устройство получило команду от пользователя, используем метод «сохрани-и-передай»: один скрипт вызывается из формы ввода команд и сохраняет ввод пользователя в файл. Другой скрипт постоянно проверяет наличие этого файла, а найдя — отправляет через последовательный порт на микроконтроллер.
Получив ввод пользователя, микроконтроллер выделяет из него команду и выполняет её. Например команду «включить нагрузку».
Всё, задача решена!
Сборка в корпус
Множество проектов не доживают до релиза из-за того, что лень или не из чего делать нормальный корпус. В данном случае изначально была поставлена цель: сделать «промышленный образец», чтобы он выглядел по-взрослому, а не как обычно.
Корпус был взят достаточно просторный, чтобы всё там разместить без тесноты. Пара выходных с дрелью и напильником, йо-хо-хо и бутылка рома, и вот устройство собрано. Все крепёжные элементы были найдены в шкафу, где хранятся остатки от сборки мебели и вообще хлам полезные в хозяйстве мелочи. Не удивляйтесь креплениям из дюбелей: винтов с гайками под нужный диаметр не нашлось.
Незаменимым материалом при сборке являются «китайские сопли» — трубочки из пластмассы для клеевых пистолетов. За неимением такого пистолета все работы выполнялись жалом обычного паяльника.
Вот что получилось в итоге:
снаружи
изнутри
Зачем это было нужно
Не буду говорить, что создано уникальное устройство, аналогов которому ещё не существует. Хотя, почему не буду? Буду! Любой новый продукт в маркетинговых материалах именуется не иначе как «уникальный» и «не имеющий аналогов». В крайнем случае «в несколько раз лучше, чем обычный...». Поэтому говорю: получилось действительно уникальное устройство, более чем в 9000 раз умнее, чем обычная розетка.
Можно подключить электрочайник и включать его с ноутбука через Wi-Fi. А можно включить пароходную сирену, если в доме пропал интернет. А можно подключить к устройству Самый Главный Сервер и перезагружать его, находясь дома.
На самом деле данный проект был реализован в качестве «разминки для ума», чтобы не растерять навыки в программировании микроконтроллеров и владении паяльником.Материалы проекта разрешается копировать и модифицировать. Желательно со ссылкой на автора проекта.