Scara Coffee Table

Hello everyone

Inspired by this forum and some blogposts, I decided to build my own polar sand table.
That was a few month ago. The Project is now (close to) finshed and I want to share the result with you.

I wanted to replace my coffee table with the new sandtable because I have no other place to put it. So I opted for a complete custom design, including the mechanics. The Result is this 600mm Table with 550mm printing diameter.

Solid Beech rim, table legs, & ring for the hardware
Drawing plate, main ring and hardware support are aluminium.

I decided to go with a ring and smaller plate underneath to keep the height of the wooden rim low.
It looks less bulky this way.
Also, I had to stay below 50mm to be able to produce it in the garage with a router jig.

The control panel has the power button and six push buttons for gcode macro activation.
I use them for: LED brightnes rotation, LED animation rotation, draw speed increase, draw speed decrease, print start / pause / resume , print pause / cancel / wipe.

The Leds are placed in a slot in the ring and covered with silicon tube.
The tube provides diffraction and holds the strips in place.

Wiring for power is hidden in one of the legs.
I drilled out one leg to get the power connection close to the floor.

Hardware / electronics:
raspberry pi zero 2 w
BTT SKR mini e3 v3 (originally chosen because it is a nice all in one solution with silent stepper drivers and integrated neopixel output. I ended up using the rpi for the led control instead)
mini skinny Neopixel RGBW
DCDC converter

I started out with sandypi + marlin, but had reliability problems with the comunication between the pi and mcu. In addition, the button customization and LED control was not what I wanted it to be.

Now I run Klipper / Mainsail plus “moonshine” for led control (

Pattern generation:
Sandify (obviously) - thanks for this great piece of work :grinning: :+1:
postprocessing with Octave to generate speeds for scara and preview pictures like this:

Some optimizations done during the build:

  • I had some issues with magnet strength, so I changed the Magnet from D8x10 to D10x10 and the drawing plate from 4mm plexi to 2mm aluminium
  • Increased tooth count on the outer scara arm from 20 to 40 for more robust movement.
  • experimented with diffferent fabrics under the sand (now: flannel)
  • added “standoff” to the central arm that supports the plate center from below (reduces noise / vibrations in the plate)
  • changed LED control from outut on the mcu to LED control on the rpi & GPIO pin on the pi (-> smooth led animations independent from load on the mcu)
  • changed from sand to natron


  • add software toggle for continuous drawing (with pauses) (almost done)
  • find a way to get a list for all files in the klipper gcode folder to add option for “start random drawing”
  • explore alternatives to Natron (it is a little bit to fine and “clingy” for my taste (suggestions welcome :slight_smile: )

Very nice finish!

I like the idea of using octave as a post processor. What algorithm did you use to determine the speed?

1 Like

thanks, it is just linseed oil - and a lot of sanding before appllying that :smiley:

for the speed algorithm:
I calculate the distance for each movement both in xy and scara coordinate systems and use the ratio of this distances to calculate the scara speed.
The start point of the first movement is unknown, so I assume the worst case for the ratio, which is movement along the perimeter.

dx = X(2:end) - X(1:end-1);
dy = Y(2:end) - Y(1:end-1);
dxy = sqrt(dx.^2+dy.^2);

dx_scara = X_scara(2:end) - X_scara(1:end-1);
dy_scara = Y_scara(2:end) - Y_scara(1:end-1);
dxy_scara = sqrt(dx_scara.^2+dy_scara.^2);

F_scara(1) = F_xy_target * units/(2 * pi * radius); %initial speed (targeted xy speed on outer radius)
F_scara(2:length(d_xy)+1) = F_xy_target*dxy_scara./d_xy;

F_scara([false, [dxy==0]’]) = F_scara_max; %catching div/0
F_scara = min(F_scara_max,F_scara); %Capping the speeds (F_scara_max can be set to high value, the Klipper settings should provide the real cap here)

Finaly, after the last G01, insert a line that resets the speed to F_scara(1) to prevent very fast movements from inputs after the drawing is finished

1 Like

It seems like you end up with each move being the same speed in xy. Is that right? (Except the first, which is an estimate).

yes, that is the goal here.
Some movements, mainly around the center are still slower due to high ratio between the systems and finite max speed.

Hi Karsten

Ich liebe deinen Tisch.
Einfach nur Wunderschön, kompliment aus Italy.

Als Alternativne zum von dir verwendeten Natron kann dir Marmorstaub,
aus dem letzten Absetzbecken einer CNC Fräse von einem Steinmetz empfehlen.

Kannst du die config von Klipper veröffentlichen?
Möchte einen Scara Tisch bauen mit SKR und Klipper.

Mein erstes SCARA Projekt.


Hi Klaus,

danke, dein Tisch macht auch was her :slight_smile:

kann man sowas online kaufen, oder muss ich einen Steinmetz in der Umgebung ausfindig machen?

Mache ich, vorher muss ich den code aber noch etwas aufräumen.

For those not fluent in german:
Klaus asked me to share my Klipper config. I will do so after some cleanup in the files.

Very nice build indeed!

On the Natron, if you mean dry caustic lye, this will cause problems with the aluminium plate you’re using, especially when it attracts moisture.

For my build I used shuffle board powder, not cheap, but nice groves;) but you need to move the powder every now and then, otherwise it may clump a bit

Good luck


I mean Natriumhydrongencarbonat (baking soda).

Never heard of Shuffle board power before. From what I just read about it, it seems interesting. How is the noise when using it in a sand table? Do you have a picture of tracks made in that powder?

Ah ok, you had me a bit worried

On the shuffleboard powder, I got the tip from a former member of this project

Built mine in a similar fashion, but the gcodes need a lot of manual adjustment to keep within the vertical tracks in order to move to the next section to draw, to avoid “connection lines”

The main advantage is you are not limited to geometrical or single line depictions, you can move the ball out of sight for horizontal moves

Noise is minimal, and the movement of the ball, 8mm magnet, is smooth

Hope this helps



1 Like

Do you have pictures of the mechanical arm? I’m curious to see it’s construction.

Sure, here are some pictures and screenshots.


Very nice. I’d like to make one now.

I think about ways to take the motion to the extreme. In my head, I’m considering a linear track for the magnet movement and rotating the entire table on the angular polar axis.

I did a straightpolar design though with an arm not a turntable worked ok but the Scara designs like this are sexier in my opinion.

Of course. I’ve never built a Scara, so I’m interested. I ordered parts for the standard ZenXY, but this polar version intrigues me. While the design on top is interesting, the left brain wants to see the underside. Looking to create a design that highlights both.

I’ve been thinking about making something like this for a while, and your build looks like one of the best I’ve seen. I have a few questions/comments…

  1. how fast do you run it? I think you said the bottom of the sandbox was aluminum. I am curious if you’ve run into any speed limitations due to the moving magnet inducing current in the aluminum.
  2. does the magnet contact the bottom of the sandbox? I’m always concerned about a cantilevered arm being rigid enough to keep the magnet off the bottom of the sandbox.
  3. I am not familiar with Octave- is that a program written specifically to process pattern files? Can you post a link? I like the preview image it generates!

I can answer the question about octave. It is open source software that sort of replaces matlab:

It has a simple scripting language. It focuses on doing mathematical operations. A lot of the code above uses vectorized operations, which work on each element in a vector/array. It starts counting at 1 :roll_eyes:.

1 Like

I usually do 100mm/s or less, after that it looses the zen for me. It does 200mm/s with a motor drive current of only 0.15A
Buuut you made me curious on what the limit would be. I removed the baking soda to try chinchilla sand and while the table was empty decided to test the limit…
Turns out, with 1A I can do F720 around the perimeter. That translates to 2 rounds per second around the talbe or a bit over 3000mm/s :innocent:

No, the arm is not rigid enough for that, and it is not intended to be. I believe all scara tables have some form of glide pad on or near the magnet. The arm just clips to the underside of the box when the ball is placed and glides along.

As Jeffeb wrote, Octave or Matlab is more a mathematical toolbox.

I abuse the plot options it has, to get the preview with overlaping tracks.

  1. Plot the track in 3d by using an increasing vector as z.
  2. Plot the track a second time, this time with an onffset for the z values and thinner, darker line
  3. view from the top
  4. profit :stuck_out_tongue:
1 Like

Any videos of the arm in operation? The sand is cool, but we’re all geeking out about the mechnical.

made just for you :slight_smile:

Homing and the start of a variation for the infinity pattern