Усилитель звука на ардуино своими руками

Добавил пользователь Евгений Кузнецов
Обновлено: 08.09.2024

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

Первый подход - в лоб. Воспроизведение звука только силами 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:

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

Arduino only Sound

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

Arduino only Sound

Архив со всем необходимым для воспроизведения звука только с помощью Arduino Nano - arduino_only_sound

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

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

Arduino SD sound wav

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

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

В этот раз, решил включить в схему усилитель на базе микросхемы 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

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

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


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

DFPlayer good CS GO

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

Гитарная педаль на Arduino Uno – pedalSHIELD UNO

Гитарная педаль на Arduino Uno – pedalSHIELD UNO

О проекте

pedalSHIELD UNO – это lo-fi программируемая гитарная педаль, которая работает с платами Arduino UNO / Genuino UNO. Это Open Source & Open Hardware проект для гитаристов, хакеров и программистов, которые хотят узнать о цифровой обработке сигналов, эффектах, синтезаторах и прочих экспериментах без глубоких знаний о DSP, электронике или низкоуровневом программировании.

Вы можете запрограммировать свои собственные эффекты на C/C++ или использовать готовые эффекты с форума.

Программируемая гитарная педаль Arduino pedalSHIELD UNO

Программируемая гитарная педаль Arduino pedalSHIELD UNO

Как работает схема?

Плата расширения состоит из трех частей:

  • входной каскад: усиливает и фильтрует сигнал с гитары, что делает его готовым для аналого-цифрового преобразователя Arduino Uno;
  • плата Arduino: использует оцифрованный сигнал с АЦП и выполняет всю цифровую обработку сигнала (DSP),создавая эффекты (distortion, fuzz, громкость, метроном. );
  • выходной каскад: после создания новой формы сигнал поступает с цифровых выходов Arduino (два объединенных ШИМ выхода) и подготавливается к отправке на следующую педаль или гитарный усилитель.

Технические параметры

Готовые примеры эффектов

  • Clean/Transparent
  • Volume/Booster
  • Distortion
  • Fuzz Distortion
  • Bit-Crusher
  • Daft Punk Octaver
  • Signal Generator
  • Metronome
  • Delay
  • Tremolo

Как программировать педаль?

Идея состоит в том, чтобы сделать программирование максимальным простым, плата программируется на C/C++ с использованием стандартных функций и среды разработки Arduino. Все инструменты и программы являются бесплатными / с открытым исходным кодом.

Ниже показана связь интерфейсов гитарной педали (вход/выход, элементы управления) с выводами платы Arduino Uno.

Связь интерфейсов платы расширения гитарной педали с Arduino Uno

Связь интерфейсов платы расширения гитарной педали с Arduino Uno

Необходимы базовые знания C. Лучший способ проиллюстрировать, как программировать педаль – это показать простой пример педали с эффектом Volume/Booster.

Педаль Громкость/Booster

Структурная схема программы выглядит так:

Структурная схема программы

Структурная схема программы

Реально используемый код выглядит так:

Аппаратная конструкция pedalSHIELD UNO

Весь проект педали с открытыми исходниками, разработка была выполнена с помощью KiCad, бесплатного открытого инструмента проектирования электроники. Все файлы проекта, схемы и перечни элементов являются общедоступными. Схема может быть разбита на 5 простых блоков: источник питания, входной каскад, выходной каскад, пользовательский интерфейс и разъемы Arduino.

Программируемая гитарная педаль Arduino pedalSHIELD UNO. Схема электрическая принципиальная

Программируемая гитарная педаль Arduino pedalSHIELD UNO. Схема электрическая принципиальная

Принцип действия прост; 1 операционный усилитель готовит сигнал для оцифровки, а другой операционный усилитель принимает сигнал с микроконтроллера Arduino UNO. Один АЦП используется для считывания сигнала гитары, и два ШИМ сигнала используются для генерации выходного сигнала.

