Zephyr OS на Raspberry Pi Pico в Ubuntu 22.04: від нуля до Hello World

Серія «Збираємо комп’ютер як Neotron, але по-своєму» | Частина 0: Середовище

В коментарях до статті “Це не Raspberry Pi. І саме тому це цікаво. Luckfox Pico Pro: від ATmega8 до живого відеостріму завязалась цікава розмова немовби на форумі, хто пам’ятає часи форумів той зрозуміє. З тієї розмови я дізнався багато чого нового і цікавого за що неймовірно вдячний flyman і Олександр Литвиненко.

Отже, погуглив “pi pico zephyr” і знайшов дещо цікаве, Neotron Pico мікрокомп’ютер на базі RP2040. Видно перетнувши межу між сном і маренням, оскільки вже була глибока ніч, вирішив що теж хочу зібрати щось на кшталт того з дисплеєм, клавіатурою і, бажано, виглядом як у ретро-ЕОМ з радянських фільмів. Але замість Rust (бо я не мазохіст) – Zephyr RTOS на C.

Zephyr як виявилось це «дорослий» RTOS від Linux Foundation в якого є євангілісти і спільнота, а головне в ньому є офіційна підтримка RP2040, документація є, Stack Overflow теж є. Що ще треба людині о другій ночі?

Сьогодні зроблю тільки Hello World. Але якщо ви думаєте, що це просто, то ви ще не зустрічали west init.

Що знадобиться

  • Raspberry Pi Pico (RP2040) дешевий, задокументований, зрозумілий і в ньому Arduino поруч якщо Zephyr набридне
  • USB-кабель micro-USB
  • Ubuntu 22.04 або новіший (WSL офіційно не підтримується для прошивки)
  • Python 3.12+ — увага, Ubuntu 22.04 дає 3.10 з коробки, див. нижче
  • ~4 ГБ на диску (Zephyr любить покушать)
  • Терпіння. Багато терпіння.

 

💡 Windows: офіційна документація рекомендує рідний cmd.exe або PowerShell, не WSL з причин сумісності при прошивці.

Застереження: nRF Connect SDK це не те, що вам треба

Перш ніж ми почнемо важлива порада, яку я засвоїв через кілька годин болю.

Якщо ви гуглите «Zephyr Pi Pico» і натрапляєте на туторіали про nRF Connect SDK від Nordic то закрийте вкладку. Зразу. Не читайте далі.

nRF Connect SDK це форк Zephyr, заточений під чипи Nordic (nRF52, nRF53 тощо). Pi Pico там явно не люблять. Nordic навмисно не включає hal_rpi_pico у свій маніфест. Ви можете витратити кілька годин на боротьбу з помилками на кшталт:

hardware/clocks.h: No such file or directory

HAS_RPI_PICO Kconfig warning → fatal error

platform.c: No such file or directory

…і це буде нескінченний ланцюг залежностей, яких там просто немає за архітектурним рішенням Nordic. Я перевірив особисто. Не повторюйте мій шлях.

🚫 nRF Connect SDK + Pi Pico це кілька годин страждань. Використовуйте чистий Zephyr.

Крок 1: Python 3.12 (якщо Ubuntu 22.04)

Zephyr вимагає Python 3.12+. Ubuntu 22.04 з коробки дає 3.10. Ставимо через deadsnakes PPA:

Перевіряємо: python3.12 –version  # має бути Python 3.12.x

⚠️ Не замінюйте системний python3 бо він може використовуватись іншими пакетами. Ми будемо явно викликати python3.12 при створенні venv.

Крок 2: Системні залежності

Встановлюємо все необхідне одним заклинанням:

Перевіряємо версії (Zephyr вимагає: cmake ≥ 3.20.5, python ≥ 3.12, dtc ≥ 1.4.6):

 

Крок 3: Встановлення west і завантаження Zephyr

west це утиліта для керування Zephyr-проєктами. Типу npm, але для мікроконтролерів і з більшим відчуттям небезпеки.

Спочатку створюємо Python virtual environment з версією 3.12 (важливо!):

Тепер встановлюємо west та завантажуємо весь Zephyr (~1-2 ГБ, час на каву):

⚠️ west update може тривати 10-20 хвилин залежно від інтернету. Це нормально бо Zephyr тягне кілька десятків репозиторіїв. west packages pip –install може не побачити venv — тоді використовуйте pip install -r напряму, як показано вище.

Крок 4: Zephyr SDK (компілятор для ARM)

SDK це крос-компілятори та інструменти для збірки під ARM (і ще 20+ архітектур, але нас цікавить саме ARM для RP2040).

Актуальну версію SDK завжди перевіряйте на github.com/zephyrproject-rtos/sdk-ng/releases.

Крок 5: Створюємо Hello World

Zephyr немає готового прикладу hello_world, і ми зробимо свій. Структура проєкту мінімальна:

src/main.c

CMakeLists.txt

prj.conf

