Introduction: The Acoustic Levitator

As a kid, I was always fascinated by science and machines. I always wanted to incorporate them both on a building project. When I was in my engineering class, I and my fellow classmates were told about this project called Side project where we build something we truly love. So I decided to build a Levitator with the help of Instructables as I didn't really possess much knowledge about Acoustic Levitation. It took around 10 hours to build with all the soldering and gluing. This project would take around a weekend to build. I made this with the help of Direct From The Lab. You can check out the Instructable here.


Soldering Iron , Quantity: 1

solder sucker , Quantity: 1

bench top smoke absorber , Quantity: 1

cutting mat , Quantity: 1

sponge clean soldering iron , Quantity: 1

Hot Glue Gun , Quantity: 1

vaccuming machine , Quantity: 1

Pliers / wire cutters , Quantity: 1

3D printer , Quantity: 1

Wire strippers , Quantity: 1

wooden table , Quantity: 1

USB 2.0 Cable - A-Male to B-Male , Quantity: 1

A Computer with the arduino IDE , Quantity: 1

Sand Paper 50 grit , Quantity: 1

Hot glue gun sticks ,Quantity:6

Rosin core solder ,Quantity:large spool

ABS Filament ,Quantity:1 roll

electricity ,Quantity: ∞

flux ,Quantity:1

Arduino Uno ,Quantity:1

filter for 3d print ,Quantity:1

wood or cardbord to house the arduino uno and other parts ,Quantity:1

Step 1: Build

The Acoustic Levitator is a really fun project for young scientists and engineers alike. It uses high-frequency sound waves to create intense pressure areas in the air. If you are interested to learn how it works click here. This project uses a total of 72 transducers to levitate objects such as water droplets and polystyrene balls(1-3mm diameter). As of now, Magnetic Levitation dominates the market but in coming years I hope that Acoustic Levitation should be used. Tractor beams have the same technology as used in this project.

So let's get down to this build and have fun along the way. I. Step one, 3D print the body Materials/equipment needed:3D printerABS/PLA filamentA. First, upload your Stl file onto your 3d printing software such as Cura. B. Upload it onto the 3d printer. C. Make sure infill density is 30%, it is on high detail and the correct amount of filament is loaded. D. Wait till it prints and takes pictures if you would like to document. E. Once done, remove from the build plate and clean of any material that is in the holes.

II. Step two let's mark polarity. Materials/equipment needed: A computer Arduino SoftwareAll the transducers Arduino Uno 2 male to female jumper wires USB to connect Arduinomarker A. First, we will begin by connecting the Arduino to the computer and opening the software. B. copy this code and save it as nanoScope.ino: void setup() { //set ADC prescaler to 128, 9.6kHz sampling rate ADCSRA &= ~(bit (ADPS0) | bit (ADPS1) | bit (ADPS2)); // clear prescaler bits ADCSRA |= bit (ADPS0) | bit (ADPS1) | bit (ADPS2); // 1 1 1 -> 128 //initialize serial Serial.begin(115200); } // this gives a sampling rate of 300Hz #define AVG_SAMPLES 32 void loop() { int val = 0; for (int i = 0; i < AVG_SAMPLES; ++i){ val += analogRead(A0); } val /= AVG_SAMPLES; Serial.println(val); } C. Connect the jumper wires to the board. One should be connected to A0 and the other two GND. D. Upload the code. E. Now connect one of the transducers to the wires by putting the legs of it into the wires. F. Open up the serial plotter by going to tools and then Serial Plotter. G. Connect the legs of the transducer into the wires. H. Poke into the transducer with another jumper wire. I. if Signal goes down or remains at 0. Then, mark the leg connected to GND. if Signal goes up or remains at 1023. Then, Mark the leg connected to A0.

J. Now do that for all of them. Good luck!

III. Step three: Gluing Materials/Equipment needed: Glue gun and glue roundsMat to protect your table (optional) Body of the levitator. All the marked transducers. A. Glue all the transducers to the body. B. The legs go through the hole and the marked legs need to face the center of body. C. Wait for the glue to cool down and pull out all the webs produced by the glue gun. D. Good luck! follow the step for both sides. IV. Wiring the transducers! Materials/Equipment needed:Solder wireThe body of the levitator A. Wrap solder wire around each leg like it shows on the picture. B. Give three loops on each leg before proceeding. C. Good luck! follow the step for both sides.

V. Solder the transducers Material/Equipment needed:Soldering IronSponge to clean the tip Solder wire Flux Fume AbsorberCutting Mat body of the levitator A. Heat the soldering iron and get the body of the levitator. B. Individually solder each leg to their solder wire. C. Do this step on both sides. Good Luck! VI. Prepare and solder long wires! Material/equipment used:The body of the levitator4 long wires(2 red and 2 black)Wire StrippersSoldering IronSponge to clean the tip Solder wire Flux Fume AbsorberCutting Mat A. First, we need to prepare the wires. So on one end expose the tip on all the wires. B. now on all the wires expose the tip on the other end and expose two more places 1 inch apart.

