Как сделать радио из Cyberpunk 2077 своими руками?

Воссоздаем технику из вселенной видеоигры. Внутри — пошаговая инструкция, а еще фотографии процесса и результатов.

Владимир Туров
Разработчик в команде серверной логики и развития выделенных серверов Selectel

Привет! Так вышло, что я не ждал Cyberpunk 2077 десять лет и даже не смотрел презентации и трейлеры. Но через два месяца после релиза друг подарил мне цифровую копию игры, и с первых часов я проникся ее красочным и противоречивым миром.

Я наиграл уже более двухсот часов, разведал каждый уголок и решил не скучать, пока выход сюжетных DLC задерживается. Мне захотелось «перенести» технику из игры в реальную жизнь, и я выбрал интернет-радио. Как я собрал его своими руками и что мне для этого понадобилось, рассказываю ниже.

Как сделать радио из Cyberpunk 2077 своими руками?

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

Все описанное дальше — мое личное творчество, которым я занимался в свободное от работы время. Официальное руководство по фан-контенту CD Projekt Red позволяет свободно творить по вселенным Cyberpunk 2077 и «Ведьмака», пока это не выставлено на продажу.

Полный список используемых деталей и ссылки на ресурсы указал в конце текста.

Выбор устройства

Радио в квартире Ви
Радио в квартире Ви

Cyberpunk 2077 — это приключенческая ролевая игра, действие которой происходит в мегаполисе Найт-Сити. Вы играете за Ви — это протагонист игры, который ищет устройство, обеспечивающее бессмертие.

В игре есть предыстории — это разные варианты прошлого Ви, которые влияют на развитие сюжета. Все они заканчиваются в одном месте: в квартире героя. Там же на столе можно найти первое радио. В игре есть несколько версий устройства, но маленькое красное радио покорило меня с первого взгляда, и я решил: «Надо делать»‎.

Действия игры разворачиваются в мире, который изобилует множеством невозможных пока технических устройств. Условимся, что наше радио должно выдерживать баланс между аутентичностью и количеством допущений, которые позволят сделать устройство сейчас.

Всю работу я разделил на несколько этапов: сначала смоделировал корпус, после занялся созданием и спайкой «начинки», сборкой устройства и настройкой прошивки. В финале запустил онлайн-радиостанцию. Остановимся на каждом шаге подробнее.

Моделирование корпуса

Моделирование корпуса позволяет оценить количество свободного места внутри устройства и в дальнейшем определиться с «начинкой».

В квесте «Стражи беспорядка» вам предстоит зайти на Джапан-Таун и допросить продавщицу на рынке. В этот момент она разбирает радио. Это единственная возможность увидеть радио изнутри. Вне квеста устройство стоит собранным.

Инструмент WolvenKit, созданный для мододелов, помог мне найти радио в игровых файлах. Он позволяет распаковывать архивы и конвертировать ресурсы из проприетарных форматов в общеизвестные.

Mesh-модель
Mesh-модель

Поиск радио занял некоторое время, так как я искал в файлах что-то со словом radio. Но оказалось, что в терминах игры это электроника бедняков (poor_electronics — плохая электроника). Я экспортировал mesh-модель, загрузил в 3D-редактор и обнаружил, что модель «битая». Впрочем, она изначально была нужна для «срисовывания» основных пропорций, поэтому проблема оказалась незначительной.

Mesh-модель, как и скриншот из игры, не позволяет точно определить размер устройства. Но и тут есть решение. Рядом с радио в квартире Ви стоит жестяная банка, визуально напоминающая банку на 500 мл. К счастью, у меня в холодильнике нашлась аналогичная, поэтому я провел замеры. Получилось, что радио должно быть 75 мм в ширину и 300 мм в длину.

Такие размеры чуть-чуть выходят за рамки области печати распространенных 3D-принтеров. Перспектива собирать устройство из частей не радовала, поэтому я пропорционально уменьшил радио до 250 мм в длину.

Модель радио в Fusion360
Модель радио в Fusion360

Без большого опыта в моделировании я потратил не один десяток часов на воссоздание модели и «подгон» под «железо» внутри. Чтобы сократить возможные доработки, выбрал путь наименьшего сопротивления: первая версия должна просто изготавливаться, а все сложные улучшения можно сделать позже.

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

Однако верхняя часть радио не бесполезна: над кнопками в модели есть панель неизвестного назначения. Туда можно установить дисплей 128х32.

Отвлечемся от корпуса и обратимся к электронной составляющей радио.

Начинка

От шипения, низкого звука и лишних проводов меня избавил проект Wi-Fi-радио от AlexGyver. Я выбрал его по нескольким причинам.

  • ESP32, на котором он работает, дешевле Raspberry Pi.
  • Динамик на видео можно сравнить по цене с готовыми колонками, которые у меня есть, но качество звука лучше.
  • Благодаря проекту я могу не погружаться в работу с программным обеспечением микроконтроллера.
  • Цифровой шум, который есть в схеме, можно свести на «нет» регулировкой громкости динамика и аккуратной пайкой.
