Компания
44,39
рейтинг
14 января 2015 в 15:05

Разное → Елочка, зажгись! Часть 1: гирлянда и сборка ПО для OpenWRT

Привет, Хабр!

28 декабря, за четыре дня до Нового года, у меня возникла проблема: я осознал, что имеющие в продаже новогодние гирлянды — редкостная китайская дрянь. Дело в том, что у меня дома маленькая искусственная ёлка, а также маленький ребёнок — поэтому я не хотел, чтобы на ёлке в каком-либо виде присутствовали 220 В, а также не нуждался в гирляндах на несколько сотен лампочек. И быстро обнаружил, что после вычёркивания всего, подпадающего под эти пункты, в окрестных магазинах остаются исключительно товары категории «обнять и плакать».

Поэтому мне пришлось сделать гирлянду самому. И у этой гирлянды есть IP-адрес.



Впрочем, если говорить серьёзно, я преследовал две цели: не только сделать гирлянду себе, но и показать вам, как на нашем нанокомпьютере Black Swift можно делать различные проекты, от наколенных до вполне себе профессиональных — чтобы показать вам, что это довольно просто и быстро. С попутным обсуждением разных интересных моментов.

Текст рассчитан на людей, которые более-менее понимают, как пишут программы, умеют держать в руке паяльник, но не более того — с какой стороны подойти к нанокомпьютеру с OpenWRT, остаётся загадкой. Попробуем её отгадать, тем более, что весь процесс не требует каких-то особенных (выходящих за вышеуказанные рамки) знаний или специального оборудования — программаторов, адаптеров и т.п.

Так как это — первая статья по теме, я разобью её на три части, чтобы не получалась огромная простыня:
  1. Гирлянда, подключение Black Swift и среда сборки под OpenWRT на C/C++
  2. Софт на C, работа с GPIO и программная ШИМ
  3. Веб-интерфейс и приложение для Android



В реальном времени все три части легко укладываются в рамки «проекта выходного дня».

Итак, сама гирлянда. Ассортимент ближайших магазинов был широк, но печален, поэтому, потыкавшись в сайт Чип-и-Дипа (у них, скажем так, недёшево, но 28 декабря альтернатив было мало), её саму я также решил спаять.



На гирлянду нам потребуется много провода сечением 0,2-0,3 кв.мм., много разноцветных светодиодов (я выбрал Betlux с углом 160 градусов — яркие, крупные с широким углом, удобные в монтаже), и много резисторов. Впрочем, резисторов — вдвое меньше, чем светодиодов: я решил включать светодиоды встречно-параллельно, поэтому на каждую пару нужен только один резистор. Это сокращает количество проводов, хотя усложняет управление гирляндой.

Ножки светодиодов были отогнуты на 90 градусов прямо у основания корпуса (вообще так делать не стоит — корпуса не рассчитываются на такое приложение нагрузки, но для себя и с пониманием риска сломать пару светодиодов — можно), после чего спаял их попарно. Удобно объединять синий с жёлтым и красный с зелёным — не только с точки зрения цветовых сочетаний, но и потому, что у этих моделей Betlux у разных цветов разная полярность включения светодиода. При таком сочетании цветов вместе соединяются одинаковые выводы, что уменьшает путаницу.

К каждой паре припаивается по одному резистору, номинал считается стандартно R > (U — 2,5)/0,02, где U — напряжение питания гирлянды, 2,5 В — примерное падение напряжения на светодиоде (зависит от цвета, но нам большая точность не нужна), 0,02 А — максимальный ток через светодиод. При питании гирлянды от +5 В сопротивление получается 125 Ом, соответственно, берём резисторы на 130 или 150 Ом. Конкретно у меня был мешок резисторов на 1 кОм и блок питания на 15 В, поэтому гирлянду я питал от 15 В, а на плату поставил дополнительный стабилизатор на 5 В — но вам так делать не обязательно.

У меня в гирлянде было 80 светодиодов (спасибо, добрый продавец, что ссыпал все четыре цвета в один пакетик!), одновременно при встречно-параллельном включении могут работать 40 из них, это ток 0,8 А. То есть банальной зарядки от мобильника на 5 В 1 А для счастья хватит.

Провода были нарезаны, зачищены, запаяны и закрыты термоусадкой. Это наиболее банальная часть, отмечу только два момента: во-первых, к середине чувствуешь себя китайской девочкой на конвейере и начинаешь ценить секунды, во-вторых, гирлянду я сделал из двух независимых веток — красно-зелёной и сине-жёлтой.