C. Now solder the wires on both sides just like shown in the picture. D. With this your body is ready. VII. Programming Materials/Equipment needed: Arduino UnoUSB AArduino software A. Connect the Arduino to the computer and go to the software. B. Upload this code and call it "Nano_TinyLev.ino": #include #include #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] = {{0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa}, {0x9,0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x6,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa}, {0x9,0x9,0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x6,0x6,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa}, {0x9,0x9,0x9,0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x6,0x6,0x6,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa}, {0x9,0x9,0x9,0x9,0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x6,0x6,0x6,0x6,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa}, {0x9,0x9,0x9,0x9,0x9,0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x6,0x6,0x6,0x6,0x6,0xa,0xa,0xa,0xa,0xa,0xa,0xa}, {0x9,0x9,0x9,0x9,0x9,0x9,0x5,0x5,0x5,0x5,0x5,0x5,0x6,0x6,0x6,0x6,0x6,0x6,0xa,0xa,0xa,0xa,0xa,0xa}, {0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x5,0x5,0x5,0x5,0x5,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0xa,0xa,0xa,0xa,0xa}, {0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x5,0x5,0x5,0x5,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0xa,0xa,0xa,0xa}, {0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x5,0x5,0x5,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0xa,0xa,0xa}, {0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x5,0x5,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0xa,0xa}, {0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x5,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0xa}, {0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6}, {0x5,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0xa,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6}, {0x5,0x5,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0xa,0xa,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6}, {0x5,0x5,0x5,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0xa,0xa,0xa,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6}, {0x5,0x5,0x5,0x5,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0xa,0xa,0xa,0xa,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6}, {0x5,0x5,0x5,0x5,0x5,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0xa,0xa,0xa,0xa,0xa,0x6,0x6,0x6,0x6,0x6,0x6,0x6}, {0x5,0x5,0x5,0x5,0x5,0x5,0x9,0x9,0x9,0x9,0x9,0x9,0xa,0xa,0xa,0xa,0xa,0xa,0x6,0x6,0x6,0x6,0x6,0x6}, {0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x9,0x9,0x9,0x9,0x9,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x6,0x6,0x6,0x6,0x6}, {0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x9,0x9,0x9,0x9,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x6,0x6,0x6,0x6}, {0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x9,0x9,0x9,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x6,0x6,0x6}, {0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x9,0x9,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x6,0x6}, {0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x9,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x6}};

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; }else{ 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 (); power_spi_disable(); power_twi_disable(); power_timer0_disable(); //power_usart0_disable(); Serial.begin(115200); byte* emittingPointer = &animation[frame][0]; byte buttonsPort = 0; bool anyButtonPressed; bool buttonPressed[N_BUTTONS]; short buttonCounter = 0; LOOP: 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 ){ ++buttonCounter; if (buttonCounter > BUTTON_SENS){ buttonCounter = 0; if (! buttonPressed[0] ) { if( frame < STEP_SIZE ) { frame = N_FRAMES-1; }else{ frame-=STEP_SIZE; } } else if (! buttonPressed[1] ) { if ( frame >= N_FRAMES-STEP_SIZE ) { frame = 0; }else { frame+=STEP_SIZE; } }else if (! buttonPressed[2] ) { frame = 0; } emittingPointer = & animation[frame][0]; } }else { buttonCounter = 0; } goto LOOP; } void loop(){}

C. Now we are going to start connecting all the pieces.

VIII. Power Supply Materials/Equipment needed: Soldering equipment DC female connector and switch. 2 black wire and one red.

A. connect the wires just like shown in the image. This image is from the original Instructables. B. once soldered use glue gun to secure the soldering. X. Gluing and wiring! Materials/Equipment Needed: BoardGlue gunMale to female jumper cables Arduino Uno and driverDC supply Body of the levitator Phillips Screwdriver A. Glue all the components like shown in the picture. B. Connect the red wire from the supply into the 12V input of the driver. C. Connect the ground from the supply into the middle connector of the driver, also insert a male-female jumper there. D. Insert a male-female jumper into the 5V input of the Driver. E. Connect the male-female jumpers that were connected to the driver into ground and 5V of the Arduino. F. Connect 4 female jumpers from the Arduino (A0, A1, A2, A3) into the inputs of the driver (IN1, IN2, IN3, IN4). G. Connect a female-male jumper into GND 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. H. Connect D10 to D11 with a jumper cable. I. Connect the wires soldered onto the levitator into the free spots on the Driver.

With this, your levitator is official built. Check out this link for any help. Have fun playing with it and try to levitate liquids.