цифровая электроника
вычислительная техника
встраиваемые системы

 

Генератор звуковых тонов на Arduino своими руками

Автор: Mike(admin) от 25-12-2018, 11:05

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


Генератор звуковых тонов на Arduino своими руками

Интенсивность тона изменяется с помощью ШИМ (широтно-импульсная модуляция). Пример ШИМ показан на графике ниже.


ШИМ

В ШИМ частота сигнала или период времени сигнала (Ton + Toff) всегда постоянны. Изменяется только соотношение времени включенного состояния и выключенного состояния. Например, на втором графике на рисунке выше время включения составляет 80%, а время выключения составляет 20% от полной продолжительности. На третьем графике время включения составляет 50%, и время выключения составляет 50% от полной продолжительности. Можно сказать, что во втором графике коэффициент заполнения составляет 80%, а в четвертом – коэффициент заполнения 20%. С этим изменением коэффициента заполнения мы имеем изменение среднеквадратичного значения напряжения (Vrms), когда это напряжение подается на зуммер, он издает шум, который меняется при изменении коэффициента заполнения.


Мы собираемся запрограммировать UNO для обеспечения сигнала ШИМ с различным коэффициентом заполнения для каждой из кнопок. Таким образом, у нас есть будет генератор тона, который генерирует разный звуковой тон при каждом нажатии кнопки. Схема подключения компонентов генератора тонов на основе Arduino показана ниже.


Генератор звуковых тонов на Arduino своими руками

Для отфильтровывания шума напряжения питания на клеммах размещаются конденсаторы, как показано на рисунке. ШИМ в Arduino Uno может быть доступен на любом из выводов, обозначенных на плате как «~».В Arduino Uno шесть каналов ШИМ. Однако сейчас мы не можем использовать выводы ШИМ, установленные на выводах 0-7, так как они предпочтительнее для подключения кнопок. Существует причина для выбора выводов 0-7 в качестве источников приема входных данных, поскольку выводы 0-7 представляют собой PORTD микроконтроллера. Таким образом, в последнем случае мы можем взять полный байт PORTD.


Теперь для получения другого коэффициента заполнения ШИМ, мы будем использовать следующую команду: analogWrite(9,VALUE). Из этого условия мы можем напрямую получить сигнал ШИМ на соответствующем выводе. Первый параметр в скобках предназначен для выбора номера вывода сигнала ШИМ. Второй параметр предназначен для записи коэффициента заполнения.


Значение ШИМ для Arduino Uno можно изменять от 0 до 255. Значение «0» - самое низкое, а «255» - самое высокое. С коэффициентом заполнения 255 мы получим 5V на выводе 9. Если коэффициент заполнения равен 125, мы получим 2,5 В. Мы собираемся разделить коэффициент заполнения 0-250 между 8 кнопками, подключенными к порту D. Здесь мы примем 25 приращений для каждой кнопки, но вы можете взять другое значение. В итоге у нас будет сигнал ШИМ, коэффициент заполнения которого меняется с каждой кнопкой. Подведя сигнал ШИМ к зуммеру, мы получим генератор тона. Код программы тонального генератора на основе Arduino приводится далее.



void setup()

{

                for (int i=0;i<8;i++)

                {

                pinMode(i, INPUT_PULLUP); // линии от 0 до 7 в качестве входов с подтягиванием к питанию.

                }

                pinMode(9,OUTPUT); // зуммер будет подключен к выводу 9

}

 

// бесконечный цикл

void loop()

{

                if (digitalRead(0)==LOW)

                {

                                analogWrite(9,25); // если кнопка 1 нажата, значение ШИМ (25 * 100) / 255 подается на зуммер

                                delay(100);

                                analogWrite(9,0);

                }

                if (digitalRead(1)==LOW)

                {

                                analogWrite(9,50); // если кнопка 2 нажата, значение ШИМ (50 * 100) / 255 подается на зуммер
 

                                delay(100);

                                analogWrite(9,0);

                }

                if (digitalRead(2)==LOW)

                {

                                analogWrite(9,75); // если кнопка 3 нажата, значение ШИМ (75 * 100) / 255 подается на зуммер

 

                                delay(100);

                                analogWrite(9,0);

                }

                if (digitalRead(3)==LOW)

                {

                                analogWrite(9,100); // если кнопка 4 нажата, значение ШИМ (100 * 100) / 255 подается на зуммер

 

                                delay(100);

                                analogWrite(9,0);

                }

                if (digitalRead(4)==LOW)

                {

                                analogWrite(9,125);

                                delay(100);

                                analogWrite(9,0);

                }

                if (digitalRead(5)==LOW)

                {

                                analogWrite(9,150);

                                delay(100);

                                analogWrite(9,0);

                }

                if (digitalRead(6)==LOW)

                {

                                analogWrite(9,175);

                                delay(100);

                                analogWrite(9,0);

                }

                if (digitalRead(7)==LOW)

                {

                                analogWrite(9,200);

                                delay(100);

                                analogWrite(9,0);

                }

}



© digitrode.ru


Теги: Arduino



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


Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Комментарии:

Оставить комментарий