Introduction: How to Make a Suspended Matrix of Spinning CDs With Arduino

About: I like to create live visual experiences at concerts and for installations as an audio-visual artist and VJ.


The finished product is called Incidental Reflections (see video). It explores reflections that occur as byproducts. Compact discs and DVDs exude light patterns on their reflective surfaces and diffract rainbow-like patterns onto surroundings. The eye-candy is a fortuitous consequence of how these discs operate as digital optical disc data storage formats. Phew, that was a mouthful!


In this step, you will see a very rough rendering of the project (actually without the hanging CDs from the board). Use this to get an idea of what the space will look like and to communicate the project to the facilities/production team at the desired venue.

You can download the rough rendering as an OBJ or STL file to open up in your software of choice. You can also import these files, or the attached JSON file, into the ThreeJS editor without leaving your browser! The rendering is also available for viewing online here, although I recommend trying to import one of the attached files into the ThreeJS editor so you can view the rendering from various angles and zoom levels, as wells edit the rendering.


I encourage you to make a copy of this Trello board and use to help guide the project to completion.

I went through several trial-and-error processes to arrive at these steps. To save you time, I'll mention what alternate methods didn't work out for me along the way.

Any questions? Feel free to contact me! My contact info is on my website.

Step 1: Materials: 3D-printed Couplers


Have access to a 3D-printer that is compatible with STL files? Go ahead print these couplers using the attached STL file. If you don't have access, follow the directions in the step to order the couplers from 3D Hubs.


Please order about 25 these 3D-printed couplers for the 28BYJ-48 stepper motor from 3D Hubs.

  • You will need 16 couplers for the completed project. They are delicate so you may break some, or need some for testing.
  • You may choose the cheapest material option "General Purpose Plastics". If you wish to shell out for a more expensive material, you can go with something like "Fiber-reinforced nylon".

  • While my couplers are white, choose a black material if possible to dissuade the eye's attention to the couplers themselves. You can also spray paint the couplers black if you wish!


  • Found another coupler design you prefer on Thingiverse? Here a short tutorial on to convert a .thing file to a .stl file that you can upload to 3D Hubs.
  • Don't overpay! These should only cost about $12-15 for the whole batch.
  • You will need a 3DHubs account to purchase from their site. If you don't have an account yet, make one! Ordering 3D-printed materials is awesome and addicting.
  • Of course, you can use another 3D-printing service if you wish, or print them yourself!

If you choose to use a service, you will have to wait for these to ship (likely without the convenience of the Amazon Prime 2-day shipping), so order these first!


Before I found this 3D print design, I went through several a long process of trial-and-error. I experimented with moldable plastic such as InstaMorph for the first time, but found it was far from pretty and difficult. I experimented with another 3D print design.

Step 2: Materials: Wait How Many CDs/DVDs!?

I successfully avoided buying a single new CD or DVD in the making of this project! Hooray for recycling!

We will be glueing two discs together so each side is reflective as they spin around. Each string is 10 disc pairs long, so each string needs 20 discs. With a total of 16 strings, that brings us to 20 * 16 = 320 discs needed for this project.

I'm confident with some time, effort, and luck, you'll accrue enough discs to move forward with the project without buying any brand-spanking-new blank CDs!

Thrift / Scrap / Junk / Art Supply stores

Try your local thrift stores. Don't be afraid to ask an employee if they have any loose CDs lying around or in the back. Use a service like Yelp to find any and all stores of interest around you.

I was fortunate enough to live by the wonderful Scrap SF, which has random gems and crap of stuff for mad cheap and is located down the street from me! I got a extra-large reusable grocery bag full of loose CDs and DVDs for about $5 or so. You're chances are higher of finding a spot like this around industrial parts of town.


  1. Search for CDs or DVDs on your local craigslist.
  2. Create an email alert for each of your searches. This will ensure you will be the first to know about posts that go up in your area!
  3. Make a "wanted" post in search of CDs and DVDs.

