Терменвокс из фоторезистора

В общем случае для сборки терменвокса нужен бесконтактный сенсор, показания которого используются для изменения частоты звучания динамика. В оригинальном инструменте, построенным Львом Сергеевичем Терменом, в качестве сенсора использовался колебательный контур с ёмкостью, величина которой менялась, если поднести к нему руку. В нашем эксперименте вместо колебательного контура будет использован фоторезистор. Поднося руку ближе или убирая ее дальше от фоторезистора можно регулировать количество падающего на него света. В свою очередь, изменение степени освещенности фоторезистора приведет к изменению сопротивления, которое будет зафиксировано АЦП. Данные, полученные с АЦП, используются для управления частотой звучания баззера.

Калибровка фоторезистора

Для того, чтобы все работало корректно, необходимо откалибровать фоторезистор, зафиксировав значения датчика когда рука находится в крайних положениях: ближней и дальней точке.
Соберем макет согласно рисунку и напишем программу для калибровки освещенности фоторезистора. Программа будет выводить данные, полученные от АЦП в терминал.

#define PROTORESISTOR_PIN A3
//Переменная для хранения значения АЦП
int value = 0;
void setup() {
  pinMode(PROTORESISTOR_PIN, INPUT);
  //Открытие соединения на скорости 9600
  Serial.begin(9600);
}

void loop() {
  //Читаем результат, полученный от АЦП
  value = analogRead(PROTORESISTOR_PIN);
  //Отправляем данные в терминал.
  Serial.println(value);
  delay(200);
}

Загрузите программу в контроллер и, открыв терминал, проведите калибровку, заслоняя рукой фоторезистор от источника света. Наблюдая за результатами измерений можно заметить, что значение, получаемое от АЦП, максимально в нижней точке (у нас получилось примерно 890). По мере увеличения расстояния между фоторезистором и рукой значение АЦП уменьшается, пока рука не перестанет влиять на освещенность фоторезистора. Очевидно, что минимальное значение АЦП также зависит от уровня освещенности помещения и распределения источников света. В нашем случае минимальное значение АЦП получилось равным 400.

Прошивка

Теперь зная диапазон изменения данных от фоторезистора, напишем программу так, чтобы частота звучания буззера изменялась от 3000 Гц до 7000 Гц. Изменение частоты должно быть пропорционально значению АЦП, характеризующему сопротивление фоторезистора.

#define PROTORESISTOR_PIN A3
#define BUZZER_PIN 9
#define VALUE_MIN 400
#define VALUE_MAX 890
#define FREQ_MIN 3000

//Частота звука от 3000 до 7000 Гц
int value = 0;
int frequency = 3000;

void setup() {
  pinMode(PROTORESISTOR_PIN, INPUT);
  pinMode(BUZZER_PIN, OUTPUT);
}
void loop() {
  //Читаем результат измерения АЦП
  value = analogRead(PROTORESISTOR_PIN);
  frequency = map(
                value,
                VALUE_MIN, VALUE_MAX,
                FREQ_MIN, FREQ_MAX
              );
  //Меняем частоту звучания баззера
  tone(BUZZER_PIN, frequency);
  delay(50);
}