概要
Make:Magazine のサイトに紹介されている記事を再現してみる。周波数の同じ2つの超音波を干渉させ、生じた定在波の節に何かを浮かせる。
紙片を超音波浮揚させている様子
手順
- とにかく何らかの方法で周波数40 kHz、デューティ50%の相補パルスを生成し、その相補パルスで2つの超音波スピーカーを駆動する。
- 超音波スピーカー同士を対面させて定在波を立てる。
- 生じた定在波の節に何かを浮かせる。節は半波長(約4 mm)おきに生じる。超音波スピーカー同士の距離は1波長の整数倍にした。
相補パルスを生成して超音波スピーカーを駆動する方法
マイコンとモータードライバーとを使ったが方法は何でもよい。反射板を利用して定在波を立てるのであれば超音波スピーカーは片側だけでよい。市販の「超指向性 超音波スピーカーキット」「パラメトリック・スピーカー実験キット」などを使えばもっと安定した強い定在波が容易に立てられる。

下のコードは参考記事(Arduino Nanoを使用)のコードを真似たものである。Atmel Studio 7でビルドした。
for_ATtiny13A.c
// ヒューズのCKDIV8ビットは解除しておく。
// クロックは内蔵9.6 MHzを使う。
#include <avr/io.h>
#include <avr/interrupt.h>
ISR(TIM0_COMPA_vect){
	PORTB ^= 0b11; // コンペアマッチするたびにPB1:0の出力をトグルする。
}
int main(){
	DDRB  = 0b11; // PB1:0からパルスを出力することにする。
	PORTB = 0b01; // 最初にPB1とPB0とのロジックを相補関係にしておく(だから0b10でもよい)。
	TCCR0A = 1 << WGM01;  // CTCモード
	TCCR0B = 1 << CS00;   // クロックを分周せずにカウント
	OCR0A  = 114;         // コンペア値(この値を調整して周波数を40 kHzにする)。計算上は(9.6MHz/80kHz)-1 = 119。
	TIMSK0 = 1 << OCIE0A; // コンペアマッチ割り込みを有効化
	sei();
	while(1);
	return 0;
}
このコードを実行すると、マイコンから下のような相補パルスが出る。Hブリッジを動かすわけではないのでデッドタイムについては気にしなくてよい。

使った超音波スピーカー
型番UT1007-Z325R (秋月で売っている)
