Рубрики
Схемы на Arduino

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

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

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

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

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

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

  1. Плата Arduino Uno (купить на AliExpress).
  2. Зуммер (звонок) (купить на AliExpress).
  3. Конденсатор 1000 мкФ (купить на AliExpress).
  4. Конденсатор 100 нФ (купить на AliExpress).
  5. Резистор 220 Ом (купить на AliExpress).
  6. Кнопка 8 шт.
  7. Источник питания с напряжением 5 В.

Работа схемы

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

Кнопки подключены к цифровым контактам платы 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);
}
}

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

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

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