Acoustic Tractor Beam





Introduction: Acoustic Tractor Beam

About: Build your own cutting-edge devices coming directly from the research lab. Ultrasonics, electromagnetism and more. Researcher at Bristol University interested in Ultrasound and in general any effect that wa...

Tractor Beams are mysterious waves that can attract particles towards the source. Here, we will show you how to build an Acoustic Tractor Beam with components that can be bought directly on the Internet for less than 75$.

With this Instructable you will be able to get in your hands a device that it was only seen on SciFi movies such as Star Wars or Star Trek.

If you want more scientific background on Acoustic Tractor Beams, you can check our Open Access research papers:

Do not forget to watch the attached video in this Instructables.

If you want to build other devices coming directly from the research lab keep in touch:

Twitter: @AsierMarzo

Step 1: Gather the Parts and Tools

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

The circuit is not complicated. Basically, an Arduino will generate 4 half-square signals at 5Vpp 40kHz with different phases. These signals get amplified to 25Vpp by the Motor Driver and fed into the transducers. A button pad can be used to change the phases so that the particle moves up and down. A battery (7.3V) powers the Arduino and the logic part of the Motor Driver. A DC-DC Converter steps-up the 7.3V to 25V for the Motor Driver.


  • 30x 16mm 40kHz Transducers The MSO-A1640H10T are the best but minimum order is 500, they are good so perhaps you can save them for future ultrasonic projects. Alternatively, others 16mm 40kHz transducers will serve (emitters and receivers are pretty much the same) for instance the MCUSD16P40B12RO.

Necessary Tools:

  • 3D printer -> you can use an online service
  • Soldering Iron, Tin and Flux.

  • Drill

  • Hot-glue gun

  • Multimeter

  • Cable Peeler

  • Screwdriver and Pliers.

  • Oscilloscope with two probes (Optional) -> you can get one for less than 50£

Step 2: 3D Print the Bowl

The transducers will be mounted in this bowl. This shape allows to naturally focus the beam.

We used an Ultimaker Extended 2+ with a 0.4mm nozzle and the Normal settings. No support, only brim. It does not need to have a perfect finish so any regular printer should work.

You can also use the case created by DanielN253, it is available in Thingiverse

Step 3: Solder Arduino Headers (upwards If Possible)

Step 4: Program Arduino

Upload the attached program in the Arduino Nano. If you are using a cheap Nano (totally recommendable) you will need to install new drivers, there are usually links in the webpage where you bought it.

Step 5: Charge the Battery

This way when you finish the project it will be at full charge.

Step 6: Cut the Handler

300x45x15mm rectangular piece of wood.

Step 7: Redrill the Bowl

Sometimes the holes are not perfect and are a little bit clogged, re-drill them if it were necessary.

Step 8: Attach the Bowl to the Handler

Drill an initial hole in the handler, attach the central screw and then you will be able to drill the two holes at the sides.

Deattach the bowl, it is more comfortable to attach and test all the components without the bowl. At the end of the Instructables we will reattach it.

Step 9: Screw the DCConverter and the Driver

Close the the drilled holes for the bowl we will place the DC-DC converter at one side and the Driver at the other. Put them and mark with a pen to drill later. Then pass a screw and a nut through the holes of the devices for being able to attach them properly to the wood.

It is very important to leave the OUT side of the Converter closer to the bowl.

Remove the indicated jumper of the Driver and keep it for later.

Step 10: Stick the Arduino

With Velcro tape, double sided tape or just hotglue stick the Arduino below the Driver with the USB port pointing to the right.

Put the jumper between the D10 and D11 pins.

Step 11: Drill Through Holes

Drill two through holes above the Driver.

Drill tree through holes below the Arduino.

We will pass wires through these holes.

Step 12: Solder Wires to the Power Switch

The central pins provides the current to the circuit, the right pins go to the DC barrel and the left ones to the battery connector pins.

Try to use red wires for (+) and black for ground (-) to keep things ordered. Pay attention to where the + and - of the DC barrel go and solder it appropriately.

For the battery connector pins we can use pin headers and a tiny piece of strip-board. Be sure that the wires are not touching each other (use a multimeter), and even put hotglue between them to make them safer.

The power switch provides current to the circuit either from a DC barrel or from the battery.

We can use any DC adaptor between 9V and 12V that can provide at least 2A if you do not want to use a battery.

Step 13: Stick the Battery

With double-sided or Velcro tape. Do not use hot-glue since it could damage the battery. Put it in the same orientation as the image.

Step 14: Connect the DCConverter With the Driver

These wires will pass the step-up voltage (25V usually) from the DCConverter to the Driver.

