Main

Универсальный 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:)