10 класс
Конструирование программируемых устройств
Занятие 14. Цифровые актюаторы. Пассивный зуммер и функция tone()

14. Цифровые актюаторы. Управление устройствами через digitalWrite() и tone()

📅 13.01 ⏱ 2 × 40 минут
🕐 Занятие состоит из двух уроков по 40 минут с коротким перерывом

📋 План занятия

  1. 00:00-00:40: Урок 1: Теория цифровых актюаторов. Классификация устройств. Работа с пассивным зуммером и tone()
  2. 00:40-00:45: Короткий перерыв
  3. 00:45-01:25: Урок 2: Практика: 3 простые задачи на урок. Дополнительная задача с вибромодулем
  4. 01:25-01:30: Итоги. Объяснение домашнего задания

🎯 Основной материал

1. Теоретическая часть

1.1 Классификация устройств для Arduino

Все периферийные устройства, подключаемые к микроконтроллеру, делятся на две основные категории:

  • Сенсор (датчик) — устройство ввода информации. Преобразует физический параметр в электрический сигнал.
  • Актюатор (исполнительное устройство) — устройство вывода. Преобразует электрический сигнал от Arduino в физическое действие.

1.2 Принцип управления цифровыми актюаторами

Цифровой актюатор — устройство с двумя четкими состояниями: ВКЛЮЧЕНО и ВЫКЛЮЧЕНО.

Управление осуществляется через цифровой выход Arduino:

digitalWrite(номер_пина, HIGH); // Включить устройство
digitalWrite(номер_пина, LOW); // Выключить устройство

1.3 Типы зуммеров и методы управления

Важное отличие: В этом занятии мы работаем с ПАССИВНЫМ зуммером, который управляется через функцию tone()!
Характеристика Пассивный зуммер Активный зуммер
Управление Функция tone() digitalWrite()
Частота звука Любая (31 Гц - 65535 Гц) Фиксированная (обычно 2-4 кГц)
Создание мелодий Возможно Невозможно
Внешний вид Нет маркировки сверху Есть маркировка "+"

1.4 Функция tone() - управление звуком

Функция tone(pin, frequency, duration) генерирует прямоугольный сигнал на указанном пине.

// Базовый синтаксис:
tone(пин, частота); // звук без остановки
tone(пин, частота, длительность); // звук заданное время (мс)
noTone(пин); // остановить звук

1.5 Таблица частот для нот

Октава/Нота C (До) D (Ре) E (Ми) F (Фа) G (Соль) A (Ля) B (Си)
4 октава 262 Гц 294 Гц 330 Гц 349 Гц 392 Гц 440 Гц 494 Гц
5 октава 523 Гц 587 Гц 659 Гц 698 Гц 784 Гц 880 Гц 988 Гц

1.6 Необходимые компоненты

Компонент Количество Пин подключения
Arduino Uno/Nano 1 -
Пассивный зуммер 1 D9 (для tone)
Светодиод 1 D8
Резистор 220 Ом 1 Для светодиода
Вибромодуль (доп.) 1 D10
Соединительные провода 10-15 Папа-папа
Макетная плата 1 400 или 800 точек

2. Практическая часть

Структура практики: Выполните 3 простые задачи (каждая оценивается в 1 балл) ИЛИ одну сложную задачу (оценивается в 3 балла). Все задачи равны по баллам.

Задача 1: Базовый звук со светодиодом 1 балл

Цель: При каждом звуковом сигнале светодиод загорается.

void setup() {
  pinMode(8, OUTPUT); // Светодиод
  pinMode(9, OUTPUT); // Пассивный зуммер
}

void loop() {
  digitalWrite(8, HIGH);
  tone(9, 440, 500); // Ля 4 октавы (440 Гц)
  delay(500);
  digitalWrite(8, LOW);
  delay(1000);
}

Задача 2: Восходящая гамма 1 балл

Цель: Воспроизвести 5 нот подряд с разными частотами.

int notes[] = {262, 294, 330, 349, 392}; // До, Ре, Ми, Фа, Соль

void setup() {
  pinMode(9, OUTPUT);
}

void loop() {
  for(int i = 0; i < 5; i++) {
    tone(9, notes[i], 300);
    delay(350); // 300 мс звук + 50 мс пауза
  }
  delay(1000);
}

Задача 3: Сигнал SOS 1 балл

Цель: Реализовать сигнал бедствия (··· --- ···) на зуммере.

void setup() {
  pinMode(9, OUTPUT);
}

void loop() {
  // Три коротких (S)
  for(int i = 0; i < 3; i++) {
    tone(9, 660, 200);
    delay(250);
  }
  delay(100);
  
  // Три длинных (O)
  for(int i = 0; i < 3; i++) {
    tone(9, 660, 600);
    delay(650);
  }
  delay(100);
  
  // Три коротких (S)
  for(int i = 0; i < 3; i++) {
    tone(9, 660, 200);
    delay(250);
  }
  
  delay(3000);
}

Сложная задача: Светомузыка с вибромодулем 3 балла

Цель: Создать синхронизированную систему из трех устройств.

Схема подключения:
• Светодиод: D8
• Пассивный зуммер: D9
• Вибромодуль: D10
int melody[] = {262, 330, 392, 523, 392, 330, 262};
int noteDurations[] = {400, 300, 300, 500, 300, 300, 400};

void setup() {
  pinMode(8, OUTPUT); // Светодиод
  pinMode(9, OUTPUT); // Зуммер
  pinMode(10, OUTPUT); // Вибромодуль
}

