Меню

andipanda.dev

CaRadio: як працює Carlinkit із Raspberry Pi

У попередній статті я розповів, як шукав спосіб запустити Apple CarPlay на Raspberry Pi, експериментував із pycarplay та carplay-receiver, а майже через два роки повернувся до проекту завдяки FastCarPlay.

Але там я практично не пояснив, навіщо взагалі потрібен USB-донгл Carlinkit і яку роль він відіграє в роботі моєї магнітоли.

На перший погляд усе виглядає досить просто: підключаємо адаптер до Raspberry Pi, з'єднуємо iPhone й отримуємо CarPlay на екрані.

На практиці між телефоном і появою зображення на дисплеї відбувається чимало цікавого.

Спробую пояснити, як влаштована ця система, не заглиблюючись у вихідний код і подробиці протоколу.

Навіщо взагалі потрібен Carlinkit

Коли я вперше зацікавився CarPlay на Raspberry Pi, мені здавалося, що достатньо знайти відповідне програмне забезпечення.

Адже Raspberry Pi має USB, Bluetooth, Wi-Fi і цілком здатний відтворювати відео та звук.

Але CarPlay — це не звичайна трансляція екрана телефона.

Для встановлення з'єднання та подальшої роботи необхідно реалізувати певний механізм взаємодії з iPhone. Саме тут і з'являється USB-донгл Carlinkit.

У моїй конструкції адаптер виступає посередником між телефоном і Raspberry Pi.

Він забезпечує частину взаємодії, необхідної для роботи CarPlay, а застосунок на Raspberry Pi обмінюється з ним даними через USB.

Таким чином, мені не довелося самостійно реалізовувати весь механізм підключення iPhone.

Однак сам по собі Carlinkit ще не перетворює Raspberry Pi на автомобільну магнітолу.

Для цього потрібне програмне забезпечення, яке зможе взаємодіяти з адаптером і обробляти отримані дані.

Як влаштована система

У CaRadio беруть участь кілька основних компонентів.

Перший — iPhone. На ньому працюють навігація, музичні застосунки та інші функції CarPlay.

Другий — USB-донгл Carlinkit. Він забезпечує взаємодію з телефоном і передає дані комп'ютеру, до якого підключений.

Третій — Raspberry Pi. Саме на ньому працює моя магнітола й виконується застосунок CaRadio.

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

У спрощеному вигляді схема виглядає так:

iPhone ↔ Carlinkit ↔ USB ↔ Raspberry Pi → дисплей і звук

При цьому керування працює і у зворотному напрямку. Коли я натискаю на екран магнітоли, відповідна команда має потрапити назад на iPhone.

Саме тому робота з CarPlay не обмежується лише відтворенням відео.

Підключення телефона

У моєму випадку використовується бездротовий CarPlay.

Це зручно в повсякденній експлуатації: сів в автомобіль, увімкнув магнітолу, і через деякий час телефон підключається без кабелю.

Однак бездротове підключення не означає, що Raspberry Pi безпосередньо працює з iPhone.

USB-донгл, як і раніше, залишається частиною системи.

З боку Raspberry Pi взаємодія відбувається з підключеним USB-пристроєм, а адаптер уже забезпечує зв'язок із телефоном.

Для CaRadio це суттєве спрощення.

Застосунку не потрібно самостійно керувати всіма етапами бездротового підключення iPhone. Він працює з інтерфейсом адаптера й обробляє дані, необхідні для відображення CarPlay та керування ним.

Звідки береться зображення

Одне з перших питань, яке виникає під час знайомства з подібною системою: яким чином зображення CarPlay з'являється на екрані Raspberry Pi?

Сам інтерфейс CarPlay формується на стороні iPhone.

Телефон передає відеодані через встановлене з'єднання, а адаптер доставляє їх застосунку на Raspberry Pi.

Далі програмі необхідно обробити відеопотік і вивести зображення на дисплей.

Саме з цією частиною в мене виникали проблеми під час перших експериментів.

У ранніх проектах для відображення зображення використовувалися браузер або окремі медіаплеєри, наприклад mpv.

Пізніше я пробував переробити виведення під VLC.

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