Asks your friends and family

Exhaust all your resources! Post to Facebook and asks if anyone has old blank CDs around.

My dad had a stack of 75 unused blank CDs in his garage. I was able get my mom to sneak the stack out of there and into my hands!

Local Radio stations / Record stores

Give em a call and see what they might have lying around for a rainy day!

Step 3: Materials: the Big Ol' Wooden Board

A diagram of the wood is attached, along with its original PSD file in case you want to create an altered version.


Here are the specs for the wooden board itself:

  • 7 x 7 x 0.75 cubic-ft
    • 7 ft. x 7 ft. square wooden board
    • 3/4 in. maple veneer plywood
  • Approximate weight of 95 lbs.

At this size and material, it should barely bow/bend at all.


  • [x4] large steel screw eyes


We will need 1 hole for each motor. We will place this in a grid on the board with each 16.8 inches (measuring from the hole centers) from the board edge or from the adjacent holes. Each hole will be 1.25 inches wide to fit the the

We will also need holes in each corner, one for each screw eye.


The huge aim of this project is to sharpen Arduino skills for a large-scale physical installation. We will be dealing how to scale a small-scale Arduino project to a large-scale one with long wires and a bunch of motors. Since I had no access to a proper space for woodworking activities, I chose to collaborate with a friend on the construction of the wooden board. He works in a local wood shop as a professional woodworker and was excited to collaborate on the project. I gave him the specs and 1 stepper motor and he was able to gather the necessary wood and the four screw eyes and complete the board over one weekend (with the screw eyes already in)!

For those looking for a woodworking tutorial, this won't be it! For those more interested scaling electronic projects, you're in the right place! Take this as an encouragement to be open to (and certainly not embarrassed) about collaborating on others for a huge (in both scope and physical dimensions) project such as this.

If you do have access to the proper space needed for such a large woodworking project, please give it a go yourself, and leave a comment below on how it went.


I had to transport the large board from the woodworking studio to my garage, then later to the exhibit. Here's a few possible ways:

  • Lugg
    • Lugg is a mobile app that is essentially Uber for moving. It is available in the San Francisco and worked out great for me. I used the cheapest option, the "Lugg Pickup" truck, to transport from the woodworking facility to my house and later to the venue, and both times the board was just able to fit in the truck! If you have the extra money, a "Lugg Van" or "Lugg XL" may work better.
  • Movers / Moving company
  • U-Haul
  • Craigslist
    • Search Craigslist for pickup truck drivers or movers.
    • Create an email alert for each of your searches. This will ensure you will be the first to know about posts that go up in your area!
    • Posted a wanted ad on Craigslist asking for assistance.
  • Ask friends make a Facebook post looking for help from someone with a pickup truck.

Step 4: Materials: Everything Else

We have already covered some needed materials in the previous steps:

  • A heaping of CDs/DVDs
  • [x16+] 3D-Printed couplers
  • Plywood board
  • [x4] large steel screw eyes


I have created this handy Amazon shopping list that has most of items needed for this project:

  • Arduino Mega
  • Crop-A-Dile Power Punch
  • [x16+] 5-V 28BYJ-48 stepper motors w/ ULN2003 driver boards
  • Soldering Iron Kit
    • Soldering Iron
    • Helping Hands w/ alligator clips and magnifier
    • Solder wire
    • Brass tip cleaner
    • Iron stand
  • Copper wire
  • Electric screwdriver / Power Drill
  • Wire stripper
  • Wire cutter
  • Scissors
  • Elmer's non-toxic Glue-All (or comparable glue)
  • Breathing/dust masks
  • Two-tube epoxy
  • ~100 ft of rope (preferably black) with a 110-LB+ work load limit
  • [x4] heavy-duty screw eyes
  • [x5] Black matte spray paint cans
  • [x32+] Wood screws
  • Electric tape
  • Packaging tape
  • Multimeter
  • Surge protector with a USB port
    • Connecting a USB-to-AC adaptor (that typically comes with a phone or tablet) to a traditional surge protector will suffice
  • Superglue
  • [x2] solderless breadboard
  • [x2] 2.1mm x 5.5mm Female CCTV Power Plug Adapter
  • Pocket/mini screwdriver
  • Optional
    • condiment cup (for mixing epoxy)
    • Jewelry pliers (for twisting copper wire)

