Ще не осів пил від коліс Хижака мого проєкту на Pi Pico RP2040 Arm Cortex-M0+, яку я програмував на Arduino платформі, з радіокерованою машинкою на приймачі FS iA6B, а я вже дивився на нову плату на столі. Хижак їздить, працює, гештальт закрито. Та Arduino за 12 років освоєно вздовж і поперек і проекти на ньому стали прототипами справжніх бізнес проектів, суттєво допомогли мені в свій час в автоматизації, та за ці роки багато що змінилось.
Є моменти в житті, коли ти стоїш між двома світами. Один знайомий, швидкий, передбачуваний. Інший — складний, незрозумілий, але дивно притягує, саме таким світом став для Embedded Linux. Колись програмування жило у браузері та на серверах.
Сьогодні воно переїжджає у реальні речі:
- камери, які думають;
- дрони, які бачать;
- пристрої, які приймають рішення без хмари;
- маленькі комп’ютери, що працюють автономно.
Де код стає фізичною реальністю, а пристрій не просто плата, а: власний сервер, власна камера, власний експериментальний комп’ютер, лабораторія, яка завжди поруч. Я вже можу створити пристрій з нуля від живлення до веб-інтерфейсу і це дає відчуття творення, яке складно отримати в абстрактному коді, там де не loop(), а kernel, драйвери і /dev/video0.
Сьогодні розповім вам про новий гештальт власну IP-камеру і зрозуміти як воно працює зсередини. Не купити готову. Не взяти Raspberry Pi з туторіалом. А взяти $15 embedded плату і пройти шлях з нуля — від голого залізa до веб-інтерфейсу в браузері. Без романтики і без фантастики. Тільки реальні команди, реальні помилки і реальний результат в браузері наприкінці.
1. Що за плата і навіщо
Luckfox Pico Pro, це embedded Linux плата на чіпі Rockchip RV1106. Розміром з великий палець, ціною ~$15, але всередині справжній Linux з Ethernet, ISP процесором для камери і NPU для нейромереж.
Характеристики:
- CPU: ARM Cortex-A7 @ 1.2GHz
- RAM: 128MB DDR2
- Storage: 256MB SPI NAND
- Мережа: 10/100M Ethernet + USB RNDIS
- OS: Buildroot Linux (kernel 5.10.110)
Мета проєкту: зробити DIY IP-камеру. Але сьогодні — просто підключитись і запустити дашборд. Baby steps.

2. Перше підключення — USB замість Ethernet
Першим сюрпризом було те, що плата підключається до комп’ютера через USB RNDIS тобто вона стає Ethernet адаптером прямо через USB кабель. Ніякого роутера не потрібно на першому кроці.
Підключили — дивимось що з’явилось:
dmesg | tail -25
rndis_host 3-7:1.0 enx0a400188dd9f: renamed from usb0
Плата з’явилась як мережевий інтерфейс enx0a400188dd9f. Така гарна назва Linux дуже художньо генерує імена для USB Ethernet пристроїв на основі MAC адреси.
Призначаємо IP на своєму боці:
sudo ip addr add 172.32.0.100/24 dev enx0a400188dd9f
sudo ip link set enx0a400188dd9f up
3. Знайти плату в мережі — детективна історія
Перший ping на дефолтний IP 172.32.0.70 не пройшов, плата отримала інший IP. Класика embedded: документація каже одне, реальність інше.
Скануємо мережу через nmap:
sudo nmap -sn 172.32.0.0/24 -e enx0a400188dd9f
→ Nmap scan report for 172.32.0.93 — Host is up
Є! Реальний IP виявився 172.32.0.93. Хтів по документації, а вийшло тут тре методом втика).
4. SSH і ми всередині
Перша спроба SSH і падіння з помилкою Too many authentication failures — ssh-agent намагається перебрати всі ключі. Фікс простий:
ssh -o IdentitiesOnly=yes -o PubkeyAuthentication=no root@172.32.0.93
Пароль: luckfox. І ось воно:
[root@luckfox root]#
Цей момент один з найкращих у embedded. Ти всередині маленького Linux девайса який тримаєш в руці. Від уяви, що ти типу хакер, аж долоньки вспотіли).
5. Що всередині системи
Проводимо розвідку, досліджуємо куди ми попали:
uname -a
→ Linux luckfox 5.10.110 armv7l GNU/Linux
free -h
→ Mem: 54.5M total, 33.7M available
→ Swap: 0 (немає swap — типово для embedded)
Цікавий момент: в lsmod видно модулі video_rkisp, rknpu, mpp_vcodec – ISP, нейромережевий процесор і hardware відеоенкодер. Все це у платі за $15, колись Ардуїно UNO була дорожча.
Python 3.11.6 і v4l2-ctl вже є в системі. Це важливо — не треба нічого компілювати для старту.
6. Чому uname показує armv7l якщо плата RISC-V?
Це перше питання яке виникає після входу в систему. В описі плати написано RISC-V, а uname -a відповідає armv7l. Що за фігня?
RV1106 — це гібридний чіп з двома ядрами всередині:
- ARM Cortex-A7 — головне ядро. На ньому крутиться Linux, всі процеси, твій код
- RISC-V MCU — допоміжне ядро. Відповідає за швидкий старт і low-power режими
Чому це важливо практично:
- Тре шукати пакети — armv7 або armhf, не riscv64
- Мою улюблену Node.js не встановиш бо2 більшість білдів для armv7 не підтримує цей чіп без крос-компіляції
- Python працює бо є в Buildroot з правильною архітектурою і вже встановлений
7. Чому Python, а не Node.js?
Логічне питання для веб-розробника, адже Node.js ж швидкий, async, знайомий до простоти. Але на embedded це зовсім інша картина і це мене трохи засмутило, що мій практичний досвід тут неревалентний, та хіба то коли небудь зупиняло справжнього дослідника і сталкера? Отже;
- Node.js runtime важить ~50MB при доступних 33MB RAM це вже проблема ще до старту
- Крос-компіляція Node для armv7 це вже окремий квест на кілька днів. Buildroot не має Node в дефолтній конфігурації
- Python 3.11.6 вже є тому просто відкриваєш файл і пишеш. Нульова конфігурація
Та звісно ж Python в цьому проєкті не для продакшну, а щоб зрозуміти як стрімінг влаштований зсередини. Різниця між “воно працює” і “я розумію чому воно працює”. Адже в embedded головне не швидкість CPU, а пам’ять.
8. А можна писати на C, Rust або Go?
Так, адже це звичайний Linux. Можна писати на чому завгодно.
C / C++
Рідна мова embedded. Компілюєш на своєму комп’ютері (крос-компіляція для armv7), копіюєш один бінарник на плату і запускаєш. Мінімальний overhead, максимальна швидкість.
Go
Найзручніший варіант для HTTP сервісів. Вбудований крос-компілятор — одна команда:
GOOS=linux GOARCH=arm GOARM=7 go build -o server main.go
Один статичний бінарник без залежностей. Для MJPEG стріму, це буде наступний крок у проєкті.
Rust
Працює після налаштування toolchain: cargo build –target armv7-unknown-linux-musleabihf. На обмеженій RAM zero-cost abstractions — це не маркетинг а реальна перевага.
Практична шпаргалка:
- Старт і прототип → Python (вже є на платі)
- HTTP сервер і стрімер → Go (простий крос-компіл, один бінарник)
- Системні речі і драйвери → C
- Безпека памяті і експерименти → Rust
9. Підключаємо Ethernet і отримуємо інтернет
Підключили Ethernet кабель до роутера. Плата отримала IP автоматично через DHCP:
ip addr show eth0
→ inet 192.168.1.102/24
ping -c3 8.8.8.8
→ 3 packets transmitted, 3 received, 0% packet loss
10. Дашборд на платі — фінальний акорд
Створюємо HTML дашборд в стилі embedded terminal з живими метриками, HUD оверлеєм для відео, логами системи і візуалізацією відео пайплайну. Закинули на плату через SCP і запустили вбудований Python HTTP сервер:
python3 -m http.server 8080 -b 0.0.0.0
# Відкриваємо в браузері: http://192.168.1.102:8080/dashboard.html
Маленький нюанс: python3 -m http.server 8080 впав з помилкою OSError: [Errno 97] Address family not supported, який з’ясувалось це IPv6 проблема на embedded ядрі. Фікс: додати -b 0.0.0.0 щоб примусово використати IPv4.
Дашборд відкрився в браузері. Веб-сервер крутиться на embedded Linux платі розміром з палець. Це і є момент коли розумієш що IP-камера, це просто маленький Linux сервер.
11. Що далі
Замовив рідну камеру MIS5001 5MP сумісна з Luckfox Pico Pro/Max/Ultra (RV1106), широкий кут, гарна робота при слабкому освітленні.
Поки їде з магазину, можна:
- Написати Python MJPEG стрімер на стандартній бібліотеці (без фреймворків)
- Зробити autostart сервісу через init.d
- Підключити реальні метрики з /proc до дашборду через API
- Камера приїде — підключити і отримати живий стрім у браузері
Підіб’ємо підсумки, дослідження
- USB RNDIS це спосіб підключитись до плати без роутера. Плата прикидається Ethernet адаптером
- nmap -sn — найшвидший спосіб знайти пристрій в мережі коли не знаєш IP
- Too many auth failures в SSH — фікситься через -o PubkeyAuthentication=no
- python3 -m http.server на embedded потребує -b 0.0.0.0 через відсутність IPv6
- lsmod показує що реально є в ядрі — краще ніж будь-яка документація
- IP-камера це просто маленький Linux сервер. Не більше і не менше
P.S. Я починаю відкритий техно-експеримент – створення власного embedded Linux девайса з нуля. Без готових рішень. Без «магічних коробок». Тільки плата, Linux і ідеї.
Це буде маленький, трохи хакерський пристрій:
– власний веб-інтерфейс
– робота з мережею
– експерименти з безпекою та pentest-інструментами
– і найцікавіше це живе відео прямо з мікропристрою
Проєкт відкритий, я буду показувати весь шлях: від першого запуску Linux до реального working-девайса.
📦 Камера вже їде.
Наступна стаття, про запуск live відеостріму з embedded Linux.
Якщо вам цікаві:
– embedded Linux
– DIY девайси
– hardware + hacking
– створення власних інструментів, а не використання чужих
тоді додавай в закладки, щоб не пропустити наступні етапи. Буде багато практики, помилок і справжнього інженерного досвіду.