아두이노 우노와 HC-SR04 초음파 센서로 만드는 미니 음향 부양 데모
부품 및 소모품
부품 수량
아두이노 우노 (Arduino UNO) 1
HC-SR04 초음파 거리 센서 (제네릭) 1
앱 및 온라인 서비스
프로젝트 소개
자세한 회로 시뮬레이션과 설명은 내 웹사이트 에서 확인하세요.
음향 부양(Acoustic Levitation) 은 소리가 파동이라는 성질을 이용합니다. 두 음파가 만나면 건설적/파괴적 간섭을 일으키는데(노이즈 캔슬링 헤드폰 원리와 동일), 이 프로젝트는 초음파 거리 센서의 송신부 두 개를 마주보게 해 '공기 주머니(정재파 노드)'를 만들고, 그 안에 스티로폼 조각을 띄워 공중 부양시킵니다.
필요 자재 (별도 구매)
아두이노 보드: 링크
H-브리지 드라이버: 링크
초음파 거리 센서: 링크 (송신부 2개 추출용)
브레드보드: 링크
점퍼 와이어: 링크
다이오드: 링크
커패시터 (필요시): 링크
아마존 어소시에이트 활동으로 적격 구매 시 수수료를 받을 수 있습니다.
1단계: 초음파 송신부 추출
초음파 거리 센서 하나를 희생해 송신부(Tranducer) 2개를 적출합니다.
기판에서 송신부 2개 모두 납땜 제거
한쪽 송신부의 메시 스크린(금속망) 분리 보관
두 송신부에 각각 와이어 납땜
2단계: 회로 구성
두 개의 100nF 커패시터는 보드가 불안정할 때만 추가 (생략 가능)
9V 배터리는 임의의 DC 전원으로 대체 가능 (필자는 7.5V LiPo로 동작 확인)
H-브리지로 두 송신부에 반대 위상 신호 인가
3단계: 코드 업로드
// Original: https://makezine.com/projects/micro-ultrasonic-levitator/
byte TP = 0b10101010; // 짝수/홀수 포트에 반전 신호 출력
void setup() {
DDRC = 0b11111111; // 아날로그 핀 모두 출력 모드
noInterrupts();
TCCR1A = 0; TCCR1B = 0; TCNT1 = 0;
OCR1A = 200; // 16MHz / 200 = 80kHz 사각파 → 40kHz 전체 파동
TCCR1B |= (1 << WGM12); // CTC 모드
TCCR1B |= (1 << CS10); // 프리스케일러 1 (분주 없음)
TIMSK1 |= (1 << OCIE1A); // 비교 매치 인터럽트 활성화
interrupts();
}
ISR(TIMER1_COMPA_vect) {
PORTC = TP; // 아날로그 포트 전체에 TP 값 출력
TP = ~TP; // 다음 주기를 위해 반전
}
void loop() {
// 메인 루프 비워둠 (인터럽트만으로 구동)
}
타이머 1 비교 매치 인터럽트로 40kHz 초음파를 지속 생성합니다. 아날로그 핀 A0~A7에 번갈아 가며 위상 반전 신호가 나가 H-브리지를 구동합니다.
4단계: 송신부 장착 및 캘리브레이션
헬핑 핸즈(보조 손) 등으로 송신부를 고정하세요.
두 송신부 간격 약 3/4인치(약 19mm)로 시작
완두콩 절반 크기의 스티로폼 조각 준비
1단계에서 분리한 메시 스크린 위에 스티로폼 올리기
핀셋으로 두 송신부 사이 정재파 노드(압력 영점) 위치에 놓기 → 흔들리기 시작하면 근접
송신부 간격을 미세 조정해 스티로폼이 가만히 떠 있도록 고정
문제 해결 팁
처음엔 15분 정도 걸렸지만, 나중엔 금방 됩니다. 안 되면 다음을 시도하세요.
배선 재확인
H-브리지 공급 전압 높이기 (다른 배터리)
더 작은 스티로폼 조각 사용
송신부 위치 미세 조정
커패시터 추가 (안 달았다면)
그래도 안 되면 송신부나 배터리 교체
코드
//original code from: https://makezine.com/projects/micro-ultrasonic-levitator/
byte TP = 0b10101010;
void setup() {
DDRC = 0b11111111;
noInterrupts();
TCCR1A = 0; TCCR1B = 0; TCNT1 = 0;
OCR1A = 200;
TCCR1B |= (1 << WGM12);
TCCR1B |= (1 << CS10);
TIMSK1 |= (1 << OCIE1A);
interrupts();
}
ISR(TIMER1_COMPA_vect) {
PORTC = TP;
TP = ~TP;
}
void loop() { }
회로도