Avoid some of the bumps in the road I hit! Here are some helpful tips...


The "insides" of these will vary depending on manufacturer:

  • There are several different versions associated with this part number. Part of the distinction is made by the voltage rating associated with the motor, either "5V" or "12V". But even for particular voltage ratings, there are different models available with, for example, different winding resistances. There may also be models with different gearing. (taken from this awesome wiki resource).
  • Don't make the same mistake I did and buy a 10-pack on Amazon here and a 5-pack on Amazon there, etc. Buy them all from the same manufacturer and seller!


Make sure each motor you buy comes with its own ULN2003 driver board. These boards are super handy and cheap! They have built-in LEDs that represent the motor's stepping and very visibly demonstrate stoppage and reversal of the motor's stepping. But you want to use a motor shield you say...

No need to use a separate motor shield! In fact, the Adafruit Motor Shields (v1 and v2) do not pair well with the 28BYJ-48 stepper motors and aren't necessary. You are much better off just using the ULN2003 boards!


  • You do not need to use a genuine Arduino Mega.
    • I began using a Mega made by another manufacturer and 2 of 54 I/O pins did not work, which took more than a few hours to figure out (I thought my wiring was incorrect the whole time!).
    • I ended up switching to a genuine Mega.
    • You may very well have better luck than me using a "knockoff".
  • You can buy a soldering iron and related items packaged together in a handy kit if you wish. Great for first-timers and for portability.

Step 5: Paint the Wooden Board

Time: ~2 hours

It is time to spray paint the board! Spray painting proved to be an easy and quick method to painting the plywood.


Paint outside if at all possible, or in a highly-ventilated area. Use a breathing mask, even if you are spray painting outside, to avoid breathing in the fumes of the paint. Particles of paint float around and will lightly coat your clothing, so wear cheap clothes and shoes. Also, make sure to wear long sleeves and pants. Put your hair up if you have long hair, and maybe even throw a cheap hair net on!


This Youtube video is a helpful guide on attaining an even coat of spray paint on large surfaces.

Going back to the board specs, the motors holes were placed leaving 5 16.8 inch-tall rows and 5 16.8 inch-wide columns. I painted a coat on each column one-by-one. Repeat to give each column about 3 coats. Give each column about 20 minutes to dry before applying a new coat. I found that it took about 20 minutes or so to coat the whole board, so each column was dry as I returned to it.

Paint only the bottom side of the board (not the side with the eyes of the screw eyes showing). You do not need to paint the top side.

Step 6: Upload the Code to the Arduino

  1. Clone or download the project's public repository.
  2. Open the file "incidental-reflections.ino" in the Arduino IDE.
  3. Under the Tools menu
    1. Plug in your Arduino Mega to your computer.
    2. For Board, choose "Arduino/Genuino Mega or Mega 2560".
    3. For Processor, choose "ATmega2560 (Mega2560)".
    4. For Port, choose the port corresponding to your Arduino Mega.
  4. Click the arrow icon to upload the code to your Arduino Mega.

Step 7: Punch Holes Into Discs

Time: ~3 hours

We will be punching holes with our Crop-A-Dile Power Punch.

For each disc:

  1. Punch one hole into the disc at a 1/4 inch distance from the edge of the disc. (Some discs are more prone to cracking the closer you punch holes to the edge.)
  2. Use a straight-edge and permanent marker to mark the desired hole on the opposite side of the disc. You want the two holes to be straight across from each other on the disc. Perfect precision isn't necessary for this, but get close!
  3. Punch a hole at the mark.
  4. Repeat with another disc!

