понедельник, 26 августа 2013 г.

Проигрываем музыку без шилдов с карточки SD --- Play WAV on Arduino from SD

Проигрываем музыку без шилдов с карточки SD --- Play WAV on Arduino from SDВроде бы особой необходимости в этой библиотеке и не было, да и времени в обрез, но рутина и скука доедает остатки мозгов. А тут под рукой и динамик пищащий и платка с подключенной к ней SD карточкой периодически на глаза попадается. В общем два вечера просижены почти не зря - на выходе библиотека которая позволяет проигрывать звуковые файлы к подключенному на порт D3 зуммеру или спикеру/динамику считывая данные налету с файлов расположенных на SD карточке.

Идея взята на форуме сайта CarMonitor.ru, где обсуждается их чудесная библиотека PlaySound. Но автор эту идею прикопал, как я понимаю, т.к. по умолчанию библиотека использует пин D11 под пищалку, но этот пин входит в SPI протокол, по которому общается SD карточка. Т.е. конфуз…

Первый вечер потратил, чтоб накидать скетч для Processing который переводит звуковые файлы с текстового формата "*.h", которые прицеплены к примеру в библиотеке PlaySound, в цифровой "*.raw", чтоб не делать это на лету тратя драгоценные микросекунды.


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

Следующий вечер ушел на вспоминание/ознакомление с  принципами управления PWM изнутри процессора, а не командой AnalogWrite. Выбор пал на пин D3, т.к. используется тот же таймер, а значит исправлять  придется не так уж и много. Так что спустя пару плясок с бубнами под ритмы трабелшутинга динамик выдал несложную мелодию. А чуть попозже заговорил человеческим голосом, мужским кстати. Хотя должен был женским...

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

Второй недостаток - отсутствие программы конвертирования  звуковых файлов в нужный нам формат. Автор свою программку придержал, обещая выдать для личных нужд только доверенным лицам, а я в их круг пока не вхожу. Но есть варианты, например если взять звуковой файлик и с помощью программы Audacity ( ну или какой другой) поколдовать со скоростью, частотой сэмплирования и чего-то там еще, а затем сохранить в формате [RAW (headeer-less)] с кодированием [Unsigned 8bit PCM], то на выходе получим готовый файл нужной нам кондиции.
video

UPDATE! 

Написанное выше не числить!
Переписал библиотеку слегка по другому.
Выкинул экстраполяцию, т.к. нам объем звукового файла уже не принципиален, то и нет смысла его ужимать, чтоб потом восстанавливать.
Добавил функцию досрочной остановки проигрывания StopPlaybackSD() и флажок isPlay, чтоб знать, когда закончится проигрыш и можно начинать следующий.
Кроме того приспособился создавать звуковые файлы в нужном формате.

Для этого нужно программой Audacity:
  • перевести в моно [Дорожки ->; Стерео в моно]
  • открыть нужный файл, подредактировать чего там нужно (повысить громкость по максимуму, к примеру);
  • сменить  частоту сэмплирования  [Дорожки ->; Сменить частоту дискретизации дорожки] с 44100 Гц на 16000 Гц
  • изменить скорость воспроизведения [Эффекты ->; Смена скорости…->; Процентное изменение 400.0]
  • сохранить в формате RAW [Файл ->; Экспортировать… ->; Тип Файла: 'Прочие несжатые файлы' ->; Параметры… ->;  Заголовок:'RAW (header-less)', Кодирование:'Unsigned 8bit PCM' ->; Ok ->; Сохранить]
  • сохранить файл на карточку, при этом имя файла не должно превышать 8 символов и быть в латинице

Ссылки

Библиотека PlaySoundSD или PlaySoundSD

Видео-отчет