Читачі дізнаються, як створити світловий терменвокс на Arduino, використовуючи фоторезистор і п’єзоелемент. У статті пояснюється принцип роботи традиційного терменвоксу та його аналог на базі Arduino, де зміна освітленості впливає на частоту звуку. Описано процес калібрування сенсора, використання функції tone() для генерації звуку та принцип роботи напівпровідникового фоторезистора у схемі.
Терменвокс – це інструмент, який видає звуки на основі рухів рук музиканта навколо інструменту. Ви, напевно, чули таке в страшних фільмах. Терменвокс визначає, де знаходяться руки виконавця відносно двох антен, зчитуючи зміну ємності на антенах.
Ці антени підключені до аналогової схеми, яка створює звук. Одна антена контролює частоту звуку, а друга – гучність. Хоча Arduino не може точно відтворити таємничі звуки цього інструменту, їх можна емулювати за допомогою функції tone(). Нижче показано різницю між імпульсами, випромінюваними analogWrite() і tone(). Це дозволяє такому перетворювачу, як динамік або п’єзо, рухатися вперед і назад з різною швидкістю.




Замість вимірювання ємності за допомогою Arduino ви використовуватимете фоторезистор для визначення кількості світла. Переміщаючи руки над датчиком, ви змінюєте кількість світла, що падає на лицьову поверхню фоторезистора, як ви робили в проекті 4. Зміна напруги на аналоговому штифті визначатиме, яку ноту частоти грати.
Ви підключите фоторезистори до Arduino за допомогою схеми дільника напруги, як це було в проекті 4. Ви, мабуть, помітили в попередньому проекті, що коли ви читаєте цю схему за допомогою analogRead(), ваші показники не коливаються від 0 до 1023. Постійний резистор, підключений до землі, обмежує нижню межу діапазону, а яскравість вашого світла обмежує верхню межу.
Замість того, щоб погоджуватися на обмежений діапазон, ви будете калібрувати показання датчика, отримуючи високі та низькі значення, зіставляючи їх із звуковими частотами за допомогою функції map(), щоб отримати якомога більший діапазон від вашого терменвокс. Це матиме додаткову перевагу коригування показань датчика кожного разу, коли ви переміщуєте свою схему в нове середовище, наприклад кімнату з іншими умовами освітлення.

