Управление воспроизведением MP3 с Music Shield

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 Ом.

Подведите питание и загрузите следующий скетч:

ShufflePlay.ino
// Подключаем все 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 стоит увеличить её высоту с помощью контактных колодок. В итоге у нас получится такой бутерброд:

Подключение ICSP

Обратим внимание, что при таком соединении контакты интерфейса 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.

Реализация программного управления

Теперь можно перейти к написанию скетча, позволяющего управлять громкостью и переключением треков кнопкой и потенциометром.

ExternalMusicControl.ino
// Подключаем все 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);
}

Результат