Природу звука мы рассматривали на уроке 3.16 "Звуковые колебания". Теперь попробуем создать звук, используя Arduino. Для этого нам потребуется пьезоизлучатель. Пьезоизлучатель имеет большое сопротивление, поэтому его можно подключить непосредственно к выводу Arduino. Так как работу мы начнем с уже знакомой вам программы Blink:

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

void loop()
{
  digitalWrite(13, HIGH);
  delay(1000); // Wait for 1000 millisecond(s) - 1 секунда
  digitalWrite(13, LOW);
  delay(1000); // Wait for 1000 millisecond(s) - 1 секунда
}
подключим один вывод пьезоизлучателя к выводу 13, второй к общему проводу:



Ну и чтобы не только слышать, но и видеть что происходит - подключим осциллограф:



      После запуска программы, пьезоизлучатель будет издавать щелчки, а на экране мы увидим сигнал прямоугольной формы (меандр). Период сигнала T (время за которое происходит один цикл колебания), как и ожидалось 2 секунды, и действительно, в программе Blink у нас время ожидания, когда на выводе 13 установлена единица - 1 секунда и еще одна секунда, когда на выводе 13 установлен ноль. Так как период - величина обратная частоте, то частота таких колебаний будет: f=1/T. В нашем случае, f=1/2=0.5 колебаний в секунду, или 0,5 Гц. Эта частота лежит за границами воспринимаемого человеческим ухом диапазона, мы её не слышим, а щелчки пьезоизлучателя - это моменты перехода сигнала из 1 в 0 и обратно. Если бы сигнал менялся плавно (синусоидальный сигнал), мы бы вообще ничего не услышали.

Давайте увеличим частоту, ну скажем в сто раз, до 50 Гц. Период таких колебаний T=1/50=0.01 секунды или 10 миллисекунд.

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

void loop()
{
  digitalWrite(13, HIGH);
  delay(10); // Wait for 10 millisecond(s)
  digitalWrite(13, LOW);
  delay(10); // Wait for 10 millisecond(s)
}
После запуска программы будет слышен гул, а на экране осциллографа мы увидим, что форма сигнала не изменилась, но он стал быстрее, чаще менять свое значение.



Если период еще уменьшить в 10 раз, функция delay() примет минимальное значение в 1 миллисекунду, то мы получим сигнал частотой 500 Гц, тональный сигнал, который отлично будет слышно.

Чтобы получить сигнал еще больше частоты, скажем 5000 Гц (или 5 кГц), нам нужно еще в 10 раз уменьшить период, но функция delay() не может принимать значения меньше 1, поэтому воспользуемся функцией delayMicroseconds()
void setup()
{
  pinMode(13, OUTPUT);
}

void loop()
{
  digitalWrite(13, HIGH);
  delayMicroseconds(100); // Wait for 100 microsecond(s) - 0,1 секунды
  digitalWrite(13, LOW);
  delayMicroseconds(100); // Wait for 100 microsecond(s) - 0,1 секунды
}
После запуска мы услышим пронзительный писк, частотой 5 кГц.

Мы можем и дальше повышать частоту, но 20 кГц - это максимальная частота которую человек теоретически может услышать.

Аналогичным образом мы можем извлекать самые разные звуки, но есть более простой способ:

Функция tone(), noTone()

Функция tone() - генерирует на указанном выходе сигнал - прямоугольную "волну" (меандр), заданной частоты.

Синтаксис:
tone(pin, frequency, duration)
где pin - номер пина, на который будет выводиться частота; frequency - частота в Герцах; duration - длительность сигнала в миллисекундах. Длительность сигнала можно не указывать, но тогда сигнал будет генерироваться пока не будет вызвана функция noTone()

Функция noTone() - останавливает сигнал, генерируемый на выходе вызовом функции tone(). Если сигнал не генерировался, то вызов noTone() ни к чему не приводит.

Синтаксис:
noTone(pin)
где pin - номер пина, на который будет прекращен вывод сигнала;

Рассмотрим простой пример:
void setup()
{
  pinMode(13, OUTPUT);
}

void loop()
{
 tone(13, 440);
 delay(1000); 
 noTone(13);
 delay(1000); 
}


В этом примере функция tone(13, 440); вызывает генерацию сигнала частотой 440 Гц (нота Ля) на 13 выводе в течении 1 секунды (первая функция delay(1000);), затем команда noTone(13); отменяет генерацию сигнала на 13 выводе и после секундной паузы (вторая функция delay(1000);) после чего программа начнется с начала. После запуска программы вы услышите сигнал, напоминающий гудки в телефонной трубке.

Эту программу можно упростить, если задать длительность сигнала прямо в функции tone()
void setup()
{
  pinMode(13, OUTPUT);
}

void loop()
{
 tone(13, 440, 1000);
 delay(2000); 
}


Поэкспериментируйте с этими функциями, попробуйте сгенерировать все семь нот.

Арифметические операторы

= оператор присваивания

Присваивает переменной слева от оператора значение переменной или выражения, находящееся справа. Например:
int val;     // объявление переменной типа integer
val = 2;     // присваивание переменной val, значение 2.
Переменная слева от оператора присваивания (=) должна быть способна сохранить присваиваемое значение. Если оно выходит за диапазон допустимых значений, то сохраненное значение будет не верно.

Сложение, вычитание, умножение и деление

Операторы +, -, * и / соответственно, возвращают результат выполнения арифметических действий над двумя операндами. Возвращаемый результат будет зависеть от типа данных операндов, например, 9 / 4 возвратит 2, т.к. операнды 9 и 4 имеют тип int. Также следует следить за тем, чтобы результат не вышел за диапазон допустимых значений для используемого типа данных. Так, например, сложение 1 с переменной типа int и значением 32 767 возвратит -32 768. Если операнды имеют разные типы, то для вычислений будет использован тип с более "широким" диапазоном.

Синтаксис:
result = val1 + val2;
result = val1 - val2;
result = val1 * val2;
result = val1 / val2;
val1 + val2 - любые переменные или константы; result - возвращаемое значение.

% оператор

Возвращает остаток от деления одного целого (int) операнда на другой.

Синтаксис
result = dividend % divisor
dividend - делимое, divisor - делитель.

Например:
x = 7 % 5;   // x имеет значение 2
x = 9 % 5;   // x имеет значение 4
x = 5 % 5;   // x имеет значение 0
x = 4 % 5;   // x имеет значение 4
Далее...


Copyright © R9AL 2020 Все права защищены

Рейтинг@Mail.ru Яндекс цитирования