Step 15: Glue the Power Switch

Step 16: Connect Logic Supply

We will provide 7.4V to the DCConverter IN.

First connect the black ground wire (-) from the central pins of the Switch into the DCConverter IN(-). In the same hole connect the ground for the Arduino.

Then, connect the red (+) wire from the central pin of Switch into the DCConverter IN(+). In the same hole put the VIn of the Arduino, and the logic supply for the converter (pins from where we removed the jumper, very important to connect it into the highlighted pin).

Tining the tips of the wires will facilitate putting several wires in the same hole.

It is also possible to get voltage for the Arduino from the DCConverter. Instead of connecting Converter.IN(+) to Arduino.VIn, we can use DCConverter(5V) to Arduino(V5).

If it is too difficult to put various wires into the sockets of the DCConverter, you can also solder to the pads that are at its sides.

Step 17: Connect Signal Wires

These four wires will transfer the signals from the Arduino into the Driver.

Connect Arduino.(A0,A1,A2,A3) to Driver.(IN1,IN2,IN3,IN4).

Step 18: Button Pad

The button pad is optional, but if you make one you will be able to levitate the particles up and down.

The idea is to have three button pads that when pressed they make contact with ground (the buttons are active low).

Get ground from the Arduino to the common terminal of the buttons. Then, connect each of the buttons to D2(up), D3(down) and D4 (reset position).

Step 19: Set the Voltage to 10V

First Connect the battery (be sure to use the right polarity).

Switch on the device.

Rotate the potentiometer counterclockwise until you see 10V in the display.

In the final device we will use 25V but it is safer for the test equipment to work at 10V. If you use X10 probes then it is alright to use 25V throughout the process.

Step 20: Test the Signals

This step is optional but it is about time to check that everything is working fine.

Get two probes and connect the grounds to a ground of the circuit, temporarily using the button pad ground is one of the easiest options. Remember to put it back when finished.

Before the driver the signals should be 5Vpp and after the driver 10Vpp.

Signals from the same side are in phase while signals from opposite sides should be out of phase.

Step 21: Mark Polarity (Recommended Method)

The easiest way to mark the polarity is to use the Arduino itself. This method does not require an oscilloscope or to poke the transducers inside.

Install the code from this section into the Arduino. Connect one wire to A0 and another wire to GND. While the Arduino is connected to the PC, run the Serial Plotter (Tools->Serial Plotter) and be sure that the speed is set to 115200. When a transducer is connected between A0 and GND the signal will do one of the following things:

  • Signal goes down or remains at 0. Then, mark the leg connected to GND.

  • Signal goes up or remains at 1023. Then, Mark the leg connected to A0.

  • It is important to not touch the transducers leg or the wires while doing that or the values will reset.

If it is still not possible to detect the polarity, poke the inside of the transducer with a thin wire and check if the spike goes up or down (like in the obsolete method). Spike up -> mark A0 leg, spike down -> mark GND.

Step 22: Mark Transducers (Obsolete Method)

This method for marking transducers is much easier than the previous one.

Just connect one probe to the transducer.

With a metal wire poke gently and repeatedly the inside of the transducer. Check the signal in the scope, if the first spike goes up, mark the ground leg. If the spike goes down, mark the other leg.

Step 23: Mark the Transducers (Obsolete Method)

The transducers have polarity and they need to be marked. Do not trust manufacturer marks since they can be wrong.

This method is the one contained in the video, but we have an alternative one that is much easier one in the next step.

First take ground and voltage from any of the Driver outputs. Connect them to a transducer and also connect one probe to the same transducer. This probe will capture the emitted signal.

Take another probe and connect it to the transducer that needs to be marked, this will be the received signal.

Put the transducers face to face and check the signals in the scope.

If the signals are in phase, mark the leg connected to ground. If they are out of phase, mark the other leg.

Mark all the transducers.

Step 24: Mount the Transducers

Put the transducers in the sockets with the marked legs pointing upwards (towards the top).

You do not need to populate the bottom row.

Step 25: Wire the Transducers (hard Method)

We need to wire the transducers to deliver power into them.

Measure the needed length for the wire and give three extra hands for connecting it later.

With the cable peeler, partially peel at the correct distance, later these exposed parts will be twisted around the transducers legs.

Once that you have made the cuts with the peeler, redistribute the plastic to keep a uniform length of cooper exposed. Twist the cooper wires to make them more solid. Twist the exposed parts around the transducers legs, apply flux and solder.

Follow the pattern presented in the images. That is, all the grounds are connected together. The red wires of the same half go towards the same side.

Pay attention to the numbers, these numbers correspond to the driver numbers.

