Introduction: Sand Table


The Kinetic Sand Table is a project that I worked on at home and in my high school engineering course. I started it with a group of students in 9th grade, and after we built the first prototype, which was mostly made out of 3D-printed plastic and didn't have too much functionality. The project was dormant for a few months until I decided to make my own improved version that is redesigned from the ground-up. It has a Raspberry Pi CNC controlled arm mechanism to move the magnetic ball bearing to create intricate designs on the surface of the sand. It is also constructed out of laser-cut legs, and hand-milled pieces of wood that I assembled and stained in my garage. I am now a high school senior after about 3 years of learning and developing this project into its final form. Here is some documentation of how I constructed this project. I will be continuing to add more things to this Instructables in the near future. Ask me any question that you have!

Step 1: Items List


Mechanism Hardware:

For the linear slide mechanism, I found the parts separately on OpenBuilds, but I would suggest using the V-Slot linear actuator kit, since it has all of the parts necessary as well as assembly instructions.

  • 1/2" wood base for the mechanism
  • Flange bearing with 1" inner diameter
  • 4x Larger screws and nuts for securing the flange bearing to the base (I found these at my local hardware store)
  • 1" steel pipe
  • 1" right angle adapter
  • Drop in T-nuts (I would suggest definitely getting some M5 T-nuts and any other sizes that you want)
  • Large washers or shims (for balancing the flange)
  • Any other wood/machine screw necessary for securing components

Wood Table Hardware:

  • 1/2" and 1/4" pieces of plywood, birchwood, etc. (refer to the table design)
  • 31" (or any other dimension) circular tempered glass
  • Router power tool
  • Circular router jig


