====== Управление воспроизведением MP3 с Music Shield ====== Music Shield — плата расширения от Seeed Studio с аудио-кодеком на базе чипа VS1053b. Она даёт возможность Arduino проигрывать звуковые файлы в форматах MP3, WAV, MIDI, Ogg Vorbis. Файлы считываются с microSD флэш-карты, которая устанавливается в слот на плате. Посмотреть описание и примеры, а также скачать необходимые библиотеки можно на [[http://seeedstudio.com/wiki/Music_Shield|странице]] производителя, однако в них имеется некоторое количество ошибок и, если их не исправить, плата работать не будет. Откорректированую версию библиотеки, которая проверенно работает с официальными платами и средой Arduino IDE версии 1.0 и выше (в том числе под Linux и MacOS) можно [[https://github.com/amperka/music-shield|скачать на GitHub]]. Установите эти библиотеки обычным образом: скопируйте в поддиректорию ''libraries'' вашей IDE. ===== Минимальный пример ===== Установите Shield на Arduino: {{ :звук:img:music_shield_simple_1.jpg?nolink& |}} Вставьте в слот microSD-карту объёмом не более 2 Гб и форматом FAT16 либо FAT32 с предварительно записанными на ней трэками. Карты объёмом более 2 Гб или другими файловыми системами не поддерживаются. Продаваемые флэш-карты обычно уже отформатированны в FAT16 или FAT32. Подлючите наушники или колонки к выходу отмеченному как «Earphone». Рекомендуется использовать динамики с импедансом 16-32 Ом. Подведите питание и загрузите следующий скетч: // Подключаем все 3 предоставленные библиотеки #include #include #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 плату-посредника, к которой в итоге и подключить необходимые компоненты. Для примера попробуем сами поуправлять некоторыми возможностями платы. Например, с помощью внешней, собственной кнопки будем переключать треки, а с помощью потенциометра управлять громкостью. ==== Что понадобится ==== {{ :звук:img:all_stuff_1.jpg?nolink& |}} * [[amp>product/arduino-uno|Arduino Uno]] * [[amp>product/arduino-music-shield|Music Shield]] * [[amp>product/arduino-troyka-shield|Troyka Shield]] * [[amp>product/breadboard|Breadboard]] * [[amp>product/potentiometer|Переменный резистор]] * [[amp>product/troyka-button|Модуль-кнопка]] * Несколько [[amp>product/wire-mm|проводов «мама-папа»]] и пара [[amp>product/jumper-wires|перемычек]] * Комплект сквозных [[amp>product/stackable-pin-headers-with-icsp|контактных колодок]] ==== Конструкционное решение ==== Для получения доступа к контактам Arduino можно воспользоваться платой Troyka Shield. А чтобы подключаемые провода физически пометились между ней и Music Shield стоит увеличить её высоту с помощью контактных колодок. В итоге у нас получится такой бутерброд: {{ :звук:img:music_shield_troyka_2.jpg?nolink |}} ==== Подключение ICSP ==== Обратим внимание, что при таком соединении контакты интерфейса ISP/SPI оказались неподключёнными к Ардуино. А они используются Music Shield’ом для коммуникации с чипом-декодером. Эту проблему можно решить, соединив 11-й, 12-й и 13-й контакты платы с шилдом следующим образом: {{ :звук:img:isp_connection_1.jpg?nolink& |}} Мы можем так поступить, потому что необходимые нам ICSP-контакты дублируются именно 11-м, 12-м и 13-м контактами. Это справедливо для Arduino Uno и Mega 2560, но не сработает с Leonardo, на которой ISP-header не продублирован обычными контактами. Итак, наша конструкция стала напоминать бутерброд, однако технически это всё та же самая конструкция, что и в самом начале. Можно убедиться в этом, включив её в сеть. ==== Доступные и занятые контакты ==== Перед тем как подключить собственные кнопку и потенциометр, давайте разберёмся, какие из контактов Arduino используются платой Music Shield, а какие не используются. Документация на [[http://seeedstudio.com/wiki/Music_Shield|странице]] производителя утверждает, что используются цифровые входы со 2-го по 13-й, а аналоговые --- с A0 по A3. Также мы знаем, что нулевой и первый цифровые контакты используются для прошивки Arduino, поэтому использовать их для управления по возможности не рекомендуется, хотя и можно. К счастью, реализованный в библиотеке класс ''MusicPlayer'' позволяет легко отключать логику встроенного управления воспроизведением, что позволяет высвободить цифровые входы с третьего по седьмой, которые в штатном режиме заняты кнопками на Music Shield. Из аналоговых входов нам остаются четвёртый и пятый. ==== Подключение внешней периферии ==== Подключим кнопку к четвёртому цифровому входу, а потенциометр --- к аналоговому входу A5: {{ :звук:img:music_shield_button_and_potentiometer_1.jpg?nolink |}} Установим Music Shield поверх Troyka Shield. В итоге должна получиться примерно такая конструкция: {{:звук:img:music_shield_sandwich.jpg?nolink |}} ==== Обзор библиотеки ==== Класс ''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 #include #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); } ==== Результат ==== {{youtube>DPWGf7lJGGc?large}}