Introduction: Acoustic Levitator

Picture of Acoustic Levitator

Use acoustic waves to hold in mid-air samples such as water, ants or tiny electric components. This technology has been previously restricted to a couple of research labs but now you can make it at your home.

If you want more background and details you can check our Open Access papers:

Do not forget to watch the attached video.

If you want to build other devices coming directly from the research lab subscribe or get in touch: Youtube:

Twitter: @AsierMarzo

Step 1: Gather the Components

Picture of Gather the Components

We present a list of the necessary components. I have tried to place links for different countries. However, the same parts can be found all around the world, some useful websites are


  • 72x 10mm 40kHz transducers. Manorshi provides MSO-P1040H07T at a very good price, minimum order is 500 but they will ship with less at a higher price. Also Ningbo has good ones FBULS1007P-T
  • 1x 3D-printed TinyLev support. (STL file provided in Step 2)
  • 1x Arduino Nano (US UK)
  • 1x L298N Dual Motor Drive Board (US UK)
  • 1x 130x90mm sheet (wood or acrylic) for the base of the driver board.
  • 1x power switch
  • DC adaptor variable between 7V and 12V
  • DC female connector
  • Jumper wires
  • 12AWG black and red wire
  • 24AWG black and red wire
  • 24AWG exposed wire
  • Some Expanded Polystyrene beads to levitate (between 1mm and 3mm diameter)
  • An acoustically transparent material: A metallic grid, very thin fabric or teabag paper.

Necessary Tools

  • 3D printer -> you can use an online service
  • Oscilloscope with two probes -> you can get one for less than 50£
  • Soldering Iron, Tin and Flux.
  • Hot-glue gun
  • Multimeter
  • Cable Peeler
  • Screwdriver and Pliers.
  • Drill

Step 2: 3D Print the Base

Picture of 3D Print the Base

3D print the STL file included in this step. We used a 0.4mm nozzle and brim but no support. It should be possible to print it in one piece.

Step 3: Clean the Base

Picture of Clean the Base

You may need to use a file to clean the edges around the levitator and clean the sockets. A Dremel will do the job faster. You may also want to drill a hole in the centre of each side, this will allow to insert a camera, a needle or evacuate liquids.

Step 4: Mark Polarity

Picture of Mark Polarity

The transducers have polarity and it is important to glue them in the base oriented with the same polarity. Do not trust the marks made by the manufacturer, they are not reliable at all. The easiest way is to connect a transducer to an oscilloscope and poke the inside with a thin wire. If the spike goes up, mark the leg connected to the positive part of the probe. If the spike goes down, mark the leg connected to ground. You can use two stripes of copper to make this process faster. After all, you will need to mark 72 transducers.

Step 5: Glue the Transducers

Picture of Glue the Transducers

Apply a little bit of hot glue on the side of the socket (if you apply glue near the holes for the legs, the legs will be covered in glue when you push the transducers through), push the transducer in and apply some pressure with your fingers to make it lay as flat as possible in the socket.

It is very important that all the marked legs are pointing towards the centre of the device (where the hole is).

Step 6: Wire the Transducers

Picture of Wire the Transducers

Wrap the exposed wire in six concentric rings around the legs of the transducers.

Step 7: Solder

Picture of Solder

Solder the pins to the wires.

Step 8: Prepare 4 Long Wires

Picture of Prepare 4 Long Wires

Now, we need to make the wires that connect the transducers to the driver board.

2 red wires and 2 black wires. They need to be around 1 meter. In one side there is only the tip exposed. On the other side there are 3 segments exposed, in the video it is shown how this can be done.

The side with 3 segments will go into the transducers rings and the side with only the tip will go into the driver board.

Step 9: Solder Long Wires

Picture of Solder Long Wires

Solder the long wires to the transducers. The side with the 3 segments exposed goes into the transducers, one segment for each ring. Each side of the levitator has a black and a red wire. You can use flux and tweezers to facilitate the soldering. Tin the other sides of the wires (the side that only has the tip exposed)

Step 10: Solder Arduino Headers

Picture of Solder Arduino Headers