Step 2: Building the Base of the Arm Mechanism

    1. I used a 1/2" piece of MDF wood to act as a strong, heavy base for the arm mechanism. Any 1/2" thick wood could be used for the base (not necessarily MDF). I used a jigsaw (before I bought a woodworking router for better cuts) to cut the MDF board into a rough circle and sanded the edges. Make sure you mark the center of your square before cutting it into a circle.

    2. I bored a 1/2" hole in the center of the circle for the slip ring, and drilled 4 other holes for the screws that will secure the flange bearing to the base. Before securing the flange, you need to insert the slip ring in the 1/2" hole and secure it with wood screws so that the flange and the free-spinning node is facing upwards.

    3. After securing the flange, insert the metal pipe in the ball bearing and check if the pipe is perpendicular to the base. When I tested this, I found that I needed to insert large washers in different locations under the flange to ensure that it was perpendicular.

    4. I cut the metal pipe to the length that I needed and drilled a hole through the pipe in the location where I was going to mount the main timing belt pulley.

    Step 3: Building the Slide Mechanism

    If you have acquired the OpenBuilds V-Slot kit or bought part that are similar, use the assembly resources from their website as a good guide for assembling the slide. I bought my parts separately so that I could have a "40x20" V-Slot rail laid horizontally instead of the vertical 20x40 arrangement that the OpenBuilds kit suggests using.

    Using a horizontal V-Slot arrangement would allow for a slightly stronger attachment point to the metal pipe rotation axis, but it forces you to design the timing belt system on top of the belt. I will go more in depth to how I designed my custom linear slide, but if you choose to use the V-Slot kit from OpenBuilds, you will have to follow their guide for more information.

    After choosing and cutting the length for my "40x20" V-slot, I began mounting the necessary hardware for gantry plate slide:

    1. I made mounting locations for the one of the pulleys that support the timing belt by drilling a hole close to on end of the slide, between the two V-Slot channels. I then used an M2.5 brass standoff with a threaded screw extension and a lock nut to secure a mounting location for the pulley that is elevated off the V-Slot. I used Loctite glue for added strength to the connection, since this pulley will have a fixed location on the slide. Then, it's as simple as mounting the ball bearing pulley with screw on to the standoff (make sure that you don't tighten it too much).
    2. The second pulley will be mounted to the stepper motor on the other side of the slide. I bought a separate flat aluminum bracket that was compliant with my "40x20" setup for mounting the stepper motor on the slide. I mounted the bracket with 2 drop in T-nuts and mounted the motor to the bracket. I used a 1/16" rubber sheet that I cut to the profile shape of the motor to insulate the vibrations from the motor, making the motor quieter.
    3. I bought four separate gantry wheels and a larger gantry plate to be compliant with my "40x20" setup. I mounted the gantry plate in the same way that it's mounted on the 20x40 V-Slot in the OpenBuilds kit. I made sure to adjust the spacing of the wheels by turning the eccentric spacers on 2 of the wheels until the gantry plate firmly secured and would start gliding when the V-Slot was tilted to one side.
    4. The timing belt that I used was a roll of GT2 timing belt (not a loop) that cut to the length that I needed. I mounted 3 more pulleys on to the gantry plate using a different length brass standoff in a V-pattern to maintain the tension in the timing belt. To secure the timing belt to the gantry plate, I used a 1" right-angled piece of scrap aluminum that I cut to about 50 mm in length. I drilled a hole to the same level as the pulleys and used a timing belt fixing bracket to clamp down the two ends of the cut timing belt. I then used belt torsion springs when necessary to increase the tension of the belt.
    5. I mounted the 2 end-stop switches to each ends of the slide by 3D printing a mounting bracket that is compliant with the V-Slot channels. I also 3D printed some bumpers for the gantry plate that extend over the edge of the plate, so that they will contact the switch first.

    Step 4: Laser Cutting the Table Legs

    I chose to laser cut the legs to be able to design a particular shape for the table. I wanted them to have a wide base and a shape that flares outward to form a cone-shaped table. I also chose laser cutting to be able to have plenty of mounting holes and connecting braces to make the structure of the table sturdy. I used Fusion 360 to model the structure of the table with the laser cut parts for the legs. I used the laser cutter that I had access to from my local university to make these parts out of 1/4" plywood. I have laid out the necessary parts for 1 leg assembly in the model that can be used to laser cut the parts from a 1/4" 12"x24" piece of plywood.

    Step 5: Building the Table Surface

    Bottom surface (holding the sand):

    The bottom surface consists of two 1/8" thick sheets of wood that will be separately cut and glued together.

    1. Cutting with a router:

    • Drill a hole for the circular jig metal pin in the approximate center of each 1/8" sheet.
    • Choose a diameter size on the jig for the outer edge of the table surface and cut out a circle from each 1/8" sheet with the router power tool.

    2. Gluing the two pieces together:

    I decided to use 2 separate 1/8" sheets so that I can glue them together while putting pressure on the center to "bow it upwards" to create a dome-shaped sheet. The two dome-shaped 1/8" sheets would be able to resist the weight of the sand better than a flat 1/4" sheet.

    • Saturate the surface of one 1/8" sheet with wood glue and line up the second sheet on top. Then place the center of the stacked sheets on an object and place weights on the edges to bow the sheets of wood.

    3. Mill the circular channels:

    • Mill one 1/4" wide channel on the edge of the stacked sheets that is 1/4" deep. Choose a diameter size that is at least 1-2" larger than that of the glass for the second channel which will hold the inner-wall enclosing the sand.

    Top surface (holding the glass):

    The top surface consists of one 1/2" sheet and one 1/4" sheet of wood that will be cut into different shapes and glued together. I added some diagrams for a better visualization of the milled cuts and channels.

    1. Cutting shape and channels:

    • Cut a circle in the 1/2" sheet that is the same diameter as the bottom surface.
    • On one side of the 1/2" sheet, mill the same channels that were milled on the bottom surface (these channels are where the circular walls will be glued to).
    • Cut a circle in the 1/2" sheet with a diameter that is 1" less than the diameter of the glass (in my case it would be 30"). Make sure that you account for the size of the router bit that is being used for an accurate cut.
    • Cut a circle in the 1/4" sheet that is the same diameter as the bottom surface, and cut another circle that is 1" larger than the inner diameter of the 1/2" sheet, to create a ring.

    2. Glue the two rings together with the channels facing outwards.

    Circular walls (attaching the two surfaces):

    • Cut two strips from a 1/4" sheet of wood, that are as long as the circumference of the table surface.
    • I used the steam from a hot iron to bend these strips of wood into a circle.
    • Glue the strips into the channels of one surface, and use clamps to hold them in place while they dry.
    • Glue the walls to the other channels to attach the two surfaces together.

    I covered the seems of the outside wall by gluing a thin wood sheet, but this can also be done with wood filler and sanding.

    Installing LED Strip:

    I used a sealed LED strip with an adhesive back surface to line the top of the inside wall with the strip. I soldered a connector to the end and drilled a hole through the inner-wall and between the channels on the bottom surface to route the wiring.

    Sanding and Painting:

    I sanded all of the edges of the table surface. I then applied a dark-wood stain on the outside, which I decided to sand-down and spray paint over. I spray painted the inside with a light-gray color to better reflect the light from the LEDs.

    Step 6: Wiring the Electronics

    After installing the Raspberry Pi Stepper HAT, I used the wiring schematic to see which GPIO ports were still available for the other hardware components. For the arm stepper motor and the limit switches, I had to solder the GPIO connections to the 12-wire slip ring to be able to wire those components. I used a GPIO pin breakout module (the board with the green connectors) to make sure my connections were secure.

    Step 7: Configuring the Software and Open-source Code

    Sand-Table code on GitHub

    Raspberry Pi Headless Setup:

    1. Download the latest version of Raspbian on your computer, and download Etcher for flashing the Raspbian image onto your Micro-SD card.

    2. In Etcher, select the Raspbian image that your saved and click flash.

    3. In the SD card's directory, create a file called "ssh" (or create a text file and rename it to "ssh"). Then create another file called "wpa_supplicant.conf". Copy the text from below and paste it into the file.

    ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
       ssid="<Network Name>"
       psk="<Network Password>"

    Clone the Sand-Table GitHub repository:

    git clone <a href="" rel="nofollow"></a>

    Receive IP Address from Raspberry Pi:

    Follow this guide on GitHub that I created for setting up an automatic IP address emailer.

    Setup on the Raspberry Pi:

    1. Enable I2C and SPI protocols in the Raspi-config:

    sudo raspi-config

    2. The only library that you should need is the "rpi_ws281x" for LED strip. Install the library onto the Raspberry Pi by using:

    sudo pip install rpi_ws281x

    Start Program On-boot:

    1. Edit the "rc.local" file by entering:

    sudo nano /etc/rc.local

    2. Add the following 2 lines before the END token:

    python3 <INSERT FILE PATH>/ &
    (sleep 15; python <INSERT FILE PATH>/

    "Movement Plans":

    For the generating and feeding the designs to the Sand Table to draw them, I started out by making my own "movement plans" by hand. I used some movement plans that were generated by Tom Dilatush in his GitHub project JSysiphus. The Sand Table uses (theta, rho) coordinates for movement, so I converted .thr files to .txt and placed all of the files in the "pending" folder of the repository, so that python can easily read them. The "" program then converts the coordinates to simple number of steps and speed commands for the stepper motors to perform.

    I was recently contacted by the owner of Sandify ( who introduced me to an excellent web-interface tool for creating and exporting movement plans. I suggest you check this great tool for visualizing and creating movement plans!

    Step 8: 3D-Models

    Here is my GitHub repository for Sand Table 3D-models that has most of the STL files for the things that I printed, as well as other models of things that were assembled.