Final Project
Acoustic Surf Display
Overview
For my final project, I plan to make a tabletop device that displays daily wave data for nearby surf spots. I often check the Magic Seaweed app on my phone for this, but I thought it would be neat to have a physical display of the surf. Recently I stumbled upon acoustic levitation, and thought using it for this physical display would be a great excuse to explore the concept. Acoustic levitation uses focused and/or phased arrays of ultrasonic transducers to levitate small particles. The phenomenon works by reflecting or opposing sound waves to create standing waves with nodes where particles can be trapped. Based on the prior work below, it seems feasible to levitate a 4x4 matrix of 16 small foam particles and have control over the height of each levitating particle individually. With Magic Seaweed's API, I can capture data on swells for several surf spots (height of waves, their period, speed of wind, and it's direction) and use this information to drive the output of the display.
Preliminary Sketches, CAD, and Simulation
Prior Work
Ultraino is an open source project for creating ultrasonic phased arrays. They have a GitHub repository that includes driver board gerber files and an acoustic simulation tool, Acoustic Sim 3D, for controlling the phases and amplitudes of individual ultrasonic transducers. This provides an "easy" way to create focal points / traps for levitating foam particles at desired positions. Ultraino has a few Instructables available also: "Sonic Surface" (Two Opposed 16x16 Phased Arrays), Standing Wave (Single Phase), 8x8 Single-Sided Phased Array (corresponding YouTube video).
Ultraino seems to have the most active (yet still very small) community, which has guided my decision to build upon their work for my project. Below are other references I have also found in my travels of research.
Nature Paper on Acoustic Levitation (CPP Header) Spoke with a PhD student at MIT who previously worked with this team after I started this project. He thought I was crazy for attempting to build this on my own on such a short timeline (update: I should have listened to him.)
Alternate method for 16x16 array without FPGA (GitHub repo)
Python Acoustic Levitation Library
JOLED: paper, Hackaday article
Mini Levitation (Two single opposed transducers): Blog post, original article, board code
What Did I Design?
For this final project I designed a 8x8 phased array, integrated with all the components required to drive the transducers on a single board. As I've documented below, there are a couple of reasons why plans don't seem to exist for this type of setup and why I ultimately pivoted from using it. The final design uses two 8x8 phased arrays, each with a separate driver board, consisting of MOSFET amplifiers, which I designed, milled, and soldered. I also designed a visually appealing enclosure, to house the arrays and microcontrollers. It was fabricated with a combination of laser cut and 3D printed materials. Lastly, I designed a webpage and server that allow users to select a preferred surf spot for displaying wave data on the Acoustic Surf Display.
Bill of Materials
Item | Quantity | Source | Cost | Tracking |
---|---|---|---|---|
40kHz Ultrasonic Transducers | 128 | Alibaba | $64 | Tracking |
TC4427VOA MOSFET Gate Drivers | 64 | Mouser | $73 | Tracking |
ATMEGA2560 Breakout Board (Arduino Mega equivalent) | 2 | Amazon | $20 | NA |
PLA Printer Filament | ~600g | Ultimaker | $50 | NA |
4.7 uF Capacitors | 64 | Fab | NA | NA |
100 nF Capacitors | 64 | Fab | NA | NA |
0 Ohm Resistors | 18 | Fab | NA | NA |
2.54mm Headers | 132 | Fab | NA | NA |
1/8" Black Acrylic | 1 sqft. | Scrap | NA | NA |
1/4" Plywood | 2 sqft. | Scrap | NA | NA |
Jumper Wires | 100+ | Fab / Amazon | $10 | NA |
18V Power Supply | 1 | Lab | NA | NA |
API Access
I contacted Magic Seaweed to request access to their public API, but unfortunately I was told they are at capacity and not currently issuing new access tokens. Alternatively, a representative provided me with JSON sample data for 4 different spots. This allowed me to develop the web app in a way that can easily be updated with MSW's live API when they have capacity.
Microcontroller Specification
Most of the prior work I reviewed suggests needing around 32 levels (5 bits) of resolution for controlling the amplitude of each transducer. Considering 64 transducers in a 8x8 array, each operating at 40kHZ, means MHz level control is required. Prior to thinking through this, I was considering the possibility of using shift registers to control all 64 pins, but I don't think they can latch fast enough for this application. Similar to Ultraino, I plan to use multiple MEGA2560's, but will start with controlling one for my first spiral.
11/17 - MOSFETs arrive
11/20 - We have levitation! (See Week 9)
11/26 - Transducers Arrive
Schematic Design
As mentioned above, I designed a 8x8 phased array with all required amplifiers mounted on a single board. I originally wanted to include the microcontroller on this board as well, but I figured for a first spiral I could move faster by pinning out to an ATMEGA2560 breakout board. I considered some resources Ultraino provided when designing the schematic for this board (Individual MOSFET schematic, Gerber files for 8x8 array, no schematic). I downloaded the KiCad footprint and symbol from Octopart for the TC4427VOAs I ordered from Mouser. For the transducers I ordered from Alibaba, I found the corresponding footprint and symbol on SnapEDA.
Wire Routing V1
Routing this board was a significant headache. For this reason alone, I can understand the benefit of separating the array of transducers from the driver board of amplifiers. As pictured below and mentioned above, the original intent was to connect the microcontroller directly to this board also. In hindsight, I think this would have taken a little more upfront planning, but could have saved me from issues I ran into with wires later. During the routing process I realized the traces would inhibit the transducers from being packed tightly next to each other. I didn't consider a double-sided board with vias because I had planned to mount the through-hole transducers on the back of the board, and did not want them near any exposed traces. In future projects with similar constraints, I would consider sending out a board of this complexity to a fab, where multiple layers for routing could be used.
PCB Milling V1
This board required almost an entire piece of the FR1 that is stocked in the CBA shop. I double-checked the X and Y minimum and maximum coordinates of the mill to ensure that it would remain over the stock throughout the cut. On my first attempt, about 20 minutes into milling, the board started detaching from the white block. I noticed that the block had a slight lip all the way at the rear, which was likely the cause of the issue. I'm not sure if this has always been the case, and I'm only just noticed it now because of the size of this board. Ensuring the FR1 was in front of this lip fixed the issue, and I successfully completed my longest milling job on the SRM-20 (~2.5hrs).
While the PCB was milling, I checked the polarity of the transducers I ordered. They arrived with no markings for positive or negative legs. The video below illustrates this process, which I described in detail in my Week 9 write-up.
Soldering V1
Seeing the spacing between transducers IRL got me a little worried, so I tried setting up a simulation with a similar array in the Acoustic Sim 3D software from Ultraino. It didn't seem to throw any errors and produced particle traps for levitating particles with the setup. Aside from that, I think I'm finally getting pretty good at this soldering thing...
CAD & 3D Printing
With a decent understanding of the PCB size and what to expect with the addition of wires, I started modelling the base of the display in Onshape. I printed the model overnight at home with an Ultimaker S5. The result is pretty rough, mainly because of the supports required for printing the top wave pattern upside down. Printing top-down with this housing geometry is a huge time and material saver. I modified the geometry of the wave design, so it would not use any support material. I printed the very top lid of the display top-up, so I would get a nice clean finish. This took almost twice as long to print, because of all the supports required in the hollow center of the lid. I printed four hollow posts to support the top portion of the display. They also allow for wires to be run through them, for connecting the top driver board power & ground lines, the MEGA 2560 power, ground, and data lines to the bottom corresponding sources. The posts are octagonal to facilitate an easy but secure connection with the circle holes in the top and bottom bases. With the first PCB (transducers attached to board) and rough-cut base side-by-side, I noticed the PCB is too large for it to be centered in the base. This was no longer an issue, when the transducers were broken out from the driver board in the final design.
Wiring
Wiring my driver board to the ATMEGA2560 breakout board was such a pain that I forgot to take any pictures of the process. Originally, I attached the transducers to any available IO on the ATMEGA2560 breakout board I could easily access. However, when I connected to the Acoustic Sim 3D software after, I had issues controlling the transducers individually. Ultraino provides a spec for a makeshift phase detector, which can be used to reassign the pin mapping. I tried making one and testing it, but the software also could not recognize it. Instead, I ripped out all my wiring and reverse engineered the wiring of the Ultraino driver board from their Gerber file. It was a lot to keep straight and took me awhile, but was worth the headache. With the new pin mapping I could control each of the transducers individually form Acoustic Sim 3D.
Spiral 1 Testing
With the array working, I ran a test with Acoustic Sim to try and levitate a single particle. No luck. However, the transducers are producing signals, as observed with the oscilloscope. They are also producing a higher signal when the power supply is turned on than without it, which means my driver board is working as expected! I spent a few hours watching youTube videos of people trying a similar test and almost all of them were able to achieve levitation by following the same steps as I was following. Again, I wondered if spacing of the transducers had something to do with this. The PhD student I mentioned speaking with above also cited this as a concern. Because of time, and still wanting to achieve the opposed phased array, I tried to continue the fabrication of two tighter packed arrays in parallel. This may have been a mistake and caused me to spread my focus too thin. I removed the transducers from my board with heat gun and lost some transducers to melting in the process. While using the heat gun the entire board got extremely hot, some traces on the opposite side started to bubble / lift off. I realized I needed to take intermittent breaks to allows the board to cool off.
Laser Cutting
I was planning to laser cut a supporting surround for the transducers, but after suspecting the spacing between transducers being an issue I also lasercut a holder to constrain the transducers as close as possible. Given the footprints of all the components on the board, it's not possible to move the transducers closer while keeping them on the same board as the amplifiers. This meant I had to come out with a makeshift method for attaching the now separate transducers to the driver board. And, yes, it now means I have a regular 'ol driver & array separate setup.
Wire Routing V2
As mentioned above, I still wanted to try and achieve the two-opposed phased array. Since I knew the first board was slightly too large for it be centered in the base housing, I decided to make some minor adjustments to cut down on the footprint.
Milling & Soldering V2
PCB + Transducer integration
Using the oscilloscope to test the first board in the tighter configuration showed only a few transducers working via oscilloscope. Originally I thought this might be because of the 1/8" acrylic + jumper wire headers causing a barrier between the wires making a strong connection with the headers. This drove me to remove the plastic sheathes for the second board + array. However, I noticed lifting traces were the cause of the issue. To connect the separate array of transducers to the driver board, I added individual male headers to the rear of the driver board. I quickly realized when wiring them together the force of connecting the jumpers wires to headers caused the headers to poke through the board and lift the traces off the rear of the board. I less quickly noticed that the excess of wires was in conflict with my sleek enclosure design and driving the need for a larger housing.
Fixing Traces
I added hot glue to the male headers on the rear of the board to provide some extra support when plugging in jumper wires. This seemed to do the trick. I was able to plug in the jumper wires from the transducer array without pushing any more headers through the board and lifting any more traces. After I finished connecting all the jumper wires, I went back and re-soldered any traces that had previously been lifted off the board.
More 3D Printing
With the addition of all the extra wires, both the base and top of the device needed to grow to accommodate them. Without putting any force on the boards, I needed about an additional ~4" in both directions. Rather than printing the entire housing extension, which would take too long, I just printed the corners and laser cut square wooden pieces to hot glue together.
Web Application
The Acoustic Surf Display web app displays what should be displayed via the physical levitator, via the browser. It allows users to select different surf spots and receive the corresponding visual display. Only the four locations Magicseaweed shared JSON samples for are available. However, this can easily be swapped with the real API, when it becomes available. When a user selects a surf spot in the drop down, a request is sent to the server via web sockets to get the corresponding wave information. The server then makes two calls - one to the microcontroller (over serial), telling it to adjust to one of three phases ("lola", medium, high), and another call to the client with the same information. The web app server side and client side code can be found in the Design Files link at the top of this page.
Assembly & Testing
The physical form of the Acoustic Surf Display assembled beautifully. However, my final testing proved that it still does not levitate particles. Eyal suggested exploring possible alternative uses, in the absence of levitation capabilities. So I tried a few different covering materials over the transducers - paper, bio-plastic, thin metal, and then pouring metal shavings over the material to see if the device could be used for sonic sand art. It didn't look promising, but sounded cool. I still want to get this working for it's intended purpose.
Debrief
I'm disappointed where I'm ending this project. I think given another week (and some proper sleep :) ) I could achieve the vision I had for this project at the onset. It feels frustratingly close to being complete. All of the subsystems of my device are working - the driver board, array, web app, and enclosure. For the most part, I think the integration of these subsystems came together nicely as well. However, I'm still not able to achieve the levitating display I was aiming for, let alone consistent levitation of a single foam particle. I'm not sure exactly what is inhibiting levitation, but based upon the tests I've run so far I believe the issues resides in my microcontroller code. I relied on Ultraino's Acoustic Sim 3D library early on, which obfuscates what is happening at the microcontroller level to shift the phase and amplitude of the individual transducers. I'd like to spend some more time digging into this to see if I can decode how the library is working and make any necessary tweaks to achieve levitation. Ultimately, I think I bit off more than I could chew with the scope of this project, but enjoyed the challenge and overall exploration of acoustic levitation. Stay tuned for any updates!
Final Video