Урок 4. Терменвокс


В этом эксперименте мы имитируем действие музыкального инструмента терменвокс: изменяем высоту звучания бесконтактным путем, больше или меньше закрывая от света фоторезистор.

Оригинальный инструмент был изобретён ещё в 1920 году, Львом Сергеевичем Терменом, человеком с непростой и насыщенной судьбой. А сейчас мы имеем возможность воспроизвести изобретение с помощью нехитрой электроники.

Список деталей для эксперимента

Принципиальная схема

Схема на макетке

Обратите внимание

  • В данной схеме мы используем резистор нового номинала, посмотрите таблицу маркировки, чтобы найти резистор на 10 кОм или воспользуйтесь мультиметром
  • Полярность фоторезистора, как и обычного резистора, не играет роли. Его можно устанавливать любой стороной
  • В данном упражнении мы собираем простой вариант схемы включения пьезодинамика
  • Полярность пьезопищалки роли не играет: вы можете подключать любую из ее ножек к земле, любую к порту микроконтроллера
  • На Arduino Uno использование функции tone мешает использованию ШИМ на 3-м и 11-м портах. Зато можно подключить ее к одному из них
  • Вспомните как устроен делитель напряжения: фоторезистор помещается в позицию R2 — между аналоговым входом и землей. Так мы получаем резистивный фотосенсор.

Скетч

  1.     // даём имена для пинов с пьезопищалкой (англ. buzzer) и фото-
    
  2.     // резистором (англ. Light Dependent Resistor или просто LDR)
    
  3.     #define BUZZER_PIN  3
    
  4.     #define LDR_PIN     A0
    
  5.  
  6.     void setup(
    )
    
  7.     {
    
  8.       // пин с пьезопищалкой — выход...
    
  9.       pinMode(BUZZER_PIN, OUTPUT)
    ;
    
  10.  
  11.       // ...а все остальные пины являются входами изначально,
    
  12.       // всякий раз при подаче питания или сбросе микроконтроллера.
    
  13.       // Поэтому, на самом деле, нам совершенно необязательно
    
  14.       // настраивать LDR_PIN в режим входа: он и так им является
    
  15.     }
    
  16.  
  17.     void loop(
    )
    
  18.     {
    
  19.       int val, frequency;
    
  20.  
  21.       // считываем уровень освещённости так же, как для
    
  22.       // потенциометра: в виде значения от 0 до 1023.
    
  23.       val = analogRead(LDR_PIN)
    ;
    
  24.  
  25.       // рассчитываем частоту звучания пищалки в герцах (ноту),
    
  26.       // используя функцию проекции (англ. map). Она отображает
    
  27.       // значение из одного диапазона на другой, строя пропорцию.
    
  28.       // В нашем случае [0; 1023] -> [3500; 4500]. Так мы получим
    
  29.       // частоту от 3,5 до 4,5 кГц.
    
  30.       frequency = map(val, 0, 1023, 3500, 4500
    )
    ;
    
  31.  
  32.       // заставляем пин с пищалкой «вибрировать», т.е. звучать
    
  33.       // (англ. tone) на заданной частоте 20 миллисекунд. При
    
  34.       // cледующих проходах loop, tone будет вызван снова и снова,
    
  35.       // и на деле мы услышим непрерывный звук тональностью, которая
    
  36.       // зависит от количества света, попадающего на фоторезистор
    
  37.       tone(BUZZER_PIN, frequency, 20
    )
    ;
    
  38.     }
    

Пояснения к коду

  • Функция map(value, fromLow, fromHigh, toLow, toHigh) возвращает целочисленное значение из интервала [toLow, toHigh], которое является пропорциональным отображением содержимого value из интервала [fromLow, fromHigh]
  • Верхние границы map не обязательно должны быть больше нижних и могут быть отрицательными. К примеру, значение из интервала [1, 10] можно отобразить в интервал [10,-5]
  • Если при вычислении значения map образуется дробное значение, оно будет отброшено, а не округлено
  • Функция map не будет отбрасывать значения за пределами указанных диапазонов, а также масштабирует их по заданному правилу.
  • Если вам нужно ограничить множество допустимых значений, используйте функцию constrain(value, from, to), которая вернет:

    value, если это значение попадает в диапазон [from, to]
    from, если value меньше него
    to, если value больше него
  • Функция tone(pin, frequency, duration) заставляет пьезопищалку, подключенную к порту pin, издавать звук высотой frequency герц на протяжении duration миллисекунд
  • Параметр duration не является обязательным. Если его не передать, звук включится навсегда. Чтобы его выключить, вам понадобится функция noTone(pin). Ей нужно передать номер порта с пищалкой, которую нужно выключить
  • Одновременно можно управлять только одной пищалкой. Если во время звучания вызвать tone для другого порта, ничего не произойдет.
  • Вызов tone для уже звучащего порта обновит частоту и длительность звучания

Вопросы для проверки себя

  • Каким сопротивлением должен обладать фоторезистор, чтобы на аналоговый вход было подано напряжение 1 В?
  • Можем ли мы регулировать яркость светодиода, подключенного к 11-му порту, во время звучания пьезопищалки?
  • Что изменится в работе терменвокса, если заменить резистор на 10 кОм резистором на 100 кОм? Попробуйте ответить без эксперимента. Затем отключите питание, замените резистор и проверьте.
  • Каков будет результат вызова map(30,0,90,90,-90)?
  • Как будет работать вызов tone без указания длительности звучания?
  • Можно ли устроить полифоническое звучание с помощью функции tone?

Задания для самостоятельного решения

  1. Уберите из программы чтение датчика освещенности и пропищите азбукой Морзе позывной SOS: три точки, три тире, три точки
  2. Измените код программы так, чтобы с падением освещенности звук становился ниже (например, падал от 5 кГц до 2,5 кГц)
  3. Измените код программы так, чтобы звук терменвокса раздавался не непрерывно, а 10 раз в секунду с различимыми паузами
     
Теги: 
Источник: 

wiki.amperka.ru