Список компонентов

Это компоненты сквозного монтажа, которые легко найти.

Печатная плата

Хотя разработчики и утверждают, что это полностью открытый проект, но упорно не желают делиться файлами разводки печатной платы для какой-либо САПР (например, для того же KiCad, в формате которого они предоставляют принципиальную схему).

Поэтому для изготовления педали есть три варианта:

Внешний вид печатной платы pedalSHIELD UNO и расположение компонентов

Внешний вид печатной платы pedalSHIELD UNO и расположение компонентов

Часто задаваемые вопросы (FAQ)

pedalSHIELD Uno совместима со всеми платами Arduino?

Нет, только с Arduino Uno и Genuino Uno.

pedalSHIELD Uno подходит для басистов?

Да, но вам необходимо заменить 2 конденсатора (C1 и C11) с 0,1 мкФ на 0,47 мкФ, чтобы пропускать через схему более низкие частоты.

Могу я включить наушники напрямую в pedalSHIELD Uno?

Нет, pedalSHIELD Uno – это не усилитель. Её необходимо включть в гитарный усилитель или в педаль мультиэффектов (например, Line 6 pods и т.п.).

Вот и всё! Делитесь впечатлениями и результатами сборки!

Судя по даташиту вроде можно. Но я не совсем понимаю зачем. Цена вопроса "2 коп".
TL972 работает очень неплохо ( в данной схеме ).
Для проверки 100% поменять можно, но для хорошего звука лучше взять TL972.

Можно ли заменить TL972 на ОУ TS972? Кто-то сталкивался с такой микросхемой?

Интересно. Попробуйте JRC4558 (режимы от 4 В). Все-таки она более "гитарная" что-ли. LM358 как-то больше для микрофонов в предусилителях используется. Если попробуете, отпишите про результат.

Учитывая опыт передовых стран решил все собрать на одной плате. Из за "VGA" монитора в мой корпус не поместились разъемы под Аудио ВХ / ВЫХ. Пришлос проявить "Смекалку". Но в общем получилось так.:
Плата спроектирована под конкретный (мой) прочный силуминовый корпус. Контакты для подключения Аудио коннекторов расположены возле переключателя.
Максимально применил дешевые китайские модули для Arduino.

Ок, давайте так и сделаем.
Высылайте оставшиеся материалы, а я всё это оформлю и включу в эту статью.

Я не смогу так же качественно оформить материал как в этой статье. На сегодня я могу предоставить схему, разводку платы (в формате EasyEDA) и код программы. (собственно я уже это сюда и выложил).
Было бы конечно очень здорово чтобы эти результаты можно было включить в данную статью как дополнительный материал или хотя бы убрать мои лишние ответы с промежуточными решениями.

Прграмма опубликованная в стате и та что выложил я - Рабочие на 100% НО.
Прграма неотделима от СХЕМЫ. То есть:
Какая будет реализована СХЕМА, такую нужно и взять ПРГРАММУ.

Я сделал под заказ педаль для бас гитары.
Собственно говоря применение экрана и органов управления (транскодер) позволяют расширить количество эффектов.
Ограничено:
- временем между опросом АЦП ~10 ms
-объём внутренней памяти Arduino NANO (в данном варианте я использую меньше половины)
Схема 100% рабочая и собирает оцифрованный сигнал вполне прилично.
Теперь вопрос за разработкой ПО. Я в общем не музыкант, так наугад несколько эффектов сварганил. Но пока не проверял (нет инсрумента и времини).
Так что если есть идей реализации варианта эффекта то можно пробовать. Пока не придумал как сделать "Октавер" (думаю).

планируется дальнейшее развитие проекта?

Да, пересылать информацию в рамках данной платформы несколько затруднительно.
Skype - boris_latysh

Как с вами можно связаться по поводу платы?

Готов купить плату, куда вам удобней написать для обсуждения данного вопрсоа?

