Introduction: Internet Arduino Controlled T-Slot XY Table

This is a ridiculously easy (in terms of power tool use - see below) way to make a lower precision XY Table.  With the wide availability of T-Slot extrusions on Amazon and Ebay, and using simple home improvement store hardware, this is a great way to build these kinds of projects.  Using patio door rollers on an angle is a low cost and easy way to handle what are often complex mechanics on CNC machines.

You can try this project out live on the Internet!  It's at the TeleToyland Sandbox 2.

This is a second version of a previous Instructable, and is another approach to making a lower cost, lower precision XY table.

How easy is "ridiculously easy"? Here is a list of all the fabrication required:
1) For each of the six timing belt pulley brackets, cut 2.25" of channel aluminum, drill two 1/2" holes (pro-tip: use a step drill), and two 13/64" holes.
2) Cut 7" off the ends of two 1"x2" t-slot extrusions.

That it! The rest is like assembling an Erector set. Nuts and bolts. T-Slot is so cool! :-)

The previous approach is working well, but having the ability to easily adjust each of the parts is a great advantage of the T-Slot.  Tightening the timing belts with screws in wood can be challenging to get just right, but with T-Slot it's very easy.  While the cost is a bit higher by using bearings vs. drawer slides, we don't have the drawer slides sticking out like we do now, getting tripped over and caught in bicycle spokes. :-)

In addition to the T-Slot, we tried to keep the parts easily available (i.e. from home improvement stores), and as always, requiring the least amount of precision drilling etc.  We've built a lot of projects, and anything that requires a hole to be drilled in a particular spot seems to be hard to get just right.  We do have the tools - punches, drill presses etc., but it's just cooler to be able to use a hacksaw and hand drill! :-)

Here's a video of it in operation during testing:

Step 1: Parts

T-SLOT  (~$85):   We used the 1" 10 Series line from 80/20.  We didn't look around too much, and there are definitely other manufacturers.  The 80/20 product is available on Amazon and Ebay, so it was easy to obtain.  For this project, the 1" profile seemed good.  The 20mm profile (about 3/4") flexed a bit at the spans we had.  We have seen some nice CNC tables made with the 1.5" profiles - they look great, but we did not need that amount of strength for the Sandbox.

We used 1"x1" profiles for two of the X axis sides, 1"x2" profiles for the other two sides (to allow the Y axis rollers and drive belts more clearance), and a 1"x3" piece for the Y axis. 

All pieces are 48" long
(2) 1"x1"
(2) 1"x2" - cut 7" off the end of these to make the Y stage Chassis
(1) 1"x3"

OK, we are going off the T-Slot script here.  You can get very nice connectors from the manufacturers, and they work really well, but the cost can add up.  For the 1" T-Slot, though, we found that #10 machine screws with square nuts works pretty well.  The square nuts are better than hex since they won't spin in the slot.  Also, they can just fit in sideways if you are in a situation where another screw is blocking the track.  You can get these at the hardware store, or order them from McMaster-Carr - in stainless, but that is not a requirement.  This hardware is available from many other sources.

For the list below, "M" is the McMaster-Carr part # - nothing special about them - just what we used.  Small Parts Inc. might be a good source too. For some of the brackets, the Stanley brand from the hardware store seemed better - the holes were more uniform and better aligned - the best ones are in the links below.  The screws and most of the plates can be found at local hardware / home improvement stores too - larger quantities, hex heads, stainless etc. may be easier to find at online parts suppliers or maybe you have a nice hardware store nearby, but for the lower quantity items, any old hardware store screws are fine too. We used the stainless ones - some people prefer the black oxide finish.

(4) 3/4" angle Brackets - to hold the 1x2 t -slot to the 1x1 t-slot to make the frame - we got them at OSH - The 7/8" ones at McMaster will work, but the holes are not consistent, so order a bunch and pick out the best ones.  Just make sure the vertical side holes line up with the middle of the T-Slot.  Getting extras of these is a good idea - we ended up using 4 more for the frame and you can also use them to hold the frame down to a workbench.
(8) 1" angle Brackets - for the Y axis carriage bearings
(4) 1.5" angle Brackets (M 1556A42) - for the X axis bearings - the main thing with these is that it's easier if the holes are in-line.
(4) 4" plates for the Y axis carriage
(42) 10-32 x 3/8" stainless screws - hex head (M 92949A263 - box of 100)
(4) 10-32 x 7/16" stainless hex head screws (M 92949A264 - box of 100 - way more than you need)
(46) 10-32 square nuts (M 94785A411)
(4) 10-32 washers (M92141A011)
(4) 10-32 split lock washers (M92146A550)
(12) 1/4-20 x 3/4" hex head cap screws (M 92240A540)
(12) 1/4-20 jam nuts (M 91847A029)
(12) 1/4-20 washers (M 92141A029)
(12) 1/4-20 split lock washers (M 92146A029)
(12) 1.5" (white) Nylon rollers (with brass ball bearings in the middle) for screen doors from Home Depot or here - this is the secret lower cost ingredient to this design! :-)  They are Prime-Line Products D-1506 1-1/2" Sliding Glass Door Rollers.  If you can't find the nylon ones, brass ones might work.  The angle brackets in this project were based on the 1.5" diameter ones, so that is the important  dimension.  The D-1799 rollers are the same - just cost a dollar or so more since they come with additional hardware.

For the angle brackets, you may need to drill out the holes that will be for the bearings to 1/4" for those 1/4" bolts. Some of the brackets we tried have holes that are big enough already - kind of hit-or-miss on that.


We used the same pulleys and belts as the previous project since they have been working well.  We greatly improved the brackets, though, and they can be made fairly easily with hand tools.  The T-Slot really shines here since adjusting the belts is now super-easy.

Channel Aluminum: This is to make the brackets for the bearings.  You will need at least 15" of 1.5"x1.5"x1/8" thick channel aluminum. McMaster-Carr may have this, but we got ours at Online Metals - 6063 T52 aluminum channel. They also sell 36" lengths on Amazon.  24" is $7.74. You will need to cut this into (6) 2.25" lengths, then drill two 1/2" holes in the sides and two 7/32" holes for the #10 bolts in the bottom of each (see step 5). Use a step drill for the 1/2" holes - it's way easier than trying to use a 1/2" bit.

(12) flanged bearings 1/4" inside diameter, and 1/2" outside diameter (just needs to match the holes in the aluminum channel) Kit776 or similar (~$40/10 of them, or M 57155K323 - $5.70 each). 
(12) thin washers (M 93574A513) - these keep the collars from touching the outsides of the bearings - saves buying extended flanged bearings.
(6) timing belt pulleys (M 57105K21)
(3) 770XL037 timing belts (M 6484K454)
(12) 1/4" shaft collars (M 9414T6) or here
(2) 1/4" shaft couplers for the motors - see step 7 for options with these
1/4" shaft (plain - not threaded) - ~44" for the long piece on the X axis to prevent racking, and (2) 2.25" pieces, and (2) 3.25" pieces. aluminum or steel should be OK.  The steel one from my home store seemed more precise - the aluminum was slightly large for the shaft collars and bearings.
(3) 2" mending plates to hold the timing belts down to the t-slot


See step 7 for more detail, but you can drive this project in a number of ways.  Stepper motors will work (our slightly under-powered setup cost about $100), but we decided to use the Pololu JRK 21v3 motor controllers ($50), with motors like the Lynxmotion GHM-16 ($22) - you can get those elsewhere - they are 12v 200RPM gearhead motors with 6mm shafts (nicely close to the 1/4" shafts we are using).  We are using the same the 10-turn potentiometers from Jameco or Mouser etc. (Bournes 3540 series or similar ~$20). So, together, that's about $200. The advantage with this approach is that the position is absolute - no limit switches needed, but it's potentially less precise than steppers. The JRK controllers are easy to setup - they have a Windows app to calibrate and adjust them. You can control them from a Arduino or PC, or from a servo controller.

For the TeleToyland Sandbox, we control these with an Arduino ($30), and Ethernet Shield ($40).

Step 2: X AxisT-Slot Frame

There are many ways to lay out the frame, and we tried a lot of variations. They all worked OK, and require varying degrees of machining.  We did have issues with adjusting the ball bearing approaches, since the tolerances were pretty close to make it really glide. There are some nice products out there that hold the bearings if you look around. In the end, we came upon the nylon screen door rollers at the hardware store. By mounting them diagonally on the edge of the T-Slot, they actually worked pretty well, and the price is great. Note that they do not spin well out of the box - some lubricant made a huge difference - something like the Teflon based Triflow, which works well, and attracts less dirt than WD-40.

For the X axis, we decided to simply place the 1x2 T-Slot extrusions on top of the 1x1 ones.  We did try having them on the same level with corner brackets, but having them on top of each other made the slots more accessible for the timing belt brackets, and there was more clearance below.  We cut 7 inches off the ends of the 1x2 extrusions to be used for the Y Axis Carriage in the next step.

To connect them, we used  3/4" L brackets with the 3/8" long #10-32 screws and square nuts - on one side, the bracket lines up with the edge (see picture), and on the other side, the 1x2 is inset by 2.5".  This is not the absolute minimum width for the timing belts we used, but it's pretty close.  You could also probably just go right to the edge on the other side too - we thought that might be useful for cable guides etc., and the Y Axis rollers do not stick out.  You could also center it - 1.25" on each side.  Whatever - that's the nice thing about the T-Slot - it's easy to move things!

One pro-tip for T-Slot - it's much easier to attach the nuts loosely to the screws on the brackets, then slide them in to the T-Slot rather than try to find the nut once it's slid on.  This is especially true for the square nuts vs. the special T-Slot fasteners.  For this entire project, only the three belt holders in step 6 (and one for the optional cable carrier) need to be screwed in after the nut is on the T-Slot.  All the others can be pre-attached to save a lot of time and trouble.

With the sides slightly tightened, we used a tape measure and t-square to make sure the 1x2 sides were the same distance apart (so the Y axis rollers stay on the 1x2 rails), and that the frame was square.  At this point, there should be some brackets to hold it down to the base since it's not that rigid - more of the 3/4" brackets would work fine for holding it down to the workbench.

Some of the other variations on this layout we tried include using all 1x1 extrusions, aluminum bars, angles etc.  We really didn't bring the price down enough to make it worthwhile in our opinion.  The incremental cost for the 1x2 and 1x3 extrusions was just not that huge.

Step 3: Y Axis Carriage

It's easiest to assemble the Y Axis carriage first, then mount the Y Axis to X Axis frame.

For the Y Axis carriage, we used the two 7" 1x2 pieces we cut off earlier.  The rollers are mounted on the 1" angle brackets, and it's best to slip them in the 1x2 pieces before using the 4" plates to hold them apart.  Once those are set, the rollers can be tightened.  It may help to use a small piece of wood or something to set the gap first.  For us, the gap was about 5/8" and we found a mini-DV case that was just right.  Then, it's a process of tightening them, and resetting/tightening them all until it's straight and looks good.

For the 1" angle brackets, the hole for the 1/4" bolt may need to be drilled out with a 1/4" bit.

We put four rollers on one piece of the 1x2, aligned them, then did the other side, then connected them together with the 4"plates.

Make sure the rollers' grooves fit nicely over the ends of the 1x2 T-Slot.  Also, be sure that they all touch most of the time.  We used the 1x3 and put the carriage on it's side etc. to get the rollers all just right - rotating the 1x3 bar and adjusting each roller one by one in several passes.

The Y axis timing belt needs to go in there.  Either add it while you are making this part, or you can loosen a couple brackets and wheels (do them one at a time to keep the rest of the rollers tight) later to add it - not a big deal either way.  Our pictures do not show it for simplicity, but maybe adding it and holding it together with a rubber band to keep it out of the way might help .

Step 4: Y Axis

The Y axis is pretty easy to build and takes just a bit of adjusting to get right. The Four rollers are mounted using the 1.5" angle brackets.  Since we only get one screw on each wheel, we used a longer #10 screw (7/16"), a washer and a split lock washer to help keep them tight.

As with the Y Axis carriage, putting the Y axis up on some small spacers seems to help the initial setup, and then you can go around and adjust them one by one.  For us, the space was about 1/2", and we found that two post-it pads was about right.  Make sure the Y Axis 1x3 t-slot is square in the frame as you make your adjustments.

We were avoiding making custom brackets, but clearly, this would be a good place for them if you are so inclined.

Step 5: Timing Belt Pulley Brackets

This is most of the fabrication for the project, and not too hard.  This approach is a big improvement on the plastic ones from the previous project, and with the T-Slot, are very nicely adjustable.

Cut the channel aluminum into six 2.25" lengths, then drill two 1/2" holes in the sides (1/2" from the end and the open side)  and two 7/32" holes for the #10 bolts in the bottom of each (1/4" and 3/4" from the end and centered in the channel). Use a step drill for the 1/2" holes - it's much easier than trying to use a 1/2" bit.

You can see how we assembled the parts for these in the pictures.

Step 6: Mouting Drive Belts, Pulleys, and Brackets

For this step you will probably be disassembling and assembling the brackets and bearings a few times.  It's easier than trying to get all the belts right beforehand.

For the Y Axis, center the top two brackets on the Y axis 1x3 - do a loose fit, then measure the difference to the ends and center it.  You can probably even set them just by eye since precise positioning does not matter that much.  Assuming you did not put the belt through the Y Axis Carriage before:  To get the belt through the Y Axis carriage, you will need to unscrew one 4" plate and one roller, then fasten them back, followed by the second 4" plate and roller.  We recommend doing them one at a time to prevent loosening the carriage parts too much.

The 2" plates are used to hold the belt down on top.  Sometimes catching the square nut (for the inside one) below can be tricky - use the wrench to make sure the nut is level first.  The special T-Slot hardware is much better in this situation, but kind of expensive in quantity.  This is the only place where it would really help since all the other locations allow you to attach the nut, then slide it on.  One of the nuts on each plate can be pre-attached, so only three nuts have to be done this way - it's slightly tricky, but doable.

For the Z axis, there are belts on both sides to prevent racking, and the long 1/4" shaft is to connect the two sides together.

From the pictures, you can see the placement we used for the motors - marked by the longer shafts and black shaft couplers - see the next step.  We chose these locations so they would not hit each other, but other locations may be possible.

This completes most of the mechanical assembly - from here you can choose your own motors and electronics!

Step 7: Motors & Potentiometers

There are a lot of options for motors.  In the previous project, we used hacked high power hobby servos.  These work well for the Y axis since there is not that much mass to move.  For the X axis, we switched to a DC Gearhead motor, which has been very reliable.

Stepper Motors

We tried using stepper motors and the ones we used were OK, but slightly under-powered for this application (for the X axis) - they were 1.2 amp ones from Pololu. Pololu also has a low-cost stepper driver carrier board that can work with them. It worked well for the Y axis, but a higher power stepper would be better for the the X axis since that 1x3 t-slot etc. is a lot of mass to move for the size of stepper motor we tried.  It did work, though - just skipped a few steps now and then, until we added some acceleration to the stepper commands.  So, that approach will surely work with the proper tuning of acceleration and size of motor.  You'd need something like an Arduino to drive them, though (that's what we did), to make the steps.  Also, you may need to add some limit switches - a bigger issue for the TeleToyland Sandbox since we would want to automatically home the robot with each sequence since it runs un-attended.  All doable.  Those parts together cost about $100 (steppers are ~$18, drivers are ~$13, and Arduino Uno is ~$30).

Encoders + DC Motors

We also tried using motors with encoders and a RoboClaw driver board.  That also works, but the board provides PID for velocity and not position, so it wasn't as precise for this type of application as we'd hoped.  They have been great for some other robot projects, though.  You can definitely get more precise (expensive) position based drivers.  We won't go into this too much - it's well worn material in CNC forums.  As with the steppers, motors with encoders, would also need some limit switches for our application.

Potentiometers + DC Motors

In the end, we decided to use the Pololu JRK 21v3 motor controllers ($50), with motors from Lynxmotion (GHM-16 -$22) - you can get similar ones elsewhere - they are 12v 200RPM gearhead motors with 6mm shafts (nicely close to the 1/4" shafts we are using).  The nice thing about this design is that you can choose any kind of motors you would like.

Other speeds would work fine too.  At 200RPM (3.33RPS) and 6.66 revolutions covering 29.25" on the X axis with the pulleys we used, that's about 10-15 inches per second travel, depending on the ramp up and down time etc.  The full transit time is 2-3 seconds and is approximately 400 divided by the motor RPM (6.66 rotations / RPM / 60 seconds per minute).

The motors are attached to the 1/4" shaft collars.  Since the motors have a 6mm shaft, it's pretty close.  To keep the motors from spinning, we loosely attached them with some plastic tubing to allow the motors to move around, which they do a lot.  We used 3/6" inside diameter x 5/16" outside diameter tubing.

An alternate mounting approach is to make brackets for the motors from some scrap aluminum (we used 1" wide by 1/6" thick), and used flexible shaft couplings.  See the pictures for both mounting techniques.  These brackets were 4" long and folded to 90 degrees at the 2.5" point along the length.  Both mounting approaches worked fine for our application, though the flexible shaft couplers are a bit tighter for CNC type applications.

As with the previous project, we used 10-turn potentiometers. They are 5K ohms like those used in hobby servos. With the JRK, we were able to try a few brands to see how they did, and the two that we tested seemed pretty similar. The ETI MH22B series ones are almost $100 now (they were less when we got them), and Bourns 3540 series are around $20. We've seen others at around $10, but have not tested them thoroughly. We got the ETI MH22B series ones before when we were concerned about the lifetime - they are rated at 10 million turns, while most of the others are at 1-2 million. We had an issue before with the pot failing, but in retrospect, that was due to the fixed mechanical mounting, and the short piece of plastic tubing connecting the potentiometers to the shafts fixes that issue, so the less expensive potentiometers should be fine.  So, get the less expensive ones and save some money.

For the two we tested, they both showed the full range and detail on the JRK - 0 to 4095 steps, and we could get them to move in one-unit steps, though for many locations, the value would oscillate by one unit. Over the 29.25" travel of the X axis, we got abut 2678 units (pre-calibration) of movement (since it's ~6.66 turns of the timing belt pulley - less than the full 10-turn range), so the precision is theoretically 0.01". If you assume we get half that with the occasional one unit oscillation, it would be around 0.02" (1339 units).  In practice, it's probably not that precise.

An interesting comparison: The stepper motor we tried has 1.8 degree full steps, so at about 6.66 revolutions, that's 1332 steps - about the same as the approach we are using. Microstepping would theoretically get higher precision, but we are not sure what the limits are on the mechanics etc.

For the Potentiometers, we made some brackets from some scrap 1" wide aluminum (1/6" thick). To prevent wear on the potentiometer bearings, we used some 3/16" ID x 5/16 OD plastic tubing to connect them to the shafts.  See the pictures for the bracket spacing.

We eventually added pipe clamps on the potentiometer side of things - one on the potentiometer and one on the shaft.  With the ramping up and down of the speed, we thought they wold not be necessary, but we did notice some slip over time.

Here's a sample video of a stepper motor on the Y Axis.  The X Axis needs more power since it needs to move the whole Y Axis too.

Since a few people have been requesting the stepper code, I have attached what I used in the video to this step - the zip file.  Hopefully it will help, but it is not much, and not well commented or anything.

Step 8: Optional Cable Carrier & Servo Mounting

For the previous project, we just suspended the cables from above, but this time, we decided to try a cable carrier for the project, and it works great.  As with the rest of the project, the T-Slot made it super easy.  We used about 18" of flexible cable carrier with the end connectors.  The one end connector just attaches to the Y axis with a single #10 screw, and for the lower piece, we used a couple 3" plates we had lying around - two #10 screws to hold them to the X axis frame, and one #10 screw to fasten the cable carrier to the one plate.  The second plate is just there to provide a bit more support.  Done! 

For the Y axis, the carriage surrounds the whole axis so we can't mount the cable carrier on the middle of the T-Slot.  So, we built a couple stands from angle brackets, and cut a piece of U shaped aluminum - 3/4" wide, and extended that out to the middle of the Y Axis from above.  We drilled a couple of holes for the stands and one for the end of the cable carrier.  We made one more stand on the Y Axis Carriage for the end of the cable carrier.  See the pictures for the details.

For our project, we are using a hobby servo to move the end effector (a stick) up and down.  To mount the servo, we made a small bracket with holes for the servo and the t-slot.  To keep the servo control rob in line, we used an extra plate.

The cable carrier we used was the McMaster-Carr # 55835K432 and corresponding mounting brackets 55835K3.  You have to buy it in 3 foot lengths, which cost about $20, so for the X and Y axis, the cost is roughly $50 - we couldn't quite get by with only 3 feet.  We bought two sets of the end clips.

We used a piece of T-Slot plastic trim to hold the wires in one of the t-slot channels in the Y axis.  That was from McMaster too, and came in a huge shipping tube.

Step 9: Electronics and Control

Motor Driver Tuning

We used the Pololu Jrk 21v3 USB Motor Controller with Feedback (JRK) - these controllers work like the electronics in a hobby servo, but have a lot more control - you can set the PID parameters, motor direction, range etc. via a Windows program and the USB connector, and they have several input methods for control (R/C signals, serial), and feedback (we used the linear voltage - potentiometer).  For the original sandbox, we are now using one of these for the X axis, and still using a modified (for continuous rotation) high-speed, high-power servo for the Y axis (which needs less power to move).

Before using the Arduino, we connected the JRK controllers one at a  time to a PC and used the configuration utility to setup the JRK controllers.

With the JRK controllers, the PID algorithm can be tuned pretty tight so we are close, but not as precise as some CNC setups.  But, it's way more than we needed for our application.  For the 200 RPM motors we used on the X axis, we ended up with P=3.5, I=0, and D=20.  We are not experts at this, and maybe they can be tuned better.  We are using the auto scaling of the input - the training mode to make the range of movement map to the full 0-4095 range.  This will make the control program easier to setup since it will not need any calibration or range constants other than 0 and 4095 - something we did not have with the previous project's servo motors.

Programming the Controller and Ethernet Connection

There are many options to set this up for Internet control.  For the previous project, we used a Siteplayer Telnet Ethernet to serial module plugged directly in to a Lynxmotion SSC-32 servo controller, and the servo or JRK controller plugs into the SSC using the R/C command mode.  This is a good setup for web server control since it needs only telnet commands (easy in PHP) to control it as long as the web server buffers and sends the commands nicely.  The Lynxmotion SSC-32 also allows the commands to be run over a set time period (a couple seconds typically), so oblique moves work well with the timing - the shorter distance axis moving more slowly.

For this project, we decided to use an Arduino to run  the JRK controllers.  So, we need to time the position commands to make the X and Y axes move together evenly.  We could also have used the Arduino to drive a Lynxmotion SSC-32, but since the JRKs also take serial commands directly, it seems cleaner to have one less set of boards.

To connect the JRKs to the Arduino, we just used the TX pin on the Arduino wired to both RX pins on the JRKs - a simple one wire Y cable since the JRKs each have an address used in the commands, they can just be connected to the same TX pin.  The motors are connected to the A and B connectors, and +12v and Gnd to those connectors.  Make sure the Arduino and JRK controllers share the ground wire so the TX works.  We used a PC power supply so we had 12v for the motors and 5v for the Arduino.

Here is the Arduino Sketch we used to test moving the XY Table to random positions.  It shows how to do the timing loop for the JRK controllers, so the diagonal moves will be straight.  This code uses the clock to time the position at each loop.  By not using delays, we are allowing for the next step of adding the Ethernet Shield and running the Arduino as a web server too.

As before, we could use an Ethernet to Serial device like the Siteplayer Telnet to send commands to the Arduino, but we can also use an Ethernet Shield to run the Arduino.  The pictures show that setup and  the simple web UI we used for testing.  There are no PCs or web servers - the entire web server is on the Arduino + Ethernet Shield!  The sketch for that setup is here.  You will need to put in your own IP address, and we had a port forwarding setup on our firewall to make it work.

That Arduino web UI could be extended to allow multiple commands, save them in an array on the Arduino, and play back the moves in sequence.  Once we get this setup for TeleToyland, we will either do that, or continue to use the server to buffer them as before.

Final Wiring Notes

In the end, we used an Arduino Mega to get the extra memory space to buffer the commands - there should be room for roughly 1,700 of the 4 byte commands we used.

For the project, we had 6 colors (R,Y,G,B, Soft White, and Bright White) of LED strips - we could have used the multicolor ones, but these were easy enough to use.  To power them, we used IRLB8721 N Channel Power MOSFETs from Adafruit.  They are very easy to use.  Pin 1 goes to an Arduino I/O pin, Pin 2 goes to the Gnd side of the LED, and Pin 3 goes to the power supply ground.  The LED + pin goes to the +12v power supply.

We used two more MOSFETs - one for the servo that moves the pen up and down, and one to control a DPDT relay that disconnects the motors when they are not being used.  We do this on TeleToyland since there are periods with no use, and keeping the servo and motors powered up will shorten their life.  So the final Arduino code we use powers them on, does all the moves, then powers them off.

That's about it.  We hope this inspires you to make your own web connected tele-robots!

Step 10: Notes and Other Work

  • There are a lot of other projects out there for home made CNC.  Some of them will be noted here:


ryanbranch made it! (author)2017-07-28

Dear Carl,

Thank you very much for writing this tutorial! I was entirely unfamiliar with many of the concepts present until I started working through them.

I followed everything directly until step 7. For the motors I'm using 2 steppers (NEMA 23, 2.0 A and 8.6 V with 24.0 kg-cm of torque). To drive them, 2 SparkFun Big Easy Drivers. Controlling those drivers as well as some limit switches is an Arduino Mega. It's currently built to run code based on the AccelStepper and MultiStepper libraries. However, I am considering abandoning this approach in favor of writing my own software for optimization purposes. I also ended up mounting the motors with 3D printed brackets (picture attached in case you're interested).

I have a few specific questions about improvements and your feelings on their viability.

1. I don't actually know what "racking" is, but I assume it has to do with 1 end of the Y-axis lagging behind another due to the way the belts move. Despite using the 44" 0,25" diameter steel rod, I'm still experiencing quite a bit of this issue. Do you think installing a second rod at the opposite end would help to further mitigate this issue?

2. I saw in another comment you mentioned how a modified roller design with multiple screws could allow the stage to support more weight. Do you have any suggestions on how to accomplish this? The nice thing about the 1-screw design is that it allows for the angle and position of each wheel to be adjusted with ease. I assume I could 3D print some sort of bracket to allow each roller to be supported with multiple screws, but I worry that its rigidity would lead to incredible difficulty in getting the wheels to align perfectly with the frame.

CarlS (author)ryanbranch2017-07-30

Thanks - glad it was helpful.

Those steppers sound good. I have used lower current / lower torque ones on a mobile robot and they were great. I used the Adafruit motor driver board and AccelStepper library.

Your definition of racking is correct. I am surprised the one rod does not work since it mechanically connects the sides (well, through the belts in my setup). Make sure the screws are tight and belts fairly tight - not slipping at all. Are you using two motors or one on that axis? If it's two, they may not be moving exactly together. I only use one motor. You could extend that long shaft and put the motor right on that one. If you have a high acceleration on the motor, that could also be an issue - would require a stronger frame. But, yes, you should be able to put a long shaft on both ends.

Yes, for multiple screws, a custom bracket from angle aluminum or printed may work, and yes, it might be less adjustable. I have not tried that approach.

Good luck!

EdwinC73 (author)2017-01-06

puedo poner un laser para grabar

kamelbh (author)2016-09-02

Thanks for sharing this information. I want to construct a similar X Y table but I want it to be of more precision (will be used for scanning). So I want the movement to be at a step of 0.1 mm. What do you think I should change/replace in your design to be able to do mine?

CarlS (author)kamelbh2016-09-02

Thanks. I do not think this approach would be suitable for very high precision positioning. Using stepper motors would help, as well as making sure everything is well tuned. But, there are many XY table hardware options out there that may be more reliable. I have not used them, so cannot make any recommendations. Good luck!

Hedaay (author)2016-03-03

Hi, can i have the programming for this?

CarlS (author)Hedaay2016-03-04

There is a link to the code in Step 9. Also, this project has some related code that might help:

greg.becker.925 (author)2015-04-11


Can this x-y table support 5-10 lbs of loading while moving?

CarlS (author)greg.becker.9252015-04-11

Possibly. There is only one screw holding each roller wheel, so those may be OK, but it might be better with a more rigid structure and multiple screws per roller. Also, with that kind of weight, there would be a lot of inertia in the system, so ramping the motors up and down carefully would be important.

greg.becker.925 (author)CarlS2015-04-13

Thanks a lot for the response. So if we ramped the motors up and had a more rigid structure it sounds like we still should be fine.

SachinY (author)2015-03-21

SachinY22 seconds agoReply

Hi Carl,

Thanks much for
sharing this - this is great. I have a question, on step 5, picture 3,
can you give the details of all the pieces which will help us hold the
nylon ball bearing on the aluminum channel. I can see that you have:

a. Two washers (M 93574A513) and

b. Two flanged bearings (M 57155K323)

c. Pulley (M57105K21)

then you also have a cylindrical rod along with 2 black round things.
assuming it is a shaft with 1/2" diameter along with a shaft collar (M
9414T6).Can you please let me know if this is correct.

Also for shaft, I'm planning to buy the following and then cutting it into 44", 2.25" (2) and 3.25" (2)

Please let me know if this will work.Thanks a lot- your help is
is much appreciated.



CarlS (author)SachinY2015-03-22

Yes, that is a short piece of the 1/4" shaft (not 1/2") since it fits on the inside of those 1/4" ID bearings, and the black things are the shaft collars. I just got my shaft material from the local home store.

