4.05. Генерация и измерение импульсов.md
Поздравляем! Вы освоили, пожалуй, самые сложные для понимания концепции — как микроконтроллер взаимодействует с аналоговым миром. Теперь, когда за плечами теория о ШИМ, АЦП и ЦАП, давайте немного отдохнём и займёмся чем-то более прикладным и весёлым. В этом параграфе мы научим наш Рудирон
«петь», используя встроенные функции для генерации звука, а также измерять длительность сигналов, что очень полезно для работы с различными датчиками.
Музыка и физика - как Рудирон
создаёт звук?
Вы наверняка слышали, как пищат электронные будильники или детские игрушки. Этот звук создаётся с помощью быстро вибрирующей мембраны в устройстве, которое называется пьезоизлучатель или зуммер (buzzer). Чтобы заставить мембрану вибрировать, на неё нужно подавать быстро переключающийся цифровой сигнал. Частота этих переключений определяет высоту звука - чем чаще сигнал переключается, тем выше тон.
Каждая музыкальная нота — это звук с определённой частотой. Например, нота «Ля» первой октавы, на которую настраивают музыкальные инструменты, имеет частоту 440 Гц. Это значит, что для её воспроизведения мембрана пьезоизлучателя должна совершать 440 колебаний в секунду.
Нота | C (До) | D (Ре) | E (Ми) | F (Фа) | G (Соль) | A (Ля) | B (Си) |
---|---|---|---|---|---|---|---|
Частота 1-й октавы (Гц) | 262 | 294 | 330 | 349 | 392 | 440 | 494 |
Ноты в других октавах имеют частоты, кратные этим значениям. Например, «Ля» второй октавы (A5) звучит на частоте 880 Гц (в 2 раза выше), а «Ля» малой октавы (A3) — на частоте 220 Гц (в 2 раза ниже).
Можно ли сгенерировать такой сигнал вручную с помощью digitalWrite()
? Теоретически да, но это очень неудобно. Чтобы получить ноту «Ля» (440 Гц), вам пришлось бы написать код, который переключает пин с HIGH
на LOW
и обратно каждые \(1 / (440 \times 2) \approx 0.00113\) секунды, или 1136 микросекунд. Это сложно, неточно, и такой код полностью заблокирует микроконтроллер, не давая ему выполнять другие задачи.
К счастью, для этого есть специальная функция tone()
.
Генерация импульса — функция tone()
Функция tone()
— это удобный инструмент, который берёт на себя всю сложную работу по генерации сигнала нужной частоты. Она использует аппаратные таймеры микроконтроллера для создания на пине сигнала ШИМ с коэффициентом заполнения 50% и точно заданной вами частотой. Это происходит в фоновом режиме, не мешая выполнению основного кода в loop()
.
Синтаксис функции:
tone(номерПина, частота);
tone(номерПина, частота, длительность);
номерПина
. ЛюбойGPIO
пин, к которому подключён пьезоизлучатель.частота
. Частота звука в герцах (Гц).длительность
(необязательный параметр). Длительность звучания в миллисекундах. Если её не указать, звук будет генерироваться бесконечно, пока не будет остановлен функциейnoTone()
.
Для прекращения генерации звука используется функция noTone()
:
noTone(номерПина);
Пример (проигрывание гаммы): Давайте научим Рудирон
играть простую гамму «До-мажор».
const int buzzerPin = 8; // Пин для пьезоизлучателя
// Массив с частотами нот гаммы "До-мажор"
int melody[] = {262, 294, 330, 349, 392, 440, 494, 523};
void setup() {
// pinMode для tone() не требуется
}
void loop() {
// Проигрываем мелодию последовательно из массива
for (int i = 0; i < 8; i++) {
tone(buzzerPin, melody[i], 300); // Каждая нота звучит 300 мс
delay(400); // Пауза между нотами
}
delay(2000); // Пауза перед повторением
}
Измерение импульса — функция pulseIn()
Если tone()
позволяет нам генерировать сигнал определённой частоты, то pulseIn()
— это обратная ей функция, которая позволяет измерить длительность входящего сигнала. Это невероятно полезно при работе с датчиками, которые кодируют информацию во временных интервалах.
Представьте ультразвуковой дальномер: он отправляет короткий звуковой импульс и «слушает» эхо. Время, прошедшее между отправкой и приёмом, говорит о расстоянии до препятствия. Функция pulseIn()
идеально подходит для измерения этого времени. Она блокирует выполнение программы и «засекает время», пока на указанном пине держится определённый уровень сигнала (HIGH
или LOW
).
Синтаксис функции:
unsigned long duration = pulseIn(номерПина, состояние, таймаут);
номерПина
. Пин, на котором измеряется импульс.состояние
. Уровень сигнала, длительность которого мы измеряем (HIGH
илиLOW
).таймаут
(необязательный параметр). Максимальное время ожидания импульса в микросекундах. По умолчанию — 1 секунда.
Функция возвращает длительность импульса в микросекундах (мкс).
Пример (измерение длительности нажатия кнопки): Этот код будет измерять, как долго вы удерживаете кнопку нажатой, и выводить результат в монитор порта.
const int buttonPin = 35; // Пин, к которому подключена кнопка
void setup() {
pinMode(buttonPin, INPUT_PULLDOWN);
Serial.begin(9600);
Serial.println("Нажмите и удерживайте кнопку для измерения...");
}
void loop() {
// pulseIn() будет ждать, пока на пине появится высокий уровень (кнопка нажата),
// измерит, как долго он продлится, и вернёт длительность.
unsigned long pulseDuration = pulseIn(buttonPin, HIGH);
// Если был зафиксирован импульс (то есть кнопка была нажата)
if (pulseDuration > 0) {
Serial.print("Кнопка была нажата: ");
Serial.print(pulseDuration);
Serial.println(" микросекунд.");
}
}
Зачем это нужно?
Функции tone()
и pulseIn()
— это отличные инструменты для создания интерактивных проектов:
- С помощью
tone()
можно добавлять в устройства звуковые оповещения, создавать простые музыкальные инструменты или сигнализации. - С помощью
pulseIn()
можно работать с широким спектром датчиков, которые передают информацию через длительность импульса, например, с ультразвуковыми дальномерами (HC-SR04
), ИК-приёмниками или некоторыми видами энкодеров.
Мы рассмотрели, как заставить Рудирон
издавать звуки и измерять временные интервалы. Эти простые, но мощные функции открывают дорогу к множеству увлекательных проектов. Если вы хотите закрепить полученные знания, переходите к лабораторным работам. А если вы готовы научиться делать так, чтобы микроконтроллер реагировал на события мгновенно, не дожидаясь своей очереди в цикле loop()
, отправляйтесь в следующий параграф, где мы изучим аппаратные прерывания.
- Страницы
- 1. Введение
- 1.01. Лабораторная работа №1.1
- 1.02. Лабораторная работа №1.2
- 1.03. Лабораторная работа №1.3
- 1.04. Лабораторная работа №1.4
- 1.05. Лабораторная работа №1.5
- 2. Основы электроники
- 2.01. Электрический ток и параметры цепи
- 2.01.1. Лабораторная работа №2.1.1
- 2.01.2. Лабораторная работа №2.1.2
- 2.02. Сопротивление в цепи
- 2.02.1. Лабораторная работа №2.2.1
- 2.02.2. Лабораторная работа №2.2.2
- 2.03. Полупроводники
- 2.03.1. Лабораторная работа №2.3.1
- 2.03.2. Лабораторная работа №2.3.2
- 3. Основы программирование на C++
- 3.01. Типы данных и переменные
- 3.01.1. Практикум
- 3.02. Операторы в C++
- 3.02.1. Практикум
- 3.03. Структуры ветвления
- 3.03.1. Практикум
- 3.04. Структуры повторения
- 3.04.1. Практикум
- 3.05. Массивы
- 3.05.1. Практикум
- 3.06. Функции
- 3.06.1. Практикум
- 3.07. Решения задач
- 4. Программирование микроконтроллеров
- 4.01. Цифровые сигналы и GPIO
- 4.01.1. Лабораторная работа №4.1.1
- 4.01.2. Лабораторная работа №4.1.2
- 4.01.3. Лабораторная работа №4.1.3
- 4.01.4. Лабораторная работа №4.1.4
- 4.01.5. Лабораторная работа №4.1.5
- 4.01.6. Лабораторная работа №4.1.6
- 4.01.7. Лабораторная работа №4.1.7
- 4.01.8. Лабораторная работа №4.1.8
- 4.02. Аналоговые сигналы и ШИМ
- 4.02.1. Лабораторная работа №4.2.1
- 4.02.2. Лабораторная работа №4.2.2
- 4.02.3. Лабораторная работа №4.2.3
- 4.02.4. Лабораторная работа №4.2.4
- 4.02.5. Лабораторная работа №4.2.5
- 4.03. Аналоговый сигнал и АЦП
- 4.03.1. Лабораторная работа №4.3.1
- 4.03.2. Лабораторная работа №4.3.2
- 4.03.3. Лабораторная работа №4.3.3
- 4.03.4. Лабораторная работа №4.3.4
- 4.03.5. Лабораторная работа №4.3.5
- 4.04. Аналоговый сигнал и ЦАП
- 4.04.1. Лабораторная работа №4.4.1
- 4.04.2. Лабораторная работа №4.4.2
- 4.05. Генерация и измерение импульсов
- 4.05.1. Лабораторная работа №4.5.1
- 4.05.2. Лабораторная работа №4.5.2
- 4.06. Аппаратные прерывания
- 4.06.1. Лабораторная работа №4.6.1
- 4.06.2. Лабораторная работа №4.6.2
- 4.07. Псевдопараллелизм
- 4.07.1. Лабораторная работа №4.7.1
- 4.07.2. Лабораторная работа №4.7.2
- 4.08. Интерфейсы связи - UART
- 4.08.1. Лабораторная работа №4.8.1
- 4.09. Интерфейсы связи - I2C
- 4.09.1. Лабораторная работа №4.9.1
- 4.10. Интерфейсы связи - SPI
- 4.10.1. Лабораторная работа №4.10.1
- home
-
imgs
- 1. Введение
- 1.01. Лабораторная работа №1.1
- 1.02. Лабораторная работа №1.2
- 1.03. Лабораторная работа №1.3
- 1.04. Лабораторная работа №1.4
- 1.05. Лабораторная работа №1.5
- 2. Основы электроники
- 2.01. Электрический ток и параметры цепи
- 2.01.1. Лабораторная работа №2.1.1
- 2.01.2. Лабораторная работа №2.1.2
- 2.02. Сопротивление в цепи
- 2.02.1. Лабораторная работа №2.2.1
- 2.02.2. Лабораторная работа №2.2.2
- 2.03. Полупроводники
- 2.03.1. Лабораторная работа №2.3.1
- 2.03.2. Лабораторная работа №2.3.2
- 3. Основы программирование на C++
- 3.01. Типы данных и переменные
- 3.01.1. Практикум
- 3.02. Операторы в C++
- 3.02.1. Практикум
- 3.03. Структуры ветвления
- 3.03.1. Практикум
- 3.04. Структуры повторения
- 3.04.1. Практикум
- 3.05. Массивы
- 3.05.1. Практикум
- 3.06. Функции
- 3.06.1. Практикум
- 3.07. Решения задач
- 4. Программирование микроконтроллеров
- 4.01. Цифровые сигналы и GPIO
- 4.01.1. Лабораторная работа №4.1.1
- 4.01.2. Лабораторная работа №4.1.2
- 4.01.3. Лабораторная работа №4.1.3
- 4.01.4. Лабораторная работа №4.1.4
- 4.01.5. Лабораторная работа №4.1.5
- 4.01.6. Лабораторная работа №4.1.6
- 4.01.7. Лабораторная работа №4.1.7
- 4.01.8. Лабораторная работа №4.1.8
- 4.02. Аналоговые сигналы и ШИМ
- 4.02.1. Лабораторная работа №4.2.1
- 4.02.2. Лабораторная работа №4.2.2
- 4.02.3. Лабораторная работа №4.2.3
- 4.02.4. Лабораторная работа №4.2.4
- 4.02.5. Лабораторная работа №4.2.5
- 4.03. Аналоговый сигнал и АЦП
- 4.03.1. Лабораторная работа №4.3.1
- 4.03.2. Лабораторная работа №4.3.2
- 4.03.3. Лабораторная работа №4.3.3
- 4.03.4. Лабораторная работа №4.3.4
- 4.03.5. Лабораторная работа №4.3.5
- 4.04. Аналоговый сигнал и ЦАП
- 4.04.1. Лабораторная работа №4.4.1
- 4.04.2. Лабораторная работа №4.4.2
- 4.05. Генерация и измерение импульсов
- 4.05.1. Лабораторная работа №4.5.1
- 4.05.2. Лабораторная работа №4.5.2
- 4.06. Аппаратные прерывания
- 4.06.1. Лабораторная работа №4.6.1
- 4.06.2. Лабораторная работа №4.6.2
- 4.07. Псевдопараллелизм
- 4.07.1. Лабораторная работа №4.7.1
- 4.07.2. Лабораторная работа №4.7.2
- 4.08. Интерфейсы связи - UART
- 4.08.1. Лабораторная работа №4.8.1
- 4.09. Интерфейсы связи - I2C
- 4.09.1. Лабораторная работа №4.9.1
- 4.10. Интерфейсы связи - SPI
- 4.10.1. Лабораторная работа №4.10.1
- home