[Перевод] Олдскульный кассетный магнитофон и новые «кассеты»

Однажды на Instructables я увидел проект, который лёг в основу моей идеи, о реализации которой я хочу сегодня рассказать. Автор этого проекта, пользователь с ником Ananords, создал проигрыватель с RFID-управлением, рассчитанный на детей и на людей, которые по каким-то причинам не могут пользоваться обычными MP3-плеерами. Тот проект назывался Juuke. Ananords создал его для бабушки своей возлюбленной. Это — устройство, которое отлично подойдёт людям с синдромом Альцгеймера или с деменцией. Эта особенность проекта меня зацепила, так как нечто подобное случилось с моей бабушкой, болезнь забрала её у нас, и я знал о том, что проигрыватель, о котором пойдёт речь, ей бы понравился.

vd_dx7qduaf1ozmewc8dx51igai.jpeg

Всё работает следующим образом: имеется проигрыватель с двумя кнопками. Одна позволяет включить музыку или поставить воспроизведение на паузу, а вторая позволяет перемешать композиции. Кроме того, можно выбрать RFID-карту и поднести её к читающему устройству, что позволяет включить конкретную композицию. Это, по своей сути, воспроизводит процесс прослушивания музыки в давние времена, когда для включения нужной записи надо было вставлять в проигрыватель обычный CD или обычную кассету. Но тут старый подход дополнен новыми технологиями, что позволяет облегчить прослушивание музыки людьми с определёнными ограничениями.
Хотя моя бабушка больше уже не с нами, мне, всё равно, хотелось сделать этот проект. Когда родители наводили порядок в доме, я наткнулся на старый кассетный магнитофон моей мамы. «Эврика!», — подумал я. В результате этот магнитофон лёг в основу моего варианта Juuke. Я, в целом, сделал всё так же, как Ananords, и всё заработало как надо, но я, вдобавок, расширил проект некоторыми собственными идеями. А именно, речь идёт о следующем:

  • Возможность проигрывания целого альбома с использованием одной RFID-карты.
  • Возможность пропуска записи и перехода к следующей записи.
  • Возможность проигрывания музыки, «записанной» на разные «стороны» карты (A и B), что напоминает проигрывание обычных кассет.
  • Использование такого же количества кнопок, но применение коротких и длинных нажатий на них.


А теперь — к делу.

Материалы и инструменты


Я, подбирая материалы для моего проекта, немного отклонился от того набора компонентов, который был использован в Juuke. Вот из чего собран мой проигрыватель:

  • Плата Arduino Nano (вместо платы Arduino Uno, использованной в Juuke).
  • Модуль проигрывателя аудиофайлов DFPlayer Mini.
  • MicroSD-карта.
  • RFID-модуль RC522. (Говорят, что стоит брать сразу пару таких, так как некоторые из них приходят уже в нерабочем состоянии. Но я заказал всего один. Он оказался в полном порядке. Может, мне просто повезло.)
  • RFID-карты (я заказал 100 штук).
  • Нажимные кнопки с самовозвратом (momentary), 2 штуки.
  • Провода.
  • Резистор на 1 кОм.
  • Накладки на разъёмы.
  • Старый кассетный магнитофон (который всё ещё работает).
  • Цветные светодиоды.
  • Внешний аккумулятор с поддержкой USB.
  • Плата для прототипирования.


Вот список необязательных материалов:

  • Переменный резистор на 10 кОм (я такой не использовал, так как на магнитофоне имеется ручка для настройки громкости).
  • Стерео-разъём (AUX) (я использовал динамики магнитофона).
  • Макетная плата.
  • Соединительные провода.
  • Источник питания на 5 В.
  • Разъём питания.


Инструменты:

  • Приспособления для пайки.
  • Инструмент для снятия изоляции с проводов.
  • Компьютер и цветной принтер.


Нам, кроме того, понадобится учётная запись на Canva.

Шаг 1. Сборка прототипа


bcc69436c0895d8a55e6ca0342dd3d6a.jpg


Сборка прототипа

Я не буду особенно много рассказывать об этом шаге нашей работы. Тут всё довольно просто. Ядро проекта состоит из нескольких частей:

  • Плата Arduino Nano, которая управляет всем с помощью кода, о котором мы поговорим ниже.
  • Модуль DFPlayer Mini — небольшое электронное устройство, которое умеет проигрывать MP3-файлы с помещённой в него SD-карты.
  • RFID-модуль RC522, который используется для чтения RFID-карт, принимая с них данные, применяемые для выбора воспроизводимых композиций.
  • Кнопки и регулятор громкости.
  • Громкоговоритель.


Я, чтобы собрать компоненты, воспользовался макетной платой, и следовал инструкциям по сборке Juuke, оказавшимися очень кстати. Затем я всё протестировал для того чтобы удостовериться в том, что всё работает как надо.
Тестирование прототипа