Step 26: Wire the Transducers (Simple Method)

It is the similar to the other method but using exposed wire.

Step 27: Test the Transducers

This step is optional but it is convenient to check that all the transducers are connected correctly.

Connect the ground from the bowl into the driver ground (there will be another wire there).

Connect the 4 red wires from the bowl into the outputs of the Driver, respect the numbering.

Connect two extra marked transducers to the scope probes. Be sure to connect the ground into the marked leg (or at least connect the two transducers in the same way). With these transducers we can check the emitted signal of other transducers.

Transducers from the same half of the bowl should emit in phase. Transducers from opposite halves emit out of phase.

Transducers with the wrong polarity should be desoldered, rotated and resoldered.

Step 28: Set Voltage to 25v

Be sure to set the DC-DC converter to 25V using its potentiometer.

Step 29: Attach the Bowl

Now that all the components are in place, it is time to reattach the bowl into the handler.

Step 30: Connect the Wires

Connect the ground from the bowl into the driver ground (there is already another wire there).

Step 31: Switch on and Levitate

Switch on the device, you should be able to feel a little bit the sound, or hear it if you point it into a big chunk of expanded polystyrene or foam.

Using an acoustically transparent sheet or tweezers you can place particles in the centre of the bowl (above 1.8cm approx) and they will be levitated.

Push the buttons to move the particle up or down.

Depending on the size of the particle and how close it is to the bowl, you will be able to levitate it laterally or upside down. It is also possible to levitate particles that are resting on a surface.

Step 32: Building Other Sonic Devices (Optional)

We have presented how to build the most efficient device but there are others that require even less electronics although they are not as efficient in terms of levitation power to watts.

For the following devices you will need smaller transducers, wires and connectors, as well as a different version for the Arduino (that generates always a 40kHZ signal).

Step 33: Coils Device (Optional)

Print the attached STL file. The transducers are fit in the bottom holes and they are all driven with the same signal.

Step 34: Tubes Devices

Print the attached STL file. The transducers are fit in the bottom holes and they are all driven with the same signal.

Step 35: Miscellaneous Files

Raw design files (Inventor)

Sci-Fi Contest 2016

First Prize in the
Sci-Fi Contest 2016

First Time Authors Contest 2016

Second Prize in the
First Time Authors Contest 2016

Arduino Contest 2016

First Prize in the
Arduino Contest 2016

15 People Made This Project!


  • Oil Contest

    Oil Contest
  • Water Contest

    Water Contest
  • Clocks Contest

    Clocks Contest

375 Discussions

Hi Asier,

Please point out the problem of my work.

I made a beam tractor according to your instructions. However, Styrofoam does not levitating. It is only bound to and fro.

I performed the step 20 faithfully. The transmitter was verified with an oscilloscope. I confirmed that the phase by the left connection and the right connection of the transmitter.

I have made an acoustic levitator successfully, so The circuit connection of beam tractor work is connected differently from the manual.

I did not remove the L298N pin in step 16. I connected 5V + and - directly to Aduino on the L298N.
The L298N has a total of three ground connections. The first is transmitter (-), the second is Aduino (-), and the third is DCConvert-out (-).

Is there a problem with this connection?

If there is no problem with this connection, where do I find the cause?

I have not used the product you suggested. Is it a problem with the transmitter?

I guess the transmitter is working normally.
If 25V is supplied to the L298N, should the signal output to the transmitter be 25V?

I look forward to your kind statement. Thank you Asier.
3 more answers

Have you put the jumper between D10 and D11?

Are all the red lights (arduino and L298N) on?

The signal at A0 arduino should be 5V 40kHz the signal at the OUT1 in the L298N should be 25V 40kHz.


I have confirmed everything you mentioned. I could successfully levitate by adjusting the output voltage lower than 25V. When the mass of styrofoam was small, the load was stable when it was smaller than the 25V output. I am still trying to find the proper voltage. I came to think that 25V is not always the right answer.

Thank you Asier.

IF you have good transducers, 19V could work better.

Yes, sure. I'm trying but the transducers make absolutely no noise. Here are the connections. Thank you

1 more answer

They look fine, could you check with the scope (ground connected to ground) the signal on A0 of the arduino (it should be square 5vpp 40kHz) and the signal on OUT1 of the L298N (it should be square 25vpp 40kHz). Best.

Hi, thanks for replying. I've tried it with water and nothing happens. Moreover, using DC in the oscilloscope there's no signal from the transducers despite the fact that the multimeter and the oscilloscope show the 25 Vpp in each one of them. All the red lights are on too. I'll try to desolder everything and solder it again with exposed wire. How do I know that the transducers are working? Do they buzz or get hot? What could have happened so that none of them work? Thank you Asier :)

1 more answer

Before desoldering there are a couple of things to try. You can get a big chunk of Styrofoam (white packaging stuff) and put it in the field, it should make a little bit of noise. Could you take a picture of the connections? Best.

Hi Asier,
I'm having some trouble lately, as, despite having checked all of the conections and having marked the polarity of the transducers with arduino, they do not seem to work at all. I'm using the MSO-A1640H10T, and I feel lost, as I don't know where the mistake might be. I mean, the transducers get 25 Vpp, but they don't levitate anything. Have you got any idea of what might be going wrong?

1 more answer

Do you have an oscilloscope to connect a transducers and check if things are emitting? Are all the red lights on? Can you point the tractor beam into a water surface and check the deformation in water, it should look like two dimples.

Dear Asier,

Congratulations for your project,

I have a question about transducers you said are the best (i have read your transducers analysis paper about acoustic output and phase deviation):

MSO-A1640H10T 16 mm seems impossible to find (the link alibaba... point to another model, which is a 10 mm model, and i dont find it anywhere ?

You propose alternatively (in your list of components) to use a MCUSD16P40B12RO and there is also in your phase deviation analysis paper another good 16 mm model with low phase deviation: MSO-P1640H10TR.

Which one of these 2 models do you advise for the tractor beam ?

Or do you know where to buy the best one MSO-A1640H10T ?

Thank you very much !

Best regards,

1 reply

Manorshi are the best value for money. I know the links goes to a different product, but when you contact the supplier you can ask them for the price of a specific model. I think minimum order is 500 but they may also do 75. The MCUSD16P40B12RO is just too pricey and does not work that well.

Hello its for my project and i need u tell me if this step is optional because i don’t find pcs here in my town so i’m a bit screwed up

1 more answer

Which step? In the instructables some steps are optional and they are marked as such, they are just to check that everything is going ok.

Hi, Im trying to download the Arduino sketch from the pdf file but the link is broken, can you please provide the updated link, thanks.

5 replies

Hi Asier, thank you for the reply. I have now replicated the setup from the Acoustic Levitation Instructable and utilized your suggested code. Unfortunately, there is still no sensible tactile feedback from the transducers. Am I missing something. Thanks for the assist.

Hi Asier, thank you so much for the link. Basically I am interested in creating a tactile surface over the transducers so that its sensable by hand. Any suggestions on how I can adapt your work to achieve this.

I'm thinking I need to modulate the signals sent to the transducers (40kHz + 250Hz). At the moment I'm using a Pololu Dual G2 Motor Driver 24v18 to amplify the signal and an Arduino Uno to generate the 40K signal. If I may ask, does your Tractor Beam gun generate a sensible field over the transducers which can be feilt by the hand? Any suggestions would be great

I Ahmed, you are right if you modulate the wave at 200Hz you will feel a stronger tactile sensation. You can switch it on/off every 200 periods, attached code below.

You can connect all the signals in phase for the tractor beam to just generate a focal point, or just use a single bowl from this instructables:

#include <avr/sleep.h>

#include <avr/power.h>

byte pattern = 0b10101010; //consecutive ports will have an opposite signal

void setup()


DDRC = 0b00011111; //set pins A0 to A4 as outputs

PORTC = 0b00000000; //output low signal in all of them

// initialize timer1

noInterrupts(); // disable all interrupts

TCCR1A = 0;

TCCR1B = 0;

TCNT1 = 0;

OCR1A = 199; // compare match register 16MHz / 200 = 80kHz -> 40kHz square

TCCR1B |= (1 << WGM12); // CTC mode

TCCR1B |= (1 << CS10); // 1 prescaler, no prescaling

TIMSK1 |= (1 << OCIE1A); // enable timer compare interrupt

interrupts(); // enable all interrupts

// disable ADC


// turn off everything we can

power_adc_disable ();





while(true); //avoid entering into the loop


int nPeriods = 0;

const int MAX_PERIODS = 200;

byte mask = 0;

ISR(TIMER1_COMPA_vect) // timer compare interrupt service routine


PORTC = pattern & mask; //output portDV into ports 0 to 7

pattern = ~pattern; //invert all the bits

if(nPeriods == MAX_PERIODS){

mask = ~mask;





void loop(){


Hi Asier, thank you so much for the reply. I have now replicated the hardware from the "Acoustic Levitator" instructable and utilized the code you suggested. Unfortunately, there is still no sensible tactile feedback from the transducers. Am I missing something? Thanks for the Assist.