Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия |
конспект-arduino:мерзкое-пианино [2013/10/11 15:31] – [Список деталей для эксперимента] perepelkin | конспект-arduino:мерзкое-пианино [2022/01/25 16:31] (текущий) – [Список деталей для эксперимента] mik |
---|
====== Эксперимент 8. Мерзкое пианино ====== | ====== Эксперимент 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|«папа-папа»]] |
| |
===== Принципиальная схема ===== | ===== Принципиальная схема ===== |
| |
{{ :конспект-arduino:}} | {{ :конспект-arduino:8_dumb_piano_scheme.svg.png?nolink& |}} |
| |
===== Схема на макетке ===== | ===== Схема на макетке ===== |
| |
{{ :конспект-arduino:}} | {{ :конспект-arduino:8_dumb_piano_bread.svg.png?nolink& |}} |
| |
===== Обратите внимание ===== | ===== Обратите внимание ===== |
| |
* Ножки тактовой кнопки, расположенные с одной стороны, разомкнуты, когда кнопка не нажата. Ножки, расположенные друг напротив друга на противоположных сторонах кнопки, — одна «рельса». Воспользовавшись этим, мы можем расположить резистор с одной стороны макетки, а провод, подключаемый к порту Arduino, с другой стороны. | * Ножки тактовой кнопки, расположенные с одной стороны, разомкнуты, когда кнопка не нажата. Ножки, расположенные друг напротив друга на противоположных сторонах макетки находятся на одной «рельсе». Воспользовавшись этим, мы можем расположить резистор с одной стороны макетки, а провод, подключаемый к порту Arduino, с другой стороны. |
* В данном эксперименте мы подключаем кнопки по [[кнопка|схеме]] с подтягивающим резистором. | * В данном эксперименте мы подключаем кнопки по [[кнопка|схеме]] с подтягивающим резистором. |
* Для того, чтобы данный вариант программы работал, важно, чтобы кнопки были подключены к портам, находящимся рядом друг с другом (имеющим соседние номера). | * Для того, чтобы данный вариант программы работал, важно, чтобы кнопки были подключены к портам, находящимся рядом друг с другом, т.е. имеющим соседние номера. |
| |
===== Скетч ===== | ===== Скетч ===== |
===== Пояснения к коду ===== | ===== Пояснения к коду ===== |
| |
* Благодаря тому, что в начале программы мы определили ''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'', выполняются, когда его условие имеет значение «истина» (единица). Поэтому для выполнения действия по нажатию, мы инвертируем сигнал с кнопки. |
===== Вопросы для проверки себя ===== | ===== Вопросы для проверки себя ===== |
| |