Музыка на Arduino

21596

Мой друг, который занимается крафтом макетов оружия из игр, попросил меня помочь ему сделать девайс который смог бы воспроизводить звук выстрела и перезарядки. Важно, чтобы он смог его повторить из модулей ардуино. Как высянилось позднее, не все так просто как мне показалось изначально. В этой статье я опишу популярные варианты которые я перебрал на пути к успеху. Отдельно стоит упомянуть, что вариантов исполнения задуманного только на вскидку можно десяток назвать. Тут я описываю лишь свой путь. Я не эксперт, а самоучка.

Первый подход - в лоб. Воспроизведение звука только силами Arduino.
Вобще, воспроизводить звук с помощью 8 битного микроконтроллера - не самая лучшая идея. А уж пытаться хранить запись в памяти Atmega 328p, которая установлена на китайской Arduino Nano, это вообще за гранью добра и зла. Но тем не менее, я начал именно с этого варианта. На помошь мне пришла библиотека PlaySound компании КарМонитор. Хочу отметить автора этого кода за красоту решения, т.к. он смог выжать максимум из железа. Библиотека устанавливается путем копирования папки PlaySound в папку с библиотеками вашего Arduino IDE. Наш микроконтроллер способен вместить в себя всего 32КБ, а это около 3-х секунд звука. Для того, чтобы загрузить нужный звук в память МК, его нужно соответствующим образом подготовить в звуковом редакторе, (напримнр в Audacity).

  • преобразовать в моно, если у вас стерео (Дорожки -> Стерео в моно)
  • изменить частоту дискретизации на 16000Гц (Дорожки -> Сменить частоту дискретизации дорожки)
  • увеличить скорость на 400% (Эффекты -> Сменить скорость)
  • теперь можно экспортировать в фаил (Фаил -> Export Audio). Тип файла выбираем "Прочие несжатые файлы" и в параметрах заголовок: "WAV (Microsoft)", кодирование:Unsigned 8 bit PCM
  • c помощью программы Wav2Hex.exe перекодируем этот *.wav фаил в .h, понятный для Arduino IDE. В программе параметры не трогать.

Библиотека немного допилена сообществом и мной. Все необходимое лежит в архиве к этой части статьи.
Звук воспроизводится следующей функцией:

void PlaySound::startPlayback(uint8_t *wave_data, uint16_t wave_length, int ismypin)

Первый параметр это название переменной, второй - ее размер, третий - пин для вывода звука (могут быть задействованы пины 11(1), 3(2), 10(3), 9(4)).  Название переменных звука задаются автоматически в прогрпмме Wav2Hex на основании имени файла. Т.к. воспроизведение звука происходит в фоне, необходима задержка равная или большая чем продолжительность звука.

Простейший тестовый скетч со звуком выстрела AWP из CS GO:

#include <util/delay.h>
#include
#include "awps.h"

int spin = 1;

void setup(){}

void loop()
{  
 PlaySound::startPlayback((uint8_t *)awps,  awps_length, spin);
 _delay_ms(1500);
}

Динамик можно подключить прямо к пину (11 в моем случае) или собрать простейший усилитель на транзисторе. Чтобы увеличить громкость такого усилителя, нужно подать большее напряжение. Внимание! Не общее напряжение с ардуино, а напряжение усилителя.

Arduino only Sound

Для моей задачи такое решение не подойдет т.к. при сжатии звук сильно теряет в качестве. Еще его приходится ускорять под библиотеку в 4 раза, что тоже сильно искажает звук. Именно по этой причине я не стал городить более мощный усилитель и фильтры.

Arduino only Sound

Второй подход. Воспроизведение звука Arduino SD карта.

Этот способ я сильно описывать не буду, т.к. он объезжен в интернете. По идее, звук должен быть лучше, т.к. его не приходится ускорять на 400% как в прошлом устройстве. Как понятно из названия, для хранения музыки будем использовать карточку SD. В сравнении с прошлым вариантом, продолжительность звукозаписей ограничена лишь размером карточки. Для комфортного подключения карты понадобится модуль кардридера. По идее, карточку можно подпоять и напрямую - питание подать 3.3В, а сигнальные линии через резисторы не менее 1кОм. Но проще использовать готовый шилд. Я взял тот что для MicroSD, т.к. там сопряжение уровней сделано на православной микросхеме, а не на резисторах как на модуле под полноразмерную карту.

Arduino SD sound wav

