Тоновый генератор на Arduino Uno

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

Внешний вид тонового генератора на Arduino Uno

Тон может быть увеличен до 20 раз. Это обеспечивает наилучшее изменение тона и значительно более «мягкие» его изменения. Интенсивность тона будет изменяться с помощью ШИМ (широтно-импульсная модуляция). Более подробно об использовании ШИМ в Arduino Uno можно прочитать в следующей статье. Пример ШИМ с различными коэффициентами заполнения приведен на следующем рисунке.

Примеры ШИМ

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

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

Необходимые компоненты

Плата Arduino Uno
Источник питания с напряжением 5 В
Конденсатор 1000 мкФ
Конденсатор 100 нФ
Буззер (звонок)
Кнопка 8 шт.
Резистор 220 Ом

Работа схемы

Схема устройства представлена на следующем рисунке.

Схема тонового генератора на Arduino UnoКнопки подключены к цифровым контактам платы Arduino Uno. Звонок через резистор подключен к контакту 9. Для фильтрации шума от источника питания в схему включены два конденсатора.

Исходный код программы

Контакты платы Arduino Uno, на которых возможно формирование ШИМ сигнала, обозначены символом “~”. Всего таких каналов на плате Arduino Uno шесть. К контактам 0-7 подключены кнопки, поэтому мы не можем использовать их для формирования ШИМ сигнала.

Мы подключили кнопки к контактам 0-7, эти контакты представляют собой целиком PORTD микроконтроллера платы Arduino Uno. Поэтому далее в программе для удобства считывания значений с этих контактов мы можем считывать полный байт с PORTD.

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

Коэффициент заполнения ШИМ (VALUE) может изменяться в диапазоне от 0 до 255. 0 соответствует самому низшему значению, а 255 – самому высшему. При VALUE=255 в результате приведенной команды мы получим 5В на контакте PIN9. Если VALUE=125, то на PIN3 мы получим среднее значение напряжения равное 2,5 В. Мы будем распределять коэффициент заполнения в диапазоне 0-250 среди 8 кнопок, подключенных к PORTD платы Arduino Uno. В данном примере для каждой кнопки использован инкремент в 25 единиц (для коэффициента заполнения ШИМ), но вы можете выбрать этот инкремент сами (какой захотите).

Далее приведен полный текст программы с пояснениями.

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/255), который подается на звонок

delay(100);
analogWrite(9,0);
}
if (digitalRead(1)==LOW)
{
analogWrite(9,50); // если кнопка 2 нажата, то формируется ШИМ сигнал с коэффициентом заполнения (50/255), который подается на звонок

delay(100);
analogWrite(9,0);
}
if (digitalRead(2)==LOW)
{
analogWrite(9,75); // если кнопка 3 нажата, то формируется ШИМ сигнал с коэффициентом заполнения (75/255), который подается на звонок

delay(100);
analogWrite(9,0);
}
if (digitalRead(3)==LOW)
{
analogWrite(9,100); // если кнопка 4 нажата, то формируется ШИМ сигнал с коэффициентом заполнения (100/255), который подается на звонок

delay(100);
analogWrite(9,0);
}
if (digitalRead(4)==LOW)
{
analogWrite(9,125); // ШИМ сигнал с коэффициентом заполнения (125/255)
delay(100);
analogWrite(9,0);
}
if (digitalRead(5)==LOW)
{
analogWrite(9,150); // ШИМ сигнал с коэффициентом заполнения (150/255)
delay(100);
analogWrite(9,0);
}
if (digitalRead(6)==LOW)
{
analogWrite(9,175); // ШИМ сигнал с коэффициентом заполнения (175/255)
delay(100);
analogWrite(9,0);
}
if (digitalRead(7)==LOW)
{
analogWrite(9,200); // ШИМ сигнал с коэффициентом заполнения (200/255)
delay(100);
analogWrite(9,0);
}
}

Видео, демонстрирующее работу схемы

(1 голосов, оценка: 5,00 из 5)
Загрузка...
60 просмотров


Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *