Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты указаны здесь.

Arduino:Примеры/Музыкальный инструмент с помощью прерывания по таймеру и аппаратного прерывания

Материал из Онлайн справочника
Перейти к: навигация, поиск

Проверка/Оформление/Редактирование: Мякишев Е.А.


Ambox content.png Черновик


Музыкальный инструмент с помощью прерывания по таймеру и аппаратного прерывания

Данный пример демонстрирует создание простейшего музыкального инструмента с использованием аппаратного прерывания и прерывания по таймеру. Здесь применена схема аппаратного антидребезга контакта кнопки.

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

Монтажная схема

Соберите схему согласно монтажной схеме.

Arduino uno SN74LS14N speaker timer interrupt 1.png
Схема аппаратного антидребезга контакта кнопки и подключение к Arduino
Распиновка SN74LS14N
Цоколевка SN74LS14N

Код

  1. #include <TimerOne.h>                                           // Подключаем библиотеку TimerOne для работы с прерываниями по таймеру
  2.  
  3. #define BUTTON_INT 0                                            // Прерывание 0 (2-ой цифровой контакт на Arduino Uno)
  4. #define SPEAKER    12                                           // Динамик подключаем к 12-му контакту
  5.  
  6. // Частоты для нот
  7. #define NOTE_C 65
  8. #define NOTE_D 73
  9. #define NOTE_E 82
  10. #define NOTE_F 87
  11. #define NOTE_G 98
  12. #define NOTE_A 110
  13. #define NOTE_B 123
  14.  
  15. // Переменную с модификатором volatile  можно изменять внутри функции-обработчика прерывания
  16. volatile int key = NOTE_C;                                      // Текущая нота
  17. volatile int octave_multiplier = 1;                             // Множитель октавы
  18.  
  19. void setup()
  20. {
  21.   Serial.begin(9600);                                           // Инициализация последовательного соединения
  22.   pinMode (SPEAKER, OUTPUT);
  23.   attachInterrupt(BUTTON_INT, changeKey, RISING);               // Инициализация аппаратного прерывания
  24.                                                                 // BUTTON_INT: прерывание 0 (2-ой цифровой контакт на Arduino Uno)
  25.                                                                 // changeKey : функция-обработчик прерывания
  26.                                                                 // RISING    : прерывание срабатывает, когда контакт переключается из LOW в HIGH
  27.                                                                 // Примечание: заметьте, мы используем RISING(из LOW в HIGH) потому-что мы применяем
  28.                                                                 // инвертирующий триггер Шмитта SN74LS14N
  29.  
  30.   Timer1.initialize(500000);                                    // Прерывание по таймеру будет срабатывать каждые 500000 мкс = 0,5 сек.
  31.   Timer1.attachInterrupt(changePitch);                          // Указываем функцию changePitch() как обработчик прерывания по таймеру
  32. }
  33.  
  34. // Функция обработчик аппаратного прерывания
  35. void changeKey()
  36. {
  37.   octave_multiplier = 1;
  38.   if (key == NOTE_C)
  39.     key = NOTE_D;
  40.   else if (key == NOTE_D)
  41.     key = NOTE_E;
  42.   else if (key == NOTE_E)
  43.     key = NOTE_F;
  44.   else if (key == NOTE_F)
  45.     key = NOTE_G;
  46.   else if (key == NOTE_G)
  47.     key = NOTE_A;
  48.   else if (key == NOTE_A)
  49.     key = NOTE_B;
  50.   else if (key == NOTE_B)
  51.     key = NOTE_C;
  52. }
  53.  
  54. // Функция обработчик прерывания по таймеру
  55. void changePitch()
  56. {
  57.   octave_multiplier = octave_multiplier * 2;
  58.   if (octave_multiplier > 16) octave_multiplier = 1;
  59.   tone(SPEAKER,key*octave_multiplier);
  60. }
  61.  
  62. void loop()
  63. {
  64.   Serial.print("Нота: ");
  65.   Serial.print(key);
  66.   Serial.print(" Коэффициент: ");
  67.   Serial.print(octave_multiplier);
  68.   Serial.print(" Частота: ");
  69.   Serial.println(key * octave_multiplier);
  70.   delay(100);
  71. }

См.также

Внешние ссылки