Для управления этим хозяйством нужны четыре полумоста: по два на каждую ветку, чтобы обеспечить возможность переключения полярности питания светодиодов и, соответственно, выбирать цвет. К счастью, есть такой прекрасный чип, как L293D, в котором как раз собраны четыре полумоста.

Схема получается сравнительно банальной:



Пять транзисторов на входе (подойдут любые маломощные N-MOSFET) нужны для согласования уровней напряжения: Black Swift работает от +3,3 В, L293 — от +5 В. В принципе в некоторых случаях можно подключать выход 3,3-В схемы к входу 5-В без согласования, но осторожно: во-первых, надо быть уверенным, что напряжения «1» на выходе первой хватит для уверенного переключения второй, во-вторых, и это важнее, что в обратную сторону ничего за пределами 0...3,3 В не прилетит ни при каких обстоятельствах.

Для двустороннего согласования есть специальные микросхемы (хотя можно и двустороннее на транзисторах), но так как у нас согласование одностороннее, а на календаре уже 29 декабря, делаем, долго не думая, из первых попавшихся транзисторов. У меня это были IRLML6344, если вам интересно.

Собираем это всё на макетке и подключаем Black Swift:



Обратите внимание, что подключён он у меня очень простым способом: в нужные линии GPIO и питания просто запаяны провода. Не самый универсальный способ, но зато очень простой и надёжный. Отдельного стабилизатора для BSB не надо — он может питаться от тех же +5 В, что и L293D.

Подготовка OpenWRT



Писать основное приложение я буду на C, а потому мне нужна среда сборки. К сожаления, штатная среда — OpenWRT SDK — работает только под Linux, к счастью, у меня есть домашний сервер под CentOS 6.

Если у вас тоже есть такой или похожий, вам достаточно скачать и распаковать на нём штатный SDK для платформы ar71xx. Он только для платформы x86-64.

Если у вас линукс бегает на каком-нибудь стареньком 32-битном процессоре (я знаю, у многих так), то мы собрали для вас SDK под 32 бита. Вот он.

Если у вас вообще нет линукса, то мы сделали для вас образ виртуальной машины для Oracle VirtualBox с установленным в нём CentOS 6 и уже распакованным в папку /home/openwrt/Openwrt-SDK-BB вышеупомянутым SDK. ОС и SDK 32-битные, поэтому работают примерно на всём; пароли — root/openwrt и openwrt/openwrt. Вот этот образ.

Итак, скачиваем виртуальную машину, распаковываем zip-файл в vdi, запускаем VirtualBox, создаём новую VM под 32-битный линукс и в качестве диска для неё указываем имеющийся vdi-файл. Запускаем, загружаемся, делаем cd Openwrt-SDK-BB — и voila, мы готовы к работе.

Пакеты для сборки лежат в каталоге packages, который пока пуст. Точнее говоря, в оригинальном варианте там лежат не сами пакеты, а только Makefile, в котором указано, откуда исходиники пакета скачивать — и при сборке они скачиваются, распаковываются и компилируются. По крайней мере, в 99 из 100 примеров по сборке под OpenWRT описывается именно эта схема.

В нашем случае это довольно неудобно — вряд ли вы будете программу управления самодельной елочной гирляндой первым делом заливать на GitHub. Поэтому напишем Makefile, который будет брать исходники тут же, ниоткуда их не скачивая.

Итак, пути будут:
packages/treelights — общая папка
packages/treelights/src — исходники программы
packages/treelights/Makefiles — инструкции для OpenWRT

Теперь пишем сам Makefile для OpenWRT. Он не контролирует то, как именно пакет будет собираться, это дело других makefile'ов, которые уже будут лежать внутри src — он описывает, что с этим добром должна делать OpenWRT.

include $(TOPDIR)/rules.mk

# Задаём имя пакета, версию, номер сборки. Имена переменных PKG_* - стандартные.
PKG_NAME:=treelights
PKG_VERSION:=0.0.1
PKG_RELEASE:=1

# Задаём каталог, в котором будет производиться сборка пакета. Здесь особой фантазии не надо
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)
include $(INCLUDE_DIR)/package.mk

# Теперь пошли описания пакета
# Наш в меню пакетов OpenWRT попадёт в категорию утилит, в основную секцию, по умолчанию собираться не будет,
# называться в меню будет "Christmas tree lights controller", URL у него понятно какой
# Переменная DEPENDS тут приведена для примера - в ней надо перечислить пакеты, от которых ваш зависит
# Так как я пишу на простом C, на самом деле мне сейчас библиотека libstdc++ нужна не будет
define Package/treelights
	SECTION:=base
	CATEGORY:=Utilities
	DEFAULT:=n
	TITLE:=Christmas tree lights controller
	URL:=http://black-swift.com
	DEPENDS:=+libstdcpp
