Освой Arduino играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

Пьезоизлучатель

02.Digital: toneMelody (Играем мелодию)
Melody
02.Digital: tonePitchFollower

Пьезоизлучатель
Внешний вид
Пьезоизлучатель
Fritzing
Пьезоизлучатель
Условное обозначение на схеме

Пьезоизлучатель может называться по разному - пищалка, зумер, piezo buzzer или speaker. Суть одна - издать звук.

Обычно в наборах идут два вида пищалок - активный и пассивный. Они похожи и новичка ставят в тупик. Давайте разбираться.

Активный зуммер имеет сверху наклейку с таинственной надписью "Remove seal after washing", которую Гугл-переводчик переводит весьма странно - "снять пломбу после мытья", ещё больше запутывая пользователя. Не обращайте внимания на надпись, это просто технический момент. Во время изготовления детали требуется промывка от флюса, но чтобы не повредить вещь, заклеивают отверстие сверху. Но не торопитесь отклеивать и выбрасывать наклейку, она вам пригодится.

Active buzzer

Активный зумер может работать самостоятельно, достаточно просто подать питание. При подключении следут следить за полярностью. На наклейке есть значок плюса (+), но доверять наклейке не стоит, может кто-то не очень аккуратно её наклеил. Лучше посмотрите на ножки. Как правило, одна ножка длиннее другой. Длинная ножка - плюс, короткая - минус. Соедините длинную ножку к питанию 5В, а короткую к земле. Вы сразу услышите противный звук. Именно по этой причине я советовал вам не отклеивать наклейку. Если вы теперь удалите наклейку, то громкость звука станет намного выше. Заклейте немедленно обратно!

Пассивный зумер внешне похож, но всё-таки отличается немного. Сравните их по размерам, а также посмотрите на их снизу. Разница видна. При подключении как из прошлого примера с активным динамиком, вы ничего не услышите. Просто подать питание не достаточно, нужно использовать программные методы, которые есть в составе В Arduino.

Passive buzzer

Также встречаются в модульном исполнении, например, KY-006 (пассивный) или KY-012 (активный). У модуля три вывода, средний не используется, вывод S соединяется с цифровым выводом платы, а вывод - с GND.

Passive buzzer KY-006
KY-006
Active buzzer KY-012
KY-012

Переходим к программной части. Активный зумер пищит громче и отчётливее, пассивный немного грубовато.

Самый простой способ - подать напряжение на нужный вывод.


int buzzPin = 2;

void setup() {
  pinMode(buzzPin, OUTPUT); // установка вывода 2 в режим вывода
}

void loop() {
  digitalWrite(buzzPin, HIGH); // перевод вывода 2 в активное состояние
  delay(500); // пауза полсекунды
  digitalWrite(buzzPin, LOW); // перевод вывода 2 в неактивное состояние
  delay(500); // пауза полсекунды
}

При запуске услышим щелчки.

Для более интересных звуков используется функция tone().


const byte piezoPin = 2;

void setup() {
  pinMode(piezoPin, OUTPUT); // настраиваем вывод 2 на выход
}

void loop() {
  tone(piezoPin, 100); // генерируем звук с частотой 100 Гц
  delay(100); // пауза 100 миллисекунд
  noTone(piezoPin); // выключаем звук
  delay(900); // снова пауза 900 мс
}

Одну ноту играть не интересно. Пусть будет массив из десяти нот.


const byte piezoPin = 2;

int numTones = 10;
// Ноты C, C#, D, D#, E, F, F#, G, G#, A
int tones[10] = {261, 277, 294, 311, 330, 349, 370, 392, 415, 440};

void setup() {
  pinMode(piezoPin, OUTPUT); // настраиваем вывод 2 на выход
}

void loop() {
  for (int i = 0; i < numTones; i++) {
    tone(piezoPin, tones[i]);
    delay(500);
  }
  noTone(piezoPin);
}

Если управлять не только нотами, но и их продолжительностью, то можно писать мелодии. Говорят, следующая мелодия воспроизводит "Имперский марш" из "Звёздных войн".


const byte piezoPin = 2;
const byte COUNT_NOTES = 39;

// частоты нот
int tones[COUNT_NOTES] = {
  392, 392, 392, 311, 466, 392, 311, 466, 392,
  587, 587, 587, 622, 466, 369, 311, 466, 392,
  784, 392, 392, 784, 739, 698, 659, 622, 659,
  415, 554, 523, 493, 466, 440, 466,
  311, 369, 311, 466, 392
};

// длительности нот
int durations[COUNT_NOTES] = {
  350, 350, 350, 250, 100, 350, 250, 100, 700,
  350, 350, 350, 250, 100, 350, 250, 100, 700,
  350, 250, 100, 350, 250, 100, 100, 100, 450,
  150, 350, 250, 100, 100, 100, 450,
  150, 350, 250, 100, 750
};

void setup() {
  pinMode(piezoPin, OUTPUT); // настраиваем вывод 2 на выход
}

void loop() {
  for (int i = 0; i <= COUNT_NOTES; i++) {
    tone(piezoPin, tones[i], durations[i] * 2);
    delay(durations[i] * 2);
    noTone(piezoPin);
  }
}

02.Digital: toneMelody (Играем мелодию)

Рассмотрим пример из меню File | Examples | 2.Digital | toneMelody. Обратите внимание, что программа состоит из двух вкладок toneMelody и pitches.h. Файл pitches.h содержит константы для проигрывания звуков различной тональности. Сам файл находится в одной папке с скетчем.

После того, как мы наигрались со светом при помощи светодиодов, пора поиграть со звуком. Для примера нам понадобится пьезоизлучатель, макетная плата и три провода.

Собирается конструкция очень просто - от вывода 8 ведём провод к одному контакту пищалки, а второй контакт присоединяем к GND.

Запустите скетч. Вы услышите мелодию, которая прозвучит один раз. Если вы хотите послушать её ещё раз, то нажмите на кнопку Reset на вашей плате.


#include "pitches.h"

// ноты для мелодии
int melody[] = {
  NOTE_C4, NOTE_G3,NOTE_G3, NOTE_A3, NOTE_G3,0, NOTE_B3, NOTE_C4};

// продолжительность ноты: 4 = quarter note, 8 = eighth note, etc.:
int noteDurations[] = {
  4, 8, 8, 4,4,4,4,4 };

void setup() {
  // проходим через все ноты мелодии:
  for (int thisNote = 0; thisNote < 8; thisNote++) {

    // to calculate the note duration, take one second 
    // divided by the note type.
    //e.g. quarter note = 1000 / 4, eighth note = 1000/8, etc.
    int noteDuration = 1000 / noteDurations[thisNote];
    tone(8, melody[thisNote], noteDuration);

    // to distinguish the notes, set a minimum time between them.
    // the note's duration + 30% seems to work well:
    int pauseBetweenNotes = noteDuration * 1.30;
    delay(pauseBetweenNotes);
    // stop the tone playing:
    noTone(8);
  }
}

void loop() {
  // нет необходимости повторять мелодию
}

В первой строчке мы подключаем заголовочный файл pitches.h при помощи оператора #include. Далее создаётся массив из нот, а также массив из продолжительности проигрывания ноты. Потом идёт цикл, где для каждой ноты вычисляется его продолжительность и вызывается функция tone(), которая и воспроизводит нужный звук. Обратите внимание, что весь код находится в методе setup(), поэтому программа выполняется один раз.

Вот так мы быстро познакомились с новым устройством - пьезоизлучателем, а также научились извлекать мелодию.

Melody

Нашёл ещё один пример с пищалкой.

Пример использует вывод 8.


int speakerPin = 8;

int length = 15; // число нот
char notes[] = "ccggaagffeeddc "; // сохраняем ноты как массив символов
int beats[] = { 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 4 }; // массив временных промежутков
int tempo = 300;

void playTone(int tone, int duration) {
  for (long i = 0; i < duration * 1000L; i += tone * 2) {
    digitalWrite(speakerPin, HIGH);
    delayMicroseconds(tone);
    digitalWrite(speakerPin, LOW);
    delayMicroseconds(tone);
  }
}

void playNote(char note, int duration) {
  char names[] = { 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C' };
  int tones[] = { 1915, 1700, 1519, 1432, 1275, 1136, 1014, 956 };

  // play the tone corresponding to the note name
  for (int i = 0; i < 8; i++) {
    if (names[i] == note) {
      playTone(tones[i], duration);
    }
  }
}

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

void loop() {
  for (int i = 0; i < length; i++) {
    if (notes[i] == ' ') {
      delay(beats[i] * tempo); // rest
    } else {
      playNote(notes[i], beats[i] * tempo);
    }

    // pause between notes
    delay(tempo / 2); 
  }
}

02.Digital: tonePitchFollower

Ещё один простой пример File | Examples | 02.Digital | tonePitchFollower для извлечения звуков, который зависит от освещённости - вы можете проводить рукой над датчиком освещённости, создавая тем самым разные значения, которые передаются на динамик. В примере упоминается 9-омный динамик, но мы можем использовать и свой пьезоизлучатель.

Схема.

Piezo

Скетч.


void setup() {
  Serial.begin(9600);
}

void loop() {
  // read the sensor:
  int sensorReading = analogRead(A0);
  // print the sensor reading so you know its range
  Serial.println(sensorReading);
  // map the analog input range (in this case, 400 - 1000 from the photoresistor)
  // to the output pitch range (120 - 1500Hz)
  // change the minimum and maximum input numbers below depending on the range
  // your sensor's giving:
  int thisPitch = map(sensorReading, 400, 1000, 120, 1500);

  // play the pitch:
  tone(9, thisPitch, 10);
  delay(1);        // delay in between reads for stability
}
Реклама