====== Эксперимент 4. Терменвокс ====== [[конспект-arduino:светильник-с-управляемой-яркостью|← Светильник с управляемой яркостью]] | [[конспект-arduino:|Оглавление]] | [[конспект-arduino:ночной-светильник|Ночной светильник →]] В этом эксперименте мы имитируем действие музыкального инструмента терменвокс: изменяем высоту звучания бесконтактным путем, больше или меньше закрывая от света фоторезистор. Оригинальный инструмент был изобретён ещё в 1920 году, [[http://ru.wikipedia.org/wiki/%D0%A2%D0%B5%D1%80%D0%BC%D0%B5%D0%BD,_%D0%9B%D0%B5%D0%B2_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87|Львом Сергеевичем Терменом]], человеком с непростой и насыщенной судьбой. А сейчас мы имеем возможность воспроизвести изобретение с помощью нехитрой электроники. ===== Прочтите перед выполнением ===== * [[конспект-arduino:пьезодинамик|Пьезодинамик]] ===== Список деталей для эксперимента ===== * 1 плата [[amp>product/arduino-uno|Arduino Uno]] * 1 беспаечная [[amp>collection/breadboards|макетная плата]] * 1 [[amp>product/piezo-buzzer|пьезопищалка]] * 6 проводов [[amp>product/wire-mm|«папа-папа»]] * 1 [[amp>product/resistor-10k|резистор]] номиналом 10 кОм * 1 [[amp>product/ldr|фоторезистор]] ===== Принципиальная схема ===== {{ :конспект-arduino:4_scheme.svg.png?nolink& |}} ===== Схема на макетке ===== {{ :конспект-arduino:4_bread.svg.png?nolink& |}} ===== Обратите внимание ===== * В данной схеме мы используем резистор нового номинала, посмотрите [[резистор#цветовая_кодировка_резисторов|таблицу маркировки]], чтобы найти резистор на 10 кОм или воспользуйтесь мультиметром * Полярность фоторезистора, как и обычного резистора, не играет роли. Его можно устанавливать любой стороной * В данном упражнении мы собираем простой вариант схемы включения [[конспект-arduino:пьезодинамик|пьезодинамика]] * Полярность пьезопищалки роли не играет: вы можете подключать любую из ее ножек к земле, любую к порту микроконтроллера * На Arduino Uno использование функции ''tone'' мешает использованию ШИМ на 3-м и 11-м портах. Зато можно подключить ее к одному из них * Вспомните как устроен [[конспект-arduino:делитель-напряжения|делитель напряжения]]: фоторезистор помещается в позицию R2 — между аналоговым входом и землей. Так мы получаем резистивный фотосенсор. ===== Скетч ===== // даём имена для пинов с пьезопищалкой (англ. buzzer) и фото- // резистором (англ. Light Dependent Resistor или просто LDR) #define BUZZER_PIN 3 #define LDR_PIN A0 void setup() { // пин с пьезопищалкой — выход... pinMode(BUZZER_PIN, OUTPUT); // ...а все остальные пины являются входами изначально, // всякий раз при подаче питания или сбросе микроконтроллера. // Поэтому, на самом деле, нам совершенно необязательно // настраивать LDR_PIN в режим входа: он и так им является } void loop() { int val, frequency; // считываем уровень освещённости так же, как для // потенциометра: в виде значения от 0 до 1023. val = analogRead(LDR_PIN); // рассчитываем частоту звучания пищалки в герцах (ноту), // используя функцию проекции (англ. map). Она отображает // значение из одного диапазона на другой, строя пропорцию. // В нашем случае [0; 1023] -> [3500; 4500]. Так мы получим // частоту от 3,5 до 4,5 кГц. frequency = map(val, 0, 1023, 3500, 4500); // заставляем пин с пищалкой «вибрировать», т.е. звучать // (англ. tone) на заданной частоте 20 миллисекунд. При // cледующих проходах loop, tone будет вызван снова и снова, // и на деле мы услышим непрерывный звук тональностью, которая // зависит от количества света, попадающего на фоторезистор tone(BUZZER_PIN, frequency, 20); } ===== Пояснения к коду ===== * Функция ''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''? ===== Задания для самостоятельного решения ===== - Уберите из программы чтение датчика освещенности и пропищите азбукой Морзе позывной SOS: три точки, три тире, три точки - Измените код программы так, чтобы с падением освещенности звук становился ниже (например, падал от 5 кГц до 2,5 кГц) - Измените код программы так, чтобы звук терменвокса раздавался не непрерывно, а 10 раз в секунду с различимыми паузами ---- [[конспект-arduino:светильник-с-управляемой-яркостью|← Светильник с управляемой яркостью]] | [[конспект-arduino:|Оглавление]] | [[конспект-arduino:ночной-светильник|Ночной светильник →]]