Music Shield — плата расширения от Seeed Studio с аудио-кодеком на базе чипа VS1053b. Она даёт возможность Arduino проигрывать звуковые файлы в форматах MP3, WAV, MIDI, Ogg Vorbis. Файлы считываются с microSD флэш-карты, которая устанавливается в слот на плате.
Посмотреть описание и примеры, а также скачать необходимые библиотеки можно на странице производителя, однако в них имеется некоторое количество ошибок и, если их не исправить, плата работать не будет.
Откорректированую версию библиотеки, которая проверенно работает с официальными платами и средой Arduino IDE версии 1.0 и выше (в том числе под Linux и MacOS) можно скачать на GitHub.
Установите эти библиотеки обычным образом: скопируйте в поддиректорию libraries
вашей IDE.
Установите Shield на Arduino:
Вставьте в слот microSD-карту объёмом не более 2 Гб и форматом FAT16 либо FAT32 с предварительно записанными на ней трэками. Карты объёмом более 2 Гб или другими файловыми системами не поддерживаются. Продаваемые флэш-карты обычно уже отформатированны в FAT16 или FAT32.
Подлючите наушники или колонки к выходу отмеченному как «Earphone». Рекомендуется использовать динамики с импедансом 16-32 Ом.
Подведите питание и загрузите следующий скетч:
// Подключаем все 3 предоставленные библиотеки #include <Fat16util.h> #include <NewSPI.h> #include "MusicPlayer.h" // Создаём объект для управления плейером MusicPlayer myplayer; void setup() { // инициализируем аппаратные средства и устанавливаем // режим проигрывания по умолчанию myplayer.begin(); } void loop() { //устанавливаем режим случайного воспроизведения myplayer.setPlayMode(MODE_SHUFFLE); //Если текущий плейлист пуст, добавим в него все треки, //находящиеся в корневой папке карты памяти. myplayer.creatPlaylist(); //отдаём контроль над микроконтроллером проигрывателю myplayer.playList(); }
Отлично! Всё работает: кнопки на плате регулируют громкость, переключают трэки, останавливают и запускают воспроизведение; светодиоды отображают текущее состояние.
Предложенный производителем интерфейс не оставляет нам возможности для собственного управления платой. Также плата физически закрывает все контакты на Arduino Uno и большую часть на Arduino Mega.
Эти ограничения можно обойти, если установить между Arduino и Music Shield плату-посредника, к которой в итоге и подключить необходимые компоненты.
Для примера попробуем сами поуправлять некоторыми возможностями платы. Например, с помощью внешней, собственной кнопки будем переключать треки, а с помощью потенциометра управлять громкостью.
Для получения доступа к контактам Arduino можно воспользоваться платой Troyka Shield. А чтобы подключаемые провода физически пометились между ней и Music Shield стоит увеличить её высоту с помощью контактных колодок. В итоге у нас получится такой бутерброд:
Обратим внимание, что при таком соединении контакты интерфейса ISP/SPI оказались неподключёнными к Ардуино. А они используются Music Shield’ом для коммуникации с чипом-декодером.
Эту проблему можно решить, соединив 11-й, 12-й и 13-й контакты платы с шилдом следующим образом:
Мы можем так поступить, потому что необходимые нам ICSP-контакты дублируются именно 11-м, 12-м и 13-м контактами. Это справедливо для Arduino Uno и Mega 2560, но не сработает с Leonardo, на которой ISP-header не продублирован обычными контактами.
Итак, наша конструкция стала напоминать бутерброд, однако технически это всё та же самая конструкция, что и в самом начале. Можно убедиться в этом, включив её в сеть.
Перед тем как подключить собственные кнопку и потенциометр, давайте разберёмся, какие из контактов Arduino используются платой Music Shield, а какие не используются. Документация на странице производителя утверждает, что используются цифровые входы со 2-го по 13-й, а аналоговые — с A0 по A3. Также мы знаем, что нулевой и первый цифровые контакты используются для прошивки Arduino, поэтому использовать их для управления по возможности не рекомендуется, хотя и можно.
К счастью, реализованный в библиотеке класс MusicPlayer
позволяет легко отключать логику встроенного управления воспроизведением, что позволяет высвободить цифровые входы с третьего по седьмой, которые в штатном режиме заняты кнопками на Music Shield.
Из аналоговых входов нам остаются четвёртый и пятый.
Подключим кнопку к четвёртому цифровому входу, а потенциометр — к аналоговому входу A5:
Установим Music Shield поверх Troyka Shield. В итоге должна получиться примерно такая конструкция:
Класс MusicPlayer
, предоставляемый библиотекой позволяет осуществлять все основные функции по управлению плеером:
begin
инициализирует плеер;creatPlaylist
формирует плейлист из треков, находящихся в корневой папке карты памяти;playSong
начинает воспроизведение указанного по имени или номеру трекаsetVolume
устанавливает громкость;setPlayMode
устанавливает тип воспроизведения, например, случайное или последовательное воспроизведение;attachDigitOperation
и attachAnalogOperation
позволяют «слушать» цифровые и аналоговые входы Arduino, при этом для каждого события необходимо отдельно написать функцию, которая и будет выполняться, когда на вход поступает сигнал;keyEnable
и keyDisable
включают или отключают управление платой встроенными кнопками;analogControlEnable
и digitalControlEnable
включают прослушивание четвёртого и пятого аналоговых входов Arduino, а также цифровых входов от нулевого до седьмого;opPause
, opPlay
и opStop
приостанавливают, запускают или останавливают воспроизведение текущего трека;opVolumeUp
и opVolumeDown
увеличивают или уменьшают громкость воспроизведения;opNextSong
и opPreviousSong
переключают воспроизведение на следующий или предыдущий трек;opFastForward
и opFastRewind
позволяют перематывать текущий трек в обе стороны;opNormalPlay
, opShufflePlay
, opRepeatList
, opRepeatOne
переключают режимы воспроизведения.
Посмотреть сигнатуру функций можно в файле MusicPlayer.h
, изучить подробней, как они работают — в файле MusicPlayer.cpp
.
Информацию об использующихся константах можно также посмотреть в файле MusicPlayer.h
.
Теперь можно перейти к написанию скетча, позволяющего управлять громкостью и переключением треков кнопкой и потенциометром.
// Подключаем все 3 предоставленные библиотеки #include <Fat16util.h> #include <NewSPI.h> #include "MusicPlayer.h" // Создаём объект для управления плейером MusicPlayer myplayer; void setup() { myplayer.begin(); myplayer.keyDisable(); //отключаем встроенное управление воспроизведением myplayer.analogControlEnable(); //включаем возможность слушать аналоговые входы myplayer.digitalControlEnable(); //включаем возможность слушать цифровые входы // прикрепляем функцию на вход 4: она будет вызвана как только // сигнал на 4-м входе станет LOW myplayer.attachDigitOperation(4, nextTrack, LOW); // прикрепляем функцию adjustVolume на вход A5: она будет вызвана // как только значение на входе изменится myplayer.attachAnalogOperation(A5, adjustVolume); } void loop() { myplayer.setPlayMode(MODE_SHUFFLE); myplayer.creatPlaylist(); myplayer.playList(); } /* * Функция, которая слушает аналоговый вход A5 и устанавливает громкость */ void adjustVolume() { // отображаем диапазон аналогового входа на диапазон // громкости. Экспериментально установлено, что он находится // в границах от 0 до 139 byte vol = map(analogRead(A5), 0, 1023, 0, 139); // командуем плейеру изменить громкость myplayer.setVolume(vol); } /* * Функция, которая слушает цифровой вход 4 и переключает треки */ void nextTrack() { // командуем включить следующий трек myplayer.opNextSong(); // защищаемся от возможного дребезга кнопки delay(50); }