Схема подключения компонентов радио. Источник: <a href="https://api.vc.ru/v2.8/redirect?to=https%3A%2F%2Falexgyver.ru%2Fwifi-radio%2F&postId=448082" rel="nofollow noreferrer noopener" target="_blank">alexgyver.ru</a>
Схема подключения компонентов радио. Источник: alexgyver.ru

Сначала я собрал схему на макетной плате без пайки. Цифровой шум был ужасен. Пересобрал схему навесным монтажом, пропаял все соединения питания и передачи звука, но шум сохранился. Добавил электролитический конденсатор на 630 uF, но и это не помогло. Я решил убрать потенциометр, который выполняет функцию регулирования громкости, и чудо произошло: цифровой шум стих.

В лучших шутках программирования я исправил одну проблему и создал две.

Во-первых, усилитель работал на максимум и динамик шипел. Во-вторых, ПО микроконтроллера умеет управлять громкостью, и ставить ползунок больше 25% мне было страшно. Так я избавился от цифрового шума, но добавил раздражающее в тишине шипение и потенциальную возможность убить схему или динамик высокой громкостью в ПО.

Три модификации PAM8403
Три модификации PAM8403

Решение пришло внезапно. Усилитель PAM8403 существует в трех версиях. Первая версия, минималистичная, представлена в оригинальном проекте. Две других же заслуживают внимания.

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

Третья же версия, с регулировкой громкости, лишена цифрового шума. Потенциометр можно настроить на комфортную максимальную громкость и спрятать схему внутри корпуса.

Когда определились с корпусом и внутренностями, пришло время собирать радио.

Сборка

Вид радио изнутри
Вид радио изнутри

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

  • Электронные компоненты фиксируются термоклеем.
  • Неэлектронные компоненты (части корпуса) тоже фиксируются термоклеем, так как в чертежах отсутствуют крепления.
  • Линии питания от блока питания до «звуковых» элементов и канал передачи звука между VS1053 и усилителем должны быть пропаяны. Остальные линии могут быть соединены перемычками для прототипирования.

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

Настройка прошивки

<p>Заполненные поля ESP32 download tool. Источник: <a href="https://api.vc.ru/v2.8/redirect?to=https%3A%2F%2Fgithub.com%2Fkarawin%2FKa-Radio32&postId=448082" rel="nofollow noreferrer noopener" target="_blank">github.com</a></p>

Заполненные поля ESP32 download tool. Источник: github.com

На микроконтроллере используется прошивка karadio32. Для первого запуска достаточно скачать архив со страницы релизов и прошить, как указано в README проекта.

Обратите внимание на файл standard_adb.bin. В репозитории есть каталог, где лежит csv-версия этого и аналогичных файлов. Данный файл — это описание используемых функций ПО и соответствующих портов платы. По умолчанию (standard_adb.csv) можно подключить следующее оборудование:

  • один энкодер для включения/выключения, смены громкости и станций,
  • I2C-дисплей для отображения информации,
  • инфракрасный датчик для управления с пульта,
  • светодиод состояния.

Дополнительно, если хватит выводов GPIO, можно добавить:

  • сенсорную панель экрана,
  • второй энкодер,
  • два джойстика для навигации по меню,
  • шесть кнопок через цифровые порты,
  • до шести кнопок через аналоговый порт (ADC keyboard),
  • отдельную подсветку дисплея.

После первого запуска karadio32 создаст точку доступа Wi-Fi с именем «WifiKaRadio», а адрес микроконтроллера в сети — 192.168.4.1. В веб-интерфейсе можно выставить сетевые и звуковые настройки.

Помимо веб-интерфейса, karadio32 предоставляет доступ через telnet и последовательный порт. При этом текстовые интерфейсы предоставляют больше конфигурируемых параметров. Действительно необходимые при первом запуске:

  • sys.lcd("6") — параметр обозначает LED-дисплей с разрешением 128x32, все константы доступны в addon.h;
  • sys.lcdout(“20”) — дисплей выключается через 20 секунд без команд;
  • sys.ddmm("1") — выбрать формат даты DD/MM;

Теперь можно подключаться к интернет-радиостанциям и слушать музыку. Но что делать, если хочется запустить в эфир свою музыку?

Домашняя радиостанция

Для создания источника интернет-радио нужен сервис потоковой передачи аудио — Icecast2.

Icecast — это своеобразный ретранслятор. Источник (source) передает трансляцию серверу, а тот «раздает» желающим клиентам. В идеале ретранслятор должен быть размещен на мощном сервере, чтобы обслуживать большое количество параллельных подключений. На практике же для домашней трансляции хватило одной Raspberry Pi 3B+.

Все представленные далее команды актуальны для Raspbian 10. Устанавливаем Icecast:

sudo apt install icecast2

Интерактивная установка поможет задать адрес сервера и пароли для администратора и источника. Сервис запустится сам. Проверить состояние сервиса можно с помощью веб-интерфейса по адресу, который был задан в настройках. В моем случае:

http://192.168.88.3:8000/

При установке через пакетный менеджер Icecast2 устанавливается как сервис, так что перезагрузки не страшны. Интерактивный установщик попросит IP-адрес и пароли, но если их необходимо поменять, то конфигурационный файл ретранслятора располагается по пути /etc/icecast2/icecast.xml.

