OpenWRT + Arduino

Домашний роутер Dir-620 с прошивкой OpenWRT

Разрабатывая систему «Умный дом» своими руками, мы чаще всего приходим к использованию в качестве контроллеров Умного дома перепрошитых домашних роутеров. OpenWRT — это как раз и есть прошивка для роутера, позволяющая коверкать его на усмотрение владельца. Ну а покуда система Умный дом — это совокупность контроллера и конечных исполнительных устройств, то последние, опять же, чаще всего строят на базе Arduino. И роутер и плату Arduino можно весьма недорого купить в наших советских магазинах.

Основная проблема в связке OpenWRT + Arduino — это обеспечить передачу данных между Arduino и контроллером. Но эта проблема решается, в итоге, довольно просто.

Arduino

Первое, что нужно сделать — это установить необходимые модули ядра OpenWRT для работы с USB и чипом FTDI (который установлен на Arduino). После установки всех модулей и перезагрузки роутера, в системе появится новое устройство /dev/ttyUSB0 (после подключения платы Arduino к USB-порту роутера).

Второе — нужно правильно настроить протокол передачи. В этом нам поможет утилиты stty, вызов которой нужно прописать в файл /etc/rc.local:

stty -F /dev/ttyUSB0 cs8 38400 clocal ignbrk -brkint -icrnl -imaxbel -opost -onlcr -isig -icanon -iexten -echo -echoe -echok

exit 0

Здесь я половину опций не разбирал. Основное — это установка правильной скорости передачи. В скетче для Arduino я ставил скорость обмена 38400, поэтому и при вызове stty нужно тоже указать 38400. Одна из опций отключает эхо, другая устанавливает нужные биты и прерывания.

Так как на роутерах обычно установлено крайне мало памяти, то с программной точки зрения на OpenWRT особо не размахнешься. Сперва я попытался поставить урезанную версию Python, но потом отказался от этой затеи, потому как готовых нужных библиотек на OpenWRT все равно никто не портировал. Однако все оказалось не так уж и плохо, потому как в OpenWRT встроен скриптовый язык Lua, который довольно прост в освоении и весьма функционален. Более того, на Lua полностью написан весь Web-интерфейс настроек роутера OpenWRT, поэтому можно представить, какой на самом деле мощный язык этот Lua.

Еще в пользу Lua говорит и то, что он довольно широко используется в робототехнике, поэтому его в любом случае желательно изучить :)

Работать с Arduino из OpenWRT при помощи Lua оказалось очень просто. Чтобы читать данные из Arduino достаточно сделать так:

io.input(«/dev/ttyUSB0″)

local data = io.read()

io.write(«Data from Arduino», data)

Передать что-либо в Arduino из OpenWRT по USB в Lua тоже просто:

io.output(«/dev/ttyUSB0″)

io.write(«Hey, Arduino, catch THIS!»)

Вот, вощимта и все :)

  • Дмитрий Макаров

    кстати на PIC контроллерах поинтереснее вещи делать можно :) да и возможностей по более :) но тут паять все от и до самому :) ардуина, как бы сказать… деревянная :)

    • Leonid Khovansky

      Не видал я пик-контролеров сравнимых с роутерами на open-wrt), а арудино в этой связке просто удобная прослойка до исполнительных устройств и датчиков.

  • Дмитрий Макаров

    еще такая тема… даже совет… если делаете такую серьезную систему на ардуине, то подумайте над экранированием всей этой темы, т.к. ардуина очень чувствительна к ЭМИ… банально гроза и есть большой шанс, что МК сгорит…

  • Дмитрий Макаров

    что-то в блоге тишина ) да и с доступом периодические проблемы )

  • Leonid Khovansky

    Блог шикарнейший, половину перечитал, половину осталось.
    Очень поддерживаю!