SCARA Arm Sand Table

Hey Folx,
It’s been a bit over a year since I posted anything here. My first project was a coreXY table built on the cheap using hardware store shelf standards and 3D printed slides as my linear rails. That table is still up and running but I decided to give myself a new challenge going forward. I’ve just built a SCARA arm sand table similar to Rob Dobson’s except for one major change. I’m using herringbone gears instead of belts. Because of this virtually the whole thing is 3D printed. The only exceptions are the 5mm steel balls I’m using as bearings and the screws that hold it together! You can see a video of my efforts here:

I’m using a BTT E3 v1.1 board for my controller and standard NEMA 17 steppers. The software is currently RepRap firmware but this will be changed or modified. I haven’t yet configured the kinematics yet. This means that any motion I make is limited to spinning the steppers and doesn’t correspond to a position on the XY plane. I’ll figure this out next. To this point, do any of you know how to configure either RepRap or Marlin (the two firmwares I can run on this board) to control a SCARA arm? I’d sure appreciate any help on this part. My company is in the middle of Techstars and I just don’t have the time to screw with the software right now. As it will probably be a number of months before my schedule frees up, I’d be happy for the help.

I built this using Fusion 360 and my Ender 5 plus printer. Any part with a bearing surface was printed at 0.08mm layer height. The rest was printed at 0.2mm layer height. I only needed supports on two or three parts I’ll be glad to share the files if you want to build one.



Neat machine! I keep thinking about making a smaller SCARA desktop machine I can take with me. This seems pretty awesome.

I think the sandify gcode should still work fine for you. Check out the docs to see if that helps:

I basically worked it out so gcode was just on the motors and the firmware doesn’t need to know it is SCARA. There are some assumptions listed in the docs. But I think you are close.

If you want to run some other gcode or thr files through it, you can import those into sandify to convert them to SCARA.

Jessica…that’s a really interesting design. I would like to get the files (or a STEP file) at your convenience. Thanks for sharing your work!

1 Like

Hey Wolfspaw,
Thanks for the kind words. I’ll get this uploaded as soon as I finish our Techstars program and then post the link here.

1 Like

Great! I’m looking forward to checking it out.

Hey Jeff,

I’ve been looking over the SCARA code you shared (thank you for this!) and I had a question for you. Due to the mechanics of the device the elbow join can move independent of the shoulder joint but, due to the gearing involved, moving the shoulder by itself actually causes the elbow to rotate as well by a third of the shoulder’s motion. This can be easily corrected for by counter-rotating the elbow for every shoulder movement. In other words, if I want the ball to follow the outer most perimeter of the table I need to issue a g0 x720 y240. I hope this makes sense. I can only assume that Rob Dobson’s machine (and all the derivatives) work this way as well but I have no way of confirming this.

So, my question is, does your SCARA code address this issue?


That’s really neat.

But the math in sandify and the previous SCARA machines did not have that 1/3. This is the code I am using to convert from a regular theta rho position to a SCARA position:

This whole thing started because I wrote a python script you could run in a web interpreter that would read in the thetarho output and generate the gcode. If we need to play with a 1/3 value, then I think that is where we should do it.

This is that post with the script. It needs to run next to the thr file and it will make a gcode file. I don’t know how much coding you know, so I am starting here.

1 Like

Maybe the python math should be more like this for your machine:

        # Here, we're actually doing the math.
        m1 = float(theta) + math.acos(float(rho))
        m2 = float(theta) - math.acos(float(rho)) + m1/3.0
1 Like

I’m not a big Python user but I’ll try and get this running over the weekend. I’ll let you know how it goes. Thanks for the help!

1 Like