Fetch: A Ferrofluid Display

A 252 electromagnet-matrix that controls Ferrofluid

Public Chat
Similar projects worth following
A student-project at the University of Oslo. We have designed and built a massive ferrofluid-display with 252 electromagnetic "pixels". The display has a 12x21 resolution (the closest we could get to 16:9 on our budget), and is currently in the final testing phase.

On Applied Procrastination we will share all the details of this project and hopefully inspire you to make something similar - or follow your own dream projects.


We are a group of students at the University of Oslo, that have designed and built a massive ferrofluid-display with 252 electromagnetic "pixels". The display has a 12x21 resolution (the closest we could get to 16:9 on our budget), and is currently in the final testing phase. The matrix will control ferrofluid and act as a reduced functionality display, meaning it has some limitations.

Most evident is the mechanical time-delays caused by slowness in the ferrofluid itself. It can only be moved "so fast", and it has to be moved up against gravity - meaning it's impossible to magically turn a pixel on out of nowhere. "So fast" is however fast enough that it falls down quite quickly due to gravity. This means we do not get any help from persistence of vision, like normal screens do. In addition, gravity makes sure that if you power a column of adjacent magnets: more ferrofluid will accumulate on the lower pixels, leaving the upper pixels drained. Therefore our system requirements basically state:

1. Each pixel must be individually powered.
2. The system must implement a way of applying different holding force for each pixel.

Now, for point 2, the obvious solution is to PWM modulate the signal that powers each magnet (as described in point 1). However, we are not aware of any microcontrollers with 252 PWM pins. We are not aware of an affordable microcontroller with 252 of any pin, really. So, first of all we have to figure out a way to expand however many pins we have to the amount of pins needed. The solution we use are serial->parallel shift-registers. That solves point 1, but snaps us out of the dreams we had about individual PWM functionality... Or does it? Well, the way this has been solved is to implement the PWM in software. This is not optimal at all, because it makes our PWM frequency dependent on the execution time of the main loop. However, with some recent upgrades we made it seems to run fast enough to give us some leeway in terms of frequency-jitter. There's more on the topic of fast code towards the end of this story, but for now, let's take a look at how the project has evolved.

Prototype (Arduino Mega based)

We were not sure how to do anything related to this project when we started, so the only logical thing to do was to start on a smaller scale than the 252-pixel "monster" that we had planned. Therefore we built a smaller, 6x6 prototype, hooked it up to a single driver-PCB (max 28 magnets, so we only connected 6x5 of them) to test how everything worked out. The results were surprisingly good, so we went ahead to commit to a design that we could use in the final display.

When we are done with the full scale display we may revisit the smaller version and make a separate project on that, since it's a lot cheaper and easier to reproduce for other ferrofluid enthusiasts.

Many hours of experimentation

From the time when we saw ourselves happy with the performance of our prototype to the point when our full-scale display was fully assembled a lot of time was spent experimenting with everything from circuitry to the actual ferrofluid tank itself. All of this is documented on our YouTube channel, and if you're interested in making your own ferrofluid display, we highly recommend that you check out those episodes, as we try to share all the pitfalls we've discovered.

Electronics Assembly and Full Integration Testing:

In our most recent video we integrate the full system and test it after first having assembled and tested the electronics.

Everything is open source, and the files can be found below. However, we do not recommend anyone to attempt to rebuild the project in its current state. The electronics especially require a big revision (version 2 will be started later this fall).

Code Optimization

As was evident in the video above, and as we discussed earlier in the article, the Arduino Mega is starting to get a bit overwhelmed by how we handle everything...

Read more »


Schematics (we don't recommend anyone actually using this design for anything... except as a bad example)

sch - 490.75 kB - 08/10/2019 at 11:40



PCB design (we don't recommend anyone actually using this design for anything... except as a bad example)

brd - 521.76 kB - 08/10/2019 at 11:40


  • 1 × Teensy3.6
  • 252 × 15/20mm Electromagnets
  • 1 × 1200W HP Server PSU
  • 10 × Custom PCBs In V2 the number of PCBs will be changed to 12
  • 1 × Glass tank

View all 2 project logs

Enjoy this project?


Discussions wrote 08/20/2019 at 12:11 point

maybe combine the anti-gravity vertically rising "raster" just mentioned with the main control coils. Drive them with a background signal, a bit like AC bias in magnetic recording, then add the pixel control on top of that.  You can drive the coils harder and for a shorter time using higher voltage, if you can drive them above the mechanical response time of the fluid, then it could look like anti-gravity without disturbing the shapes you want to make.  It might be an idea to tilt the display as one path, to get the pixel control working, and solve the upward drift in parallel, to un-tilt the display hen ready.  

  Are you sure? yes | no wrote 08/20/2019 at 11:58 point

OK, suggestion that aren't cheating then..   possibly a 2nd immiscible phase to add buoyancy?  difficult not to end with mayonnaise though. 

what about a vertical stack of full-width coils, excited so as to make a travelling wave UP the display, at a much higher frequency, like 10kHz, even 100kHz, so it "strokes" the ferrofluid upwards and counters gravity to the desired extent.  

  Are you sure? yes | no

Sprite_tm wrote 08/15/2019 at 09:49 point

Hello, do you have any information on the liquid side of things? I experimented a fair bit to get something like this working, but the ferrofluid I could find either was extremely expensive, or dirtied the glass when put in water and attracted by an electromagnet...

  Are you sure? yes | no

Applied Procrastination wrote 08/16/2019 at 16:04 point

Hi, yes we have made three or four youtube episodes on how to make ferrofluid containers. We still have some kinks to sort out, but getting a perfectly stainless result is a bit above our knowledge-level.

  Are you sure? yes | no

russell.verdon wrote 08/15/2019 at 09:26 point

I once built a valve oscilloscope that had a 1 Megohm resistor from input to ground. I couldn't get anything to display until I found that I had used a 1.5 ohm instead(same colours in the resistor colour code).. did you measure the value of the test load resistor when you blew the circuit board track?   

  Are you sure? yes | no

Applied Procrastination wrote 08/16/2019 at 16:04 point

Yeah, we used a multimeter.

  Are you sure? yes | no wrote 08/15/2019 at 09:05 point

what about just tilting the display back so you get just the right amount of gravity? - then you should be able to sequence the magnets to move a blob to the top of display - and hold it against the weakened gravity. 

  Are you sure? yes | no

Applied Procrastination wrote 08/16/2019 at 16:43 point

That's cheating 😁 

  Are you sure? yes | no

vincems wrote 08/14/2019 at 19:00 point

you might be able to do the pumping function with a bunch more electro magnets in a linear motor arrangement.  

  Are you sure? yes | no

MRMAINT62 wrote 08/14/2019 at 18:08 point

Here is the link address for ebay for the PCA9685 16-channel, 12-bit I2C PWM servo driver...    $2.10 each when bought in quantities > 4.

In the description, it lists only 62 board address combinations as being possible for the I2C. I do not know the current draw of your electro magnets, but if they are less than that of servos, it should work.

  Are you sure? yes | no

MRMAINT62 wrote 08/14/2019 at 17:46 point

I have two possible ideas that might help, maybe... 

First idea: Related to your PWM controller problems... PCA9685 16-channel, 12-bit, I2C driven PWM boards with 64 possible address combinations.  252/16=15.75 or 16 driver boards needed. 64x16=1024 maximum display size per I2C communication group. 42x24 display is 16:9 and 1008 pixels using 63 boards. Specs: 5V logic, 6V max PWM @ 40-1000 Hz. The boards are daisy chainable for a single I2C connection to the computer.

Second idea: Gravity battled to get Ferro-Fluid up to magnets. What if your display had two chambers, a front display and rear fluid conduit. Each magnet would push the fluid from the rear river forward through a small opening into a front chamber that would empty back into the stream by gravity. This would require the addition of a small pump to circulate the Ferro-Fluid from the bottom well to the top river where the flow would cascade down  top to bottom in the back layer for each column. The fluid would only divert forward to the display plane when the electromagnet pushes it there and the flow would drain back into the river at the back plane directly below the fill hole rendering a single clean pixel that can display instantly.

  Are you sure? yes | no

Similar Projects

Does this project spark your interest?

Become a member to follow this project and never miss any updates