Solder the headers of the Arduino, backwards if possible.

Step 11: Program the Arduino

Picture of Program the Arduino

Upload the code provided in this step into the Arduino Nano.

Step 12: Glue Arduino and Driver

Picture of Glue Arduino and Driver

Glue the Arduino Nano and the Driver into the base. It is important to use the positions and orientations of the figures.

Step 13: Create the DC Supply

Picture of Create the DC Supply

You will need to solder the DC female connector to the Switch and leave two wires prepared to supply power to the driver board.

Step 14: Glue DC and Wiring

Picture of Glue DC and Wiring

Glue the DC connector and the switch.

Connect the red wire from the supply into the 12V input of the driver.

Connect the ground from the supply into the middle connector of the driver, also insert a male-female jumper there.

Insert a male-female jumper into the 5V input of the Driver.

Connect the male-female jumpers that we connected to the driver into ground and 5V of the Arduino.

Connect 4 female jumpers from the Arduino (A0,A1,A2,A3) into the inputs of the driver (IN1,IN2,IN3,IN4).

Connect a female-male jumper into ground of the Arduino, this jumper can be connected to D2, D3 or D4 to move the particles up, down or reset them to their original position.

Step 15: Test the Driver

Picture of Test the Driver

When powered (always between 6V and 12V) the output signals of the driver (IN1&IN2 or IN3&IN4) should output a 40kHz square wave of twice the voltage provided to the circuit.

Step 16: Test for Shortcuts

Picture of Test for Shortcuts

Test that there are no shortcuts between the red and black wires of the levitator.

Step 17: Test the Transducers

Picture of Test the Transducers

Connect the levitator to the driver board and switch it on (always provide between 6V and 12V). For testing, 6V will be enough.

You will need two probes with transducers connected (pay attention to connect the marked leg into the positive part of the probe).

Transducers of the same array (side) should be in phase.

You can correct mistakes by cutting the exposed wire and bridging with wires.

Step 18: Test Optimum Resonance

Picture of Test Optimum Resonance

Connecting the wires as shown in the right should provide optimum performance and minimum power consumption. Otherwise, swap the red and black wire.

Step 19: Secure the Wires and Glue the Legs

Picture of Secure the Wires and Glue the Legs

Apply some hot-glue to glue the wires to the levitator for mechanical support.

You can now glue the legs.

Step 20: Levitating Solids

Picture of Levitating Solids

Provide up to 10V. You can use a tweezer to place the particles. Also a metallic grid or thin fabric (acoustically transparent) will be useful since the particles can be placed there and then introduced into the levitator.

Step 21: Levitating Liquids

Picture of Levitating Liquids

It is necessary to adjust the voltage to the type of liquid. Too high and the droplets will pop, too low and they will fall. For water around 9V is enough and for alcohol around 8V.

It is important to place a thin fabric on the bottom to absorb falling droplets, they can damage the transducers.

Place a particle to have a guidance of where to inject the droplets.

A syringe with a bent needle and the tip removed is the best option.

Step 22: BIGLev (optional Device)

Picture of BIGLev (optional Device)

If you want a more powerful levitator you can use the 16mm transducers. The process is exactly the same but you will need to 3d-print the levitator base in 2 part and glue them together (one half is attached in this step). This levitator can take up to 20V in the driver board (40Vpp) and levitate solids of up to 6g/cm3 but it is not as easy to use for liquids.

Step 23: Mid-Lev (Optional Device)

Picture of Mid-Lev (Optional Device)

If you want to use 16mm diameter transducers but BIGLev is too big, you can use MidLev. It uses 16mm diameter transducers but it will fit most of the printers.


klettervirus (author)2017-09-23

Awesome project, just started. Thought I share my setup for testing the transducers - the breadboard made my life a little easier. I used a small piece of a 3d-printer leftover (a brim) to gently push on the membrane. On the release I got a better spike, especially when releasing slowly. I was using an old analogue oscilloscope from school, it had an unclear reading....

Asier Marzo (author)klettervirus2017-09-23

thanks klettervirus, I will try to add a tiny section for using the Arduino Nano as a tiny oscilloscope. It does the job decently.

TaeZ1 made it! (author)2017-09-22

Can Mid-Lev and BigLev lift object by applying voltage follow this graph?

Jason_stallings (author)2017-09-09

Could I get some help with the driver board? I have all of the inputs hot. No shorts that I can find but I get no voltage out to the top and bottom?


Sorry should add pics for the wiring.

Thanks for the pictures. Is D10 connected to D11?
Are the red lights of the Arduino and the Driver on?

D10 and 11 are connected. Arduino seems to boot up fine and no compile or load errors. The wiring seems fine. I toned out the concentric circles and every other ring tones with no shorts to adjacent rings ( think this should be the case?) .I get the 5 v out and 12 volt out but .42 on both top and bottom legs. I have tried 6v and 12v input.

Going to try a new driver board and arduino next.

How many volts are you providing to the device and how many amps is it consuming? If you had a scope you could test if the arduino is generating 5V signals and if the driver is amplifying them. There are some simple tutorials for creating a scope with an arduino.

Jason_stallings made it! (author)Asier Marzo2017-09-16

Ok gave up on the small one and tried the big one. I have some wiring images and scope output. First the output from the arduino pins 1-4 looks like this.

The voltages seem perfect. Only think I can think is not having enough amps from the DC adaptor. Could you try to provide 6 or 7V? That should be enough to levitate styrofoam particles and will consume certainly less than 1Amp.

ok....update with terry cloth and a styrofoam ball I can get it to jump around a bit in the sweet spot but it just bounces out randomly. Almost like too much turbulance.

Here is the scope from top and bottom at the same time. I can stick my hand in there and it will move from 9v .76 amps to .89. I just cant get anything to float?

Jason_stallings made it! (author)Asier Marzo2017-09-17

I have 8.93 at the power source. Below is scope output from the power board.

Jason_stallings made it! (author)Asier Marzo2017-09-16

Scope output from top and bottom output of power board and the arduino pins. Still am stuck. Do these outputs look ok?

PhilippeS31 (author)2017-09-12

For moving the particles up and down you shift the phase of one of the driver signals. this will move the nodes/antinodes of the standing wave correct? but then, shouldnt the particles fall down when the phase shift reaches 180deg?

It works like a charm, havent tried with liquids yet.

Asier Marzo (author)PhilippeS312017-09-13

They would only cancel each other if they were propagating in the same direction but since they are counter-propagating they always create the standing wave pattern.

With liquids it is more tricky to move them up/down.

AndreaD20 (author)2017-09-13

Hello, Asier.

I have noticed that the drops are sort of flattened, and I guess that might be because of the voltage applied. Could I replace the DC transformer with a DC boost voltage module as it was used in the previous device? I'd like to see the effect as I increase the voltage, but I don't want to burn it ;)

Asier Marzo (author)AndreaD202017-09-13

Yep, I usually use a regulated supply. Depending on the voltage you will change the shape of the droplet.

JimmyS88 (author)2017-09-11

This is really cool. Does the set up work sideways too? So mount the arrays of transducers on the left and the right instead of top and bottom?

Asier Marzo (author)JimmyS882017-09-12

If what you are levitating is not very heavy (i.e. styrofoam) you can rotate the levitator 360deg and the particles will still be trapped.

JimmyS88 (author)Asier Marzo2017-09-12

How about liquid?

Asier Marzo (author)JimmyS882017-09-12

Mmmm water certainly not and ethanol will pop. Liquids will not levitate sidewise.

Webby123 (author)2017-09-11

Can the transducers be tested with a multimeter instead of an oscilloscope ?

Asier Marzo (author)Webby1232017-09-11

I do not think so. If you do not have a scope there are several instructables for making one just with an Arduino nano.

DavidR885 (author)2017-09-05

Is anyone in Australia looking to build one of these? Deciding whether to get 80 transducers or reduce the cost per unit and get 500....

harristotle (author)DavidR8852017-09-11

I have built one. His supplier is awesome. To put it into context, the transducers arrived from China one day before the 3d printed part I submitted online the the service down the road.