П’єзо — це невеликий елемент, який вібрує, коли отримує електрику. Коли він рухається, він витісняє повітря навколо себе, створюючи звукові хвилі.
Традиційні терменвокси можуть регулювати частоту та гучність звуку. У цьому прикладі ви зможете керувати лише частотою. Хоча ви не можете контролювати гучність через Arduino, можна змінити рівень напруги, що надходить до динаміка, вручну. Що станеться, якщо встановити потенціометр послідовно з контактом 8 і п’єзо? А як щодо іншого фоторезистора?
На макетній платі підключіть зовнішні лінії шини до живлення та заземлення.
Візьміть п’єзо, підключіть один кінець до землі, а інший до цифрового контакту 8 на Arduino.
Розмістіть фоторезистор на макетній платі, підключивши один кінець до 5 В. Підключіть інший кінець до контакту 0 аналогового входу Arduino та до заземлення через резистор на 10 кОм. Ця схема така ж, як і схема дільника напруги в проекті 4.
Створіть змінні для калібрування датчика. Створіть змінну для зберігання значення analogRead() з фоторезистора. Далі створіть змінні для високих і низьких значень. Ви збираєтеся встановити початкове значення змінної sensorLow рівним 1023, а значення змінної sensorHigh — 0. Коли ви вперше запустите програму, ви порівняєте ці числа з показаннями датчика, щоб знайти реальне максимальне та мінімальне значення.
Назвіть константу для калібрувального індикатора. Створіть константу під назвою ledPin. Ви використовуватимете це як індикатор того, що датчик завершив калібрування. Для цього проекту використовуйте вбудований світлодіод, підключений до контакту 13.
Встановіть напрямок цифрового штифта та високо поверніть його. У setup() змініть pinMode() ledPin на OUTPUT і ввімкніть світло.
Використовуйте цикл while() для калібрування. Наступні кроки відкалібрують максимальне та мінімальне значення датчика. Ви будете використовувати оператор while(), щоб запустити цикл протягом 5 секунд. Цикли while() виконуються, доки не буде виконано певну умову. У цьому випадку ви збираєтеся використовувати функцію millis(), щоб перевірити поточний час. millis() повідомляє, як довго Arduino працював з моменту останнього ввімкнення чи скидання.
Порівняйте значення датчиків для калібрування. У циклі ви прочитаєте значення датчика; якщо значення менше, ніж sensorLow (спочатку 1023), ви оновите цю змінну. Якщо воно більше, ніж sensorHigh (спочатку 0), воно оновлюється.
Вказує на завершення калібрування. Коли пройде 5 секунд, цикл while() завершиться. Вимкніть світлодіод, підключений до контакту 13. Ви будете використовувати щойно записані високі та низькі значення датчика для масштабування частоти в основній частині вашої програми.
int sensorValue;
int sensorLow = 1023;
int sensorHigh = 0;
const int ledPin = 13;
void setup() {
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, HIGH);
while (millis() < 5000) {
sensorValue = analogRead(A0);
if (sensorValue > sensorHigh) {
sensorHigh = sensorValue;
}
if (sensorValue < sensorLow) {
sensorLow = sensorValue;
}
}
digitalWrite(ledPin, LOW);
}
while()<br />arduino.cc/while
Зчитайте та збережіть значення датчика. У loop() прочитайте значення на A0 і збережіть його в sensorValue.
Зіставте значення датчика на частоту. Створіть змінну з іменем pitch. Значення кроку буде зіставлено з sensorValue. Використовуйте sensorLow і sensorHigh як межі для вхідних значень. Для початкових значень для виведення спробуйте від 50 до 4000. Ці числа встановлюють діапазон частот, які генеруватиме Arduino.
Грайте на частоті. Потім викличте функцію tone(), щоб відтворити звук. Потрібно три аргументи: на якому контакті відтворювати звук (у цьому випадку на контакті 8), на якій частоті відтворювати (визначається змінною висоти) і як довго відтворювати ноту (спробуйте почати з 20 мілісекунд). Потім викличте delay() на 10 мілісекунд, щоб дати звуку деякий час для відтворення.
Коли ви вперше вмикаєте Arduino, у вас є 5-секундне вікно для калібрування датчика. Для цього рухайте рукою вгору та вниз над фоторезистором, змінюючи кількість світла, що доходить до нього. Чим ближче ви відтворюєте рухи, які плануєте використовувати під час гри на інструменті, тим краще буде калібрування.
Через 5 секунд калібрування буде завершено, і світлодіод на Arduino вимкнеться. Коли це станеться, ви повинні почути певний шум від п’єзо! Оскільки кількість світла, що падає на датчик, змінюється, змінюється і частота, яку відтворює п’єзо.
void loop() {
sensorValue = analogRead(A0);
int pitch =
map(sensorValue,sensorLow,sensorHigh, 50, 4000);
tone(8,pitch,20);
delay(10);
}
Діапазон у функції map(), яка визначає висоту звуку, досить широкий, спробуйте змінити частоти, щоб знайти ті, які правильно підходять для вашого музичного стилю.
Функція tone() працює дуже подібно до ШІМ у analogWrite(), але з однією суттєвою відмінністю. У analogWrite() частота фіксована; ви змінюєте співвідношення імпульсів у цей період часу, щоб змінити робочий цикл. За допомогою tone() ви все ще надсилаєте імпульси, але змінюєте їх частоту. tone() завжди пульсує з робочим циклом 50% (половину часу висновок високий, іншу половину часу низький).
Функція tone() дає вам можливість генерувати різні частоти, коли вона пульсує динаміком або п’єзо. Використовуючи датчики в схемі дільника напруги, ви, ймовірно, не отримаєте повний діапазон значень між 0-1023. За допомогою калібрування датчиків можна зіставити ваші вхідні дані з корисним діапазоном.