Звук

Ответить
Oleg
Сообщения: 186
Зарегистрирован: 12 июл 2023, 12:09
Звук

Сообщение Oleg »

Разобравшись с управлением движением, светом, температурой и дисплеями, на- стало время обратить внимание и на создание звуков.

Ha Raspberry Pi получать высококачественный звук проще, поскольку активные колонки можно подключить к его аудиоразъему, а на Arduino эта задача решается несколько сложнее.
Oleg
Сообщения: 186
Зарегистрирован: 12 июл 2023, 12:09
Эксперимент: громкоговоритель без усилителя на Arduinо

Сообщение Oleg »

Для воспроизведения более или менее сложного звука потребуется какой-нибудь громкоговоритель. Громкоговорители, появившиеся почти сто лет назад, в большинстве своем работают на основе соленоида (см. раздел «Соленоиды»), содержащегося в них электромагнитную катушку с достаточно высокой частотой, которая колеблет жесткий конус, создавая звуковые волны.

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

Обычно на громкоговорителях встречаются значения 4 или 8 Ом. И если вы собираетесь подключить 8-омный громкоговоритель к выходу Arduino с напряжением 5 В, то с полным основанием можете ожидать возникновения тока, равного по силе:

I = V / R = 5 / 8 = 625 мА

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

ЗВУКОВЫЕ ЧАСТОТЫ
Частота звуковой волны в музыкальных терминах называется тоном и выражается в количестве звуковых волн, достигающих ваших ушей за одну секунду. Мне нравится представлять звуковые волны в виде ряби на пруду. Звук высокой частоты - скажем, 10 кГц (килогерц), создает 10 000 звуковых волн в секунду, а звук низкой частоты (скажем, 100 Гц) - всего 100 звуковых волн в секунду. Человек обычно слышит звуки в диапазоне от 20 Гц до 20 кГц, но верхняя граница с возрастом снижается. Звуки выше 20 кГц обычно называют ультразвуком.

У животных другие диапазоны слышимых звуков. Например, кошки могут слышать частоты вплоть до 55-79 кГц, а летучие мыши известны тем, что вообще пользуются ультразвуковой эхолокацией.

В музыке самая низкая нота «До» на обычном пианино соответствует частоте 32,7 Гц, а самая высокая - на частоте 4186 Гц. Известное всем, имеющим хоть какое-то отношение к музыке, понятие октава означает удваивание частоты. Поэтому если заставить на клавиатуре пианино зазвучать две ноты «До» смежных октав, то вторая нота будет звучать с удвоенной частотой первой ноты.

Комплектующие

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

Комплектующие для работы с Arduino в эксперименте с громкоговорителем:


Небольшой громкоговоритель с импедансом 8 Ом
Резистор 270 Ом 0,25 Вт
400-точечная беспаечная макетная плата
Перемычки «папа-папа»


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

Макетная схема эксперимента

Схема, собранная для проведения эксперимента на макетной плате, показана на рисунке ниже. Один провод от громкоговорителя подключается к контакту GND (заземление) Arduino, а второй - к контакту D11 через резистор.
Схема эксперимента с громкоговорителем на Arduino в сборе
Схема эксперимента с громкоговорителем на Arduino в сборе
Программа для Arduino

Скетч Arduino для этого эксперимента:

Код: Выделить всё

const int soundPin = 11;

void setup() {
  pinMode(soundPin, OUTPUT);
  Serial.begin(9600);
  Serial.println("Enter frequency");
}

void loop() {
  if (Serial.available()) {
    int f = Serial.parseInt();
    tone(soundPin, f);    // (1)
    delay(2000);
    noTone(soundPin);     // (2)
  }
}

Незнакомая вам часть кода может находиться внутри цикла loop():

1. `tone` настраивает один из выходных контактов Arduino на воспроизведение звука с указанной частотой (в данном случае, с частотой, набранной в окне монитора порта).

2. После двухсекундной задержки команда `noTone` отменяет воспроизведение звука, возвращая умиротворяющую тишину.

Загружаем и выполняем программу

Загрузите программу в устройство, а затем откройте окно монитора порта. Попробуйте ввести значение 1000 - должен услышаться не самый приятный звук умеренной громкости, но не настолько громкий, чтобы быть услышанным в шумном помещении.

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

СИНУСОИДА И МЕАНДР
Звук, излучаемый громкоговорителем при подключении его непосредственно к выходному контакту Arduino, режет слух и кажется грубым. Дело в том, что цифровой выход может находиться только во включенном и выключенном состоянии, и звуковая волна, получаемая при этом, по форме напоминает меандр. По сравнению с более мягкой и приближенной к синусоиде звуковой волной музыкального инструмента, звуковая волна в форме меандра считается весьма ненатуральным звуком (рисунок ниже).
Звуковые волны в виде меандра и синусоиды
Звуковые волны в виде меандра и синусоиды
Oleg
Сообщения: 186
Зарегистрирован: 12 июл 2023, 12:09
Усилители

Сообщение Oleg »

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

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

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

Усилитель можно собрать самостоятельно, но гораздо проще воспользоваться уже готовым устройством или парой колонок, имеющих встроенный усилитель, таких как те, что используются с персональным компьютером. Это особенно удобно при использовании Raspberry Pi, так как их можно просто подключить к аудиоразъему Raspberry Pi.

Мы рассмотрим подробнее этот подход позже, когда кукла Пепе (из раздела "Проект: танцующая кукла Пепе на Raspberry Pi" ) приобретет голос.
Oleg
Сообщения: 186
Зарегистрирован: 12 июл 2023, 12:09
Эксперимент: воспроизведение звуковых файлов на Arduino

Сообщение Oleg »

Звуковые файлы формата WAV можно проигрывать на Arduino с помощью оборудования из раздела "Эксперимент: громкоговоритель без усилителя на Arduino" и библиотеки Arduino под названием PCM (от англ. pulse code modulation, импульсно-кодовая модуляция). Для генерирования колебаний, способных вызвать звук, в этой библиотеке используется технология, слегка похожая на технологию широтно-импульсной модуляции (ШИМ).

Флеш-памяти Arduino хватает приблизительно на 4 секунды записи, а если требуется проигрывать более длинные звуковые клипы, необходимо добавить к Arduino кардридер SD и следовать рекомендациям, приведенным на веб-сайте Arduino по адресу: [https://www.arduino.cc/en/Tutorial/SimpleAudioPlayer](https://www.arduino.cc/en/Tutorial/SimpleAudioPlayer).

Звук мы запишем на компьютере, воспользовавшись пакетом программ Audacity, а затем запустим утилиту, предназначенную для преобразования звукового файла в набор чисел, соответствующих этому звуку, который можно будет вставить в программу для Arduino и воспроизвести.

Исходная статья с описанием такого подхода к воспроизведению звука опубликована на веб-сайте High-Low Tech ([http://highlowtech.org/?p=1963](http://highlowtech.org/?p=1963)). Наш эксперимент немного отличается от этого описания тем, что в нем для записи аудиоклипа используется свободно распространяемое приложение Audacity.

Оборудование и программное обеспечение

В этом эксперименте используется то же самое оборудование, что и в разделе "Эксперимент: громкоговоритель без усилителя на Arduino". Но вам придется установить на компьютер следующие программы, позволяющие записывать и обрабатывать звуковые клипы:

- Приложение Audacity: [audacityteam.org](https://www.audacityteam.org/).

- Утилиту Audio Encoder - ссылку на версию под вашу операционную систему можно найти на веб-сайте [highlowtech.org/?p=1963](http://highlowtech.org/?p=1963).

Создание звукового файла

Примечание: Если записывать свой собственный звуковой клип желания у вас нет, вы можете сразу перейти к разделу "Загружаем и выполняем программу", входящему в состав этого эксперимента, и запустить программу wav_arduino, содержащую в закодированном виде небольшой звуковой блок.

Чтобы создать звуковой файл, запустите программу Audacity, переключите режим записи в моно (Mono) и выберите частоту проекта (Project Rate) равной 8000 Гц.

Чтобы начать запись, щелкните на красной кнопке "Record" (Записать) и запишите свое сообщение. Учтите, что запись не должна быть длиннее секунды. Как только запись будет сделана, в окне Audacity появится изображение звуковой волны. Можно выбрать любую "немую" область в начале или в конце записи и удалить её, оставив только нужную часть звукового блока.

Записанный звук необходимо экспортировать в нужный формат. Для этого опять понадобятся специальные настройки. Выберите в меню "File" (Файл) пункт "Export" (Экспорт аудио), затем в раскрывающемся меню выберите вариант "Other uncompressed files" (Прочие несжатые файлы), перейдите в область настроек "Format options" (Настройки формата) и укажите характеристики WAV (Microsoft) и Unsigned 8 bit PCM, как показано на рисунке ниже. Присвойте файлу имя и пропустите страницу, приглашающую ввести данные об исполнителе.
Программа Audacity выбор параметров экспорта
Программа Audacity выбор параметров экспорта
Только что сгенерированный файл представляет собой двоичные данные. Его нужно преобразовать в список чисел в текстовом виде, разделенных друг от друга запятыми, чтобы его можно было вставить в нашу программу. Запустите для этого утилиту Audio Encoder, загруженную с веб-сайта [highlowtech.org](http://highlowtech.org). Она выведет на экран приглашение на выбор конвертируемого файла - выберите файл, который только что был экспортирован из Audacity

Через несколько секунд появится диалоговое окно с утверждением о том, что все данные находятся в вашем буфере обмена.
Откройте программу /arduino/experiments/wav_arduino и замените всю строку, начиная с последовательности 125, 119, 115, данными из буфера обмена. Это очень длинная строка, поэтому лучше всего выбрать ее, поместив курсор в начало строки, а затем, удерживая нажатой клавишу <Shift>, опустить курсор вниз и переместить его на последний символ строки. Для замены выбранного текста данными из буфера обмена воспользуйтесь пунктом контекстного меню "Insert" (Вставить). Если нанести все вставленные числа на график, его форма будет напоминать ту, которую вы уже видели в Audacity при записи звукового клипа.**

Программа для Arduino

Прежде чем приступить к компиляции и запуску программы, необходимо установить библиотеку PCM. Загрузите ZIP-архив с GitHub (https://github.com/damellis/PCM/zipball/master), распакуйте его, переименуйте папку в "PCM" и переместите ее в каталог своих библиотек Arduino.

Программа для Arduino (если проигнорировать звуковые данные) имеет весьма скромный размер, но массив данных представлен очень длинной строкой!

Код: Выделить всё

#include <PCM.h>

const unsigned char sample[] PROGMEM = {125, 119, 115, 115, 112, 116, 114, 113, 124, 126, 136, 145, 139};//1

void setup() {

  startPlayback(sample, sizeof(sample));//2
}

void loop() {//3

}

Уточним некоторые моменты этого скетча по пунктам, воспользовавшись разметкой строк, сделанной в комментариях:

1. Данные хранятся в массиве типа `unsigned char`, состоящем из восьмиразрядных чисел без знака. Команда `PROGMEM` обеспечивает хранение данных во флэш-памяти Arduino (в ней должно быть доступно около 32 Кбайт).

2. Проигрывание звукового сэмпла осуществляет библиотека PCM. Функции `startPlayback` передается массив проигрываемых данных и размер данных в байтах.

3. Звуковой клип проигрывается однократно при каждом перезапуске Arduino, поэтому функция `loop` остается пустой.

Загружаем и выполняем программу

Загрузите программу в свой Arduino, и как только загрузка завершится, звуковой клип будет воспроизведен!

Сразу же после загрузки программы в нижней части Arduino IDE появится сообщение о том, сколько флэш-памяти Arduino было задействовано, примерно следующего содержания: "Binary sketch size: 11,596 bytes (of a 32,256 byte maximum)" (Размер двоичной программы: 11,596 байтов (из максимально возможных 32,256 байтов)). Если звуковой файл окажется слишком большим, вы получите сообщение об ошибке.
Oleg
Сообщения: 186
Зарегистрирован: 12 июл 2023, 12:09
Подключение Arduino к усилителю

Сообщение Oleg »

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

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

Для этой цели подойдут два резистора, соединенных в делитель напряжения.

Делитель напряжения

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

Делитель напряжения
Делитель напряжения
Например, на рисунке показан делитель напряжения, используемый для снижения напряжения 5 В от Arduino до уровня, подходящего для входа усилителя звука, около 0,5 В. Напряжение в точке соединения двух резисторов (V) вычисляется по формуле:
1.jpg
1.jpg (5.34 КБ) 752 просмотра
В данном случае, при высоком уровне сигнала (HIGH) на цифровом выходе и (Vin = 5 V), (Vout = 5 х 1/(1+10) = 0,45 V).

Макетную плату из раздела "Эксперимент: громкоговоритель без усилителя на Arduino" можно использовать для подключения к усилителю. Расположите один резистор над другим, как показано на рисунке ниже, и подсоедините верхний резистор с номиналом 10 кОм к выводу D11, а нижний - к заземлению. Затем останется только выбрать способ подключения контактного провода к линии GND и линии, на которой соединяются оба резистора, к усилителю.
Схема подключения Arduino ко входу усилителя звукового сигнала в сборе
Схема подключения Arduino ко входу усилителя звукового сигнала в сборе
Для этого можно использовать входной кабель усилителя, укоротив его наполовину и обнажив провода на концах, чтобы их можно было вставить в гнезда макетной платы. Обычно такой кабель имеет три провода, так как большинство звуковых систем предназначены для работы с стереосигналом. То есть в нем есть общий провод (GND) и два отдельных провода для левого и правого звуковых каналов (обычно они имеют изоляцию красного и белого цветов).

Вам нужно найти только общий (GND) провод, так как провода для левого и правого каналов лучше объединить, чтобы монофонический сигнал от Arduino был слышен в обоих колонках. Общий (GND) провод можно найти с помощью мультиметра, установленного в режим проверки наличия контакта (см. рисунок ниже).
Тестирование входного кабеля звукового сигнала
Тестирование входного кабеля звукового сигнала
Прикрепите один из проводов мультиметра к самому дальнему контакту на конце штекера звукового кабеля. Затем последовательно прикоснитесь другим проводом мультиметра к каждому из трех проводов кабеля, пока не услышите звуковой сигнал мультиметра или не обнаружите признаки наличия контакта. Это будет общий провод, который следует вставить в гнездо контактной линии GND макетной платы. Два других провода следует соединить и вставить в гнездо контактной линии материнской платы, которая является выходом, то есть линией, на которой соединяются оба резистора.

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

Ответить