The cost of product is USD67.5. for 150 transmitters

The freight is USD30.

The PayPal Fee is USD5.5.

I was really impressed actually. The lady I spoke with (Jenny Wang) was exceptionally helpful, and this was my first alibaba purchase. 45 cents a tranducer, 40 for 500! Amazing !

Asier Marzo (author)harristotle2017-09-11

I can confirm that. If you find a good provider in alibaba and do not mind purchases in big packs, then it is amazing.

AndreaD20 (author)DavidR8852017-09-07

If you go to Alibaba and ask them for quotations, you can get really good prices.

DavidR885 (author)AndreaD202017-09-07

So far the best I have got is USD0.41 each for 80 plus USD30 shipping from Ningbo. I am going to go with that. The alternative is USD0.4 plus USD40 shipping for 500.

Asier Marzo (author)DavidR8852017-09-07

Both Ningbo and Manorshi for the 10mm ones are quite good.

DavidR885 (author)Asier Marzo2017-09-07

Yes, I looked at that .pdf and hence wanted to go with either Ningbo or Manorshi. BTW Should I be looking for a low Acoustic output

Asier Marzo (author)DavidR8852017-09-07

The acoustic output should be as high as possible. Bear in mind that the phase deviation should be low and that the transducers with high Acoustic Output also occupy more surface (larger diameter). For 10mm the best are the Murata but they are pricey as hell, Ningbo and Manorshi are quite good options, they have given me very good results.

anamenottaken (author)DavidR8852017-09-06

If you make the 16mm version there's plenty of cheap ones on ebay.

$50 all up

harristotle (author)2017-09-10

Hi. Nice Instructable.

I am finding that this doesn't work, on either my nano or uno. When I put the ocilloscope onto it, I find that there is a nice 40.0 KHz signal on pin 10 of my nano (39.7KHz on my Uno), and nothing on A0, A1, A2, or A3.

I am very surprised by this, as the wiring is clean, free of shorts etc.

I am testing on a nano (dccduino), and ocasionally an Uno. There are no reported incompatibilities. The version of the code I used is from this instructible, and I have appended it below. Any ideas as what I should do next?

Cheers, H.

#include <avr/sleep.h>
#include <avr/power.h>

#define N_PORTS 1
#define N_DIVS 24

#define WAIT_LOT(a) __asm__ __volatile__ ("nop"); __asm__ __volatile__ ("nop"); __asm__ __volatile__ ("nop"); __asm__ __volatile__ ("nop"); __asm__ __volatile__ ("nop");__asm__ __volatile__ ("nop"); __asm__ __volatile__ ("nop");__asm__ __volatile__ ("nop"); __asm__ __volatile__ ("nop"); __asm__ __volatile__ ("nop"); __asm__ __volatile__ ("nop");__asm__ __volatile__ ("nop"); __asm__ __volatile__ ("nop"); __asm__ __volatile__ ("nop")
#define WAIT_MID(a) __asm__ __volatile__ ("nop"); __asm__ __volatile__ ("nop"); __asm__ __volatile__ ("nop"); __asm__ __volatile__ ("nop"); __asm__ __volatile__ ("nop");__asm__ __volatile__ ("nop"); __asm__ __volatile__ ("nop");__asm__ __volatile__ ("nop"); __asm__ __volatile__ ("nop"); __asm__ __volatile__ ("nop"); __asm__ __volatile__ ("nop"); __asm__ __volatile__ ("nop"); __asm__ __volatile__ ("nop")
#define WAIT_LIT(a) __asm__ __volatile__ ("nop"); __asm__ __volatile__ ("nop"); __asm__ __volatile__ ("nop"); __asm__ __volatile__ ("nop"); __asm__ __volatile__ ("nop"); __asm__ __volatile__ ("nop"); __asm__ __volatile__ ("nop"); __asm__ __volatile__ ("nop"); __asm__ __volatile__ ("nop")

#define OUTPUT_WAVE(pointer, d) PORTC = pointer[d*N_PORTS + 0]

