Почему разные «ноты», издаваемые пищалкой, звучат с разной громкостью?
Чем выше частота ноты, тем громче она звучит.
4.Для чего мы использовали оператор логического отрицания !?
Поскольку мы собрали схему с подтягивающим резистором, при нажатии кнопки мы будем получать на соответствующем порте 0. Мы используем логический оператор отрицания «не» !. Если keyUp имеет значение 0, выражение !keyUp будет иметь значение 1 и наоборот.
Задания для самостоятельного решения
Сделайте так, чтобы наше пианино звучало в диапазоне от 2 кГц до 5 кГц.
Листинг:
1. #define BUZZER_PIN 13
2. #define FIRST_KEY_PIN 7
3. #define KEY_COUNT 3
4. void setup() {
5. pinMode(BUZZER_PIN, OUTPUT);
6. }
7. void loop() {
8. for (int i = 0; i < KEY_COUNT; ++i) {
9. int keyPin = i + FIRST_KEY_PIN;
10. boolean keyUp = digitalRead(keyPin);
11. if (!keyUp) {
12. int frequency = 2000 + i * 1000;
13. tone(BUZZER_PIN, frequency, 20);
14. }
15. }
16. }
Добавьте еще 2 кнопки и измените программу так, чтобы можно было извлечь 5 различных нот.
Листинг:
1. #define BUZZER_PIN 13
2. #define FIRST_KEY_PIN 7
3. #define KEY_COUNT 5
4. void setup() {
5. pinMode(BUZZER_PIN, OUTPUT);
6. }
7. void loop() {
8. for (int i = 0; i < KEY_COUNT; ++i) {
9. int keyPin = i + FIRST_KEY_PIN;
10. boolean keyUp = digitalRead(keyPin);
11. if (!keyUp) {
12. int frequency = 2500 + i * 500;
13. tone(BUZZER_PIN, frequency, 20);}
14. }
15. }
Подключите кнопки по схеме со стягивающим резистором и измените программу так, чтобы она продолжала работать.
Листинг:
1. #define BUZZER_PIN 13
2. #define FIRST_KEY_PIN 7
3. #define KEY_COUNT 5
4. void setup() {
5. pinMode(BUZZER_PIN, OUTPUT);
6. }
7. void loop() {
8. for (int i = 0; i < KEY_COUNT; ++i) {
9. int keyPin = i + FIRST_KEY_PIN;
10. boolean keyUp = digitalRead(keyPin);
11. if (keyUp) {
12. int frequency = 2500 + i * 500;
13. tone(BUZZER_PIN, frequency, 20);
14. }
15. }
16. }
Эксперимент 9. Миксер
В этом эксприменте мы создаем модель миксера с двумя скоростями работы.
Принципиальная схема
Код
1. #define MOTOR_PIN 9
2. #define FIRST_BUTTON_PIN 5
3. #define BUTTON_COUNT 3
4. // имена можно давать не только числам, но и целым выражени¤м.
5. // мы определ¤ем с каким шагом (англ. step) нужно мен¤ть
6. // скорость (англ. speed) мотора при нажатии очередной кнопки
7. #define SPEED_STEP (255 / (BUTTON_COUNT - 1))
8. void setup() {
9. pinMode(MOTOR_PIN, OUTPUT);
10. // на самом деле, у каждого порта уже есть подт¤гивающий
11. // резистор. ƒл¤ его включени¤ необходимо ¤вно настроить порт
12. // как вход с подт¤жкой (англ. inputwithpullup)
13. for (int i = 0; i < BUTTON_COUNT; ++i) {
14. pinMode(i + FIRST_BUTTON_PIN, INPUT_PULLUP);
15. }
16. }
17. void loop()
18. {
19. for (int i = 0; i < BUTTON_COUNT; ++i) {
20. // если кнопка отпущена, нам она не интересна. ѕропускаем
21. // оставшуюс¤ часть цикла for, продолжа¤ (англ. continue)
22. // его дальше, дл¤ следующего значени¤ i
23. if (digitalRead(i + FIRST_BUTTON_PIN))
24. continue;
25. // кнопка нажата Ч выставл¤ем соответствующую ей скорость
26. // мотора. Нулевая кнопка остановит вращение, перва¤
27. // заставит крутиться в полсилы, вторая на полную
28. int speed = i * SPEED_STEP;
29. // подача Ў»ћ-сигнала на мотор заставит его крутитьс¤ с
30. // указанной скоростью: 0 Ч стоп машина, 127 Ч полсилы,
31. // 255 Ч полный вперед!
32. analogWrite(MOTOR_PIN, speed);
33. }
34. }
Вопросы для проверки себя
Зачем в схеме использован диод?
Защитный диод нам нужен для того, чтобы ток обратного направления, который начнет создавать двигатель, вращаясь по инерции, не вывел из строя транзистор.
Почему мы использовали полевой MOSFET-транзистор, а не биполярный?
Потому что биполярный и полевой транзисторы абсолютно разные по принципу действия. Выходной сигнал биполярного транзистора управляется током, а нам нужно управление напряжением.