Amateur Radio Station R9AL

      Природу звука мы рассматривали на уроке 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 2021 Все права защищены

Рейтинг@Mail.ru