#define N_BUTTONS 6
//half a second
#define STEP_SIZE 1
#define BUTTON_SENS 2500
#define N_FRAMES 24

static byte frame = 0;
static byte animation[N_FRAMES][N_DIVS] =

void setup()

for (int i = 0; i < (N_PORTS*N_DIVS); ++i){
animation[frame][i] = 0;

for (int i = 0; i < (N_PORTS*N_DIVS/2); ++i){
animation[frame][i] = 0b11111111;

for(int i = 0; i < N_DIVS; ++i){
if (i % 2 == 0){
animation[frame][i * N_PORTS] |= 0b00000001;
animation[frame][i * N_PORTS] &= 0b11111110;
DDRC = 0b00001111; //A0 to A3 are the signal outputs
PORTC = 0b00000000;

pinMode(10, OUTPUT); //pin 10 (B2) will generate a 40kHz signal to sync
pinMode(11, INPUT_PULLUP); //pin 11 (B3) is the sync in
//please connect pin 10 to pin 11

for (int i = 2; i < 8; ++i){ //pin 2 to 7 (D2 to D7) are inputs for the buttons
pinMode(i, INPUT_PULLUP);

// generate a sync signal of 40khz in pin 10
noInterrupts(); // disable all interrupts
TCCR1A = bit (WGM10) | bit (WGM11) | bit (COM1B1); // fast PWM, clear OC1B on compare
TCCR1B = bit (WGM12) | bit (WGM13) | bit (CS10); // fast PWM, no prescaler
OCR1A = (F_CPU / 40000L) - 1;
OCR1B = (F_CPU / 40000L) / 2;
interrupts(); // enable all interrupts

// disable everything that we do not need
ADCSRA = 0; // ADC
power_adc_disable ();

byte* emittingPointer = &animation[frame][0];
byte buttonsPort = 0;

bool anyButtonPressed;
bool buttonPressed[N_BUTTONS];
short buttonCounter = 0;

while(PINB & 0b00001000); //wait for pin 11 (B3) to go low

OUTPUT_WAVE(emittingPointer, 0); buttonsPort = PIND; WAIT_LIT();
OUTPUT_WAVE(emittingPointer, 1); anyButtonPressed = (buttonsPort & 0b11111100) != 0b11111100; WAIT_MID();
OUTPUT_WAVE(emittingPointer, 2); buttonPressed[0] = buttonsPort & 0b00000100; WAIT_MID();
OUTPUT_WAVE(emittingPointer, 3); buttonPressed[1] = buttonsPort & 0b00001000; WAIT_MID();
OUTPUT_WAVE(emittingPointer, 4); buttonPressed[2] = buttonsPort & 0b00010000; WAIT_MID();
OUTPUT_WAVE(emittingPointer, 5); buttonPressed[3] = buttonsPort & 0b00100000; WAIT_MID();
OUTPUT_WAVE(emittingPointer, 6); buttonPressed[4] = buttonsPort & 0b01000000; WAIT_MID();
OUTPUT_WAVE(emittingPointer, 7); buttonPressed[5] = buttonsPort & 0b10000000; WAIT_MID();
OUTPUT_WAVE(emittingPointer, 8); WAIT_LOT();
OUTPUT_WAVE(emittingPointer, 9); WAIT_LOT();
OUTPUT_WAVE(emittingPointer, 10); WAIT_LOT();
OUTPUT_WAVE(emittingPointer, 11); WAIT_LOT();
OUTPUT_WAVE(emittingPointer, 12); WAIT_LOT();
OUTPUT_WAVE(emittingPointer, 13); WAIT_LOT();
OUTPUT_WAVE(emittingPointer, 14); WAIT_LOT();
OUTPUT_WAVE(emittingPointer, 15); WAIT_LOT();
OUTPUT_WAVE(emittingPointer, 16); WAIT_LOT();
OUTPUT_WAVE(emittingPointer, 17); WAIT_LOT();
OUTPUT_WAVE(emittingPointer, 18); WAIT_LOT();
OUTPUT_WAVE(emittingPointer, 19); WAIT_LOT();
OUTPUT_WAVE(emittingPointer, 20); WAIT_LOT();
OUTPUT_WAVE(emittingPointer, 21); WAIT_LOT();
OUTPUT_WAVE(emittingPointer, 22); WAIT_LOT();
OUTPUT_WAVE(emittingPointer, 23);

if( anyButtonPressed ){
if (buttonCounter > BUTTON_SENS){
buttonCounter = 0;

if (! buttonPressed[0] ) {
if( frame < STEP_SIZE ) {
frame = N_FRAMES-1;
else if (! buttonPressed[1] ) {
if ( frame >= N_FRAMES-STEP_SIZE ) {
frame = 0;
}else {
}else if (! buttonPressed[2] ) {
frame = 0;
emittingPointer = & animation[frame][0];
}else {
buttonCounter = 0;

goto LOOP;


void loop(){}

Asier Marzo (author)harristotle2017-09-10

Is there a jumper between D10 and D11? In other words, D10 and D11 need to be connected. If you see no signal in A0 when those pins are connected then something must be going on with the arduino. Best.

harristotle (author)Asier Marzo2017-09-11

Thanks. Duh! I can't believe I missed that. It is sort of working, and I will get onto it this next weekend!

AndreaD20 made it! (author)2017-09-09

Hi, I just finished it. This is so cool! Thanks Asier for sharing your work, I really appreciate it. Now I will experiment with different objects.Here is a short video:

Asier Marzo (author)AndreaD202017-09-10

congrats, looks very well done. Hopefully I will be able to release a directional speaker soon, I imagine people getting tired of levitation : )

AndreaD20 (author)Asier Marzo2017-09-11

Can you tell me what type of transducers will you use for the directional speaker (16 mm or 10 mm) ? I already have 75 16 mm transducers, I bought them a few months ago because I thought they would be needed for this project, buy I finally ended up doing the small lev. Thank you

Asier Marzo (author)AndreaD202017-09-11

Any transducer will do the job. I will provide designs for both 16mm and 10mm transducers.

penoel made it! (author)2017-09-07

Very clear and easy to follow directions. I like alcohol more than water (easier to levitate and evaporates fast). I also printed legs and a platform that is attached to the tiny lev.

Asier Marzo (author)penoel2017-09-08

Very good job, congrats. In a couple of months I will try to publish the instructions for a directional speaker. The hardware is pretty much the same so I bet you could build it easily.

penoel (author)Asier Marzo2017-09-09

Awesome, I will definitely build a directional speaker (it would be a big hit as a lecture demo). I'm also plan to make the tractor beam. I think it will be fun to look at using my schlieren optics setup.

Asier Marzo (author)penoel2017-09-10

Do not be disappointed with the tractor beam, it can levitate things upside-down but it is much weaker than this standing wave levitator. It can only levitate Styrofoam. Kindly, let me know if you get any results with the schilieren, we had it working in water but no luck for acoustic waves in air. Although this videos shows that it is possible

kev1017 (author)2017-09-05


i just want clarify something

please let me know whether the above item is ok for the project

please reply soon so as i can order it under discount


Asier Marzo (author)kev10172017-09-05

They seem fine but I cannot guarantee since I have never seen that model.

kev1017 (author)Asier Marzo2017-09-05

thank you so much for your concern

DavidR885 (author)2017-09-04

Manorshi provides MSO-P1040H07T at USD90 for 80 units. Does that sound about right?

Asier Marzo (author)DavidR8852017-09-04

So each unit is 1.12$? I guess it is not that bad but if you order 500pc it should be around 0.4$ each.

AndreaD20 (author)2017-09-03

Hello again Asier,

Just wondering, if the transducers have polarity, how come the only important thing is that they are all with the same polarity, but not if this is + or -? Doesn't this affect the final performance of the transducer or power comsumption?


About This Instructable




Bio: Do you want to build your own cutting-edge devices? Directly from the research lab. Ultrasonics, Electromagnetism and more. Researcher at Bristol University interesting in Ultrasound ... More »
More by Asier Marzo:Acoustic LevitatorAcoustic Tractor Beam
Add instructable to: