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

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

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


Cat poo.png Черновик


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

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

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

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

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

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

Код

#include <TimerOne.h>                                           // Подключаем библиотеку TimerOne для работы с прерываниями по таймеру 

#define BUTTON_INT 0                                            // Прерывание 0 (2-ой цифровой контакт на Arduino Uno)
#define SPEAKER    12                                           // Динамик подключаем к 12-му контакту

// Частоты для нот
#define NOTE_C 65
#define NOTE_D 73
#define NOTE_E 82
#define NOTE_F 87
#define NOTE_G 98
#define NOTE_A 110
#define NOTE_B 123

// Переменную с модификатором volatile  можно изменять внутри функции-обработчика прерывания
volatile int key = NOTE_C;                                      // Текущая нота
volatile int octave_multiplier = 1;                             // Множитель октавы

void setup()
{
  Serial.begin(9600);                                           // Инициализация последовательного соединения
  pinMode (SPEAKER, OUTPUT);
  attachInterrupt(BUTTON_INT, changeKey, RISING);               // Инициализация аппаратного прерывания
                                                                // BUTTON_INT: прерывание 0 (2-ой цифровой контакт на Arduino Uno)
                                                                // changeKey : функция-обработчик прерывания 
                                                                // RISING    : прерывание срабатывает, когда контакт переключается из LOW в HIGH
                                                                // Примечание: заметьте, мы используем RISING(из LOW в HIGH) потому-что мы применяем
                                                                // инвертирующий триггер Шмитта SN74LS14N
 
  Timer1.initialize(500000);                                    // Прерывание по таймеру будет срабатывать каждые 500000 мкс = 0,5 сек.
  Timer1.attachInterrupt(changePitch);                          // Указываем функцию changePitch() как обработчик прерывания по таймеру
}

// Функция обработчик аппаратного прерывания
void changeKey()
{
  octave_multiplier = 1;
  if (key == NOTE_C)
    key = NOTE_D;
  else if (key == NOTE_D)
    key = NOTE_E;
  else if (key == NOTE_E)
    key = NOTE_F;
  else if (key == NOTE_F)
    key = NOTE_G;
  else if (key == NOTE_G)
    key = NOTE_A;
  else if (key == NOTE_A)
    key = NOTE_B;
  else if (key == NOTE_B)
    key = NOTE_C;
}

// Функция обработчик прерывания по таймеру
void changePitch()
{
  octave_multiplier = octave_multiplier * 2;
  if (octave_multiplier > 16) octave_multiplier = 1;
  tone(SPEAKER,key*octave_multiplier);
}

void loop()
{
  Serial.print("Нота: ");
  Serial.print(key);
  Serial.print(" Коэффициент: ");
  Serial.print(octave_multiplier);
  Serial.print(" Частота: ");
  Serial.println(key * octave_multiplier);
  delay(100);
}

См.также

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