Универсальный Wi-Fi узел
Идея: сделать универсальный узел (или модуль) домашней автоматики, используя Arduino + бюджетный wifi-роутер.
UPDATE: Универсальное решение на базе OpenWRT?
Дано:
Wi-Fi роутер DLink DIR 320
Arduino
В итоге мы должны получить возможность передавать данные, полученные с помощью Arduino на внешний веб-сервер -- в нашем случае с установленной системой MajorDoMo.
Шаг 1. Подготовка роутера
Для начала нам следует обновить прошивку роутера. Я использовал прошивку от Олега. Вероятно, большая часть из нижеописанного будет справедливо и для прошивок на базе OpenWRT/DDWRT, но я экспериментировал именно с вышеуказанной прошивкой. Инструкций по загрузке прошивки можно найти много в интернете -- процесс не совсем элементарный и у меня получилось не с первого раза, но в конце концов удалось.
Следующим шагом после перепрошивки у меня была смена MAC-адреса, т.к. в сети уже был работающий роутер перешитый этой же прошивкой, которая, в свою очередь, всегда ставит устройству один и тот же MAC-адрес. Устройства с одинаковыми MAC-адресами в сети жутко конфликтуют, поэтому их надо обязательно менять. Процедура смены MAC-адреса хорошо расписана здесь.
Далее, нам нужно, чтобы роутер был в роли "клиента" для имеющейся WiFi-сети -- мы ведь хотим, чтобы наш узел был беспроводным.
Я по неопытности довольно долго промучался с этим шагом и поэтому просто представлю ниже картинки с итоговыми настройкми. Основная идея -- "клиентский" роутер должен иметь практически такие же настройки беспроводной сети, что и "родительский", но находится в режиме "клиента" (спасибо, Кэп!).
Настройки на "родительском" роутере:
Нажмите для отображения картинок
Настройки на "клиентском" роутере: Настройки на "родительском" роутере:
Нажмите для отображения картинок
Статус на "клиентском роутере" после соединения:
Нажмите для отображения картинок
Статус на "родительском" роутере после соединения:
Нажмите для отображения картинок
Итак, у нас на данном этапе должно быть готово беспроводное устройство, которое при включении питания может подключаться к существующей WiFi-сети. Но для работы Arduino нам понадобится ещё небольшая модификация начинки роутера.
В прошивку встроен драйвер USB-serial, но его нужно активировать зайдя на роутер по SSH и выполнив следующие команды:
insmod usbserial.o insmod pl2303.o insmod ftdi_sio.o
А для того, чтобы эти команды выполнялись автоматически при загрузке роутера, делаем следующее:
1. создаём файл инициализации порта:
vi /tmp/local/etc/init_arduino.sh
в этот файл вносим следующие строчки:
#!/bin/sh insmod usbserial.o insmod pl2303.o insmod ftdi_sio.o
(в vi редакторе надо нажать INS для перехода в режим редактирования, после редактирования нажимаем ESC, затем нажатием на ":" переходим в режим команд и там набираем "!wq" для записи изменений и выхода)
и ставим атрибут разрешения запуска скрипта
chmod +x /tmp/local/etc/init_arduino.sh
2. создаём каталог командой
mkdir /usr/local/sbin
3. создаём файл post-boot командами
echo "#!/bin/sh" > /usr/local/sbin/post-boot chmod +x /usr/local/sbin/post-boot
4. редактируем файл post-boot с помощью vi и вносим в него следующий код:
#!/bin/sh /tmp/local/etc/init_arduino.sh
5. сохраняем все изменения в память роутера и перегружаемся
flashfs save && flashfs commit && flashfs enable reboot
Теперь, если подключить к роутеру Arduino, то в системе должно обнаружиться устройство /dev/usb/tts/0 , через которое мы будем общаться с контроллером.
Шаг 2. Подготовка Arduino
На самом деле никакой особенной подготовки для контроллера не нужно. Можно использовать готовый код, который представлен на этой странице. Фактически, задача контроллера сводится к том, чтобы при необходимости передать данные, выводить строчку вида:
GET http://<полный_путь_с_параметрами>
Корректность работы контроллера желательно проверять вообще без роутера, просто подключив его по USB к компьютеру и загрузив программу мониторинга порта -- будь-то терминал или специализированная программа, доступная по вышеуказанной ссылке. Роутер, в свою очередь, будет нами использоваться для передачи запроса на сервер.
Шаг 3. Передача команд от Arduino на сторонний веб-сервер
Итак, у нас есть роутер в режиме клиента WiFi-сети, есть контроллер Arduino с загруженным скетчем. Подключаем Arduino к роутеру, используя встроенный USB-порт.
Следующим шагом будет создание bash-скрипта мониторинга состояния Arduino. Для этого делаем следующее:
1. С помощью vi создаём файл /tmp/local/etc/monitor.sh следующего содержания:
#!/bin/sh ARDUINO_PORT=/dev/usb/tts/0 BASE_URL=http://192.168.0.17 stty -F $ARDUINO_PORT raw speed 115200 while read LINE; do date echo "$LINE" MATCH=${LINE:0:5} #echo "$MATCH" if [ "$MATCH" = "GET /" ]; then echo "MATCHED: $MATCH" URL=${LINE/GET /} URL=${URL%%?????????} URL="$BASE_URL$URL" echo "URL: $URL" wget -q -T 5 -O - $URL fi done < $ARDUINO_PORT
При этом заменяем 192.168.0.17 на адрес вашего сервера.
2. Ставим на этот файл атрибуты запуска
chmod +x /tmp/local/etc/monitor.sh
3. Добавляем файл в автозагрузку с помощью редактирования созданного выше скрипта:
/usr/local/sbin/post-boot
Итоговое содержимое post-boot должно быть следующим:
#!/bin/sh /tmp/local/etc/init_arduino.sh /tmp/local/etc/monitor.sh &
4. Записываем все изменения в память и перегружаемся
flashfs save && flashfs commit && flashfs enable reboot
На этом настройка связки "arduino-роутер" можно считать завершённой.
Шаг 4. Настройка MajorDoMo для приёма и обработки команд
Здесь всё так же, как и при работе с Arduino, имеющим ethernet-shield на борту. Пример создания объектов и сценариев можно посмотреть на этой странице.
Что дальше?
Дальше всё зависит от вашей фантазии -- подключайте к Arduino всё, что угодно -- датчики температуры, движения, дыма и прочее. Кроме того, можно использовать более широко сам роутер -- поставьте USB-хаб и подключите дополнительную периферию, например веб-камеру.
Кроме того, при желании можно организовать не только реакцию на датчики, но и приём команд для исполнительных механизмов -- последнее не рассматривется в этой статье, но дело лишь за модификацией программной части, т.к. "железная" платформа уже имеется.
(:page_topic:)