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-хаб и подключите дополнительную периферию, например веб-камеру.

Кроме того, при желании можно организовать не только реакцию на датчики, но и приём команд для исполнительных механизмов -- последнее не рассматривется в этой статье, но дело лишь за модификацией программной части, т.к. "железная" платформа уже имеется.

 
 

Обсуждение

 

sergejey: Обсуждение страницы Универсальный Wi-Fi узел

sergejey: Приглашаю к дискуссии :) Концепция первоначально была описана здесь: viewtopic.php?f=8&t=305

Urbas81: Так на роутер не переносится MajorDomo? или роутер не потянет?

sergejey: Так на роутер не переносится MajorDomo? или роутер не потянет? Я в данном случае такой задачи не ставил, но думаю, что роутер слабоват будет для всей системы. Теоретически конечно попробовать можно, но, честно говоря, вероятность хорошего результата весьма сомнительна.

zZz: А можно подключить также ардуину и релюшки http://www.arduino.ru/forum/apparatnye- ... le-arduino такие и сделать аналог мегадевайса? без Ethernet Shield прошивку полностью менять надо? http://ab-log.ru/forum/viewtopic.php?f= ... =780#p4715

BATONS: интернет шилд сейчас не проблема, его можно купить за 13,5 бакса уже с доставкой! http://www.aliexpress.com/item/2PCS-LOT-New-2012-version-Ethernet-W5100-Shield-For-UNO-Mega-2560-1280-328-only-hte/580032418.html

lighthouse: интернет шилд сейчас не проблема, его можно купить за 13,5 бакса уже с доставкой! http://www.aliexpress.com/item/2PCS-LOT-New-2012-version-Ethernet-W5100-Shield-For-UNO-Mega-2560-1280-328-only-hte/580032418.html Я у этого продавца заказал UNO3 и W5100, теперь жду с нетерпением :) Действительно шилд не проблема, но "Универсальный Wi-Fi узел" интересен как раз наличием Wi-Fi. Интересно получится ли сделать его на DIR-300? USB в нем нет, но есть RS232...

BATONS: я тоже много всего заказывал через этот сайт - все доходило. там есть и Wi-Fi. -но они в районе 70-80 баксов уже стоят....тут дешевле расковырять DIR-300 или еще лучше (в плане габаритов) MR3020

sergejey: У нас в Минске с ценами вообще беда... ethernet-shield здесь можно купить где-то за $40. Заказ с aliexpress с доставкой в Беларусь обойдётся где-то в $50, так что мне дешевле wifi-роутеры покупать :) На DIR-300 с RS232 по идее тоже можно -- принцип будет тот же, надо только соединить arduino с этим портом и в скрипте поменять путь к порту, по которому скрипт общается с arduino. Подключить релюшки к arduino совсем не проблема, но надо подумать как ими управлять извне. Вероятно, можно просто передать команду записи в порт ардуино через имеющийся в роутере веб-интерфейс -- но здесь пока не экспериментировал. Насчёт прошивки мегадевайса на этой платформе -- теоретически да, но практически надо разбираться и я, пожалуй, не возьмусь -- просто не хватит на всё времени :)

lighthouse: To BATONS: MR3020 лучше, но в наличии только DIR-300 :) На днях залью в него обратно open-wrt. И продолжу ожидания UNO :) Вопрос только как их соединить? Готового порта rs232 в ардуине нет, но есть USB через ATMEGA16U2. Получается есть два варианта: 1. Как-нибудь соединить напрямую в обход ATMEGA16U2. 2. Применить второй переходник USB-serial (есть вналичии). Вроде этого http://www.aliexpress.com/item/Free-shi ... 22320.html

sergejey: вообще-то в ардуине есть готовый UART порт, который можно подключить к роутеру. вот здесь подробности http://roboforum.ru/wiki/OR-WRT_0.60 Вот как мне советывали подключать: рекомендую подключать дуино (RX TX) к UARTу внутри роутера, в этом случае не понадобятся сериал-модули. Не забудь соединить ЗЕМЛЮ роутера с ЗЕМЛЕЙ дуины У меня кракозябры шли без этого.

sergejey: Сообщения про установки системы целиком на роутер перенёс сюда: viewtopic.php?f=8&t=480

artko: На всякий случай напомню (вдруг кто не знает и будет повторять данный универсальный wi-fi узел) - есть изумительный, очень мелкий и дешевый роутер TP-Link WR703N. Размеры чуть более коробка спичек. OpenWRT, USB,Wi-Fi, LAN. Рекомендовано :) https://dl.dropbox.com/u/3204010/wr703n-1.jpg

sergejey: Я два таких заказал :) Как доставят, попробую их использовать.

artko: Что там пробовать, хорошо работает. Только надо будет прошивку собрать с поддержкой модулей USB-Serial конверторов. Ну и не нужны танцы с активацией конвертора - воткнул в усб, система сразу все подхватила и запустился порт. (пункты 1...5 инструкции из статьи становятся ненужными).

sp01: TP-Link WR703N -ваще хорош, мелкий, и проворный. Как завершу тесты на DIR320 - буду переходить на него.

sergejey: Пришло наконец-то два роутера TP-Link WR703N, заказанных ещё до Нового Года :) Буду дальше уже на нём пробовать. А на DIR 320 тоже всё ок получилось -- уже пару недель в гараже температуру снимаю через Arduino + Dir320, только надо Wiki обновить, т.к. кое-какие коррективы вносил в настройку роутера, что б оно надёжней работало.

binladin: А можно использовать TP-Link TL-MR3020, чего то WR703 в продаже не наблюдаю ?

sergejey: А можно использовать TP-Link TL-MR3020, чего то WR703 в продаже не наблюдаю ? Это абсолютно одно и то же, на сколько я знаю.

binladin: А можно использовать TP-Link TL-MR3020, чего то WR703 в продаже не наблюдаю ? Это абсолютно одно и то же, на сколько я знаю. Спасибо, подписываю у шефа приказ на отпуск, разгребаю машину от снега и поехал в днс-шоп. Ещё бы лопату с приводом и ардуино в машину: runScript ("checkCar"); if (getGlobal("OurPoloSedan.CoveredWithSnow")!=1) { callMethod('shovel.cleanseAllAround'); say ("Good Luck!") } } :D

[ Обсудить на форуме ]

 

MajorDomo

Информация

Проекты

Партнёры

edit SideBar

 
 
 

 

Blix theme adapted by David Gilbert, powered by PmWiki