После настройки ретранслятора можно переходить к настройке источника. Для отправки данных на ретранслятор можно использовать любую программу, которая умеет работать с протоколом shoutcast.

Действительно простым и эффективным решением стала утилита ezstream. Эта программа не только работает с mp3, но и умеет перекодировать файлы в желаемый формат «на лету». Для утилиты нужен плейлист и файл конфигурации. Плейлист создается буквально в одну строчку:

ls *.mp3 > playlist.m3u

Примеры файлов конфигурации доступны по пути /usr/share/doc/ezstream/examples/ezstream*. Рассмотрим файл конфигурации для трансляции mp3 без перекодирования.

<ezstream> <!-- Имя потока задается источником --> <url>http://192.168.88.3:8000/vexelstrom</url> <!-- Имя пользователя по умолчанию --> <sourceuser>source</sourceuser> <!-- Пароль в настройках Icecast2 для пользователя source --> <sourcepassword>hackme</sourcepassword> <!-- Формат --> <format>MP3</format> <!-- Файл-плейлист, относительный путь, но можно указать абсолютный --> <filename>playlist.m3u</filename> <!-- Воспроизвести один раз? 0 – крутить по кругу --> <stream_once>0</stream_once> <!-- Включить перемешивание? --> <shuffle>1</shuffle> <!-- Информация о потоке. Если заполняете поля с битрейтом, то следите за правильностью информации, либо используйте перекодирование. --> <svrinfoname>89.3 RADIO VEXELSTROM</svrinfoname> <svrinfogenre>Alternative</svrinfogenre> <svrinfodescription>89.3 RADIO VEXELSTROM</svrinfodescription> <svrinfobitrate>128</svrinfobitrate> <svrinfochannels>2</svrinfochannels> <svrinfosamplerate>44100</svrinfosamplerate> </ezstream>

Для запуска в консоли достаточно вызвать ezstream с указанием на созданный файл конфигурации:

ezstream -c ezstream_mp3.xml

Так как ретранслятор работает как сервис, то и источник необходимо сделать сервисом. Создаем systemd-юнит с именем ezstream.service в каталоге /etc/systemd/system со следующим содержанием:

[Unit] Description=EzStream Unit After=syslog.target After=network.target After=icecast2.service [Service] Type=simple WorkingDirectory=/home/pi/cp2077 User=pi Group=pi ExecStart=/usr/bin/ezstream -c /home/pi/cp2077/ezstream_mp3.xml TimeoutSec=300 [Install] WantedBy=multi-user.target

Обновляем список сервисов и запускаем источник:

sudo systemctl daemon-reload sudo systemctl start ezstream

Конечно, не идеальный юнит, но самое важное в нем — запуск после icecast2.service. Если эту строчку упустить, то источник может запуститься раньше ретранслятора, вывести ошибку и не завершиться. И сервис работает, и трансляции нет.

Готовое радио
Готовое радио

Ну вот, радио стоит и играет. Время подсчитать, сколько деталей ушло на проект.

Исходники и затраты

Корпус печатался на Flyingbear Ghost 5, PLA-пластиком, толщина слоя 0.32мм, скорость печати 60 мм/с, для стенок – 30 мм/с. Заполнение — 20%.

  • основа корпуса — 11 часов;
  • верхняя крышка — 2 часа;
  • задняя крышка — 1,5 часа;
  • ручка — 30 минут.

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

Электроника:

  • микроконтроллер ESP-WROOM-32 DevKit v1,
  • модуль VS1053,
  • усилитель PAM8403,
  • OLED-дисплей 0.91" 128x32,
  • модуль энкодера EC11,
  • динамики AIYIMA, 2 шт., 2 дюйма, 4 Ом, 10 Вт, 53 мм (aliexpress);
  • блок питания 5В 3А, штекер 5.5x2.5;
  • разъем питания 5.5х2.5 с клеммными колодками.
Результат
Результат

Цены не указываю ввиду постоянных изменений в мире.

Что бы вы воспроизвели из Cyberpunk или любой другой игры? Расскажите в комментариях и подпишитесь на блог Selectel, чтобы не пропустить полезные инструкции, новости и кейсы из мира IT.

Читать также:

2828
8 комментариев

какое классное в итоге получилось радио, вот что значит руки растут из нужного места)

2
Ответить

Спасибо за поддержку :)

Ответить

Проще было бы разобрать недорогую умную колонку и запихнуть начинку в этот корпус. ИМХО

1
Ответить

Вова проектировал корпус так, чтобы в радио можно было добавить разную начинку.

Вариант с умной колонкой тоже возможен, но автору было интереснее пойти по более сложному и увлекательному пути :)

2
Ответить

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

Ответить

спизженное с хабра за 17 число

Ответить

Добрый день! У Selectel есть блог и на vc.ru, и на Хабре. Материалы, которые будут интересны читателям этих двух площадок, публикуем и там, и там. Это наш авторский контент.

В этом конкретном случае текст написал наш разработчик.

Ответить