Почему пассивный зуммер щелкает, а не гудит, когда установлен на ВЫСОКИЙ?

все. Я работаю над изучением Arduino с нуля и нахожусь на уроке зуммера. Учебник, которому я следую, состоит в написании кода для получения входных данных от пользователя в виде целого числа, и, если оно больше 10 (или любого другого порогового значения, на которое вы его установили), оно будет жужжать.

Я написал код точно так, как сказано в руководстве, но зуммер не гудел, вместо этого он издавал странный щелкающий звук. Я везде искал причину и не мог найти объяснения. Большинство вопросов на форумах были решены путем замены положительного провода от 5 В на обычный вывод на плате, и эти проблемы были вызваны тем фактом, что люди, задававшие вопросы, не знали, что зуммер был пассивным.

В любом случае, мне удалось получить кайф, переключившись с цифрового на аналоговый режим и набрав значение меньше 255. Казалось странным, что 255 и ВЫСОКИЙ будут вызывать щелчок, но значения меньше 255 будут жужжать, поэтому я попробовал несколько значений analogWrite:

  • При 255 зуммер издает странный щелчок.
  • На отметке 254 зуммер издает очень слабое жужжание.

Жужжание становилось все громче, когда я записывал меньшие числа, пока оно не стабилизировалось на отметке около 250, а затем стало менее громким, когда я уменьшил число.

Кто-нибудь знает, почему это так? Не слишком ли высокое напряжение для зуммера при 255/? Я попробовал резистор, но все равно не получил ничего, кроме щелчка с программой, установленной на 255/HIGH.

Это в основном из любопытства, но я все равно был бы признателен, если бы вы смогли ответить на это.