Шаг 2. Пайка


a6823649883c33451617391a537ba6f1.jpg


Компоненты, размещённые на плате для прототипирования

640215e6ec608b111ba17688381ce39e.jpg


Обратная сторона платы

9463e6990767c4dd4459cbce1197c372.jpg


Подключение платы к магнитофону

faa38eaa72efc61175f6fc6236c909db.jpg


Плата с установленным на ней RFID-модулем RC522

0e39e2d67f67c2d02c83e3377403149e.jpg


Плата с RC522 размещена в батарейном отсеке магнитофона, в центре изображения можно видеть светодиод, указывающий на воспроизведение «Стороны B»

bc73a314fd90460627e36371e66802fb.jpg


Кнопки перед пайкой

После того, как меня устроил прототип и то, как он работает, я распаял компоненты устройства на плате для прототипирования. Здесь я следовал схемам, подготовленным пользователем Ananords, но внёс в них одно небольшое изменение. А именно, я добавил светодиод. Контакт »+» светодиода подключён к Pin 8 платы Arduino Nano, а »-» — к «земле». Этот светодиод указывает на то, что проигрывается «Сторона B». Когда проигрывается «Сторона A», светодиод выключен, а когда он включен, проигрывается «Сторона B».

Я открыл корпус магнитофона и нашёл провода, ведущие к регулятору громкости и к динамикам. Я отпаял и промаркировал эти провода, приклеив к ним соответствующие ярлыки. Это позволило мне знать о том, куда именно они ведут.

Всё остальное в магнитофоне я решил не трогать — на тот случай, если когда-нибудь решу его восстановить. Мне удалось уместить Arduino Nano и DFPlayer Mini на небольшой плате, которую можно было разместить в корпусе магнитофона. Там, правда, было не особенно много места для кнопок и для RFID-модуля RC522.

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

Я пропустил провода RC522 через отверстия в батарейном отсеке и установил плату с самим RFID-модулем в том же батарейном отсеке, около внешней стенки корпуса магнитофона. Я решил поступить именно так из-за того, что благодаря этому между внешней стенкой магнитофона и RFID-модулем будет совсем небольшое пространство. Поверхность корпуса, кроме того, плоская. А значит — у RFID-модуля будут все шансы успешного считывания поднесённой к корпусу карты.

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

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

Шаг 3. Подготовка RFID-карт


9f3fedee5b1086ad03220d4c1173a3ce.png


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

58e958fe9532f7fbeca1a8ae70d07941.png


Обложка карты, используемая для проигрывания отдельной композиции со «Стороны B»

8f65979667b2a6bef99fcf027b22e2d3.jpg


Карты и их обложки

Для того чтобы подготовить карты к работе нужно сделать два дела:

  1. Карты нужно запрограммировать, назначив им номера (в проекте Ananords есть указания по этому поводу). Тут есть два пути. Первый — сделать это автоматически, тогда каждая следующая карта получит номер, на 1 превышающий номер предыдущей. Второй — задать параметры карт вручную, пользуясь окном Serial Monitor в Arduino IDE.
  2. Нужно сделать обложки для карт. Благодаря этому можно узнать о том, какие записи (или альбомы) связаны с картами. Я сделал в Excel список всех композиций, проигрывание которых должна была поддерживать система, и пронумеровал их от 1 до 100. Это были композиции для «Стороны A». Затем, для реализации возможности проигрывания «Стороны B», я повторил эту процедуру.


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

Для того чтобы указать на то, связана карточка с отдельной композицией или с альбомом, я использовал особые значки. На иллюстрациях к этому разделу можно видеть обложку карты-альбома (со значком диска) и обложку карты, включающей отдельную запись, на которой изображён значок ноты. Кроме того, на фоне тех обложек, которые будут соответствовать композициям, размещённым на «Стороне B», я поместил большую букву «B».

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

После того, как карты будут готовы, останется лишь загрузить программный код на Arduino Nano и подготовить к работе MicroSD-карту.

Шаг 4. Обзор кода для Arduino и подготовка SD-карты


325f2bf61e15dd93153b06cb409d1638.png


В папке 01 находятся записи, которые можно выбирать по одной, а в папках 78–99 находятся альбомы

7a7400ec8b95a13d795c7ba2bff6fe1e.png


Содержимое папки 01

7f1ea5532e3245d85ebfb56b65883e4c.png


Содержимое одной из папок с альбомами

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

▍Подготовка отдельных записей


Я, воспользовавшись материалами проекта Juuke, столкнулся с некоторыми сложностями. Они заключались в том, что иногда включалось воспроизведение не той композиции, что зависело от MicroSD-карты, вставленной в устройство. Я исследовал этот вопрос и выяснил, что могу переписать код и сделать так, чтобы проигрыватель воспроизводил бы композиции из заданной папки. Поэтому я поместил все отдельные композиции в папку с именем 1 и сообщил проигрывателю о том, что ему нужно проигрывать выбранную композицию из этой папки:

myDFPlayer.playLargeFolder(1,number.toInt())


Для проигрывания «Стороны B» я предусмотрел код, который, наблюдая за состоянием кнопки, сообщает проигрывателю о необходимости проигрывания композиций, номера которых вычисляются путём прибавления 100 к номеру прочитанной RFID-модулем карты. Например, если просканирована карта №22 и при этом включён режим проигрывания «Стороны B», то будет воспроизводиться композиция с номером 122. А если этот режим не включён, то считывание той же карты приводит к проигрыванию композиции №22. Вот как выглядит соответствующий фрагмент кода:

myDFPlayer.playLargeFolder(1,number.toInt()+100)


У имён музыкальных файлов, записанных на MicroSD-карту, должны быть префиксы, состоящие из 4 цифр, соответствующие номерам, назначенным RFID-картам. Например, если карте назначен №3, то имя соответствующего ей музыкального файла должно начинаться с префикса 0003. А композиция, связанная с картой №21, будет записана в файл, имя которого начинается с 0021. Композиции для «Стороны B» именуются похожим образом. Например, запись 157 будет записана в файл с префиксом 0157.

▍Подготовка альбомов


Работа с альбомами организована похожим образом. Проигрыватель умеет воспроизводить записи, хранящиеся в заданной папке. Каждому альбому соответствует отдельная папка, номер которой совпадает с номером одной из карт. В результате, например, для проигрывания композиций альбома №90 можно просканировать карту с таким же номером. Вот фрагмент кода управления проигрывателем:

myDFPlayer.loopFolder(number.toInt());


Именно так мне удалось добиться проигрывания записей, относящихся к отдельным альбомам. Правда, тут есть ограничение, которое заключается в том, что проигрывать можно лишь содержимое 99 папок. Сначала я настроил систему так, что альбомы находились в папках 89–99. Но когда я решил, что у моих «кассет» будет «Сторона B», это означало, что я не мог просто добавить 100 к номерам карт, так как система не позволяла пользоваться именами папок в диапазоне 189–199. А к тому времени у меня уже было 11 альбомов. В результате я решил находить имя папки, соответствующей «Стороне B» карты, вычитая из номера карты 11. Так и получилось то, что дополнительные альбомы попали в папки 78–88. В коде это выглядит так:

myDFPlayer.loopFolder(number.toInt()-11);


Всё то, что я рассказал о структуре папок, записываемых на MicroSD-карту, отражено на вышеприведённых скриншотах.

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

▍Кнопки


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

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

Красная кнопка включает или приостанавливает воспроизведение текущей композиции по короткому нажатию. Длительное нажатие на эту кнопку вызывает переход на следующую композицию. Короткое нажатие на жёлтую кнопку позволяет включать и отключать воспроизведение композиций, «записанных» на «Стороне B» (тут же включается или выключается светодиод, находящийся на задней стенке магнитофона). Длительное нажатие на эту кнопку «перемешивает» композиции.

Для включения воспроизведения следующей композиции я использовал такой код:

myDFPlayer.next();


Для работы с композициями со «Стороны B» я пользовался особой переменной. Эта переменная установлена в значение false до короткого нажатия на жёлтую кнопку. После нажатия значение переменной меняется на true. Эта переменная используется при принятии решения о том, какие именно композиции проигрывать. Записи с индексами 1–100 — это «Сторона A», а записи 101–200 — это «Сторона B».

Код, о котором я рассказывал, ищите здесь. Можете поменять его так, как вам нужно.

Шаг 5. Окончательная сборка и проверка проекта


a9dd9c341620a60f2cec6ff63c8de384.jpg


Готовый проект, вид сзади, проигрывание композиции со «Стороны A»

d68a59a3bdc94929e1f211296992dfe2.jpg


Готовой проект, вид сзади, проигрывание композиции со «Стороны B» (обратите внимание на горящий светодиод и на карту, на обложке которой имеется буква «B»)

Я убрал все провода в корпус и поставил на место заднюю крышку магнитофона. Потом подключил USB-кабель к внешнему аккумулятору, который тоже расположен в корпусе (мой проигрыватель может работать и без подключения к электросети) и проверил работу системы с разными RFID-картами.


Испытание системы

Шаг 6. Слушаем музыку


А теперь можно послушать музыку с новых «кассет» на олдскульном кассетном магнитофоне.

0e735578c14a3399563e2b5b441fdbdb.jpg


Готовый проект
Слушаем музыку

Планируете сделать музыкальный проигрыватель с RFID-управлением?

8xzqbhb0at3_pjylb5c4366w_t8.png

oug5kh6sjydt9llengsiebnp40w.png

© Habrahabr.ru