Урок 8. Мерзкое пианино


В этом эксперименте мы создаем маленькую клавиатуру, на которой можно сыграть несколько нот.

Список деталей для эксперимента

Для дополнительного задания

  • еще 2 кнопки
  • еще 2 резистора номиналом 10 кОм
  • еще 2 провода

Принципиальная схема

Схема на макетке

Обратите внимание

  • Ножки тактовой кнопки, расположенные с одной стороны, разомкнуты, когда кнопка не нажата. Ножки, расположенные друг напротив друга на противоположных сторонах макетки находятся на одной «рельсе». Воспользовавшись этим, мы можем расположить резистор с одной стороны макетки, а провод, подключаемый к порту Arduino, с другой стороны.
  • В данном эксперименте мы подключаем кнопки по схеме с подтягивающим резистором.
  • Для того, чтобы данный вариант программы работал, важно, чтобы кнопки были подключены к портам, находящимся рядом друг с другом, т.е. имеющим соседние номера.

Скетч

  1.     #define BUZZER_PIN    13 // пин с пищалкой (англ. «buzzer»)
    
  2.     #define FIRST_KEY_PIN 7  // первый пин с клавишей (англ. «key»)
    
  3.     #define KEY_COUNT     3  // общее количество клавиш
    
  4.  
  5.     void setup(
    )
    
  6.     {
    
  7.       pinMode(BUZZER_PIN, OUTPUT)
    ;
    
  8.     }
    
  9.  
  10.     void loop(
    )
    
  11.     {
    
  12.       // в цикле бежим по всем номерам кнопок от 0-го по 2-й
    
  13.       for (
    int i = 0
    ; i < KEY_COUNT; ++i) {
    
  14.         // на основе номера кнопки вычисляем номер её пина
    
  15.         int keyPin = i + FIRST_KEY_PIN;
    
  16.  
  17.         // считываем значение с кнопки. Возможны всего 2 варианта:
    
  18.         //  * высокий сигнал, 5 вольт, истина — кнопка отпущена
    
  19.         //  * низкий сигнал, земля, ложь — кнопка зажата
    
  20.         boolean keyUp = digitalRead(keyPin)
    ;
    
  21.  
  22.         // проверяем условие «если не кнопка отпущена». Знак «!»
    
  23.         // перед булевой переменной означает отрицание, т.е. «не».
    
  24.         if (
    !keyUp) {
    
  25.           // рассчитываем высоту ноты в герцах в зависимости от
    
  26.           // клавиши, которую рассматриваем на данном этапе цикла.
    
  27.           // Мы получим значение 3500, 4000 или 4500
    
  28.           int frequency = 3500 + i * 500
    ;
    
  29.  
  30.           // Заставляем пищалку пищать с нужной частотой в течение
    
  31.           // 20 миллисекунд. Если клавиша останется зажатой, пищалка
    
  32.           // вновь зазвучит при следующем проходе loop, а мы услышим
    
  33.           // непрерывный звук
    
  34.           tone(BUZZER_PIN, frequency, 20
    )
    ;
    
  35.         }
    
  36.       }
    
  37.     }
    

Пояснения к коду

  • Благодаря тому, что в начале программы мы определили FIRST_KEY_PIN и KEY_COUNT, мы можем подключать произвольное количество кнопок к любым идущим друг за другом цифровым пинам, и для корректировки программы нам не придется менять параметры цикла for. Изменить понадобится лишь эти константы:
  1. цикл в любом случае пробегает от 0 до KEY_COUNT;
  2. перед считыванием порта мы задаем смещение на номер первого используемого порта — FIRST_KEY_PIN.
  • Функция digitalRead(pin) возвращает состояние порта, номер которого передан ей параметром pin. Это может быть состояние HIGH или LOW. Или, выражаясь иначе: высокое напряжение или низкое, 1 или 0, true или false
  • Поскольку мы получаем с порта одно из двух состояний, мы сохраняем его в переменную уже знакомого нам типа boolean, и можем работать с ней как с логическим значением.
  • Мы используем логический оператор отрицания «не» !. Если keyUp имеет значение 0, выражение !keyUp будет иметь значение 1 и наоборот.
  • Поскольку мы собрали схему с подтягивающим резистором, при нажатии кнопки мы будем получать на соответствующем порте 0.
  • Действия, описанные в условном выражении if, выполняются, когда его условие имеет значение «истина» (единица). Поэтому для выполнения действия по нажатию, мы инвертируем сигнал с кнопки.

Вопросы для проверки себя

  • Почему мы не настраивали порты, к которым подключены кнопки, как INPUT, но устройство работает?
  • Каким образом мы избежали написания отдельного когда для чтения каждой кнопки?
  • Почему разные «ноты», издаваемые пищалкой, звучат с разной громкостью?
  • Для чего мы использовали оператор логического отрицания !?

Задания для самостоятельного решения

  • Сделайте так, чтобы наше пианино звучало в диапазоне от 2 кГц до 5 кГц.
  • Добавьте еще 2 кнопки и измените программу так, чтобы можно было извлечь 5 различных нот.
  • Подключите кнопки по схеме со стягивающим резистором и измените программу так, чтобы она продолжала работать.
Теги: 
Источник: 

wiki.amperka.ru