void loop() {
  for(int i = 0; i < 7; i++) {
    // Зажигаем светодиод
    digitalWrite(8, HIGH);
    
    // Включаем вибрацию для низких нот
    if(melody[i] < 350) {
      digitalWrite(10, HIGH);
    }
    
    // Воспроизводим ноту
    tone(9, melody[i], noteDurations[i]);
    delay(noteDurations[i] + 50);
    
    // Выключаем все
    digitalWrite(8, LOW);
    digitalWrite(10, LOW);
    delay(100);
  }
  delay(2000);
}
Правило выбора: Можно выполнить 3 простые задачи (1+1+1 = 3 балла) ИЛИ одну сложную задачу (3 балла). Выбор за вами!

3. Готовые мелодии для пассивного зуммера

3.1 Мелодия "Happy Birthday"

int happyNotes[] = {
  262, 262, 294, 262, 349, 330,
  262, 262, 294, 262, 392, 349,
  262, 262, 523, 440, 349, 330, 294,
  466, 466, 440, 349, 392, 349
};

int happyDurations[] = {
  500, 500, 1000, 1000, 1000, 2000,
  500, 500, 1000, 1000, 1000, 2000,
  500, 500, 1000, 1000, 1000, 1000, 2000,
  500, 500, 1000, 1000, 1000, 2000
};

void setup() {
  pinMode(9, OUTPUT);
}

void loop() {
  for(int i = 0; i < 24; i++) {
    tone(9, happyNotes[i], happyDurations[i]);
    delay(happyDurations[i] * 1.1); // Добавляем небольшую паузу
  }
  delay(5000);
}

3.2 Сирена "Полиция"

void setup() {
  pinMode(8, OUTPUT); // Светодиод
  pinMode(9, OUTPUT); // Зуммер
}

void loop() {
  // Восходящий тон (мигание светодиода)
  for(int freq = 300; freq <= 1200; freq += 10) {
    digitalWrite(8, HIGH);
    tone(9, freq, 20);
    delay(20);
  }
  
  // Нисходящий тон
  for(int freq = 1200; freq >= 300; freq -= 10) {
    digitalWrite(8, LOW);
    tone(9, freq, 20);
    delay(20);
  }
}

3.3 Простые сигналы (для кнопок)

void beep(int freq, int duration) {
  tone(9, freq, duration);
  delay(duration + 50);
}

void setup() {
  pinMode(9, OUTPUT);
}

void loop() {
  beep(1000, 100); // Короткий высокий звук
  delay(500);
  beep(500, 200); // Более длинный низкий звук
  delay(1000);
  beep(1500, 50); // Очень короткий высокий
  delay(2000);
}

📝 Домашнее задание

ДЗ #3 📅 Срок сдачи: 20.01 🏆 Макс. балл: 5 баллов

Создание музыкальных проектов с пассивным зуммером

Цель задания: Научиться создавать сложные звуковые последовательности, работать с функциями tone() и noTone(), интегрировать звук с визуальными и тактильными эффектами.

Базовая часть (5 баллов, любое из трех на выбор):

  1. Музыкальная шкала: Создайте программу, которая проигрывает мажорную гамму (8 нот) с разной длительностью: первые 4 ноты по 200 мс, последние 4 ноты по 400 мс.
  2. Мелодия с ритмом: Напишите мелодию из 10 нот, где каждая нота сопровождается миганием светодиода (вкл во время звучания ноты).
  3. Контроль пауз: Создайте программу с использованием noTone(), где между нотами есть четкие паузы (noTone на 100 мс).

🔍 Дополнительно

❓ Контрольные вопросы

Какая функция Arduino используется для управления цифровыми актюаторами?

Для управления цифровыми актюаторами используется функция digitalWrite(pin, state), где pin - номер цифрового вывода, state - HIGH (5В) или LOW (0В).

Почему для светодиода нужен резистор, а для модуля вибромотора — нет?

Светодиод имеет низкое сопротивление и может сгореть при подключении напрямую к 5В. Резистор ограничивает ток. Модуль вибромотора уже содержит транзистор и ограничивающие резисторы на плате модуля.

Что произойдет, если не вызвать pinMode() в функции setup()?

Пин будет находиться в неопределённом состоянии (вход с высоким импедансом). Устройство может работать некорректно или не работать вообще. Всегда настраивайте пины с помощью pinMode() перед использованием.

Чем отличается активный зуммер от пассивного?

Активный зуммер имеет встроенный генератор и издаёт звук фиксированной частоты при подаче питания. Пассивный зуммер требует внешнего генератора сигнала (функция tone()) и может воспроизводить разные частоты.

Для чего нужна функция noTone()?

Функция noTone() останавливает генерацию звука на указанном пине. Без неё звук может продолжаться до следующего вызова tone() или перезагрузки.

🔗 Полезные материалы

🎵 Еще больше мелодий для практики

// Мелодия "Jingle Bells" (фрагмент)
int jingleNotes[] = {
  330, 330, 330, 262, 392, 392, 392, 349
};

// Мелодия "Star Wars" (вступление)
int starWarsNotes[] = {
  392, 392, 392, 311, 466, 392, 311, 466, 392
};

Совет: Экспериментируйте с длительностями нот и паузами между ними. Попробуйте создать свою собственную мелодию, изменяя частоты в небольших пределах (±20 Гц).

Made on
Tilda