Добавление звуков или музыки в какой-нибудь ваш проект (устройство) всегда выглядит хорошо. Особенно просто добавить музыку/звук в ваш радиоэлектронный проект если он построен на основе платы Arduino и у вас есть свободные контакты на этой плате. В этом случае вам нужно будет просто докупить модуль для SD карты и нормальный динамик.
В этой статье мы рассмотрим как можно просто проигрывать музыку или добавлять различные звуковые эффекты в ваш проект с использованием платы Arduino. Хочется сказать спасибо сообществу Arduino которое разработало специальные библиотеки, позволяющее реализовать работу со звуком в Arduino с минимальными усилиями. В этом проекте кроме платы Arduino мы еще использовали микросхему LM386 для усиления сигнала и уменьшения помех.
Необходимые компоненты
Плата Arduino Uno
Модуль чтения SD карт
SD карта
Аудио усилитель LM386
Конденсатор 10 мкФ (2 шт.)
Конденсатор 100 мкФ (2 шт.)
Резистор 1 и 10 кОм
Кнопка (2 шт.)
Макетная плата
Соединительные провода
Основы работы с WAV аудиофайлами в Arduino
Для проигрывания звуков/музыки с SD карты с помощью платы Arduino необходимо чтобы они были в .wav формате потому что плата Arduino умеет работать только с аудиофайлами этого формата. Чтобы сделать mp3 плеер на основе платы Arduino можно воспользоваться большим количеством предлагаемых на рынке шилдов (плат расширения) для Arduino, позволяющих работать с mp3. Либо можно с помощью специальных сайтов в сети интернет конвертировать формат mp3 в формат wav (этот способ мы будем использовать в данной статье).
Таким образом, для конвертирования любых аудио файлов в wav формат необходимо выполнить следующую последовательность действий:
Шаг 1. Перейдите на сайт — Online Wav Converter.
Шаг 2. Установите параметры wav файла, указанные в следующей таблице. В дальнейшем вы можете экспериментировать с этими настройками, но указанные в таблице настройки обеспечивают наилучшее качество звучания.
Bit Resolution | 8 Bit |
Sampling Rate | 16000 Hz |
Audio Channel | Mono |
PCM format | PCM unsigned 8-bit |
Шаг 3. На указанном веб-сайте нажмите “choose file” и выберите файл который вы хотите конвертировать. Затем заполните необходимые настройки. Вы должны будете на экране компьютера получить примерно следующую картинку:
Шаг 4. Теперь нажмите “Convert File” и ваш файл будет конвертирован в wav формат, который можно будет скачать к себе на компьютер.
Шаг 5. Отформатируйте свою SD карту и сохраните ваш .wav аудио файл на нее. Запомните имя (наименование) своего файла. Можно загружать и несколько аудио файлов при необходимости. Мы в нашем проекте выбрали 4 файла с песнями и назвали их 1, 2, 3 и 4 (имена не должны изменяться). Соответственно, после конвертации мы получили файлы 1.wav, 2.wav, 3.wav and 4.wav как показано на следующей картинке.
Работа схемы
Схема устройства представлена на следующем рисунке.
Плата Arduino | Модуль чтения SD карт |
+5V | Vcc |
Gnd | Gnd |
Pin 12 | MISO (Master In Slave out) |
Pin 11 | MOSI (Master Out Slave In) |
Pin 13 | SCK (Synchronous Clock) |
Pin 4 | CS (Chip Select) |
Теперь наша плата Arduino сможет считывать музыкальные файлы с SD и проигрывать их на своем контакте 9. Но аудио сигнал на выходе контакта 9 платы Arduino будет достаточно слабый, поэтому мы будем усиливать его с помощью микросхемы аудио усилителя LM386. Данная микросхема позволяет усиливать аудио сигнал до 200 раз и ее контакт Vdd (pin 6) запитывается от контакта 5V платы Arduino. Если вы хотите увеличить/уменьшить громкость звука вам необходимо увеличить/уменьшить напряжение подаваемое на этот контакт. Максимально на этот контакт можно подать 15 В. Более подробно о микросхеме LM386 можно прочитать по этой ссылке (на английском языке).
Также мы в схему добавили 2 кнопки, одна из которых используется для переключения на следующий трек (аудиофайл), а вторая – для проигрывания/паузы музыки.
Вы можете собрать представленную схему на макетной плате как показано на следующем рисунке:
Программирование Arduino для проигрывания музыки
Когда вся аппаратная часть рассматриваемого проекта у вас уже готова вставьте SD карту в модуль для их чтения и выполните следующую последовательность действий:
Шаг 1. Скачайте библиотеку для работы с аудиофайлами по следующей ссылке — TMRpcm library. На открывшемся сайте выберите “Clone or download” и выберите скачивание в формате ZIP архива.
Шаг 2. Добавьте этот Zip файл в вашу Arduino IDE при помощи выбора пункта меню Sketch->Include Library -> Add .ZIP Library как показано на рисунке ниже и выберите ZIP файл который вы только что скачали.
Шаг 3. Полный текст программы приведен в конце статьи, просто скопируйте и вставьте ее в вашу Arduino IDE, а потом загрузите ее в вашу плату Arduino. В этом разделе будут объяснены лишь наиболее значимые фрагменты программы.
Проигрывание аудио файла
Вы можете проигрывать аудио файл, хранящийся в Wav формате на SD карте, с помощью следующей команды:
music.play("3.wav");
//object name.play (“FileName.wav”);
Постановка на паузу аудиофайла
Для этого можно использовать команду вида:
music.pause();
//objectname.pause();
Перемотка вперед/назад аудио файла
В платформе Arduino нет прямых способов перемотки аудио файла вперед/назад, однако можно проигрывать аудиофайл с заданного фрагмента времени. При дополнительном программировании эту способность можно использовать для перемотки аудио файла.
music.play("2.wav",33); //проигрывание песни с 33-й секунды
//objectname.play(“Filename.wav”,time in second);
Установка качества аудио
Скачанная нами библиотека обеспечивает два возможных уровня качества проигрывания музыки: в нормальном режиме и с двухкратной частотой дискретизации (2X oversampling).
music.quality(0); //Normal Mode
music.quality(1); //2X over sampling mode
Установка уровня громкости
Громкость звучания музыки можно регулировать и программным путем с помощью ниже представленных строк кода. Но высокие уровни громкости, устанавливаемые программным путем, могут приводить к появлению искажений в аудиосигнале, поэтому по возможности используйте усиление аудио сигнала аппаратными способами.
music.setVolume(5); //установка уровня громкости 5
//objectname.setVolume(Volume level);
Работа музыкального аудиоплеера на основе Arduino
После загрузки программы в плату Arduino просто нажмите кнопку, подсоединенную к контакту 2 платы Arduino, и начнется воспроизведение первой песни, записанной на SD карту (в нашем случае это 1.wav). Если нажмете кнопку еще один раз, то произойдет переключение на вторую песню — 2.wav и т.д.
Можно ставить песню на паузу и возобновлять ее проигрывание с помощью кнопки, подключенной к контакту 3 платы Arduino. Более подробно все эти процессы показаны на видео, приведенном в конце статьи.
Исходный код программы
Представленная программа показывает как можно проиграть три песни с SD карты при помощи нажатия соответствующей кнопки в схеме.
#include "SD.h" //библиотека чтобы считывать информацию с SD карты
#include "TMRpcm.h" //библиотека чтобы проигрывать аудио файлы
#include "SPI.h" //SPI библиотека для SD карты
#define SD_ChipSelectPin 4 //Chip select is pin number 4
TMRpcm music; //Lib object назовем "music"
int song_number=0;
boolean debounce1=true;
boolean debounce2=true;
boolean play_pause;
void setup(){
music.speakerPin = 9; //аудио выход на контакте 9
Serial.begin(9600); //задействуем последовательный порт для целей отладки
if (!SD.begin(SD_ChipSelectPin)) {
Serial.println("SD fail");
return;
}
pinMode(2, INPUT_PULLUP); //подключение кнопки 1 с внутренним подтягивающим резистором для переключения на следующий аудио файл
pinMode(3, INPUT_PULLUP); //подключение кнопки 2 с внутренним подтягивающим резистором для паузы/воспроизведения аудио файла
//pinMode(3, INPUT_PULLUP); //Button 2 with internal pull up to fast forward
music.setVolume(5); // установка уровня громкости (от 0 до 7)
music.quality(1); // установите 1 для 2x oversampling (удвоенной частоты дискретизации) и 0 для обычного режима воспроизведения аудио
//music.volume(0); // 1(up) or 0(down) to control volume
//music.play("filename",30); plays a file starting at 30 seconds into the track
}
void loop()
{
if (digitalRead(2)==LOW && debounce1 == true) //нажата кнопка 1
{
song_number++;
if (song_number==5)
{song_number=1;}
debounce1=false;
Serial.println("KEY PRESSED");
Serial.print("song_number=");
Serial.println(song_number);
if (song_number ==1)
{music.play("1.wav",10);} //проигрывание песни 1 с 10-й секунды
if (song_number ==2)
{music.play("2.wav",33);} // проигрывание песни 2 с 33-й секунды
if (song_number ==3)
{music.play("3.wav");} //проигрывание песни 3 с начала
if (song_number ==4)
{music.play("4.wav",25);} // проигрывание песни 4 с 25-й секунды
if (digitalRead(3)==LOW && debounce2 == true) //кнопка 2 нажата
music.pause(); Serial.println("PLAY / PAUSE");
debounce2=false;
}
if (digitalRead(2)==HIGH) // устранение дребезга контактов
debounce1=true;
if (digitalRead(3)==HIGH) // устранение дребезга контактов
debounce2=true;
}
}