Arduino:Примеры/Tone2

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Звук, реагирующий на изменяющуюся информацию [1]

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

Необходимое оборудование

Цепь

Подсоедините один контакт динамика к 9-ому цифровому контакту (через 100-омовый резистор), а другой – к «земле» (GND). Фоторезистор подсоедините к 5-вольтовому напряжению, а также к 0-ому аналоговому контакту и к «земле» (через 4,7-кОм резистор).

Схема

Код

Для этого примера требуется очень простой код. Просто возьмем входные данные с аналогового контакта и разобьем так, чтобы превратить их в нотную гамму. Люди могут слышать звуки частотой от 20 до 20000 Гц, но для этого скетча подойдет и диапазон от 120 до 1500 Гц.

Для разбиения входных данных нужно знать их диапазон, и в построенной нами цепи входные данные варьируются от 400 до 1000. Чтобы преобразовать эти данные (идущие от сенсора) в звуковой диапазон, воспользуемся функцией map().

/*
 Звук, реагирующий на изменяющуюся информацию

 Проигрывает звук, который меняется в зависимости от изменения данных на входном аналоговом контакте.
 
 Цепь:
 * 8-омовый динамик на 9-ом цифровом контакте
 * фоторезистор, подсоединенный 5 вольтам и 0-ому аналоговому контакту
 * 4700-омовый резистор, подсоединенный к «земле» и 0-ому аналоговому контакту
 
 Создан 21 января 2010,
 модифицирован 31 мая 2012 Томом Иго (Tom Igoe) по совету Майкла Флинна (Michael Flynn)

Этот пример кода не защищен авторским правом.
 
 http://arduino.cc/en/Tutorial/Tone2
 
 */


void setup() {
  // инициализируем последовательную передачу данных (только в целях отладки):
  Serial.begin(9600);
}

void loop() {
  // считываем данные с сенсора (т.е. с фоторезистора):
  int sensorReading = analogRead(A0);
  // выводим на Serial Monitor данные от сенсора, чтобы узнать их диапазон:
  Serial.println(sensorReading);
  // сопоставляем диапазон входных аналоговых данных
  // (в данном случае это 400-1000 от фоторезистора)
  // с выходными данными, т.е. со звуковым диапазоном (120-1500 Гц);
  // меняем максимальное и минимальное значения входных данных
  // в зависимости от данных, «пойманных» фоторезистором:
  int thisPitch = map(sensorReading, 400, 1000, 120, 1500);

  // проигрываем звук:
  tone(9, thisPitch, 10);
  delay(1);        // делаем задержку между считываниями – для стабильности программы
}

См.также

  1. array
  2. for
  3. tone()
  4. map()
  5. Tone
  6. Simple keyboard
  7. Tone4

Внешние ссылки