Ялинка, зажгись! Частина 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 конфігураційного меню

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

Виходимо з конфігураційного меню, зберігаючи конфігурацію, і запускаємо власне складання пакету командою 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, без вказівки конкретного пакета. Збереться все, що було включено до конфігураційного меню. Команда make clean пере проміжні файли, створені при складанні, make dirclean — проміжні та фінальні файли, make distclean стирає все, повертаючи папку в початковий стан.

Інші подробиці про складання під OpenWRT можна подивитися на офіційному сайті.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.