Инструменты пользователя

Инструменты сайта


Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Следующая версия
Предыдущая версия
конспект-arduino:мерзкое-пианино [2013/10/08 14:02] – создано perepelkinконспект-arduino:мерзкое-пианино [2022/01/25 16:31] (текущий) – [Список деталей для эксперимента] mik
Строка 1: Строка 1:
-====== Эксперимент №7. Мерзкое пианино  ====== +====== Эксперимент 8. Мерзкое пианино  ====== 
-[[бегущий-огонек|← Бегущий огонёк]] | [[конспект-arduino:оглавление|Оглавление]] | [[миксер|Миксер →]] +[[бегущий-огонек|← Бегущий огонёк]] | [[конспект-arduino:|Оглавление]] | [[миксер|Миксер →]] 
----- + 
-В этом эксперименте мы создаем маленькую клавиатуру на которой можно сыграть несколько нот.+В этом эксперименте мы создаем маленькую клавиатуруна которой можно сыграть несколько нот.
 ===== Прочтите перед выполнением ===== ===== Прочтите перед выполнением =====
  
-[[кнопка|Кнопка]]+  * [[кнопка|Кнопка]]
  
 ===== Список деталей для эксперимента ===== ===== Список деталей для эксперимента =====
  
-  * 1 [[amp>product/arduino-uno|Arduino Uno]] +  * 1 плата [[amp>product/arduino-uno|Arduino Uno]] 
-  * 1 [[amp>collection/proto|макетная плата]]+  * 1 беспаечная [[amp>collection/breadboards|макетная плата]]
   * 1 [[amp>product/piezo-buzzer|пьезопищалка]]   * 1 [[amp>product/piezo-buzzer|пьезопищалка]]
   * 3 тактовых [[amp>product/tactile-button|кнопки]]   * 3 тактовых [[amp>product/tactile-button|кнопки]]
-  * 3 [[amp>product/resistor|резистора]] номиналом 10 кОм+  * 3 [[amp>product/resistor-10k|резистора]] номиналом 10 кОм
   * 10 проводов [[amp>product/wire-mm|«папа-папа»]]   * 10 проводов [[amp>product/wire-mm|«папа-папа»]]
  
Строка 24: Строка 24:
 ===== Принципиальная схема ===== ===== Принципиальная схема =====
  
-{{ :конспект-arduino:}}+{{ :конспект-arduino:8_dumb_piano_scheme.svg.png?nolink& |}}
  
 ===== Схема на макетке ===== ===== Схема на макетке =====
  
-{{ :конспект-arduino:}}+{{ :конспект-arduino:8_dumb_piano_bread.svg.png?nolink& |}}
  
 ===== Обратите внимание ===== ===== Обратите внимание =====
  
-  * Ножки тактовой кнопки, расположенные с одной стороны разомкнуты, когда кнопка не нажата. Ножки, расположенные друг напротив друга на противоположных сторонах кнопки,  — одна «рельса». Воспользовавшись этим, мы можем расположить резистор с одной стороны макетки, а провод, подключаемый к порту Arduino, с другой стороны.+  * Ножки тактовой кнопки, расположенные с одной стороныразомкнуты, когда кнопка не нажата. Ножки, расположенные друг напротив друга на противоположных сторонах макетки находятся на одной «рельсе». Воспользовавшись этим, мы можем расположить резистор с одной стороны макетки, а провод, подключаемый к порту Arduino, с другой стороны.
   * В данном эксперименте мы подключаем кнопки по [[кнопка|схеме]] с подтягивающим резистором.   * В данном эксперименте мы подключаем кнопки по [[кнопка|схеме]] с подтягивающим резистором.
-  * Для того, чтобы данный вариант программы работал, важно, чтобы кнопки были подключены к портам, находящимся рядом друг с другом (имеющим соседние номера).+  * Для того, чтобы данный вариант программы работал, важно, чтобы кнопки были подключены к портам, находящимся рядом друг с другом, т.е. имеющим соседние номера.
  
 ===== Скетч ===== ===== Скетч =====
  
-<code cpp >+<code cpp p080_dumb_piano.ino> 
 +#define BUZZER_PIN    13 // пин с пищалкой (англ. «buzzer») 
 +#define FIRST_KEY_PIN 7  // первый пин с клавишей (англ. «key») 
 +#define KEY_COUNT      // общее количество клавиш
  
-</code>+void setup() 
 +
 +  pinMode(BUZZER_PIN, OUTPUT); 
 +}
  
 +void loop()
 +{
 +  // в цикле бежим по всем номерам кнопок от 0-го по 2-й
 +  for (int i = 0; i < KEY_COUNT; ++i) {
 +    // на основе номера кнопки вычисляем номер её пина
 +    int keyPin = i + FIRST_KEY_PIN;
 +
 +    // считываем значение с кнопки. Возможны всего 2 варианта:
 +    //  * высокий сигнал, 5 вольт, истина — кнопка отпущена
 +    //  * низкий сигнал, земля, ложь — кнопка зажата
 +    boolean keyUp = digitalRead(keyPin);
 +    
 +    // проверяем условие «если не кнопка отпущена». Знак «!»
 +    // перед булевой переменной означает отрицание, т.е. «не».
 +    if (!keyUp) {
 +      // рассчитываем высоту ноты в герцах в зависимости от
 +      // клавиши, которую рассматриваем на данном этапе цикла.
 +      // Мы получим значение 3500, 4000 или 4500
 +      int frequency = 3500 + i * 500;
 +
 +      // Заставляем пищалку пищать с нужной частотой в течение
 +      // 20 миллисекунд. Если клавиша останется зажатой, пищалка
 +      // вновь зазвучит при следующем проходе loop, а мы услышим
 +      // непрерывный звук
 +      tone(BUZZER_PIN, frequency, 20);
 +    }
 +  }
 +}
 +</code>
 ===== Пояснения к коду ===== ===== Пояснения к коду =====
  
-  * Благодаря тому, что в начале программы мы определили ''FIRST_KEY_PIN'' и ''KEY_COUNT'', мы можем подключать произвольное количество кнопок к любым идущим друг за другом цифровым пинам, и для корректировки программы нам не придется менять параметры цикла ''for''но только изменить эти константы:+  * Благодаря тому, что в начале программы мы определили ''FIRST_KEY_PIN'' и ''KEY_COUNT'', мы можем подключать произвольное количество кнопок к любым идущим друг за другом цифровым пинам, и для корректировки программы нам не придется менять параметры цикла ''for''. Изменить понадобится лишь эти константы:
     * цикл в любом случае пробегает от 0 до ''KEY_COUNT'';     * цикл в любом случае пробегает от 0 до ''KEY_COUNT'';
     * перед считыванием порта мы задаем смещение на номер первого используемого порта — ''FIRST_KEY_PIN''.     * перед считыванием порта мы задаем смещение на номер первого используемого порта — ''FIRST_KEY_PIN''.
-  * Функция ''digitalRead(pin)'' возвращает состояние порта, номер которого передан ей параметром ''pin''. Это может быть состояние HIGH или LOW (высокое напряжение или низкое, 1 или 0, true или false).+  * Функция ''digitalRead(pin)'' возвращает состояние порта, номер которого передан ей параметром ''pin''. Это может быть состояние ''HIGH'' или ''LOW''. Или, выражаясь иначе: высокое напряжение или низкое, 1 или 0, ''true'' или ''false''
   * Поскольку мы получаем с порта одно из двух состояний, мы сохраняем его в переменную уже знакомого нам типа ''boolean'', и можем работать с ней как с логическим значением.   * Поскольку мы получаем с порта одно из двух состояний, мы сохраняем его в переменную уже знакомого нам типа ''boolean'', и можем работать с ней как с логическим значением.
-  * Мы используем логический оператор отрицания ''!'', «не». Если ''keyUp'' имеет значение 0, выражение ''**!**keyUp'' будет иметь значение 1 и наоборот. +  * Мы используем логический оператор отрицания «не» ''!''. Если ''keyUp'' имеет значение 0, выражение ''**!**keyUp'' будет иметь значение 1 и наоборот. 
-  * Поскольку мы собрали схему с подтягивающим резистором, при нажатии кнопки мы будем получать на соответствующем порте 0. Как мы знаем, действия, описанные в условном операторе ''if'' выполняются, когда его условие имеет значение «истина», 1, поэтому нужное нам действие будет выполняться при инвертированном значении состояния порта +  * Поскольку мы собрали схему с подтягивающим резистором, при нажатии кнопки мы будем получать на соответствующем порте 0. 
 +  * Действия, описанные в условном выражении ''if''выполняются, когда его условие имеет значение «истина» (единица). Поэтому для выполнения действия по нажатию, мы инвертируем сигнал с кнопки.
 ===== Вопросы для проверки себя ===== ===== Вопросы для проверки себя =====
  
Строка 66: Строка 101:
  
 ---- ----
-[[бегущий-огонек|← Бегущий огонёк]] | [[конспект-arduino:оглавление|Оглавление]] | [[миксер|Миксер →]]+[[бегущий-огонек|← Бегущий огонёк]] | [[конспект-arduino:|Оглавление]] | [[миксер|Миксер →]]