Взаимодействие Arduino с датчиком звука и управление устройствами с помощью хлопков
Не хотите добавить в свой следующий проект возможность слышать? Эти звуковые датчики недороги, просты во взаимодействии и способны обнаруживать звуки голоса, хлопки или стук в дверь. Вы можете использовать их для различных проектов, реагирующих на звуки, например, чтобы активировать освещение.
Вы знаете, как работают электретные микрофоны?
Внутри микрофона находится тонкая диафрагма, которая на самом деле представляет собой одну из пластин конденсатора. Вторая пластина – это задняя стенка, которая расположена близко к диафрагме и параллельна ей.
Когда вы говорите в микрофон, звуковые волны, создаваемые вашим голосом, ударяют диафрагму, заставляя ее вибрировать.
Когда в ответ на звук диафрагма начинает вибрировать, по мере того, как пластины становятся ближе друг к другу или дальше друг от друга, начинает изменяться и емкость.
При изменениях емкости изменяется и напряжение на пластинах, что позволяет измерить амплитуду звука.
Обзор аппаратного обеспечения
Звуковой датчик представляет собой небольшую плату, которая объединяет микрофон (50 Гц – 10 кГц) и схему обработки для преобразования звуковых волн в электрические сигналы.
Этот электрический сигнал подается на встроенный высокоточный компаратор LM393 для его оцифровки и выводится на выход (вывод OUT).
Для регулировки чувствительности выходного сигнала модуль содержит встроенный потенциометр.
С помощью этого потенциометра вы можете установить пороговое значение. Таким образом, когда амплитуда звука превысит это пороговое значение, модуль выдаст низкий логический уровень, в остальных случаях будет выдаваться высокий логический уровень.
Эта настройка очень полезна, когда вы хотите запустить какое-то действие при достижении определенного порога. Например, когда амплитуда звука пересекает пороговое значение (при обнаружении стука), вы можете активировать реле для управления освещением. Вот вам идея!
Совет: поворачивайте движок потенциометра против часовой стрелки, чтобы увеличить чувствительность, и по часовой стрелке, чтобы ее уменьшить.
Помимо этого, модуль имеет два светодиода. Индикатор питания загорится, когда на модуль подается напряжение питания. Светодиод состояния загорится, когда на цифровом выходе будет низкий логический уровень.
Распиновка звукового датчика
У данного датчика звука только три вывода:
Вывод VCC подает питание на датчик. Рекомендуется питать датчик напряжением от 3,3 до 5 В.
GND для подключения земли.
Вывод OUT выдает высокий логический уровень, когда тихо, и низкий логический уровень, когда обнаруживается звук. Вы можете подключить его к любому цифровому выводу Arduino или напрямую к 5-вольтовому реле или другому подобному устройству.
Подключение звукового датчика с Arduino
Давайте подключим звуковой датчик к Arduino. Подключение довольно простое. Для начала подключите вывод VCC на модуле к выводу 5V на Arduino, а вывод GND на модуле – к выводу GND Arduino. Теперь подключите вывод OUT к цифровому выводу 7 на Arduino. Вот и всё!
На следующем рисунке показана схема соединений.
Калибровка датчика звука
Для получения точных показаний с вашего звукового датчика, рекомендуется сначала его откалибровать.
Для калибровки цифрового выхода (OUT) модуль содержит встроенный потенциометр.
Поворачивая движок потенциометра, вы можете установить пороговое значение. Таким образом, когда уровень звука превышает пороговое значение, светодиод статуса загорается, а на цифровой выход (OUT) выдается низкий логический уровень.
Теперь, чтобы откалибровать датчик, хлопайте рядом с микрофоном и подстраивайте потенциометр, пока вы не увидите, что светодиод состояния на модуле мигает в ответ на ваши хлопки.
Теперь ваш датчик откалиброван и готов к использованию.
Простой пример: обнаружение звука
Теперь, когда всё подключено, вам понадобится скетч, чтобы проверить эту схему в работе.
Следующий пример обнаруживает хлопки или щелчки и выводит сообщение в мониторе последовательного порта. Попробуйте скетч в работе, а затем мы рассмотрим его подробнее.
#define sensorPin 7
// Переменная для хранения времени, когда произошло последнее событие
unsigned long lastEvent = 0;
void setup()
{
// Настраиваекм вывод, к которому подключен датчик, как вход
pinMode(sensorPin, INPUT);
Serial.begin(9600);
}
void loop()
{
// Прочитать показания датчика
int sensorData = digitalRead(sensorPin);
// Если на вывод подан низкий логический уровень, то звук обнаружен
if (sensorData == LOW)
{
// Если прошло 25 мс с момента последнего состояния низкого логического уровня,
// это значит, что обнаружен хлопок, а не какие-либо ложные звуки
if (millis() - lastEvent > 25)
{
Serial.println("Clap detected!");
}
// Запомнить, когда произошло последнее событие
lastEvent = millis();
}
}
Если всё в порядке, то при обнаружении хлопка вы должны увидеть вывод в мониторе последовательного порта, похожий на приведенный ниже.
Объяснение
Скетч начинается с объявления вывода Arduino, к которому подключен вывод OUT датчика.
#define sensorPin 7
Затем мы определяем переменную с именем lastEvent
, которая хранит время с момента обнаружения хлопка. Это поможет нам устранить ложные срабатывания.
unsigned long lastEvent = 0;
В функции setup()
мы определяем сигнальный вывод, к которому подключен датчик, как входной. А также настраиваем последовательную связь с компьютером.
pinMode(sensorPin, INPUT);
Serial.begin(9600);
В функции loop()
мы сначала читаем состояние цифрового вывода датчика.
int sensorData = digitalRead(sensorPin);
Когда датчик обнаруживает какой-либо звук, достаточно громкий, чтобы пересечь пороговое значение, логический уровень выходного сигнала становится низким. Но мы должны убедиться, что звук вызван хлопками, а не случайным фоновым шумом. Итак, мы ждем 25 миллисекунд. Если логический уровень на выводе остается низким в течение более 25 миллисекунд, мы заявляем, что обнаружен хлопок.
if (sensorData == LOW)
{
if (millis() - lastEvent > 25)
{
Serial.println("Clap detected!");
}
lastEvent = millis();
}
Управление устройствами с помощью хлопков
В нашем следующем проекте мы будем использовать звуковой датчик в качестве «детектора хлопков», который включает устройства, питающиеся от сети переменного тока, хлопком в ладоши.
В данном проекте для управления питанием устройств используется одноканальный модуль реле, который будет коммутировать переменное напряжение сети 220 В.
Схема соединений
Схема соединений в этом проекте очень проста.
Предупреждение: |
Сначала необходимо подать питание на датчик и модуль реле. Подключите их выводы VCC к выводу 5V на Arduino, и выводы GND к выводу GND на Arduino.
Затем подключите выходной вывод (OUT) звукового датчика к цифровому выводу 7 на Arduino, а управляющий вывод (IN) на модуле реле к цифровому выводу 8 Arduino.
Вам также необходимо поместить модуль реле в линию питания устройства, которым вы хотите управлять. Вам придется разрезать один провод в кабеле питания и подключить один конец отрезанного провода (идущий от вилки) к выводу COM (общий) модуля реле, а другой к выводу NO (нормально разомкнутый).
Схема соединений показана на следующем рисунке.
Код Arduino
Ниже приведен скетч для управления устройствами с помощью хлопков.
#define sensorPin 7
#define relayPin 8
// Переменная для хранения времени, когда произошло последнее событие
unsigned long lastEvent = 0;
// Переменная для хранения состояния реле
boolean relayState = false;
void setup()
{
pinMode(relayPin, OUTPUT); // Настроить вывод, подключенный к реле, как выход
pinMode(sensorPin, INPUT); // Настроить вывод, подключенный к датчику, как вход
}
void loop()
{
// Прочитать показания датчика
int sensorData = digitalRead(sensorPin);
// Если на вывод подан низкий логический уровень, то звук обнаружен
if (sensorData == LOW)
{
// Если прошло 25 мс с момента последнего состояния низкого логического уровня,
// это значит, что обнаружен хлопок, а не какие-либо ложные звуки
if (millis() - lastEvent > 25)
{
// изменить переменную состояния реле и установить состояние на выходе
relayState = !relayState;
digitalWrite(relayPin, relayState ? HIGH : LOW);
}
// Запомнить, когда произошло последнее событие
lastEvent = millis();
}
}
После того, как вы загрузили программу в Arduino, и всё включили, датчик должен включать или выключать управляемое устройство каждый раз, когда вы хлопаете.
Объяснение
Если вы сравните этот скетч с предыдущим, вы заметите много общего, кроме нескольких вещей.
В начале мы объявляем вывод Arduino, к которому подключен вывод управления реле (IN). Мы также определили новую переменную relayState
для хранения состояния реле.
#define relayPin 8
boolean relayState = false;
В функции setup()
мы настраиваем вывод relayPin
как выходной.
pinMode(relayPin, OUTPUT);
Теперь, когда мы обнаруживаем звук хлопка, вместо того, чтобы печатать сообщение в мониторе последовательного порта, мы просто переключаем состояние реле.
relayState = !relayState;
digitalWrite(relayPin, relayState ? HIGH : LOW);
Исправление проблем
Если датчик звука работает неправильно, попробуйте выполнить следующие действия.
- Дважды проверьте, что источник питания обеспечивает чистое напряжение питания. Поскольку звуковой датчик – это аналоговая схема, он более чувствителен к шуму, создаваемому блоком питания.
- Электретный микрофон в звуковом датчике также чувствителен к механическим вибрациям и шуму ветра. Установка с помощью эластичных/упругих материалов может помочь поглотить вибрацию.
- Диапазон чувствительности этого звукового датчика очень мал, возможно, всего 10 дюймов (примерно 25 см), поэтому, чтобы получить хорошую реакцию, вам нужно создавать шум намного ближе.