Сегодня я расскажу и покажу, как в домашних условиях повторить эффект ультразвуковой левитации своими руками.
В предыдущих статьях раз, два. Я демонстрировал псевдо левитацию. В этот раз все по настоящему. Начну с теории.
Звуковые колебания.
Что бы понять всю суть эффекта левитации, нужно понять, что такое звуковая волна и стоячая волна.
По этому я начну с них. Акустическая волна распространяется во все стороны и состоит из двух полуволн, положительной и отрицательной. Положительная полуволна представляет из себя зону сжатия или повышенного давления, в дальнейшем я буду ее называть компрессионная, а отрицательная полуволна зону разряжения, назовем ее декомпрессионная.
На практике это выглядит так: Диффузор динамика при движении наружу создает компрессию, а при движении во внутрь декомпрессию. На изображении это наглядно показано.
Максимальная сила волны создается около диффузора динамической головки и в процессе отдаления от излучателя постепенно теряет свою мощность, чем дальше от динамика тем она слабее.
Стоячая волна — это волна, которая образуется при наложении двух встречных, совпадающими по фазам и с одинаковой частотой волн. Если обычная волна теряет свою мощность в процессе распространения в пространстве, то стоячие волны на не больших расстояниях образуют узлы с примерно равной мощностью. Достигается это за счет складывания разнонаправленных волн. Слабеющая волна усиливается за счет встречной волны. Что бы понять как это происходит, посмотрите на изображение ниже. Серым цветом выделены узлы или в нашем случаи полки из стоячих волн. На этих полках(узлах) и удерживаются предметы.
Длинна волны — это скорость звука разделенная на частоту колебаний. При температуре 20°C и влажности воздуха 50%, звук распространяется в такой среде со скоростью 340 м/с. Резонансная частота колебаний нашего пьезоизлучателя примерно 40 000 Гц. В итоге получаем длину волны 340000 мм / 40000 Гц = 8,5 мм. Длина стоячей волны будет такой же 8,5 мм.
Излучатели можно располагать на разном расстоянии друг от друга, но оно всегда должно быть кратным длине волны. Чем меньше расстояние между излучателями, тем мощнее узлы стоячей волны. Чем больше пространства между акустическими трансмиттерами, тем больше узлов между ними, но слабеет мощность узлов и наоборот. Так же нужно понимать, что для удержания большого количества предметов в узлах волн и на большем отдалении между ультразвуковыми излучателями, потребуются более мощные пьезо головки. Например от автомобильных парковочных радаров, или от бытовых увлажнителей. В этой статье я рассматриваю самый доступный и бюджетный ультразвуковой излучатель. Который можно выпаять из дальномера HC-SR04
Схема подключения — я использовал Ардуино нано и драйвер моторов MX1508, можно было бы обойтись генератором NE555, а в качестве усилителя для излучателей использовать микросхему MAX232 которая установлена на дальномере HC-SR04, но я для себя избрал более простой путь, который сэкономил мне время. Так как на сборку акустического левитрона у меня ушло не более 5 минут. Соединения я произвел набором проводов dupont. Покупал все в магазине duino.ru
Описание скетча Ардуино.
Код ничего особенного из себя не представляет. Все сводится к настройке таймера и дерганий ногами порта D Arduino. Для этого переводим Timer1 в режим сброса при совпадении(CTC) и теперь при совпадении значений регистра счета TCNT1 с заданным числом в регистре сравнения OCR1A, будет срабатывать прерывание, в обработчике которого выполняется инверсия всего порта D. После чего счетный регистр обнулитcя и после выхода из обработчика процесс счета запустится по новой.
Нужное нам значение регистра OCR1A рассчитывается следующим образом: так как делитель в регистре TCCR1B выключен, то мы берем частоту тактового генератора 16 000 000 Гц и делим на требуемую нам частоту срабатывания прерывания 80 000 Гц, в результате получаем число 200, это и будет наше значение для регистра OCR1A.
Почему 80 кГц, а не 40 кГц, спросите Вы? Потому, что период в обработчике формируется за два срабатывания прерывания. При первом срабатывании на выходах формируется D3=0 и D4=1, а при втором D3=1 и D4=0.
Код для Arduino:
volatile uint8_t portD3_D4 = 8; // единица на D3 и ноль на D4
void setup()
{
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
// Инициализируем Timer1
TCNT1 = 0;
TCCR1A = 0;
TCCR1B = 0;
OCR1A = 199; // Установить регистр сравнения 16 МГц / 80 кГц = 200
TCCR1B = (1 << WGM12)|(1 << CS10); //Устанавливаем режим CTC, без делителя
TIMSK1 |= (1 << OCIE1A); // Включить прерывания таймера
}
void loop () {}
ISR (TIMER1_COMPA_vect) // Обработчик прерывания по таймеру
{
PORTD = portD3_D4; // Отправляем значения в порт
portD3_D4 = 255-portD3_D4;// Инвертируем значения для следующей отправки в порт
}