А на каком сайте заказывать плату и как её туда загрузить (какую папку)?

TL072 минимальное питание +3,5в, -3,5в то есть минимальное общее питание для нее - 7в. TL072 использовать можно, НО нужно будет делать дополнительное питание.
TL972 можно полностью питать 5в, я думаю потому ее и применили. А учитывая что нам нужно зайти в контроллер сигналом амплитудой 0-5в. То в такой ситуации c TL072 будут дополнительные сложности с согласованием сигнала от операционника к входу АЦП контроллера.

Пиши в Личку. Отправлю текст

"Коментарии" не всегда соответствуют коду, так как программа пока в работе.
Я в стендовых условиях все проверил работает отлично. НО . на реальном инструменте пока не тестировал.
P.S. Есть готовая плата под эту схему. Если кому нужно могу продать.

// Based on OpenMusicLabs previous works.
// Цифровой усилитель: нажатие кнопки 1 или кнопки 2 увеличивает или уменьшает громкость.

Звук в ардуино

Генерировать звук в Ардуино можно многими способами. Самый простой — это использовать функцию tone(). Поэтому, прежде всего, посмотрим как работает эта функция.

Генерируем звук на ардуино

Также существуют дополнительные платы, которые можно подключить к Ардуино с помощью перемычек. Но о них мы поговорим в дугой раз.

Сейчас посмотрим, как можно запрограммировать Ардуино для вывода звука. Для этого просто используем небольшой динамик.

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

Для выполнения этого урока нам понадобятся

  • Ардуино Uno
  • Макетная плата
  • Перемычки
  • 1 резистор номиналом 150 Ом
  • Потенциометр 10 кОм
  • Динамик 8 Ом
  • Кабель USB

Что такое звук

Во-первых, несколько слов о звуке. Что такое звук, какими свойствами он обладает, как люди воспринимают звук?

Прежде всего, мы знаем, что звук распространяется по воздуху в виде волны. Работа звуковых колонок, удар в барабан или колокол создают вибрацию воздуха. Таким образом, частицы воздуха за счет колебаний передают энергию все дальше и дальше. В результате волна давления передается от источника к вашей барабанной перепонке через реакцию вибрирующих частиц.

Звук в ардуино управляется двумя свойствами этих частиц. Частотой и амплитудой. Частота — это скорость вибрации, а амплитуда — это размах колебаний.

В физическом смысле звуки с большой амплитудой громче, чем с малой. Тон высокочастотных звуков выше, а низкочастотных, как видим на графике, — ниже.

Как работает динамик

В предыдущих уроках мы рассматривали как работают электродвигатели. Двигатели используют электромагниты для превращения электрической энергии в механическую.

Динамики работают так же для создания звука.

Перед постоянным магнитом размещена звуковая катушка. Когда вы подаете на нее электрический сигнал, переменный ток создает магнитное поле, звуковая катушка перемещает диффузор вверх и вниз. Из-за вибрации диффузора из динамика раздается звук.

Функция tone()

Для работы со звуком в Ардуино предусмотрена функция tone(). Она создает меандр с заданной частотой и выводит его на выбранный контакт.

Функция tone() взаимодействует с одним из аппаратных таймеров контроллера ATmega, так что ее можно вызвать и продолжать работать с Ардуино, а звук будет играть в фоновом режиме.

Программа и схема

На этом теоретическая часть закончена. Так что, давайте соберем небольшую схему и попробуем запрограммировать воспроизведение звука.

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

Подключим динамик к ардуино последовательно с резистором и с потенциометром, таким образом мы сможем регулировать громкость звука.

Проверить работоспособность схемы очень просто. Используем функцию tone() и напишем простую программу чтобы продемонстрировать ее работу.

Поскольку функция tone() принимает несколько параметров, мы можем указать длительность сигнала. Поэтому будем использовать оператор setup() а не loop().

В результате выполнения этого кода, мы услышим высокий звук длительностью 1 секунду.

Ардуино и динамик

Теперь, если мы хотим использовать последовательный порт и принимать команды из него, используем функцию Serial.parseInt(). Для этого, будем считывать число из порта и передавать его как частоту в функцию tone().

Не забудем ограничить максимальные и минимальные значения, а так же включить последовательный порт в функции setup().

Полный текст программы

Заключение

Сегодня мы рассмотрели еще один аспект работы с Ардуино. А именно звук в Ардуино. Более того, в будущем мы будем улучшать схему и программу этого урока. А в следующий раз подключим к схеме несколько кнопок и попробуем сыграть настоящую мелодию.

Миниатюры

Миниатюры

Тоже сегодня посвятился в эту тему. Хотел ветку создать а оказывается есть уже и давно. Хотел такой вопрос задать. Кто знает. В программе ARDUINO как я понимаю С++ используется. Ну модифицированный. Но просто интересно. Поддерживает ли эта программа обращения к регистрам напрямую в программным коде имеется ввиду?

Тоже сегодня посвятился в эту тему. Хотел ветку создать а оказывается есть уже и давно. Хотел такой вопрос задать. Кто знает. В программе ARDUINO как я понимаю С++ используется. Ну модифицированный. Но просто интересно. Поддерживает ли эта программа обращения к регистрам напрямую в программным коде имеется ввиду?

Там самый обычный C++, просто есть готовые библиотеки и как бы штатные функции, но вы можете их игнорировать и вставлять куски C++ кода не из ардуинских проектов или даже ASM-вставки, но возможны (и даже скорее всего будут) проблемы с различными переопределениями ключевых слов/макросов (но они есть и при использовании просто разных сред программирования, программерам оно сильно не мешает, а начинающему может).

но вы можете их игнорировать и вставлять куски C++ кода не из ардуинских проектов или даже ASM-вставки,

Да ладно!, АСМ точно вставлять нельзя. Да и от С++ (и от С) язык довольно сильно отличается. Кроме того, Ардуино IDE не поддерживает сторожевой таймер. Интересно, чем он создателям насолил?

Приветствую! А кроме фото можно подробности. Я тут тоже временами балуюсь. И даже мой девятилетний сын сам упражняется. Отдал ему для экспериментов старый ноут. Предварительно поставил на него Ubuntu, Arduino IDE и Scrath 4 Arduino. Собирает программы из кубиков прямо на экране. Успешно скрещивает его с конструктором "Знаток" который уже весь пересобирал вдоль и поперек. Скачал ему видеоуроки на эту тему как раз для младших школьников. А я недавно получил из китая модуль на AD9850. Правда руки еще не дошли пока. Хочу поэкспериментировать с синтезатором и всякими простыми конструкциями на этой базе. Основная идея: простые конструкции для начинающих на современной элементной базе. Не без компьютера разумеется. Мне кажется, что очень интересные вещи возможны. Некоторые даже с минимумом пайки, практически всё из готовых блоков и возможно даже на макетных платах с гнездами и перемычками. Типа QRP трансивер за поолчаса. :-)
Радует, что при заказе из поднебесной цена получается вполне демократичная и качество в основном вполне достойное. Во всяком случае явного брака мне пока не попадалось, все что заказывал успешно работает без нареканий. Есть уже несколько разных плат, заказал индикатор на ЖК с клавиатурой, пару валкодеров, макетную плату, перемычки к ней и кучу всяких датчиков для автоматизации дачи :-)
Телеграфный ключик уже попробовал прошивать. Без проблем получается. В сети много вариантов. Есть достаточно крутые с памятью и кучей макросов.
А еще в одном из недавних номеров CQ QRP мне попалась статья про КВ маячок на аналогичном контроллере но не Arduino. Интересно попробовать сделать на этой платформе. По идее получается, что нужен только контур на рабочую частоту на выходе и соответствующий скетч.

Читайте также: