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

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

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


Pixel Art Mini Meow Animated.gif Черновик


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

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

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

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

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

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 }

См.также

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