Тут вмикаємо USB CDC ACM — це віртуальний серійний порт через USB. Без нього Pico буде мовчати як партизан:

app.overlay — ключовий файл!

Ось де ховається головний підводний камінь, через який Pico з’являвся як USB-пристрій але без жодних інтерфейсів. Без цього файлу CDC ACM не реєструється, хоч як налаштовуй prj.conf:

💡 Device Tree Overlay (.overlay) — це механізм Zephyr для опису апаратного забезпечення. Без явного оголошення CDC ACM вузла в дереві пристроїв — USB стек просто не знає про його існування, навіть якщо Kconfig вмикає драйвер.

 

Крок 6: Збираємо проєкт

Активуємо venv (якщо ще не активований) і збираємо:

Якщо все добре — через 2-3 хвилини побачите:

⚠️ При повторній збірці після змін використовуйте –pristine для чистої збірки: west build -b rpi_pico ~/hello_pico –pristine

Крок 7: Прошиваємо Pico

Ось тут Pi Pico дає нам щось рідкісне у світі мікроконтролерів, повну відсутність програматорів:

  1. Затискаємо кнопку BOOTSEL на Pico
  2. Підключаємо до ПК через USB (не відпускаємо кнопку)
  3. Відпускаємо кнопку і Pico з’явиться як диск RPI-RP2
  4. Копіюємо файл прошивки:

cp ~/zephyrproject/build/zephyr/zephyr.uf2 /media/$USER/RPI-RP2/

  1. Pico автоматично перезавантажується і запускає прошивку

Крок 8: Дивимося результат

Після прошивки перевіряємо що Pico з’явився як серійний порт:

Підключаємось і дивимось що говорить Pico:

Виглядає скромно, але під капотом крутиться справжній RTOS з планувальником, пріоритетами задач і управлінням пам’яттю. k_msleep(1000) — це не просто delay, це yield для планувальника. Різниця принципова, хоч і непомітна в однозадачному Hello World.

Типові помилки та як з ними жити

«west: unknown command build»

Запускаєте west поза workspace. Треба бути всередині ~/zephyrproject або передавати шлях явно:

 

«Could NOT find Python3: Found unsuitable version 3.10»

CMake бере системний Python замість venv. Вирішення — venv має бути на початку PATH:

«config 1 has no interfaces?» в dmesg

Відсутній app.overlay з описом CDC ACM вузла. Без нього USB стек не знає про серійний порт. Перевірте що файл app.overlay є в папці проєкту і містить блок &zephyr_udc0.

Pico не з’являється як диск

  • Тримайте BOOTSEL до підключення кабелю
  • Спробуйте інший кабель (класика жанру)
  • Перевірте чи не зайнятий порт іншою програмою

«west packages pip –install» не бачить venv

Відоме обмеження в деяких конфігураціях. Замість цього:

pip install -r ~/zephyrproject/zephyr/scripts/requirements.txt

Про VS Code

Планував збирати через VS Code з відповідними розширеннями. Якщо хочете спробувати то потрібні розширення C/C++ і CMake Tools від Microsoft. nRF Connect для VS Code, не ставте, він тягне nRF SDK і плутає шляхи.

На практиці виявилось що термінал з west build більш надійніший варіант для першого знайомства. VS Code зручний для редагування файлів і має вбудований Serial Monitor для перегляду виводу замість minicom.

Що далі

Hello World це лише початок. Мета цієї серії — зібрати повноцінний мікрокомп’ютер на Pi Pico з:

  • Дисплеєм ST7789 або ILI9341 через SPI + бібліотека LVGL
  • PS/2 або USB клавіатурою
  • Командним рядком через Zephyr Shell
  • Файловою системою на SD-картці (FatFS)
  • І, може, VGA-виходом через PIO — якщо вистачить нервів

У наступній частині цієх серії підключаємо LCD-дисплей і виводимо перші пікселі. Там буде Device Tree, LVGL і відчуття, що ти вже справжній embedded-розробник.

Якщо у вас щось не запустилось чи є релевантніший досвід ніж у мене, то пишіть у коментарях. Досвід «у мене теж не завелось» теж корисний, бо я точно не один наступав на ці граблі.

Корисні посилання

  • Офіційна документація Zephyr для Pico: docs.zephyrproject.org/latest/boards/raspberrypi/rpi_pico/
  • Getting Started Guide: docs.zephyrproject.org/latest/develop/getting_started/
  • Neotron Pico (натхнення): github.com/Neotron-Compute/Neotron-Pico
  • Zephyr SDK releases: github.com/zephyrproject-rtos/sdk-ng/releases
  • USB CDC ACM на Pico (англ.): bucknalla.dev/2023/05/12/rpi-pico-usb-serial-zephyr/

 

P.S. Так, я знаю, що коментарі на DOU скажуть «навіщо Zephyr, є ж Arduino». Відповідаю заздалегідь: бо хочу. І бо Zephyr крутіший. Все.

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *