Acoustic Levitation

During the second year of my undergraduate education, I had the opportunity to enroll in PHYS418, a fourth-year elective course. This course was instrumental in broadening my academic horizons, introducing me to the fascinating world of interdisciplinary studies. Focusing primarily on optical and acoustic sensors, the course required each student to undertake a unique project. Driven by curiosity and the desire to explore the boundaries of physics, I chose to delve into Acoustic Levitation. Through perseverance and innovative thinking, I successfully managed to levitate a small piece of styrofoam, marking a significant milestone in my journey of scientific discovery.

How does it work?

Acoustic levitation uses sound waves at ultrasonic frequencies (above human hearing) to create pressure zones that can suspend small objects in mid-air. When two sound waves of the same frequency travel in opposite directions, they interfere with each other and create a standing wave. This standing wave has points where the pressure is minimal, called nodes, and points where the pressure is maximal, called antinodes.

By placing an object like a small piece of styrofoam at a node, the sound pressure from the ultrasonic waves can hold it in place, balancing the upward force of sound pressure with gravity.

Physics Classroom. (n.d.). Nodes and anti-nodes. The Physics Classroom. Retrieved from https://www.physicsclassroom.com/class/waves/lesson-4/nodes-and-anti-nodes

Small Tutorial

byte TP = 0b10101010; // Every other port receives the inverted signal void setup() { DDRC = 0b11111111; // Set all analog ports to be outputs // Initialize Timer1 noInterrupts(); // Disable interrupts TCCR1A = 0; TCCR1B = 0; TCNT1 = 0; OCR1A = 200; // Set compare register (16MHz / 200 = 80kHz square wave -> 40kHz full wave) TCCR1B |= (1 << WGM12); // CTC mode TCCR1B |= (1 << CS10); // Set prescaler to 1 ==> no prescaling TIMSK1 |= (1 << OCIE1A); // Enable compare timer interrupt interrupts(); // Enable interrupts } ISR(TIMER1_COMPA_vect) { PORTC = TP; // Send the value of TP to the outputs TP = ~TP; // Invert TP for the next run } void loop() { }