endef

# Описание пакета. Тут можно внутри блока написать про него что-нибудь длинное, на пару строк
define Package/treelights/description
	Christmas tree lights controller
endef

# Действия перед сборкой пакета
# 1. Создаём каталог для сборки
# 2. Копируем в него исходники из нашего подкаталога src
define Build/Prepare
	mkdir -p $(PKG_BUILD_DIR)
	$(CP) ./src/* $(PKG_BUILD_DIR)/
endef

# Действия по сборке, ничего особенного нам не надо
define Build/Configure
	$(call Build/Configure/Default,--with-linux-headers=$(LINUX_DIR))
endef

# Действия по установке
# 1. Указываем каталог для установки (если его в системе нет, он будет создан)
# 2. Фактически ручками копируем в него исполняемые файлы
# Если файлов для установки много (несколько исполняемых, конфиг какой-нибудь) - их все
# надо перечислить отдельными строками
define Package/treelights/install
	$(INSTALL_DIR) $(1)/usr/bin
	$(INSTALL_BIN) $(PKG_BUILD_DIR)/treelights $(1)/usr/bin/
endef

$(eval $(call BuildPackage,treelights))


Положив такой Makefile в packages/treelights/, а исходники программы — в packages/treelights/src/, можем смело из корня папки OpenWRT SDK запускать make menuconfig

Откроется меню конфигурации пакетов, внутри которого будет наша утилита Christmas tree lights controiller, по умолчанию выключенная. Ставим на неё курсор, жмём пробел — перед утилитой появляется отметка (M), означающая, что она будет собрана отдельным пакетом.

Выходим из menuconfig, сохраняя конфигурацию, и запускаем собственно сборку пакета командой make package/treelights/compile

Если всё проходит хорошо — через несколько секунд в папке bin/ar71xx/ появляется подкаталог, в котором лежит наш пакет в файле формата ipk. Забираем его оттуда в удобное нам место, подключаемся к включённому Black Swift, например, с помощью WinSCP, копируем на него этот файл. Открываем любимый SSH-клиент, подключаемся им к консоли BSB и запускаем команду opkg install treelights*ipk. Ещё несколько секунд — и можно запускать программу, она лежит в /usr/bin/treelights и готова к работе. Удаление программы — opkg remove treelights, обновление — снова opkg install, удалять вручную старую версию перед обновлением не требуется.

Если сборка проходит с ошибкой — запускаем её снова командой make package/treelights/compile V=99, выводящей подробную выдачу компилятора, со всеми ошибками.

Если у нас несколько пакетов, которые надо собрать одновременно — просто говорим make или make V=99, без указания конкретного пакета. Соберётся всё, что было включено в menuconfig. Команда make clean стирает промежуточные файлы, созданные при сборке, make dirclean — промежуточные и финальные файлы, make distclean стирает всё, возвращая папку в первоначальное состояние.

Другие подробности о сборке под OpenWRT можно посмотреть на официальном сайте.
Автор: @olartamonov
Black Swift
рейтинг 44,39
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Комментарии (44)

  • +3
    Какие сложности для всего лишь гирлянды из светодиодов… Ох уж эта универсальность, проникает куда надо и не надо.
    • 0
      Сложности?! Попробуйте собрать то же самое (я не говорю про Wi-Fi, но хотя бы вот два канала ШИМ с отдельной регулировкой полярности) на мелкой логике, без микропроцессора — вот это будут сложности.
      • +1
        Микропроцессор это еще куда ни шло, но довольно мощный камушек… да еще кастомная среда сборки с исходников которую надо настраивать перед использованием… — вот где лишние сложности.
        • 0
          Не помню микроконтроллеров, у которых среда сборки была бы не кастомной, да и настройка тут сводится к tar jxf SDK.tar.bz2.

          P.S. Ну разве что Edison, он x86.
  • 0
    А когда и где можно будет заказать сам девайс? И можно ли оплатить не из РФ с указанием адреса товарища в МСК?
    • 0
      Прямо сейчас предзаказы живут на www.smartlx.ru/shop, потом переедут на официальные black-swift.ru для России и black-swift.com для всего мира. Оплатить можно, можно даже адрес доставки сразу указать не в РФ.
  • 0
    Сначала подумал: а нах это все? Потом подумал еще. А вообще интересная идея. На новый год вешал гирлянды по квартире… Замучался удлиннители протягивать и прятать… А с такой идеей — воткнул это все в комп/сервер, написал таймер включения-выключения и все? Жалко я с паяльником не дружу особо, так, 2 проводка спаять смогу, а дальше… :(

    Спасибо. Жду продолжения статьи.
    • 0
      А оно не сильно от двух проводов по сложности пайки отличается, в этом часть идеи Black Swift. Сам модуль можно взять с кроваткой под разъёмы с шагом 2,54 мм, в которые воткнуться проводами, схему собрать на breadboard. Паять только светодиоды останется :)
      • +1
        Вот со схемами совсем недружу. Хотя это как обычно наверное, на первый взгляд все страшно и сложно.
        • +1
          Именно :)
  • 0
    Замечательная статья! Как раз в тему моей разработке ) Я тоже сделал гирлянду с IP адресом. Гирлянда на микросхемах WS2801, которые управляются роутером TL-MR3020 по SPI интерфейсу. Работает это всё под управлением программы написанной на Python. Всё бы ничего, в статике можно зажигать любые светодиоды в любом количестве и любым цветом, но в динамике, когда происходит быстрая смена цвета, происходят совершенно рандомные вспышки рандомного количества светодиодов, и да, рандомным цветом. В общем у меня подозрение либо на неправильную работу роутера с конкретными GPIO, либо на модуль SPI для OpenWRT.
    А вообще с нетерпением жду появления black swift!
    • 0
      А SPI случаем не программный, на произвольных GPIO? Если да — от него странностей ждать логично.
      • 0
        Да, да, SPI именно программный настроенный на свободные GPIO.
        • 0
          Тут можно посоветовать только снизить скорость и проверить, что софт не пытается пихать в него данные быстрее, чем этот SPI может отработать.
          • 0
            Можно аппаратный SPI попробовать использовать. Прямо к ножкам NOR flash на роутере подпаяться, и один GPIO в качестве чип селекта.
    • 0
      А прокладка в виде ардуины, например, не рассматривалась?
      • 0
        Практического смысла в общем случае нет — у AR9331 есть аппаратный SPI, он через него с собственным флэшом общается, так что вопросов к скорости и стабильности там нет.

        Другое дело, что на роутерах этот SPI наружу не выведен, разве что к ножкам флэша и припаиваться, собственно.
  • 0
    А не поздновато? Даже старый Новый год прошел уже…
    • +1
      Так как раз к следующему НГ все успеют себе сделать!

      Не 30-го же надо было это выкладывать.
      • 0
        Еще можно себе представить гика, который 28 декабря паяет гирлянду… Но мне вот лично сложно представить его же, пишущего про это 30 декабря статью. :-)
        • +1
          И гиков, которые, прочитав 30 декабря статью, 31-го едут в Чип-и-Дип за светодиодами и транзисторами.
          • +1
            Я вот совсем напротив ЧиД живу и честно попёрся бы ещё 30, потому как поздравил себя с новым годом паяльной станцией и теперь не знаю что с ней делать.
            • 0
              Как что, паять гирлянду к следующему новому году. Да малоли праздников еще в переди? 23 февраля, 8 марта, майские… На все можно разных тематических гирлянд напоять и экспериментировать с black swift или еще чем ;)
          • 0
            Магазин не у всех есть под рукой, но у такого рода гиков есть подходящие детали где-то в чулане — светодиоды, транзисторы и прочая мелочь, которой достаточно для этой цели. Можно всё придумать и собрать не выходя из дома.
  • 0
    Видел у вас на Фейсбуке фотографию вроде как этой гирлянды, советую, кстати, к ней прикрепить ссылку на эту статью — а то одной фотографии там явно недостаточно =)

    Уверены, что нужно 5 транзисторов на входе? Не говорю о том, что можно было бы поставить буфер — скорее о том, что на входах L293D ну никак не должны появиться 5 вольт, на то они и входы. Ничего даже подтягивающего в даташите нет. Сам управляю L293D, используя сигналы 3.3V (плата MicroPython) без каких-либо транзисторов, при этом Vlog — 5-6V.

    Заказал 3 ваших платы, буду создавать давно задуманные вещи ;-) Надеюсь, скоро долетят в Латвию.
    • 0
      Скорее всего, будет прекрасно работать и без транзисторов. Я их поставил отчасти для красоты, отчасти для того, чтобы в статье этот момент упомянуть лишний раз.
    • 0
      Хмм. Прочитал свой давний комментарий. Транзисторы нужны. Во-первых, напряжения действительно может не хватить. Во-вторых, в прошлом месяце я сжёг 4 платы Arduino, используя L293DNE с 12В питанием =) Так что забираю свои сомнения обратно.
      • 0
        А я в этом году собрал контроллер на купленной в Чип-и-дипе готовой плате с L293 и инверторами (ту макетку давно выбросил, делать под такое специальную плату — странная трата времени, есть задачи актуальнее).

        Нет, вот в данном конкретном случае транзисторы не нужны :)

        У L293 два питания — одно для логики, другое для выходного каскада. При логике 5 В она таки нормально понимает выходные уровни 3,3-вольтового атероса.

        Но в общем случае транзисторы таки нужны. Потому как 74HC00, стоящая на той же плате, как раз при 5 В питания от выхода 3,3 В работала через два раза на третий; пересаживание её на 3,3 В при L293, оставшейся на 5 В (она меньше не умеет) проблему решило.
        • 0
          Тут всё в конце концов зависит от границ лог. уровней, поэтому я бы ставил бы транзисторы/буферы и не рисковал бы =) Флуктуации, гистерезис входов, да мало ли что ещё. Да и высокий уровень GPIO на BSB вроде 2,75. — ещё ближе к undefined state.
          Скоро буду продвинутый роутер собирать на BSB, вот тогда будет чем поделиться в плане опыта в сборке железа. Пока что только собираю данные, помогая с дебагом чужих проблем на форуме =)
          • 0
            У L293 уровень «1» на входе — от 2,3 В.

            Но вообще да, такие вещи лучше всегда согласовывать корректно.
  • 0
    Резисторы в цепи затворов можно убрать. Там же «логические» полевики, а не силовые, — ёмкость затвора совсем небольшая, бояться пробоя управляющего вывода не стоит.
  • 0
    Переживания насчет 220 В на елке совершенно напрасны — оно там гораздо менее опасно, чем, например, свисающие из розеток шнуры настольных светильников, бытовой техники и т.п. В гирлянде напряжения/токи ограничены наличием множества лампочек, а в шнурах — только автоматами в щите. Если Вы действительно озабочены безопасностью ребенка — нужно начинать, как минимум. с установки УЗО в щит и затычек в розетки.
  • 0
    Жаль, что нет видео с результатом.
    • 0
      Мммм… завтра, в третьем посте по теме сделаю.
  • 0
    Ваш образ CentOS 6 заработал только на виртуальной машине под 64-битный Linux. При попытке запуска на 32-битном писал, что CPU не поддерживает PAE.
    • 0
      CentOS 6 штатно не поддерживает машины без PAE. В принципе можно сделать и без него, но я не вижу, если честно, большой необходимости — образ для VirtualBox рассчитан на десктопные машины, в которых процессоров без PAE не осталось уж давно (32-битный он потому, что 64-битная гостевая ОС потребует от процессора VT, а тут уже могут быть нюансы).
      • 0
        У Вас в статье написано:
        Итак, скачиваем виртуальную машину, распаковываем zip-файл в vdi, запускаем VirtualBox, создаём новую VM под 32-битный линукс

        А на самом деле, нужно создавать под 64-битный линукс.
        • 0
          Нет.

          yadi.sk/i/xFcUYFuSe3AEQ
          yadi.sk/i/9VgB2wZUe3AF3

          32 бита, PAE в VirtualBox включён по умолчанию (если на каких-то версиях/конфигурациях он выключен — да, надо включить).
  • 0
    Стоит отметить, что может быть удобно не cобирать каждый раз пакет и устанавливать его на OpenWRT, а использовать eclipse с установленным toolchain. Это позволит из среды разработки запускать приложение на отладку удаленно, прямо на OpenWRT устройстве. Для этого на OpenWRT потребуется gdb.

    downloads.openwrt.org/docs/eclipse.pdf
    • 0
      Да, скоро будет пост про это — ну и образы линукса с установленным Eclipse подготовим.
      • 0
        Это удобно, молодцы что сразу готовите образы, для того чтобы развернуть среду по первости можно убить целый день, а то и вообще зайти в тупик.
        • 0
          Я бы радикальнее сказал — человек, у которого уже нет отдельной машинки или виртуалки с линуксом, с большой вероятностью решит вообще с этим не связываться.
    • 0
      На OpenWrt потребуется gdbserver, а не сам gdb. В нашей «стандартной» прошивке он уже стоит. Плюс нужен SFTP сервер, которого почти никогда в прошивках изначально не бывает (у нас есть). Т.е. наша плата к отладке через WiFi готова «из коробки».
      • 0
        Да, все верно, конечно же gdbserver и openssh-sftp-server. И это отлично, что все работает из коробки, так как флеш на Black Swift можно не экономить, а плата отладочная и должна иметь такие функции. В следующий раз для отладки проекта буду использовать не mr3020 а вашу платку.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.

Самое читаемое Разное