Андрей Смирнов
Время чтения: ~16 мин.
Просмотров: 11

Делаем аудио плеер на Ардуино для проигрывания WAV-файлов

Модули Ардуино позволяют создать множество различных электронных устройств, которые будут работать по несложным программам. Одним из таких устройств является компактный плеер. Ардуино плеер, проигрывающий WAV и МР3 файлы, может быть реализован на базе любого контроллера (Uno, Nano, Mega и т.п.) с помощью адаптера micro-SD, который позволяет записывать и считывать музыкальные файлы.

Формирование звука на Arduino

Arduino-UNO-300x225.jpg

Несмотря на то, что платформа Arduino, в основном, предназначена для работы с цифровыми устройствами, в архитектуру микроконтроллеров входят аналого-цифровой и цифро-аналоговый преобразователи и несколько каналов широтно-импульсной модуляции. Это позволяет осуществлять захват звуковых сигналов и их воспроизведение. Платформа Ардуино включает в себя как 8-битные AVR контроллеры, так и мощные 32 битные ARM процессоры. Принцип воспроизведения файлов Arduino MP3 не позволяет обеспечить высокое качество звука, поскольку с выхода контроллера снимаются импульсы прямоугольной формы (меандр), отличающиеся от идеального синусоидального сигнала.

Самым бюджетным модулем платформы Ардуино, является Arduino UNO с микроконтроллером ATmega 328, в котором интегрированы два 8-битных и один 16-битный счётчик, каждый из которых может быть использован для генерации ШИМ. Контроллеры получают сигналы от внешних источников и выдают свои собственные сигналы через порты ввода/вывода (GPIO). Теоретически порты микроконтроллера предназначены для работы с уровнями логического нуля и логической единицы, тем не менее, выводы GPIO позволяют оцифровывать аналоговые сигналы с ограничением по уровню и генерировать сигналы различной формы с помощью ШИМ и фильтра низких частот. Внешние данные могут поступать разными способами, но основным методом оцифровки звукового сигнала является использование АЦП.

Так же данные могут поступать на микроконтроллер через первый разряд порта ввода/вывода. Аналого-цифровой преобразователь позволяет точно оцифровывать входной сигнал с разрешением до 10 бит. Оцифровка может выполняться на более высокой скорости преобразования, но при этом уменьшается точность, так как два младших бита игнорируются. После того как входной сигнал был оцифрован и прошёл необходимые преобразования он может быть конвертирован в аналоговую форму через блок ШИМ. Амплитуда сигнала кодируется через соотношение длительностей логического нуля и логической единицы. Важным этапом обработки выходного сигнала является фильтрация, удаляющая высокочастотные компоненты модуляции. Так же фильтры ограничивают частотный диапазон звукового сигнала.

Для воспроизведения отдельных частот звукового диапазон можно использовать внутренний генератор Arduino. Для этого достаточно подключить к плате пьезоэлектрический динамик и задать простую функцию. Динамик подключается между контактами GND и «2» разъема Digital. Динамик нужно подключать через резистор 100 Ом. Далее задаётся конкретная функция. Выбирается контакт const byte dinPin = 2; Контакт настраивается как выходной pinMode (dinPin, output); //. Затем командой tone можно включить генератор с заданной частотой. Команда выглядит следующим образом: tone ( dinPin, 440 ) ; // Получился электронный камертон генерирующий ноту Ля первой октавы. Нота будет звучать до тех пор, пока генерация не прекратится командой noTone (  dinPin  ); //

Плеер для Ардуино

Shema-dlya-neslozhnogo-pleera-na-Arduino-300x192.png

Простейший плеер можно собрать буквально за 20 минут. Для этого потребуются следующие элементы:

  • Адаптер для карт памяти.
  • Соединительные провода.
  • Динамик 8 Ом.
  • Транзистор BC 546 B.

На транзисторе собран усилитель низкой частоты. Без него можно обойтись, подключив к  плате Ардуино высокоомный пьезоэлектрический динамик, но он имеет ограниченный частотный диапазон и не обеспечит нормального качества звучания. Arduino wav-файлы воспроизводит нормально, а вот для чтения файлов в формате МР3 он не предназначен, поэтому все звуковые файлы нужно конвертировать в формат wav, используя программу Online-convert.com.  Файлы записываются в формате wav pcm Mono 8 kHz 8 bit. SD-карту памяти нужно отформатировать и затем перенести на неё wav файлы с простыми идентификаторами типа “001.wav.  Адаптер для чтения SD-карт имеет встроенный стабилизатор напряжения, поэтому обе платы можно питать от одного источника +5 В. Адаптер подключается к плате Ардуино следующим образом:

  • CS – 10 контакт.
  • MOSI –11 – “ – “.
  • MISO –12 – “ – “.
  • CLK – 13 – “ – “.
  • GND – земля.
  • 5 V – питание + 5 В.

Для работы устройства следует загрузить библиотеку TMRpcm-Arduino, которая предназначена для чтения файлов в формате wav непосредственно с  карты памяти. Библиотека поддерживает все модули, выполненные на микроконтроллере ATmega328.

Модуль МР3 для ардуино

Modul-MP3-dlya-arduino-300x300.jpg

Более сложной модификацией плеера является вариант с использованием отдельного устройства, где датчик МР3 позволяет воспроизводить файлы именно в этом формате.  Обычным носителем информации в мини плейерах является твердотельный накопитель информации или карата памяти micro-SD. На ней располагаются звуковые файлы определённого формата. Чаще всего используются карты с ёмкостью, не превышающей 32 Гб. Для подключения к Arduino удобно использовать DF Player Mini MP3. Он представляет собой компактную плату, на которой находятся следующие компоненты:

  • Слот для установки карты.
  • Усилитель звуковой частоты.
  • Дискретные элементы.

Питание модуля осуществляется от источника постоянного тока с напряжением 3,5-5,0 В. Плейер поддерживает форматы MP3, WAV, WMA и TF карты с системами FAT16 и FAT32. В устройстве имеется возможность управлять уровнями громкости от 0 до 30 и включать одну из 6 предустановленных настроек эквалайзера. Подключение плеера к ардуино выполняется следующим образом:

  • VCC – + 5 V
  • RX – RX
  • TX – TX
  • SPK 1 – динамик
  • SPK 2 – динамик
  • GND – GND

Линии RX и TX подключаются через резисторы 1 кОм. Для того чтобы устройство заработало нужно загрузить библиотеку Mini mp3 Arduino Library V2.0. Основной набор команд, выполняемых плеером:

  • Mp3_play (0002) – воспроизведение файла с указанным номером.
  • Mp3_stop – остановка воспроизведения.
  • Mp3_next – следующий файл.
  • Mp3_prev – предыдущий файл.
  • Mp3_set_volume – выбор уровня громкости.
  • Mp3_set_EQ (0-5) – выбор предустановки эквалайзера.

Если подключить к плееру USB порт через контакты USB «+» и «–», то можно воспроизводить звуковые файлы, записанные на флэш-карте.

  • Цена: $1.30