Вот код ("Нумеро" означает "номер", а "Дама ун нумеро" означает "Дай мне номер":

int Numero;

int buzz=10;

int DLY=2000;

String msg="Dame un numero.";

void setup() {

Serial.begin(9600);
pinMode(buzz,OUTPUT);

}

void loop() {
 
Serial.println(msg);
while (Serial.available()==0){
  
}

Numero=Serial.parseInt(); 

if (Numero>25){

  Serial.println(Numero);

  analogWrite(buzz,10);

  delay(DLY);

  digitalWrite(buzz,LOW);

}


}

, 👍1

Обсуждение

для пассивного зуммера используйте функцию tone (). активный зуммер издает звук только при напряжении 5 В. https://www.arduino.cc/reference/en/language/functions/advanced-io/tone/, @Juraj


3 ответа


Лучший ответ:

2

эти проблемы были вызваны тем фактом, что люди, задававшие вопросы, не знали, что зуммер был пассивным.

Кажется, вы знаете, что у вас есть пассивный зуммер, но вы не знаете, что это значит для вас.

Зуммер состоит в основном из пьезоэлемента, который вибрирует и, таким образом, издает звук, если вы подаете на него переменное напряжение. Здесь у нас есть 2 типа зуммеров:

  • Те, которые сами генерируют переменное напряжение, таким образом, требуют от вас только простого постоянного напряжения для работы (это активные зуммеры).
  • и те, у которых есть только пьезо и, следовательно, они требуют, чтобы вы обеспечивали их переменным напряжением (это пассивные зуммеры).

У вас есть второй тип-пассивный зуммер. Происходит следующее:

digitalWrite(pin, HIGH) установит только ВЫСОКИЙ pin. При переходе от НИЗКОГО уровня к ВЫСОКОМУ вы получаете щелчок, потому что пьезо в зуммере реагирует на это изменение. analogWrite (), с другой стороны, генерирует ШИМ-сигнал, представляющий собой переменное напряжение (чередующееся между НИЗКИМ и ВЫСОКИМ).

При изменении номера для analogWrite ()вы меняете не частоту, а только рабочий цикл (соотношение ВЫСОКИХ и НИЗКИХ времен в одном периоде сигнала).

  • Аналоговая запись(вывод 255) означает 100% рабочий цикл и, следовательно, постоянный ВЫСОКИЙ сигнал. На самом деле это эквивалентно digitalWrite(pin, ВЫСОКИЙ), потому что analogWrite() делает именно это, если вы указываете 255 (аналогично, он использует digitalWrite(pin, НИЗКИЙ), если вы указываете 0). Таким образом, вы снова слышите тот же щелчок.
  • Поскольку пьезо в зуммере должен колебаться, чтобы издавать звук, вам нужно дать ему время вернуться в низкое состояние. При аналоговом значении 254 НИЗКОЕ время сигнала довольно мало, так что пьезоэлемент не может снова достичь своего полного НИЗКОГО состояния. Таким образом, амплитуда колебаний довольно мала. Таким образом, вы слышите только очень слабое жужжание.
  • С analogWrite(pin, 250) вы достигли максимума, потому что теперь у пьезоэлемента достаточно времени, чтобы снова перейти в низкое состояние. Амплитуда здесь максимальна, поэтому это самое громкое значение.
  • При движении ниже 250 к нулю вы также уменьшаете количество энергии, которое вы отдаете зуммеру, таким образом, объем уменьшится (хотя это, конечно, не линейный процесс и зависит также от характеристик зуммера).

Как уже писал Юрай в комментариях, пассивный зуммер может быть сопряжен с функцией tone (). Он будет генерировать переменное напряжение для вас, и вы даже можете установить частоту по своему вкусу, чтобы получать звуки с разной высотой. В Интернете есть множество обучающих программ по функции tone ().

,

Я не согласен с вашим заявлением "Когда вы идете ниже 250 к нулю, вы также уменьшаете количество энергии". Это снижает среднее напряжение, но среднее напряжение-это не то, что обеспечивает максимальный звук пьезоэлектрического излучателя. Вы получите максимальный объем пьезоэлемента при 50% - ном рабочем цикле ("Цифровая запись(pin, 128)`)., @Duncan C

@DuncanC Вы имеете в виду " Аналоговая запись(pin, 128)". Но по мере того, как я думаю ближе, вы, возможно, правы. Его трудно сопоставить рабочий цикл с объемом. Можете ли вы объяснить подробнее, почему при 50% - ном рабочем цикле у вас наибольший объем? Пьезо достаточно быстр, так что изменения в диапазоне от 5 до 250 не будут иметь большого значения. Когда вывод находится высоко, пьезоэлектрик движется в одном направлении. Когда низко опускаешься в другую. Между ними он стоит неподвижно. Амплитуда задается напряжением (для указанного выше диапазона), которое равно для всех высоких или низких состояний. Таким образом, теперь я мог бы сказать, что в этом диапазоне значение не имеет значения для громкости., @chrisl

Или я неправильно здесь думаю?, @chrisl

Ну, сказать, что это будет громче всего в 128,-это чрезмерное упрощение. Он будет ближе всего к чистому тону на 128, и вы получите равное время с элементом в позициях "Вход" и "выход". При значениях, отличных от 128, в тон будут введены дополнительные гармоники. (В сигнале прямоугольной волны в любом случае много высокочастотных гармоник, но при рабочем цикле, отличном от 50%, их будет еще больше.), @Duncan C

Эй, чувак, спасибо за объяснение. Не мог бы и пожелать лучшего на пассивных гудках. Это было ясно и лаконично и решило мой животрепещущий вопрос. Так держать., @Coy Ote


0

Как объяснил Крисл, пассивному зуммеру нужен переключаемый сигнал нужной частоты, чтобы издавать тон определенного тона. Он будет производить лучший/самый громкий выход с прямоугольной волной (рабочий цикл 50%).

Функция analogWrite выводит сигнал ШИМ (широтно-импульсной модуляции). Это сигнал фиксированной частоты, но с изменяющимся рабочим циклом (отношение времени включения к времени выключения). При 50% (значение 128) вы должны быть в состоянии получить от этого достойный тон. (Похоже, что частота ШИМ зависит от модели Arduino: )

Если вы хотите создавать тона различной частоты, используйте функцию tone() библиотеки Arudino, задокументированную здесь: https://www.arduino.cc/reference/en/language/functions/advanced-io/tone/

С помощью функции tone() вы указываете контакт и требуемую частоту, и это делает все остальное. Как упоминалось в документах, функция тембра мешает выходу ШИМ на платах, отличных от Mega.

Вы также можете получить сигнал с помощью кода, подобного этому:

bool state = HIGH;
int buzz=10;
unsigned long time = 0;

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

void loop() {
   if (millis() > time) {
      state = state == HIGH ? LOW: HIGH;
      time = millis() + 2;
      digitalWrite(buzz, state);
   }
}

Если ваш цикл больше ничего не делает, это должно дать вам тон примерно среднего С. (250 Гц, если мои расчеты верны).

,

1

Пассивный пьезо-зуммер нуждается в возбуждении для создания звука, из вашего кода следует, что время задержки составляет 2000 мс. 2000 мс означает, что частоты 0,5 Гц недостаточно.для моего пассивного зуммера YL-44 даже минимально возможного числа, разрешенного функцией задержки arduino(мс), которая составляет 1 мс, недостаточно, чтобы услышать четкий звук. Частота 2000 кГц была хорошей с задержкой в микросекундах(мкс).

double outPin = outPin;
double freq_Hz = freq_Hz;
double period_s = 1 / m_freq_Hz;
double period_ms = m_period_s * 1000;
double period_us = m_period_ms * 1000;
void loop() {
 digitalWrite(m_outPin, HIGH);
 delayMicroseconds(period_us / 2);

 digitalWrite(m_outPin, LOW);
 delayMicroseconds(period_us / 2);
}
    
,