Прошивка базируется на библиотеке TMRpcm, которая легко ишется и ставится через встроенный менеджер библиотек. Файлы звукозаписей готовятся похожим образом, только проще. В любом аудиоредакторе достаточно поставить частоту дискретизации моно дорожки в 16кГц и сохранить в 8 битный WAV. Следите чтобы имена файлов не были длиннее 5 символов (цифры и буквы) иначе могут не читаться с карты.

В этом скетче я уже добавил воспроизведение по нажатию на кнопки подключенные к выводам A1 и A2. Тут вообще все без лишних затей - определяем пин с которого выводим звук, инициализируем карточку и функцией tmrpcm.play("название файла"); воспроизводим звук.

#include                       // need to include the SD library
//#define SD_ChipSelectPin 53  //example uses hardware SS pin 53 on Mega2560
#define SD_ChipSelectPin 4  //using digital pin 4 on arduino nano 328, can use other pins
#include            //  also need to include this library...
#include

TMRpcm tmrpcm;   // create an object for use in this sketch

void setup(){
  pinMode(A1, INPUT);
  pinMode(A2, INPUT);
  tmrpcm.speakerPin = 9; //5,6,11 or 46 on Mega, 9 on Uno, Nano, etc
SD.begin(SD_ChipSelectPin);
  tmrpcm.play("es.wav"); //the sound file "music" will play each time the arduino powers up, or is reset
}

void loop(){  
  if(digitalRead(A1)==LOW)
    { tmrpcm.play("awp1.wav"); }
    
  if(digitalRead(A2)==LOW)
    { tmrpcm.play("awpd.wav"); }

}

В этот раз, решил включить в схему усилитель на базе микросхемы PAM8403 для увеличения максимальной громкости. Кнопки традиционно замыкаются на землю, а подтягивающие резисторы (10кОм) подключены к питанию.  Не забудьте подвести питание ко всем элементам схемы. Картинка со схемой скачана с интернета, там неправильно подключены кнопки и нет усилителя. Но суть должна быть понятна.

Arduino SD sound wav

Ниже привожу перечень прямых соединений, чтобы вам проще было проверить свой прототип.

  • D4 - CS
  • D13 - SCK
  • D11 - MOSI
  • D12 - MISO
  • D9 - выход звука на усилитель
  • A1, A2 - подключены кнопки

Третий подход. Успех.

Вариант с SD карточкой, конечно хорош, но далек от идеала. Поэтому, покапавшись на Aliexpress я нашел mp3 модуль DFPlayer mini. Мне этот модуль нужен был срочно, и я купил его в местном магазине. Кокгда почитал даташит на него я понял - это то что мне нужно было с самого начала. Модуль может воспроизводить WAV и MP3 форматы.

Вот его краткие характеристики:

  • 24 битный ЦАП на выходе
  • частота дискретизации до 48к Гц
  • карты памяти до 32Gb (FAT16, FAT32)
  • до 22 кнопок управления
  • управление по UART
  • встроенный усилитель 3W
  • 30 уровней громкости, 10 преднатроек эквалайзера
  • может высткпать как кардридер при подключении через USB

Быстренько собрал прототип этого устройства по следующей схеме:

DFPlayer mini shoot

Применил динамик от старой USB колонки. Питается устройство от маленього литиевого аккумулятора на 240mAh, который подключен через платку зарядки и защиты на базе TP4056. На карточке лежит два файла - выстрел и перезарядка AWP и соответствующе пронумерованы. Обе кнопки подключены к одному выводу ADKEY_1. Первая замыкает прямо на землю, а вторая через резистор 3кОм. На один такой вывод можно повесить до 10 кнопок.

Свой прототип я собрал на куску макетной платы. Вы же волны собирать как вам позволит ваша фантазия. Не вижу смысла рассписывать конструкцию подробно.

DFPlayer good CS GO

В итоге получилось компактное и надежное устройство. Отдельно хочу отметить хорошую мощность встроенного усилителя.

DFPlayer mini - http://ali.pub/1ppkc2
Аккумуляторы  LiPo  - http://ali.pub/1pplb2
Макетная плата - http://ali.pub/1pplks
Arduino Nano - http://ali.pub/1ppk6t

Видео про Музыка на Arduino

Комментарии

Комментарии


  Виктор
 
05 Ноября 2022 
Привет у меня такой же случай нужно создать звуковой выстрел для детского бластера У вас в третьем варианте не нужно создавать файль с расширением h для arduino,? а просто записываешь mp3 на cd карту ?