Это старая версия документа!
Эксперимент №7. Мерзкое пианино
← Бегущий огонёк | Оглавление | Миксер →
В этом эксперименте мы создаем маленькую клавиатуру на которой можно сыграть несколько нот.
Прочтите перед выполнением
Список деталей для эксперимента
- 3 тактовых кнопки
- 3 резистора номиналом 10 кОм
- 10 проводов «папа-папа»
Для дополнительного задания
- еще 2 кнопки
- еще 2 резистора номиналом 10 кОм
- еще 2 провода
Принципиальная схема
Схема на макетке
Обратите внимание
- Ножки тактовой кнопки, расположенные с одной стороны разомкнуты, когда кнопка не нажата. Ножки, расположенные друг напротив друга на противоположных сторонах кнопки, — одна «рельса». Воспользовавшись этим, мы можем расположить резистор с одной стороны макетки, а провод, подключаемый к порту Arduino, с другой стороны.
- В данном эксперименте мы подключаем кнопки по схеме с подтягивающим резистором.
- Для того, чтобы данный вариант программы работал, важно, чтобы кнопки были подключены к портам, находящимся рядом друг с другом (имеющим соседние номера).
Скетч
Пояснения к коду
- Благодаря тому, что в начале программы мы определили
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
выполняются, когда его условие имеет значение «истина», 1, поэтому нужное нам действие будет выполняться при инвертированном значении состояния порта.
Вопросы для проверки себя
- Почему мы не настраивали порты, к которым подключены кнопки, как
INPUT
, но устройство работает? - Каким образом мы избежали написания отдельного когда для чтения каждой кнопки?
- Почему разные «ноты», издаваемые пищалкой, звучат с разной громкостью?
- Для чего мы использовали оператор логического отрицания
!
?
Задания для самостоятельного решения
- Сделайте так, чтобы наше пианино звучало в диапазоне от 2 кГц до 5 кГц.
- Добавьте еще 2 кнопки и измените программу так, чтобы можно было извлечь 5 различных нот.
- Подключите кнопки по схеме со стягивающим резистором и измените программу так, чтобы она продолжала работать.