SachinY (author)CarlS2015-03-23

Thanks Carl for your prompt response. Much appreciated.



sebastian.velasco.7 (author)2015-03-15

Hi, Greetings from Colombia, I'm working doing a project for my university that is based on the xy table, you could be so kind as to let me see the code you used in Arduino please.

Thank You


Step 9 has some code, and also, this similar one that is joystick controlled. Hope that helps!

chestef (author)2014-10-26

Hey CarlS,

outstanding Instructable! As a retired Mechanic and Mechanical Engineer your comment about having the "Nice Toys" to improve the fit of the parts I can suggest the following. The photos show the pulleys and shafts skewed to the slots. That is understandable since the slots are meant to easily insert a screw and nut and it's up to you to apply a square and tighten until red in the face to hold the alignment! One suggestion: there are u-tube and Instructables about soldering aluminum with a low temperature torch (propane or butane) that really holds. Cutting pieces of aluminum strap material a little oversize you can file the piece to just slide into the mating slot. Then, squaring the piece of aluminum to the piece you wish to locate, clamp it and solder away. Touch up with a fine tooth file can give you the fit you are looking for. No great expense, practice soldering on aluminum scrap, and when ready, build a machine that looks and is accurate. The aluminum solder holds up against stress and strain far beyond what you will face with your design here. Outstanding! Thank you for the instructable!

CarlS (author)chestef2014-10-26

Thanks - good ideas!

mohd.naz.731 (author)2014-10-10

hi..may someone help me in my project..i want to make project to move
object from one place to another base on this project

can i do it?and how..please help me

dylanpahina (author)2014-06-20

Hi, awesome project! I to would appreciate if you do not mind sharing code to control two 4 wire 12v stepper motors with a joystick or something of the sort, if you have know it. Also what the circuit would look like, sorry I'm really novice, but learning as implementing this into a school project.

thankyou inadvance, any direction will be helpful!

hh30 (author)2014-03-26

Hi, I am doing a similar project . I would appreciate if you do not mind to share your arduino code used to control the system especially the internet control.

Thanks in advance

CarlS (author)hh302014-04-03

I think I replied via message, but to get it in the comments... The code should all be in this Instructable, and I am happy to answer any questions.

robjags220 (author)2014-04-03


I would just like to say thank you for all the help. Your documentation was very easily to follow and adapt as needed for our XY stage application. Per my school requirements. Would it be okay if I add you as a reference along with the pdf build procedures in my thesis. An email concurrence is okay. Thanks a bunch once again.

CarlS (author)robjags2202014-04-03

Absolutely. I'd love to see the report or some pictures of what you built. If you have anything online, I can also link from the site if you would like.