Когда мы мастерим различные полезности для дома, используя Ардуино, мы мало задумываемся, как получать информацию от этого устройства. Если ее немного, то обходимся чащe всего светодиодами. Но если информации выводить нужно больше, то конечно, это будет видео в том или ином виде — разнообразные индикаторы и дисплейчики, коих в продаже великое множество. Ибо это просто и это привычно. Да, зрение у нас основной орган чувств, но иногда звук гораздо более удобный, а зачастую и единственный способ донести до нас информацию. Примерами могут служить будильник, сигналка на авто или, увы, слабовидящие люди. Но в своих поделках дальше использования пищалки мы звуком не пользовались, поскольку не было удобного инструмента для этого. Теперь это в прошлом. В этом обзоре мы научим разговаривать (и даже немного шутить) часы и другие приборы и напишем аудиосинтезатор, с помощью которого Ардуино сможет произносить любые числа из натурального ряда голосом. Для начала о цене вопроса. Не слишком ли она окажется высока для заявленных возможностей? И вот тут нас ожидает первый и весьма приятный сюрприз. Чуть больше доллара MP3 модуль плюс чуть меньше бакса micro SD карточка на 64 mb (я брал на ebay по 99 центов), без которой модуль бесполезен. Недорого, правда? Да, для вывода звука, конечно, понадобится еще динамик, но поскольку никаких выдающихся характеристик от него не требуется, мы его покупать не станем, а вытащим, к примеру, из какого-нибудь старого системника или радиоприемника. А зато в качестве бонуса мы получим возможность выбросить из проекта пищалку, если она там была — с ее ролью прекрасно справится сам MP3 модуль. Познакомимся с железом: Модуль представляет собой вполне себе самостоятельный девайс, который можно использовать и без Ардуино. Для этого достаточно подключить к нему несколько кнопок (или даже резистивную клаву), динамик или внешний усилитель, вставить micro SD карточку с музоном и все, можно слушать любимые композиции. Но это совсем неинтересно. Гораздо интересней управлять им программно, чем мы сегодня и займемся. Ниже расписаны все его контакты, но нам для работы с Ардуино понадобятся только первые семь. Вывод Описание 1. VCC Питание «+» 2. GND Питание «−» 3. RX UART приём 4. TX UART передача 5. SPK1 Громкоговоритель «+» 6. SPK2 Громкоговоритель «−» 7. BUSY Индикатор состояния («0» — простой, «1» — проигрывание) 8. DAC_R Выход на наушник или усилитель (канал «R») 9. DAC_L Выход на наушник или усилитель (канал «L») 10. IO1 Вход управления: короткое нажатие — «назад», длинное — уменьшить громкость 11. IO2 Вход управления: короткое нажатие — «вперёд», длинное — увеличить громкость 12. ADKEY1 Порт для подключения резистивной клавиатуры, вход 1 13. ADKEY2 Порт для подключения резистивной клавиатуры, вход 2 14. USB+ USB порт, вывод «+» 15. USB− USB порт, вывод «−» Что нам следует знать о железке? Плеер может проигрывать как mp3 файлы с битрейтом до 320kbps, так и wav. На его борту присутствует встроенный усилитель, к которому, согласно даташита, можно подключить динамик и выжать до 3W. Качество звука не ахти, но для экспериментов пойдет. Лучше использовать все-таки внешний стерео усилитель, задействовав выводы DAC_R и DAC_L. Для питания требуется напряжение в диапазоне 3.2 — 5V. В плеере присутствует простенький эквалайзер на 5 профилей: NORMAL, POP, ROCK, JAZZ, CLASSIC и BASS. Общаться наш плеер с Ардуино будет через последовательный интерфейс с скоростью 9600bps. В принципе, используя команды из даташита, можно управлять плеером напрямую через UART, но мы будем использовать библиотеку mp3TF, где управление реализовано нагляднее и удобнее. Для обратной связи будем использовать пин BUSY, чтобы знать о состоянии плеера (режим воспроизведения или ожидания). Один интересный момент касается реализации связи по UART. Хотя, в даташите указано прямое соединение TX-RX, RX-TX, народ рекомендует включить в эти цепи по резистору 1-2 кОм. Без них, якобы, появляются искажения, идет нагрев плеера и у кого-то даже плеер вышел из строя. Поверим и включим эти резисторы. О железе плеера пока все, можно приступать к сборке. В качестве Ардуино я буду использовать Uno, но подойдет любая модель. Поскольку плеер с динамиком 0.5W потребляет прилично для возможностей USB, с которого и пойдет у нас питание, на высокой громкости довольно существенно просаживается напряжение, из-за чего плеер вырубается. Поэтому я к цепи питания добавил конденсатор на 4700 mkF. После такой модификации плеер стабильно работает на любой громкости. Теперь что касается программной части. Как я уже упоминал выше, я буду использовать библиотеку mp3TF, а не более распространенную DFPlayer-Mini-mp3, так как эта библиотека, предоставляя бОльшие возможности, генерит более компактный код. Но самое главное, в ее составе есть функции, позволяющие воспроизводить файлы из нужной папки! Присутствуют также стандартные функции управления громкостью, навигацией, эквалайзером и несколько экзотических, которые мы применим для модернизации Тетриса. Немного об организации файлов на micro SD карте при использовании функции playFolder2 из этой библиотеки. Файлы могут располагаться в папках с двузначным номером. Допустимо использовать не более 15 папок, в каждой из которых до 3000 файлов. Файлы при этом сортируются по имени в алфавитном порядке. Номер трека указывается в соответствии с этой сортировкой. Чтобы не путаться, перед именем файла будем ставить четырехзначный номер, типа 0015file.mp3 или просто 0015.mp3. Чтобы изучение возможностей плеера было нескучным, соберем на макетной плате несколько полезных устройств из того что у меня оказалось под рукой. Поскольку были найдены модуль реального времени DS1307 и дисплейчик на TM1637, то соберем говорящие часы. Активатором голосового вывода времени будет сенсорный датчик. Подготовка micro SD карточки. Отформатируем ее в FAT16 или FAT32 и наговорим в микрофон все возможные часы и минуты. Получится 84 файла — 24 часа и 60 минут. Скачаем и установим библиотеки DS1307RTC.h и TimeLib.h для работы с часами, TM1637Display.h для работы с дисплеем и SoftwareSerial.h для организации виртуального последовательного порта. Можно, конечно, пользоваться и встроенным портом, но так мы получим более гибкую конструкцию с одинаковыми номерами пинов для подключения всех моделей Ардуино. Собираем схему. Теперь нам нужно установить время в наших часах. Поскольку мы собираем часы только для демонстрации возможностей плеера, то не будем писать код для установки и корректировки даты/времени, а воспользуемся примером из состава библиотеки DS1307RTC.h с названием SetTime. Этот скетч просто заливает в RTC дату/время своей компиляции, он выполнит инициализацию модуля DS1307 и больше нам не потребуется. Теперь зальем в папку с именем 02 на флешку наши голосовые файлы, набросаем небольшой скетч для наших часов и запустим его.Говорящие часы Мы увидим на дисплее текущее время и моргающее двоеточие-секунды. А теперь прикоснемся к сенсору и вот оно! Часы сообщают нам время голосом. Такие часы я видел когда-то очень давно и мне очень хотелось тогда их иметь, но, увы, возможностей не было. Теперь, не особо напрягаясь, любой может собрать их за несколько минут. Но мы пойдем еще дальше и дадим часам сварливый характер. Пусть наши часы начнут ворчать, если к сенсору прикасаться слишком часто. Для этого добавим несколько файлов с соответствующей озвучкой и несколько строк кода. Обновленный скетч будет выглядеть так:Говорящие часы — ворчуны ) А вот как они работают. Теперь, если касаться сенсора чаще, чем раз в 5 сек, часы начинают раздражаться, а после 3-го раза вообще обижаются и перестают сообщать время. Но, конечно, ненадолго ). После 5 секунд настроение у них снова восстанавливается. Характеры можно придумать разные, все ограничивается только нашей фантазией. Собрав подобные часы в корпусе (мыльница?), мы получим отличный подарок для близких. И даже весьма полезный для слабовидящих. А может кому то понравится возможность узнавать ночью время, не открывая глаз, а просто коснувшись корпуса часов рядом. Себе-то я точно соберу, как только приедет микрофон (чтобы в зависимости от шумности вокруг, регулировалась громкость). Собирая часы, мы использовали полный набор файлов с часами и минутами, где в каждом файле присутствует число и его размерность: “Два часа”, “Двадцать одна минута”, “Восемнадцать часов” и т.д. Нам не пришлось заниматься лексическим разбором: “одна минутА”, но “две минутЫ” или “пять минуТ”. Мы упростили себе жизнь, соединяя только 2 файла – количество часов и количество минут. А комбинаций всех возможных часов и минут получилось всего 84, это немного и нас это устроило. Но мы можем озвучить не только часы, но и показания любых других приборов, значения которых могут превышать тысячи и более. В этом случае все возможные комбинации не надиктуешь. Значит нужно написать универсальный голосовой синтезатор чисел. Этим и займемся. Как мы произносим число? Есть базовые лексические единицы и сборные. Например, числа “один”, “пятнадцать”, “семьдесят”, “сто” являются базовыми, а число “сто двадцать пять” синтезируется из 3-х базовых единиц. В интервале от 0 до 19 числа все базовые, поэтому надиктуем их в 20 файлов. Далее идут десятки от 20 до 90, их также запишем в 8 файлов. За ними 9 файлов с произношением сотен. Дальше начинаются тысячи. Тут уже новый лексический нюанс. “ОДНА тысячА”, “ДВЕ тысячИ” и “пять тысяЧ”. Почти все в тысячах будет соответствовать и для более высоких размерностей, кроме слов “ОДНА” и “ДВЕ”. Для всех остальных размерностей это будут слова “ОДИН” и “ДВА”. Надиктуем эти варианты произношения для тысяч в 2 файла и добавим их в нашу папку. А затем по три варианта произношения для каждой последующей размерности: «миллион», “миллиона”, “миллионов” и т.д. Все файлы надиктованы, идея понятна, осталось воплотить её в скетч. Но мы-же программисты, ёпт…Скетч голосового синтезатора чисел Вот такая небольшая функция voicedig() способна лексически верно произнести любое натуральное число до 42-х разрядов. А вы сможете? Тогда вперед! ))) Видео работы голосового синтезатора: Если кому-то этого недостаточно, можно надиктовать еще размерностей, но мне их названия неизвестны. (Не проблема обучить систему произношению дробей и еще многому чему, но для демонстрации возможностей сабжа вполне, думаю, приведенного примера будет достаточно.) Теперь давайте применим нашу функцию для реальных измерений. Для этого добавим на макетку датчик освещенности BH1750. Значит, нам понадобятся еще 3 файла со словами “люкс”, “люкса”, “люксов”. Закинем эти файлы в новую папку и напишем скетч для опроса датчика. Немножко похулиганим и добавим в инициализацию прибора прибора приветствие ).Скетч говорящего датчика освещенности Видео работы говорящего люксметра: Заменим люксметр на дальномер, поправим немного код и получим говорящий дальномер.Скетч говорящего дальномера Видео работы говорящего дальномера: Конечно, данные датчики используют нашу функцию лишь на малую долю. Но ее возможностей хватит на любой прибор с запасом. Напоследок мы модернизируем игру Тетрис из этого обзора. Отключим уже ненужную пьезопищалку и поставим сабж. Запишем фоновый трек, звук проваливания линии и озвучим установление нового рекорда. Применим из вышеозвученной библиотеки крайне интересные функции: repeatCurrent(bool start) (Проигрывать по кругу текущий трек) и setInterCut(uint16_t track)(ставит текущий проигрываемый трек на паузу и проигрывает заданный).Тетрис с озвучкой Посмотреть, что вышло можно ниже. Прошу прощение за качество записи, особенно звука. Снимал чем было, но главное, я думаю, оценить можно. Кстати, из видео можно услышать звук проваливания линий. Кто первый догадается откуда он, сразу плюс в карму! )) Все скетчи, описанные выше, работают с тем набором файлом, под который заточены. Скачать этот набор можно здесь. Разумеется, я не диктор, потому рекомендую тем, кто захочет повторить эти эксперименты, попросить человека с хорошей дикцией надиктовать эти файлы. Главное — соблюдать последовательность. Итак, мы увидели, что звук может не только заменять дисплеи, но и, дополняя их, заметно разнообразить выдачу информации. Здесь все будет зависеть только от нашей фантазии… и умения немного программировать.Выводы: Из минусов я, пожалуй, отмечу только ограничения на имена файлов и папок, поскольку нужно знать не столько имя файла, сколько его место в таблице FAT. Из-за этого, бывало, надиктуешь полсотни файлов с именами 0001-0050, а один в середине пропустишь. И потом приходится вручную переименовывать кучу файлов, чтобы вставить забытый. Поэтому я написал себе программку на Delphi для вставки и удаления файлов в папке, так, что теперь это для меня не проблема, но производителю все-таки нужно подумать над этим. Плеер обладает огромным потенциалом и, при своей низкой цене и творческом подходе способен стать отличным помощником программиста микроконтроллеров. Вердикт: Must have!DmitrijЭлектроника / Arduino С помощью этой статьи можно быстро собрать очень простой плеер на основе Arduino. С помощью такого плеера можно будет воспроизводить музыку с SD-карты, предварительно ее туда записав. Также для самоделки вполне подойдут такие контроллеры как Seeeduino 2.21 или Garagino на ATmega328. Материалы и инструменты для сборки:— Seeduino;- SD-карт ридер (гнездо для SD-карт);- динамик и конденсатор на 1-10 мкф.Процесс сборки самоделки:Шаг 1. Электронная схема устройстваДля того чтобы подключить SD-карт к контроллеру понадобится делитель напряжения с 5 до 3.3 В. Его собирают на резисторах номиналом 1.8 к и 3.3 к. Но конкретно в этом случае плату можно переключить на режим работы 3.3 В. Для общения карты с seeduino используется протокол SPI. Карта подключается к плате с помощью четырех проводов. Минимум два нужно оставить для питания. На схеме более подробно можно увидеть, как подключается электроника.Для того чтобы можно было нормально скомпилировать прошивку понадобится библиотека fat16lib. Библиотеку нужно распаковать в папку с Arduino и присвоить ей название FAT16. По умолчанию в прошивке ничего менять не нужно. Карту нужно форматировать исключительно в системе FAT16. Автор использовал карту на 256 мегабайт.Шаг 3. Воспроизведение музыкиМузыка должна быть записана в формате WAV PCM Mono 8kHz 8 bit. Для перекодирования музыки в нужный формат можно использовать кодировщик Switch Sound File Converter. Еще важно, чтобы названия музыки на карте имели формат ххх.wav. Имена нужно вписывать без расширения через пробелы. В прошивке они должны стоять в строке playlist = «song1 song2 song3″;. Вот, собственно, и все. Таким вот нехитрым образом можно быстро собрать очень простой плеер. Также для этих целей подходит контроллер Garagino, но в таком случае компоненты и схема сборки несколько иная. form-image.pngДоставка новых самоделок на почту

Получайте на почту подборку новых самоделок. Никакого спама, только полезные идеи!

*Заполняя форму вы соглашаетесь на обработку персональных данных

Становитесь автором сайта, публикуйте собственные статьи, описания самоделок с оплатой за текст. Подробнее здесь. Используемые источники:

  • https://arduinomaster.ru/datchiki-arduino/arduino-mp3-wav-modul/
  • https://mysku.ru/blog/aliexpress/50345.html
  • https://usamodelkina.ru/7014-kak-sobrat-prostoy-pleer-iz-arduino-i-sd-ridera.html

Рейтинг автора
5
Подборку подготовил
Максим Уваров
Наш эксперт
Написано статей
171
Ссылка на основную публикацию
Похожие публикации