After every 10-20 discs, empty the cartridge in the hole-puncher that gathers the punched-out pieces of the discs.

TIP: It is much faster to hole-punch in assembly-line fashion. I took a stack of about 50-100 discs at a time and repeated each step for the whole stack before moving onto the next step.

We will also need 32 discs (16 disc-pairs) to only have 1 hole in them. These will be the bottom disc-pair of each disc-string. This means for these 32 discs - we just need to complete step 1 of the hole-punching stages, skipping step 2 and 3!

We now have many discs with two holes in them. Awesome! Now it's time to glue the discs together!


I also tried taking a hot soldering iron and pressing the tip through a CD to make the hole. This worked! But had some downsides:

  1. Smelled terrible... the fumes of the burning CD are likely very toxic.
  2. Slow and meticulous.
  3. The melted CD left a coat of plastic on the tip of the soldering iron.

Step 8: Glue Discs Into Double-sided Pairs

Time: ~3 hours

These discs will be spinning around, so we want to have the reflective side showing on both sides.

  1. Apply glue on the label-side of a disc. (You need less glue here than you probably think!)
  2. Take a second disc and press the label-sides of the two discs together. (There's no need to apply glue to the second disk. The glue on the first disk will suffice.)
  3. Adjust as needed to align the holes.
  4. You now have a disc-pair. Repeat with two more discs!

Step 9: Wire Discs Together Into Long Strings

Time: ~4 hours

We will be using copper wire to tie the disc-pairs together.

  1. Cut a 2-3 inch length piece of copper wires with wire cutters.
  2. Thread the piece of wire through one hole of each disc-pair.
  3. Twist the ends of the piece of wire together.
  4. Use wire cutters to cut excess wire off.

Repeat to make a disc string of 11 pairs. We want 10 disc-pairs with two holes each, and on one end an 11th disc-pair that has only one hole. This disc-pair will be the bottom of our string.

Repeat to make 16 disc-strings.

Step 10: Glue Couplers to Motors

Time: ~25 minutes

Use two-tube epoxy to glue the couplers to the stepper motors. The epoxy will come with directions on the packaging that important to heed to end up with a strong bond between the coupler and motor. It comes with a wooden mixing spoon that resembles a wooden popsicle stick.

Find a flat surfaces or a few small containers you can use to mix the resin and hardener parts of the epoxy together. A small condiment cup, a dixie cup, an index card, piece of cardboard, or egg carton will do.

The epoxy hardens quickly. To conserve, only squeeze out enough to use for a quarter to half of the motors on the board. (If it begins to noticeably harden, then toss the surface/container and repeat the process.)

  1. Use wooden spoon to mix together a small amount of equal parts resin and hardener on the surface or in the container. Follow the directions for your glue for this step.
  2. Apply a very small amount of epoxy to the center hole of the coupler (less than you probably think!). If you apply too much, scrape off the excess with the wooden spoon.
  3. With the coupler below the motor, push the coupler tightly onto the motor shaft. Keeping the coupler on the bottom ensures excess glue does not leak onto the motor itself.
  4. Let sit!
  5. Repeat! If the glue begins to noticeably harden (which will happen during this process, possibly multiple times), toss the surface/container and repeat the process.

Step 11: Screw Motors Onto the Wooden Board

    Gather your motors, a power drill or electric screwdriver, and wood screws.

    1. Insert the motor into the hole, pushing the wire through first so it hangs out towards the unpainted side of the board. The motor should now be flush with the board. The brackets with screw holes should be against the painted side of the board.
    2. Adjust the coupler's position to get it out of the way of one screw hole.
    3. Use your power drill or electric screwdriver to drill in one screw at an angle outwards from the hole.
    4. Adjust the coupler position' to get it out of the way of the other screw hole.
    5. Do the same with another screw for the other hole.

    Repeat for each motor hole.

    Step 12: Attach Arduino, Breadboards to the Wooden Board


    1. Use electric tape to cover entire backside of the Arduino Mega. (This is to avoid getting glue on the actual Arduino.)
    2. Put a layer of superglue on the taped side.
    3. Place the Arduino on the board per the picture, between motors 2 and 3 but a tad closer the edge.


    1. The breadboards have double-sided table on the bottom. Remove the seal of the breadboard.
    2. Place the breadboard on the board per the picture, slightly closer to motors 2 and 3 (farther from the edge than the Arduino).
    3. Repeat with a second breadboard, placing it to the right of the Arduino.

    Step 13: Make Long Ribbon Wires

    We will be placing the Arduino Mega near the center of the board. Breadboard jumper wires aren't long enough connect motors a few feet away.

    We need 4-wide wires to send directions to the ULN2003 driver boards, and 2-wide wires to power these boards and the 28BYJ-48 stepper motors. Refer to the pictured schema.

    We will be making 2 types of long wires.


    We can use the Elegoo wires. Each pack conveniently comes with male-to-male, male-to-female, and female-to-female wires terminal pins at each end.


    For medium-length wires, we will be using electric tape to tape together these Elegoo wires. These are very easy and quick to make. Try to use these as much as possible for long connections, saving soldered wires for covering longer distances across the wooden board. When taping these wires together, the maximum amount of wires we want to tape together is 3, which leaves us a wire of about 24 inches (each wire is about 8 inches long).


    For our longest wires, we will use these same Elegoo wires, cutting them in half and soldering them to both ends of long ribbon wire (pictured as a coil above). Essentially, we using the ribbon wire to create extra long versions of the Elegoo wires, utilizing the fact that they come with terminal connections pre-installed.

    1. Elegoo male-to-female wire
      1. Pry off a 2-wide or 4-wide piece of a male-to-female Elegoo wire (you will need both 2-wide and 4-wide wires by the end of this!).
      2. Use a wire cutter to cut the Elegoo wire in half.
      3. Use a wire stripper to strip about 8 mm off the cut end of both wires. (You should be able to strip the 2-wide or 4-wide piece at once.)
    2. Ribbon wire
      1. Use a wire cutter to cut off a somewhere around 2-3 feet of ribbon wire.
      2. Pry off a 2-wide or 4-wide piece of the cut ribbon wire.
      3. Use a wire stripper to strip about 8 mm off both ends of the wire. (You should be able to strip the 2-wide or 4-wide piece at once.)
    3. Connecting the wires
      1. Solder one half of the Elegoo wire to one end of the ribbon
      2. Solder the other half to the other end.

    Sweet! You know have a long wire that can connect a stepper motor at one end of the board to the Arduino and breadboard at the other end! I'd recommend testing out the wire using a multimeter to make sure it is still passing a quality voltage through the despite the soldered connection.

    Repeat to make as many as needed.

    Step 14: Make AC Power Adaptors for Breadboards

    We will make two of these adaptors. We need two female power plug adaptors, four of our Elegoo male-to-male wires, and our pocket screwdriver.

    1. Prepare the pocket screwdriver for use with the correct head. If you have the Lutz Hardware 4-in-one Pocket Mini Screwdriver from the Amazon shopping list, we want to use the smaller double-slotted head (labeled PH.000 / 1/16).
    2. Loosen the two screws on the adaptor.
    3. Insert a wire into each clamp.
    4. Tighten the screws.

    Repeat to make a second adaptor.

    Step 15: Connect Wires Between Arduino, Power Supplies, Breadboards, and Motors

    The schematic provided is by no means complete and is only meant to call attention to the idiosyncrasies of this particular setup. Use it along with the AccelStepper declaration in the code to wire everything up.


    Hook up three 9V AC-to-DC power supplies to a surge protector.

    1. Begin with the surge protector off or unplugged.
    2. Plug one power supply into the Arduino.
    3. Plug the other two power supplies into the our breadboard adaptors we made in the previous step.
    4. Put the male connections of the breadboard adaptors into the breadboard power and ground rows, ensuring power and ground are plugged into the correct rows. (We want one power supply per breadboard.)

    Hook up about half of the motors to one breadboard's power and the other motors to the other breadboard's power.

    While setting up the project, you will want the Arduino hooked up to your computer to test your code. For exhibition, you want the USB cord hooked up to the surge protector as well. Depending on your set up, you may want to use a longer USB cord than the one that comes with the Mega.


    The inner four motors (numbered 1-4) will be controlled by the same digital inputs. We use 4 Elegoo male-to-male wires from the Arduino to the breadboard. As the schematic demonstrates, Arduino pins 23, 25, 27, and 29 are wired to the breadboard. The four motors will then be wired to the breadboard to all receive the same input from those Arduino pins.

    This method allows us to spin the inner disc strings in the opposite direction of the outer strings.


    We are using the AccelStepper library for Arduino and will have one AccelStepper instance per stepper motor. Refer to the AccelStepper instance declarations in the Arduino code for connecting the motors to the Arduino. Feel free to attach them to different combinations of the Arduino's I/O pins if you wish. Make sure your connections and the AccelStepper instances match up correctly.

    Important note: The AccelStepper constructor does not want the pin numbers coming from the ULN2003 driver board (pictured above) in numerical order. Pins 2 and 3 must be switched in the constructor's arguments. Declare like so:

    AccelStepper stepper1(STEP, IN1, IN3, IN2, IN4);


    Use electric tape to help keep groups of wires in place. For example, you can tape together all the wires that connect to one breadboard's power. You can tape together all the wires that connect the inner four motors to the breadboard.

    Step 16: Connect Disc Strings to Motor Couplers

    Please note: by now, your motors will already be screwed into the wooden board. The motor pictured is not in the board only for demonstration purposes. We will be wiring our disc strings to the motor couplers already on the wooden board. Begin by setting the board on two tables as pictured.

    1. Use wire cutters to cut off about a 5-inch piece of copper wire.
    2. From the top side of the coupler, loop through two coupler holes adjacent to the motor shaft on opposite sides.
    3. Take a disc-string. Loop both ends of the wire through the top hole of the top disc.
    4. Twist the loose ends together.
    5. Use wire cutters to cut off the excess wire.

    Repeat to attach the 16 strings to the couplers.

    Step 17: Prepare for Exhibition


    Hanging logistics are very specific to the exhibition venue. The facilities manager will have an idea of how to hang a heavy installation like this at the desired venue. You will need to cut four long, equal-length pieces of rope, but the needed length will vary. Some venues have portable walls, which could be used to place the board atop of if you are unable to hang it from the ceiling or rafters. Be sure to contact the facilities manager ahead of time to know what is possible at the venue and to iron out logistics ahead of time.


    Preferably place 8 foot-long movable walls on three sides of the installation. Rainbow-like patterns will reflect onto the walls. Disco ball-like effects will reflect onto the surroundings.

    Note: you can see from the photo that I did not have movable walls on three sides. This is only because venue did not have enough to supply three for my installation the night of exhibition.


    Direct a spotlight or similar light from ceiling/rafters to the installation. The light should be pointing towards the installation onto the side without a movable wall.

    Place an LED light like this one like on the ground in the very center of the installation.

    Incidental Reflections was exhibited at Gray Area in San Francisco, CA for the Fall 2016 Immersive Exhibition and for a Creative Coding meet-up. Thanks to everyone at Gray Area, including Matt and Mark for all the help. Thanks to the Immersive Fall 2016 cohort. Huge thanks to production manager Seabrook for getting this hung in the air! And thanks to Andrea Mina Oh for all the help twisting all those copper wires :)

    Trash to Treasure Contest 2017

    Participated in the
    Trash to Treasure Contest 2017