robjags220 (author)2013-09-18

Appreciate the detailed instructions. This will be really helpful for my project. Would it be possible to get a copy of your arduino code used to controll your system with the stepper motors. This would really help for my project application. Thanks in advance

CarlS (author)robjags2202013-10-01

Thanks. I will PM you the code since it is not pretty! :-)

libelluleft (author)CarlS2013-10-16

would you please send it to me too? thank you

danielbfmv (author)libelluleft2014-01-31

May i have the code too for step motors?please

CarlS (author)danielbfmv2014-01-31

I went ahead and added it to Step 7 since there have been a few requests.

CarlS (author)libelluleft2013-10-17

OK, I sent it

libelluleft (author)CarlS2013-10-17

Thank you so much! :)

danielbfmv (author)2014-01-10

How is the stepper controlled ? by joystick?

CarlS (author)danielbfmv2014-01-10

That was just a test, and hard-coded with an Arduino. If the project was switched to stepper motors, it would work as it does now - with commands being sent to the installation from the web site.

danielbfmv (author)CarlS2014-01-11

Congratulations on your work, your projects are awesome Carls.

Do you think im able to do the same with an arduino and an adafruit motor shield v2?

My project is similar to yours but with a positioning table, do you think it's better with step motors or servos ?

CarlS (author)danielbfmv2014-01-12

