diPlayer

English version

Это настольный плеер для DI.FM, который я сделал к 20-летию компании в подарок.

Во время этого проекта я получил много опыта, например:

снова научился паять

познакомился с Python

написал и отдебажил прошивку для Arduino Nano

освоил моделирование в Fusion 360

узнал, что 3-д печать не получается с первого раза

Детали

Настольный плеер, который умеет играть каналы DI.FM (стримы IceCast).

Управляется с помощью карточек от фотослайдов, на которые нанесены NFC-наклейки. Это ссылки на каналы.

Плеер может играть и из других источников — Spotify, Google Play Music, Soma.fm и др.

Есть кнопка Плей/Пауза, регулятор громкости, маленький экран, который показывает текущий трек. Звук выходит через миниджек или HDMI.

Начало

В прошлом году я увидел эти твиты:

https://twitter.com/Jude_Pullen/status/1078368701370511360

А в комментариях была ссылка на проект — PlasticPlayer.

Это небольшое устройство на основе Espruino с NFC-датчиком и экраном. При распознавании NFC-чипа, отправляет на Raspberry Pi, который находится в той же сети, ссылку на трек или альбом.

Автор проекта, Brendan Dawes, выложил весь исходный код и модели для 3-д печати на гитхабе.

Моя попытка

Я начал работать над проектом в июне.

Мне как раз приехали свежие ESP32 из Китая. Я перепрошил один из них под Espruino, но даже упрощенный код из вышеупомянутого репозитория не заработал.

Мне с самого начала не нравилось, что в таком простом проекте даже устройства будут подключаться к вай-фаю, и еще то, что Arduino будет лазить в интернет, чтобы получить данные о треке перед отправкой на Raspberry Pi.

Поэтому я решил делать все с нуля и по своему.

Форкнул репозиторий и понеслось.

Ошибки и опыт

Макет

NFC PN532

Это очень популярный NFC-модуль для Arduino. Только спустя полтора месяца очень нестабильной работы и нескольких дней, когда он совсем перестал работать у меня, я почитал оригинальный мануал.

Оказалось, что очень важно, чтобы провода к модулю проходили строго над антенной, и под углом 90°.

NFC-модуль сильно реагирует на наводку от других устройств и проводов

Энкодер

В моей версии я решил заменить кнопку «Следующий трек» на регулятор громкости.

В первой итерации я пытался прикрутить энкодер к Arduino.

Энкодер — это такая «крутилка», внутри которой есть два кольца с контактами и при движении курсора по ним, можно определить направление вращения. Количество оборотов не ограничено. Это типичный в наше время регулятор громкости.

На отдельной плате Arduino, к которой был подключен только энкодер, и использовался простой тестовый код-пример, все работало отлично.

Но как только я подключал энкодер к основной макетной плате, где уже был NFC-модуль, экран и пара кнопок, нормально громкость вообще не регулировалось.

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

Поборовшись в эту сторону, и уже почти решив бросить проект, я попробовал использовать потенциометр.

Потенциометр

Это более традиционная и старая «крутилка». Работает на основе изменения сопротивления внутри себя.

С потенциометром тоже пришлось поизголяться. Похоже, NFC-модуль сильно «шумел», и значения потенциометра все время колебались на 10% в ту или другую сторону. Это большая разница, которая нельзя просто так сгладить.

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

Корпус

В оригинальном репозитории Брендана (см. выше) была 3-д модель для корпуса. Но она меня не устраивала — высота была слишком маленькой для Raspberry+Arduino, и на задней части крышки была огромное отверстие под ввод питания, а не несколько маленьких под миниджек и микро-USB, как я хотел.

Для моделирования я сначала взял Blender — я помнил, что 15 лет назад это была популярная программа для моделинга скинов для Контр-Страйка.

Я с нуля сделал модель корпуса в относительных единицах и отправил на печать. Через день ребята, которые печатали, скинули мне фотографии нижней крышки, где посадочные места под Raspberry Pi «уехали» из-за масштабирования модели.

Посоветовали переделать в Fusion 360.

Это оказалось отличной идеей. Fusion 360 мне очень понравилась, и за полное воскресенье я сделал еще раз эту же модель в точных размерах.

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

Корпус до обработки и покраски

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

Финальная сборка

До дедлайна (поездка в Хорватию на встречу с коллегами) оставалось около двух недель и я думал, что у меня есть время.

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

Первым сюрпризом оказалось, что кабель, которым я соединял Raspberry Pi и Arduino никак не помещался в корпус, который я сделал. Пришлось спаять отдельный короткий провод USB-A — mini-USB.

Пайка mini-USB штекера

Потом я спаял все компоненты и хедеры для подключения периферии на плату, и потенциометр опять начал выдавать неточные данные. Я поспрашивал на форуме, немного помудрил с конденсатором, и опять заменил потенциометр на энкодер, который подключил напрямую к Raspberry Pi. Тут я с удивлением узнал, что в Raspberry нет конвертера аналоговых сигналов в цифровые и устройства вроде потенциометра напрямую подключить нельзя.

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

Одна из промежуточных версий платы «расширения» для Raspberry Pi

Когда до отъезда оставалось меньше трех дней, а я собирался дописать еще несколько важных вещей в прошивке, Raspberry Pi перестало нормально работать.

Это было очень странно — подключиться по ssh можно было, но веб-интерфейс в браузере не был доступен. Опять отчаяние и опять решение оказалось довольно прямолинейным — переустановить систему на Raspberry.

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

Примерно два месяца очень плотной работы почти каждый вечер (после основной работы) — это довольно много.

Окончательный вид внутренностей плеера

В итоге код я дописывал за полчаса до отъезда в аэропорт, и еще позже — уже в поездке я настроил автостарт Python-приложения, которое и заправляет всем этим весельем.

Вырезаю обложки для NFC-карточек в ночь перед поездкой

Презентация

Ари, Эндрю, Я, Мич

Прошло на «ура», несмотря на неидеальный внешний вид.

P.S. Пользуясь случаем, хочу передать привет своей жене, которая много раз помогала мне в этом проекте, подбадривая и не давая отступиться. Спасибо тебе

P.S.S. Несколько человек уже спросили у меня, когда я буду делать такие на продажу, и я обдумываю эту идею. Если вам интересно, оставьте свой емейл здесь.