DIY Kinetic Sand Art Table

I forget exactly how, but one day browsing the internet I came across the kickstarter for the sisyphus table, and was blown away. This is the first time I had seen something so captivating that I immediately wanted one. Checking their page, I was disheartened by the prices of the full wooden coffee tables, but I still considered it. I decided to try and see if anyone had built a DIY version of this table that I could perhaps take on myself before dropping thousands of dollars.

Eventually I stumbled upon a UK Engineer named Rob Dobson’s personal blog page. He had created a smaller version of with a similar mechanism. This looked promising. I saw he re-designed his whole bot and the mechanism to a new SCARA type robot. He had the 3D model and all the stl files ready for 3D printing, so I decided to start my journey of creating my own table from these plans.

As a side note – during my research I learned about all the CoreXY tables that have been doing similar things for years. I stumbled across the very nifty Sandify tool as well, which generates pattern gcode. I entertained the idea of a CoreXY table, but I had my mind set on a round coffee table after seeing the beautiful sisyphus tables, so the XY machines just wouldn’t fit my needs.

Rob’s blog gives a good idea of how to go about assembling everything, so I will just go over my differences here.

I don’t have a laser cutter – so I decided to 3D print everything out, not just the 3D printed parts.

I think the easiest think to do here is link my build album, because it shows the progress of the build. I wanted to build an actual piece of furniture for this table, to sit in our sitting room, so it had to look nice.

Sand Table Build Album

Some highlights

First working protoype of the robot


Table Design.. on the fly!


LED circuit design


Initial App development (Still under development….)

Close to final table design




3D printed LED holders


Veneer Glue-up.. ugh


Final Assembly


Neoprene only – no sand


First Run! Spreading out the sand




Some takeaways..


Furniture Building

Building a round table is hard!  I used 2.5mm underlayment plywood cut into strips to build the round structure around my table frame.  Using ratchet straps, I was able to clamp the wood good enough to make a decent structure. I then decided to glue maple veneer on the outside of the table for finishing.  This was a nightmare.  Trying to use ratchet straps on the veneer just created a whole new set of problems with bubbling because the veneer is so thin.  It’s not really noticeable, but in my final table, there are noticeable bubbles in the veneer. Oh well.


I tried many different types of material for the “sand”. After researching for a while I couldn’t find any specific link to anything that I could actually buy. Some people recommended shuffleboard wax.. Some people said baking powder.. I tried them all. I finally settled on the hamster bathing sand. This is the finest sand I could find, while still able to maintain the peaks needed for nice shadows


THR Support

With some coaxing, I was able to get Rob to add support for .thr files (Theta Rho), which are the native files for the sisyphus table, so now we can take advantage of the sisyphus pattern designer’s hard work and use these patterns on this custom table.  There are still some kinks with thr support, but the majority of the files work correctly and look great!  The sisyphus subreddit is a great place to find custom files. 

Here is my table drawing the hosta pattern from that subreddit


Micro SD Card Support

Rob and I worked hard on this, and in the end the only thing we could get to actually work was the Adalogger feather wing with SD Card in it. We tried external card readers (My PCB is wired for one), but couldn’t get anything to work reliably. Even with the feather wing, I had serious problems getting it to recognize a micro sd card. I had to try about 5 before I could finally get a 1GB micro SD card to be recognized.  I used the official SD card formatter app in windows and various filesystems before this was successful. I think working SD card support is vital for having an interesting table. Without it you can only store a few smaller thr files, however you can fit many parametric patterns.

Micro SD Card Update (June 18, 2020)

In my original post I forgot a few things to make the SD card work with my PCB and robot configuration.  By default, the adalogger wing has the chip select (SDCS) pin hard wired to pin 33. In my configuration, the little jumper needs to be scraped away, and a wire jumper soldered to pin 21.

When I said I could only get one SD card to work, this is the card I got working. It is a kingston 1GB microSD card formatted in FAT with the official SD card formatter.

Custom PCB

While Rob’s PCB does work – I found it very confusing at first. It is designed for more than one application, so I figured I would create a single purpose PCB for the sole reason of powering a sand table.  The project can be found at Easy EDA, and the PCBs can be ordered through JLCPCB.  My version 1.5 has everything needed for a functioning sand table and allows either RGB (Signal/+/-) LED control or White LED dimming control (- PWM). I have only used (And the firmware only supports) White dimming LEDs. The board also has a socket for a light sensor, which at some point will auto dim the LEDs. I wasn’t happy with my implementation of the dimming algorithm, so auto dimming is currently not supported in the firmware either.

Here is my custom PCB outfitted with everything but the drivers and processor. I’ve also included vias for probing and debugging if necessary.

Schematic (minus the external card reader)

PCB Components

Everything you need to purchase to populate the PCB

Since my PCB has a different pinout than Rob’s, the robot configuration will be different. This is the robot configuration I use for my setup.

	"robotType": "SandTableScaraMatt",
	"cmdsAtStart": "",
	"webui": "SandUI",
	"evaluators": {
		"thrContinue": 0
	"robotGeom": {
		"model": "SingleArmScara",
		"homing": {
			"homingSeq": "FR10;A+10000N;B-10000;#;A+5000n;B-5000;#;B+10000N;#;B+5000n;#;A=h;B=h;$",
			"maxHomingSecs": 120
		"blockDistanceMM": 1,
		"allowOutOfBounds": 0,
		"stepEnablePin": "12",
		"stepEnLev": 0,
		"stepDisableSecs": 10,
		"axis0": {
			"maxSpeed": 9,
			"maxAcc": 50,
			"maxRPM": 2,
			"stepsPerRot": 9600,
			"unitsPerRot": 628.318,
			"maxVal": 185,
			"stepPin": "14",
			"dirnPin": "32",
			"endStop0": {
				"sensePin": "36",
				"actLvl": 0,
				"inputType": "INPUT_PULLUP"
		"axis1": {
			"maxSpeed": 9,
			"maxAcc": 50,
			"stepsPerRot": 9600,
			"unitsPerRot": 628.318,
			"maxRPM": 2,
			"maxVal": 185,
			"stepPin": "27",
			"dirnPin": "15",
			"endStop0": {
				"sensePin": "39",
				"actLvl": 0,
				"inputType": "INPUT_PULLUP"
	"fileManager": {
		"spiffsEnabled": 1,
		"spiffsFormatIfCorrupt": 1,
		"sdEnabled": 1,
		"sdMOSI": "18",
		"sdMISO": "19",
		"sdCLK": "5",
		"sdCS": "21"
	"wifiLed": {
		"hwPin": "14",
		"onLevel": 1,
		"onMs": 200,
		"shortOffMs": 200,
		"longOffMs": 750
	"ledStrip": {
		"ledPin": "4",
		"sensorPin": "34"

Improving the Robot

After running my completely 3D printed robot for over a year, I could tell that it was getting really sloppy.  Homing wasn’t consistent, and patterns weren’t ending where they should.  Graciously, Rob had sent me some laser cut acrylic top and bottom plates a while back, so I got the making a second robot that would hold tighter tolerances.  These were the major improvements I thought I needed.

I’ve uploaded all my 3D models for printing on my github. The SandTableScara model is a direct import of Rob’s original model, so that I could extend the arms.

Belt Tensioning

While the tensioning system Rob devised does work, I wasn’t happy with the tension I was getting on any of my belts. I don’t think the motors were secured strong enough to put enough tension on the drive belts. I believe this was due to my 3D printed plates, and the plastic just deforming over time.  I devised a system of 3D printed tubes to help me ensure the new plates would be perfectly parallel to each other.  These are secured with nylock nuts, so they aren’t going to be loosening up

The long arm belt was just floppy after a year of running.  I think this is due to trying to tension a belt that wasn’t the correct size. After some trial and error I decided to print arms the exact length I needed in order to put the perfect amount of tension on a new belt of 488mm. I found that for my 3ft table and a bit less of drawing area, I needed new arm lengths of 184.5mm exactly to give me the perfect tension on the 488mm belt.  I printed the bottom arm of near solid PLA, and the top arm of PETG to give me flex.

Magnetic End Stops

I believe my sloppy homing was due to the inconsistency of the magnets and hall effect sensors when dealing with different amounts of friction due to how much sand the ball is dragging around during homing.  I decided to migrate to optical end stops, and designed and printed out a new concentric gear lock and elbow gear lock that allowed me to mount optical end stop sensors to track the rotational movement.

Best shot I could get of the concentric sensor

Elbow Sensor

New Sand Bed Surface

I originally started with a plywood sand surface, with the bottom coated with urethane and polished as smooth as I could get it. After I saw how uneven this surface was, I migrated to a piece of hardboard, with the smooth end down. I think this still provided too much friction and contributed to some of the inconsistencies.

I finally ponied up the money for a 3ft by 3ft piece of acrylic to cut a new table bed out of. This stuff isn’t cheap. I used 3/16″ acrylic, and there seems to be little sag to it.  The magnets I use hold strong through it. Now I’m just waiting for a few more tests before covering it. PSA – drilling holes in acrylic cracks it a lot easier than I expected… Although milling it to shape with a double fluted spiral bit went much easier than expected with a hand router.

Magnet Friction

Initially, I used a piece of felt to decrease the friction between the magnet and wood sand base. I think this worked OK, but it needed to be better. I started now by polishing the acrylic’s underside with Optimum Hyper Polish and finished it up with some Optimum Spray Wax. Just by feel alone I could tell the surface was much smoother than stock acrylic. It felt slick to the touch

I also purchased some mouse skates to put on the magnet. I am hoping this further decreases the friction of the magnet on the acrylic bed

I had to cut these down to size so there was no lip around the skate, but I think this is working out well. Make sure there is no dirt on the skate.. otherwise it will start scratching the underside of the bed… Ask me how I know!

New Sand Bed Underlayment

The underlayment is necessary for dampening the sound the ball makes while riding over the sand. Otherwise it sounds like sand crunching all the time, which isn’t pleasant.

In my original build, I used some neoprene as sand underlayment. While this worked great, I noticed the sand seemed to be disappearing! To my surprise, neoprene is quite porous and can trap a TON of sand in the fabric itself.  This provided a much harder surface full of sand to drag the ball around on.  After looking at quite a few different types of fabric, I settled on buying some velvet. The soft side has a bit of pile to it, so this should dampen the sand sound pretty well.

New velvet underlayment spray glued to the acrylic bed.

Spreading the sand out with the new velvet. Pretty quiet!

Only time will tell how these new improvements hold up. We shall see!

(Incomplete) List of purchases for this project:


Qty Product Price Notes
1 Custom Sand Table PCB $7  


Qty Product Price Notes
1 Engineers Precision Crimping Pliers Pa-09 $42.90  
1 TroySys Glass Table Top: 36″ Length, 1/4″ Thick, Flat Edge, Tempered Glass $74.95  
1 120V AC to 12V DC Transformer, 36W Power Supply $12.99  
1 Adafruit Panel Mount Extension USB Cable $4.84  
1 PGN – 5/8″ Inch (0.625″) Precision Chrome Steel Bearing Balls $12.45  
1 binifiMux 10-Pack M6x150mm Half Thread Phllips Furniture Bunk Beds Bolts $11.23  
1 Sun-Glo Twin Pack of 2 Speed Shuffleboard Powder Wax $15.82  
1 Maple Wood Veneer Sheet Plain Sliced 4’x10′ $81.40  
1 uxcell M6x50mm 304 Stainless Steel Hex Key Bolt Socket Head Cap Screws $6.30  
1 HitLights Warm White LED Light Strip, Premium 2835-16.4 Feet, 300 LEDs, 3000K $25.99  
1 SenMod 5PCS Micro SD Card Adapter Reader Module for Arduino $14.95 Used for testing – Not used in final table
1 Espressif Genuine (not a Clone) ESP32 ESP32-DEVKITC $14.95 Used for testing – Not used in final table
2 Adafruit HUZZAH32 – ESP32 $19.83  
1 Adafruit PCF8523 Real Time Clock $8.55 Used for testing – Not used in final table
2 Adalogger FeatherWing – RTC + SD Add-on $34.95  
1 ESP32-EVB development board for Espressif ESP32 $34.95 Used for testing – Not used in final table
5 Hamster Bathing Sand $12.99  
1 Soldering Flux Pen $7.99  
4 STEPPERONLINE 17HS13-0404S1 Stepper Motor $10.99  
2 15x21x4mm Precision Ball Bearings $10.98  
1 Maxmoral 4pcs Mechanical Endstop $7.99  

17 thoughts on “DIY Kinetic Sand Art Table”

  1. Hi Matt

    Your sandtable post does not have a comment session so I’m hijacking this post, sorry for that 🙂

    Would it be possible for you to share the CAD files of your updated table design? 3d models instead of STL would be much better so I can modify them if needed.



      1. Hi Matt, Do you have a file where are the models are in position in fusion? I don’t have a 3D printer but I hope I can make the parts on my CNC. Maybe I need to do some small adjustments.. For this, it would be better to have the model like it is assembled. Can you help me please?

        With kind regards


  2. Hi Matt. What a great design! Thanks for posting all this information! I used your design models and built one myself. I actually brought the .stl models into a cad system and changed up the models a bit as needed and 3d printed them. On the electronics side I used a Raspberry Pi controlling an arduino cnc board and shield which is VERY convenient because you can remote login to the PI and control the OS and files and all that. My biggest problem now is getting the Sandify designs to run on this scara design machine. Maybe I’m missing something and also confused. I’m attempting to write a vb program that will convert an xy pattern to the correct scara arm rotations.

    1. Hi John.. Nice job!. Since I didn’t write any of the motion firmware for this, I’m not going to be of much help translating to rotational commands. When you say XY pattern, are you talking about sandify’s gcode export? Rob’s firmware for this robot is open source, so I can point you to his gcode interpreter that will process gcode commands and submit them to the robot’s motion manager. I hope this helps.

      As a side note – would the theta rho sandify export not be easier to adapt? You have relative angle and distance already computed inherent to the theta rho format.

  3. Hello Matt. Thank’s for the great work. I’m building my sandtable and I’m using your circuit board, Huzzah32+adalogger sd-card reader. I can’t get the sd-card working. It’s not recognizing it. I have tried 2gb, 16gb and 32gb cards. Any tips?

      1. Thanks for the extra info. I have tested 10 different cards and none of them are working. I have formatted all of them with the official SD formatter. I used Arduino example sketch Cardinfo to check the cards and only two of them are showing credible info. One is 2gb and other 16gb. I tried changing the debug level in the terminal with the command “loglevel/fff”. Is that what you meant by changing the debug level?

  4. Hello Matt. Thank you for documenting your build. Your table looks amazing.
    I want to bulid one myself and have found most of the parts but unfotunately i can not find the optical sensors you have used. Where can i buy them? Or have you changed your design to use the mechanical endstop sensors from the end of your parts list? Am i correct that i don’t need all the magnets from Robs list, except the one to drag the ball?
    I also have some problems to find the correct stl files. As i don’t know which parts to take from Rob and which from you? Can you post a list of all parts to print?

    1. Hi Martin

      Any optical endstop will work. These looks like the same endstop: – I am still using optical endstops. No mechanical or magnetic.

      Correct on the magnets if you are not using hall effect endstops.

      Most of the parts of the actual robot are all Rob’s parts. Anything dealing with sensor holders are my parts. The arms in my model I used to my specific robot’s size. You will need to modify the arm lengths to suit your table size/needs/

  5. I send Martin’s message. I am also busy building this, but struggle to know which parts to use from who, and also looking for the .STL files for the top and bottom (the ones that are normally laser cut). Is that available somewhere?

  6. Great blog! my son and his friend would like to build one of these. I’d like to find someone who has done it who can help them along the way – I’ll pay!!! His dad is a wood worker, and will handle the table part. Wondering if you would be willing to do – or if not – if you know who would. Really appreciate it!!!

  7. Hey Matt,

    this Sandtable is a great project but I’m struggling with finding the code for the robot.
    I can not find it on your Github and Robs. Is there a link I’ve overseen?
    I just started to build the table with Arduino and I need help with the position calculation.

    Can you please help me?


Leave a Reply