Most lower cost precision tables use stepper motors, so that may be worth checking. The Adafruit shield may work. With DC motors and potentiometers, you would need to write code for the motion control - preferably with PID control, which may work. For this project, I used the Pololu motor drivers to off-load that functionality. The other concern with the Adafruit board is if you can have motors with sufficient power to move a project of this size and mass - I am thinking that shield may not be able to supply quite enough power unless you are building a smaller one, but I have not tried it.

apos00 (author)2013-12-13

Hi Carl
You instructions are amazing and I used your idea to base my project that uses the xy table on your design. The issue that I am having is that following the analog calibration the commands don't seem to correspond to a linear mapping i.e commanding the jrk to go to 2045 does not drive the motor to the centre of the range. Rather it behaves somehow logarithmically. I have double checked the specs of my potentiometers and are definitely linear. I was wondering if you experienced a similar issue?

johnny1784 (author)2013-11-15

Very nice work.

I sent you a PM.
Bye Mr. Carl.

JoeStrout (author)2013-08-19

Beautiful project and a really nice write-up!

I'm tempted to try something like this myself, but I find myself balking a little bit at the $50 (each!) motor controllers. Are there any other closed-loop options? Seems like it's just a microcontroller with an A/D input and an H-bridge... shouldn't be more than $10 in parts. But I know the devil is in the details. I know Pololu does great work, but were there any other options you considered?

