====== Управление воспроизведением 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}}