Magnetic Kinetic Art Display
In my search for unique display ideas I came up with this concept. It can be described as the fully magnetic equivalent of a kinetic sand art table (e.g. like this one). Below a magnetic field viewing film a small magnet is moved in 2D by PCB coils. In this way the magnet can draw patterns on the film like the ball bearing does on sand. The display can be used to draw patterns but because I am a big fan of unique clocks I also programmed it so that it can display the time.
I would like to thank PCBWay for generously sponsoring the PCB coils for this project.
Supplies
Materials
- custom 2D stepper coil flex PCB
- custom stepper controller PCB
- 2x TB6612FNG motor controller breakout board
- 1x ESP8266 Wemos D1 mini
- N52 magnet 2mm diameter, 1mm height
- 100x100mm magnetic field display paper (amazon.de)
- 4x M3x30 screws and washers
- 4x M2x4 screws
Tools
- 3D printer
- soldering iron
PCB Coils
The PCB coil design is from this cool project by bobricius. It is a 2-layer PCB with coils for the x- and y-direction. The coils are arranged so that they can be driven like a standard bipolar stepper motor.
In order for the coils on the bottom layer to work the PCB should be as thin as possible. I tried out standard FR4 material with 0.6mm thickness and also flexible PCBs based on polyimide both manufactured by PCBWay. The flex PCBs are only about 0.1mm thick so the force from the bottom coils is much stronger. In my tests I found out that the 0.6mm PCB does in principle work to move the magnet in both x- and y-directions. However when the stepper controller is holding the position with the top coils the bottom coils are to weak to move the magnet. Although this problem could be circumvented by adapting the code for the stepper controller I ended up using the flex PCBs.
You can find the PCB files on my GitHub or on bobricius project page linked above.
Stepper Controller PCB
As stepper controller I used a spare PCB that I had lying around from another project. It is based on TB6612FNG breakout boards and an ESP8266 Wemos D1 mini. The PCB I used had four stepper driver boards but in my GitHub repo you can find a redesigned version for only two steppers.
On the PCB there are JST XH connectors for the connection to the stepper motors (PCB coils) and an USB-C socket for power supply. The latter may not be necessary as I have succesfully powered everything from the micro-USB connector of the Wemos board even though the PCB coils draw about 2 Amps.
3D Printed Housing
The housing was designed in Fusion360 and 3D printed mostly from PLA. Only the plate where the PCB coil was mounted (body3) was printed from PETG because it has to be stiff so that the PCB stays flat. Also the PCB gets pretty warm during operation so PLA might warp.
All parts can be printed without supports.
The stl files are availble on my GitHub.
Assembly
- solder pin headers and connectors to the controller PCB
- add TB6612FNG breakout and Wemos boards
- solder cables with JST XH connectors to the flex PCB (pin order according to silk screen on PCBs)
- attach controller PCB to housing using 4x M2x4 screws
- attach flex PCB to "body3.stl" with double-sided adhesive tape (make sure PCB is really flat)
- add hot glue to the cables as strain relief
- connect JST XH connectors to controller PCB
- put magnet in center of PCB
- add "body2.stl" on top of PCB
- add magnetic filed viewing film on top
- add "body1.stl" on top
- flip housing upside down and secure with 4x M3x30 screws and washers
Code
The code for the ESP8266 can be found on my GitHub. It is based on the AccelStepper library. One issue with the library is that you have to be careful not trigger the watchdog timer of the ESP because it uses blocking functions.
The github repo also includes gcode files with patterns I created from sandify.org. The gcode files can be uploaded to the ESP8266 using the LittleFS tool. The code includes a pattern drawing mode and a clock mode. In the latter the ESP first opens an AP wheren you can configure your wifi credentails. After that it connects to your wifi and the current time is fetched from an NTP server and then drawn on the display.