CarlS (author)JoeStrout2013-08-19

Thanks! Most of the people who use this design use stepper motors, so that is one way to go. You would either need to manually home the system every once in awhile, or use limit switches and automatically home it...

For the DC motor approach, you may be able to use H-Bridge chips and an Arduino or something to do the motor control. I just like the JRK controllers since you can calibrate them (PID, max accel, and travel limits) easily with the Windows program.

For the Y Axis, you could use a hobby servo pulled apart - see the previous design Instructable that is linked in the intro of this one. For the Y axis, a reasonably powerful servo will work. For the X axis, though, there seems to be a bit too much momentum for regular higher power servos to handle. There are some monster servos, but then you are getting back up to the same price point.

Good luck!

rimar2000 (author)2013-06-20

What a great work! Congratulations.

CarlS (author)rimar20002013-06-26


GrfxGawd (author)2013-06-23

I have a very strong motivation to build my own mill, or cnc machine. I VERY much like your choice of frame materials and overall construction method. But higher resolution will be necessary, as some of the parts will require military spec final dimensions. (Not aerospace specs mind you...) Stepper motors and a control system are obviously indicated. What other factors am I obviously missing? I am an absolute novice yet at this point. But, on a positive note, I'm very quickly assimilating information on processes and materials. My problem with many of the current build I see are materials used in construction, and especially max size of parts. I don't need to machine "large pieces", but I need something larger than a pencil box.

