В этом эксперименте мы создаем маленькую клавиатуру, на которой можно сыграть несколько нот. Прочтите перед выполнением: 
  
 
СПИСОК ДЕТАЛЕЙ ДЛЯ ЭКСПЕРИМЕНТА
  
-   1 плата Arduino Uno;
-   1 беспаечная макетная плата;
-   1 пьезопищалка;
-   3 тактовых кнопки;
-   3 резистора номиналом 10 кОм;
-   10 проводов «папа-папа».
 
ДЕТАЛИ ДЛЯ ДОПОЛНИТЕЛЬНОГО ЗАДАНИЯ
  
-   еще 2 кнопки; 
-   еще 2 резистора номиналом 10 кОм; 
-   еще 2 провода. 
 
ПРИНЦИПИАЛЬНАЯ СХЕМА
  
  
  
СХЕМА НА МАКЕТНОЙ ПЛАТЕ
  
  
  
ОБРАТИТЕ ВНИМАНИЕ
 - Ножки тактовой кнопки, расположенные с одной стороны, разомкнуты, когда кнопка не нажата. Ножки, расположенные друг напротив друга на противоположных сторонах макетки находятся на одной «рельсе». Воспользовавшись этим, мы можем расположить резистор с одной стороны макетки, а провод, подключаемый к порту Arduino, с другой стороны.
 
 - В данном эксперименте мы подключаем кнопки по схеме с подтягивающим резистором.
 
 - Для того, чтобы данный вариант программы работал, важно, чтобы кнопки были подключены к портам, находящимся рядом друг с другом, т.е. имеющим соседние номера.
 
 
 
СКЕТЧ
скачать скетч для Arduino IDE 
#define BUZZER_PIN 13 // пин с пищалкой (англ. «buzzer»)
#define FIRST_KEY_PIN 7 // первый пин с клавишей (англ. «key»)
#define KEY_COUNT 3 // общее количество клавиш
 
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);
 }
 }
}
 
 
ПОЯСНЕНИЯ К КОДУ
 - Благодаря тому, что в начале программы мы определили 
FIRST_KEY_PIN и KEY_COUNT, мы можем подключать произвольное количество кнопок к любым идущим друг за другом цифровым пинам, и для корректировки программы нам не придется менять параметры цикла for. Изменить понадобится лишь эти константы:
 
 - цикл в любом случае пробегает от 0 до 
KEY_COUNT; 
 - перед считыванием порта мы задаем смещение на номер первого используемого порта —
FIRST_KEY_PIN. 
  
  
 - Функция 
digitalRead(pin) возвращает состояние порта, номер которого передан ей параметром pin. Это может быть состояние HIGH или LOW. Или, выражаясь иначе: высокое напряжение или низкое, 1 или 0, true или false; 
 - Поскольку мы получаем с порта одно из двух состояний, мы сохраняем его в переменную уже знакомого нам типа 
boolean, и можем работать с ней как с логическим значением. 
 - Мы используем логический оператор отрицания «не» 
!. Если keyUp имеет значение 0, выражение !keyUp будет иметь значение 1 и наоборот. 
 - Поскольку мы собрали схему с подтягивающим резистором, при нажатии кнопки мы будем получать на соответствующем порте 0.
 
 - Действия, описанные в условном выражении 
if, выполняются, когда его условие имеет значение «истина» (единица). Поэтому для выполнения действия по нажатию, мы инвертируем сигнал с кнопки. 
 
 
ВОПРОСЫ ДЛЯ ПРОВЕРКИ СЕБЯ
 - Почему мы не настраивали порты, к которым подключены кнопки, как 
INPUT, но устройство работает? 
 - Каким образом мы избежали написания отдельного когда для чтения каждой кнопки?
 
 - Почему разные «ноты», издаваемые пищалкой, звучат с разной громкостью?
 
 - Для чего мы использовали оператор логического отрицания 
!? 
 
 
ЗАДАНИЯ ДЛЯ САМОСТОЯТЕЛЬНОГО РЕШЕНИЯ
 - Сделайте так, чтобы наше пианино звучало в диапазоне от 2 кГц до 5 кГц.
 
 - Добавьте еще 2 кнопки и измените программу так, чтобы можно было извлечь 5 различных нот.
 
 - Подключите кнопки по схеме со стягивающим резистором и измените программу так, чтобы она продолжала работать.
 
 
 
С оригиналом статьи вы можете ознакомиться на сайте Amperka.ru 
 
ЭКСПЕРИМЕНТ 7 | ОГЛАВЛЕНИЕ | ЭКСПЕРИМЕНТ 9   |