Эксперимент 4. Терменвокс
← Светильник с управляемой яркостью | Оглавление | Ночной светильник →
В этом эксперименте мы имитируем действие музыкального инструмента терменвокс: изменяем высоту звучания бесконтактным путем, больше или меньше закрывая от света фоторезистор.
Оригинальный инструмент был изобретён ещё в 1920 году, Львом Сергеевичем Терменом, человеком с непростой и насыщенной судьбой. А сейчас мы имеем возможность воспроизвести изобретение с помощью нехитрой электроники.
Прочтите перед выполнением
Список деталей для эксперимента
- 1 плата Arduino Uno
- 1 беспаечная макетная плата
- 6 проводов «папа-папа»
- 1 резистор номиналом 10 кОм
Принципиальная схема
Схема на макетке
Обратите внимание
- В данной схеме мы используем резистор нового номинала, посмотрите таблицу маркировки, чтобы найти резистор на 10 кОм или воспользуйтесь мультиметром
- Полярность фоторезистора, как и обычного резистора, не играет роли. Его можно устанавливать любой стороной
- В данном упражнении мы собираем простой вариант схемы включения пьезодинамика
- Полярность пьезопищалки роли не играет: вы можете подключать любую из ее ножек к земле, любую к порту микроконтроллера
- На Arduino Uno использование функции
tone
мешает использованию ШИМ на 3-м и 11-м портах. Зато можно подключить ее к одному из них - Вспомните как устроен делитель напряжения: фоторезистор помещается в позицию R2 — между аналоговым входом и землей. Так мы получаем резистивный фотосенсор.
Скетч
- p040_thermenvox.ino
// даём имена для пинов с пьезопищалкой (англ. 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 раз в секунду с различимыми паузами
← Светильник с управляемой яркостью | Оглавление | Ночной светильник →