CarlS (author)GrfxGawd2013-06-26

You should definitely look at other home made CNC projects. This one was designed to be low cost and low precision, so it would not work for your application. Many of the materials (t-slot & timing belts) are used in other CNC machines. Good luck!

ScottCE (author)2013-02-19

This is a great design and write-up, thanks for taking the time to document it so well.
I am looking to do something similar but on a rather smaller scale, roughly about 1/4 of what you've made. I want to be able to cut a designs into 3" by 6" sheets of 0.02" vinyl. I will be using MicroRAX instead of T-Slot for the smaller cross-section, but what other changes would you recommend to fulfill those needs?

CarlS (author)ScottCE2013-02-19

Another user was building a smaller one too, though I think he is using the same design with a smaller frame. It's important to note that this design is not very accurate since it's just a sand box. You most likely want stepper motors etc., and there are a lot of great CNC designs on the web. I have some MicroRAX, OpenBeam, and MakerBeam extrusions - all about 10mm, and you would definitely want to test it out to see how it flexes, but on a smaller scale, it might be great. Some of the 3D printers, like the BukoBot, also use T-slot, and work in a very similar fashion. Good luck! I am also interested in making a more portable one to show at Maker Faires etc.

prekdal (author)2012-08-27

Is it possible to purchase this as a kit or at least grab the parts from a single online retailer? :)

CarlS (author)prekdal2012-08-27

Sorry - it was a custom project. The parts and sources should all be listed, though.

marco.bucao (author)2012-07-13

@ CarlS, I'm looking to make a larger desing of this XY Linear table, do you know what changes in the potentiometer, motor, and controller will I need. I found longer T-slots, hardware and programing will be the same, but also can'
t find a longer timing belt right now. Do you think you could help point me in the right direction?

CarlS (author)marco.bucao2012-07-14

The motors and controller would be fine. The trick with the potentiometer, though, is that the design in the Instructable uses almost all of the 10 turns that the potentiometer allows. So, using the same setup would require some other approach - maybe gearing the potentiometer down (at a lower resolution), or a different approach like using stepper motors or DC motors + encoders.

For longer belts, I think they make ones that are adjustable - you make any length you want.

Good luck!

marco.bucao (author)CarlS2012-07-16

@ CarlS,
Thank you for the helpful hints. Hopefully the 10 turn potentiometer can be geared down enough to cover the length of the linear table. Would you think using one with more turns would also be ok? As far as the adjustable timing belts, I tried looking around for them but can't seem to find, would you happen to know where they sell those?
Thank you!

CarlS (author)marco.bucao2012-07-18

I guess getting one with more turns and gearing a 10-turn one down are about the same - you would be getting the same voltage range across the table. With either approach, you probably want to use as much of the range of the potentiometer as possible so you will get the most precision. If I were making a larger one, I would probably consider using steppers or a dc motor with encoders.

For the belts, maybe this page will help. I have not used them myself.

I am not sure how you join them - the plate may work if it can travel from one pulley to the other, and not go around a pulley.

About This Instructable




Bio: A Maker since childhood with all the classic symptoms, a robot builder, and an Internet software CTO by day.
More by CarlS:Hawaiian French Toast HashWiFi Connected LED Bars With Shared AnimationsLED Holiday Tree with Shared Internet Control
Add instructable to: