Световой терменвокс.

18 марта 2013, 13:07

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

У терменвокса две антенны, при изменении положения рук исполнителя относительно них  изменяется ёмкость колебательного контура антенн. Эти антенны подключены к аналоговой схеме, которая создает звук. Одна антенна отвечает за частоту звука, а вторая за его громкость. Arduino, конечно же, не может воспроизвести загадочные звуки этого инструмента, но можно эмулировать их с помощью функции tone(). На рисунках ниже можно увидеть разницу между модуляциями произведёнными функцией analogWrite() и функцией tone(). Эти модуляции заставляют воспроизводящие устройства (такие как наушники, колонки или пьезоэлементы) издавать различые звуки.

Большую часть времени сигнал равен нулю, но частота такая же как и в ШИМ 150 PWM 50: analogWrite(50)
Большую часть времени сигнал равен единице, но частота такая же как и в ШИМ 50 PWM 150: analogWrite(50)
Рабочий цикл составляет 50% (половину времени сигнал есть, половину времени нет), но частота изменилась. TONE 440: tone(9,440)
Рабочий цикл такой же как и в Tone 440, но частота больше вдвое. TONE 880: tone(9,440)

Вместо определения ёмкости с помощью Arduino, мы будем использовать фоторезистор, чтобы определять количество света. Двигая руки над фоторезистором, мы будем менять количество света, которое на него попадает, так же как проекте «Лампа хамелеон». Изменение напряжения на аналоговом входе будет определять ноту какой частоты играть.

Фоторезистор к Arduino мы подключим используя схему делителя напряжения. Ранее мы уже заметили, что когда считываем напряжение с этой схемы используя функцию analogRead(), получаемые значения не всегда полностью покрывают диапазон от 0 до 1023 (максимальный диапазон, который может быть считан с аналогового входа). Резистор фиксированного сопротивления, подсоединённый к «земле», ограничивает считываемые значения снизу, а максимальная яркость освещения — сверху. Вместо того, чтобы ограничивать диапазон возможных значений, можно откалибровать сенсор, получив максимальное и минимальное значения, и соотнести их с частотой извлекаемого звука с помощью функции map() (как мы уже делали), таким образом, диапазон частот, которые будет издавать наш терменвокс, станет максимально возможным. Так же к нашему сенсору добавится дополнительная «фича»: куда бы мы не перенесли схему, например, в более темное помещение, она будет автоматически подстраиваться.

Итак , вот схема, которую мы будем собирать:

Собранный макет:

Пишем программу, для управления терменвоксом:

int sVal;//Значение на фоторезисторе
int sLow=1023; //минимальное значение фоторезистора
int sHigh=0;//максимальное значение фоторезистора
int ledPin=13;//встроенный светодиод

void setup(){
  pinMode(ledPin,OUTPUT);
  digitalWrite(ledPin,HIGH); //начало калибровки
  while(millis()<5000) { //калибруем в течении 5 секунд
    sVal=analogRead(A0);
    if (sVal>sHigh){
      sHigh=sVal;
    }
    if(sVal<sLow){
      sLow=sVal;
    }
  }
  digitalWrite(ledPin,LOW);//окончание калибровки
}

void loop(){
  int freq;
  sVal=analogRead(A0);//считываем значение с фоторезистора
  freq=map(sVal,sLow,sHigh,50,4000);//приводим значение
  tone(8,freq,20);//извлекаем звук
  delay(10);
}

Небольшой комментарий к программе:

Объявления переменных:

sVal — сюда будем считывать значение с фоторезистора;

sLow и sHigh — максимальное и минимальное значения, которые можно прочитать с фоторезистора. В начале программы они соответственно равны 1023 (минимальное) и 0 (максимальное). В процессе калибровки в этих переменных появятся реальные значения минимума и максимума.

ledPin — пин со светодиодом, при начале калибровки включим его, по окончании выключим.

Инициализация:

Включаем светодиод. Втечении первых пяти секунд, в цикле считывается значение с фоторезистора, если оно меньше уже зафиксированного минимального значения (первоначально 1023), то записываем его в минимальное, если оно больше уже зафиксированного максимального значения (первоначально 0), то записываем его в максимальное. Используем функцию mills(), для определения времени, прошедшего с момента включения Arduino.

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

Вот что вышло:

Настоящий терменвокс позволяет управлять не только частотой звука, но и его громкостью. В этом примере мы можем менять только частоту. Если подсоединить потенциоментр последовательно с пьезоэлементом, то звук можно будет регулировать с помощью его ручки или можно поставить второй фоторезистор. Мы решили подключить потенциометр.

Схема и фото макета ниже, а вот видео:

Популярное