Коли я повернувся до розробки й почав працювати з FastCarPlay, з'явилася можливість вирішувати ці завдання безпосередньо на C++.

У нинішній CaRadio відображення CarPlay інтегроване у власний застосунок з інтерфейсом на SDL3.

Це дозволяє використовувати один інтерфейс магнітоли замість набору окремих програм.

А що зі звуком?

Із зображенням усе відносно зрозуміло: телефон формує картинку, а Raspberry Pi виводить її на дисплей.

Але для автомобільної магнітоли не менш важливий звук.

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

Тому програмна частина CaRadio повинна працювати не лише з відео, а й з аудіоданими.

У моїй конструкції Raspberry Pi є основним обчислювальним пристроєм магнітоли, а для відтворення звуку використовується окремий підсилювач.

Таким чином, CarPlay стає частиною загальної аудіосистеми автомобіля.

При цьому обробка зображення та звуку — різні завдання. Навіть якщо відеопотік уже вдалося вивести на екран, це ще не означає, що вся мультимедійна система готова до роботи.

Керування через сенсорний екран

Ще одна важлива частина — зворотний зв'язок із телефоном.

Коли я натискаю на кнопку в інтерфейсі CarPlay, дія має виконуватися на iPhone.

Сам по собі сенсорний екран Raspberry Pi нічого не знає про CarPlay. Він лише повідомляє застосунку координати дотику.

Програмне забезпечення має обробити ці координати й передати відповідну подію через USB-адаптер.

Після цього телефон реагує на дію, а оновлене зображення знову надходить на дисплей магнітоли.

Виходить двосторонній обмін: телефон передає зображення та звук, а магнітола надсилає команди керування.

Без цієї частини CarPlay був би просто зображенням, з яким неможливо взаємодіяти.

Чому недостатньо просто підключити донгл

Коли я вперше купив адаптер Carlinkit, мені хотілося якнайшвидше побачити працюючий CarPlay на Raspberry Pi.

І завдяки відкритим проектам це справді вдалося.

Але між першим успішним запуском і повноцінною магнітолою виявилася велика різниця.

Недостатньо один раз вивести зображення на екран.

Потрібно, щоб система запускалася передбачувано, телефон підключався, зображення та звук працювали без помітних проблем, а сенсорне керування залишалося зручним.

Крім того, автомобільна магнітола має бути частиною самого автомобіля.

У моєму випадку CaRadio необхідно коректно вмикатися, реагувати на вимкнення запалювання й завершувати роботу Raspberry Pi без ризику пошкодити файлову систему.

Ці завдання вже виходять за межі самого CarPlay і потребують окремої логіки застосунку та апаратної частини.

Саме тому CaRadio поступово перетворилася з експерименту з USB-донглом на самостійний проект.

Що в підсумку робить CaRadio

Якщо спростити, USB-донгл Carlinkit допомагає встановити взаємодію з iPhone, а CaRadio перетворює отримані дані на працюючу автомобільну мультимедійну систему.

Застосунок взаємодіє з адаптером, забезпечує відображення CarPlay, обробку звуку й сенсорного керування, а також об'єднує ці функції з рештою логіки магнітоли.

При цьому я не розробляв протокол CarPlay з нуля.

В основі програмної частини лежать ідеї та напрацювання відкритих проектів, насамперед FastCarPlay, які я вивчав і адаптував під власну конструкцію.

Для мене головним результатом стала не просто поява CarPlay на екрані Raspberry Pi, а можливість щодня користуватися ним в автомобілі.

Що далі

У цій статті я спробував пояснити загальний принцип роботи системи, не заглиблюючись у технічні подробиці.

За кожним з описаних етапів приховано значно більше деталей: обмін даними через USB, обробка відеопотоку, передача звуку, керування підключенням та інтеграція з інтерфейсом застосунку.

Можливо, з часом я розповім про окремі частини докладніше.

А якщо хтось захоче повторити подібний проект або розібратися в програмній частині CaRadio, зі мною можна зв'язатися електронною поштою. За можливості поділюся досвідом та окремими напрацюваннями.

Поки що головне для мене — те, що зв'язка Raspberry Pi та Carlinkit виявилася цілком придатною для повсякденного використання в автомобілі.