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

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

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



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

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

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

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

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

Схема аппаратного антидребезга контакта кнопки и подключение к 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);
}

См.также

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