X2 Time Ball: Final Assembly

DISCO! We hope you enjoyed the over-the-top X2 Time Ball video as much as we enjoyed making it! Getting this finished in time for New Year’s Eve meant the progress blog posts would have to wait, so we’ll be returning to a few details now after the fact, and continuing as future design plans are ironed out…

As explained in an earlier post, we settled on an icosahedron shape as a sanity-preserving measure. Every single LED — 120 of them — must be installed in a specific sequence, and using a higher-order polyhedron would require following a very complex map for their locations. The icosahedron is simpler with 20 identical triangular faces, and the same wiring sequence from one to the next (with alternate rows rotated 180 degrees):

This is just the installation order for the LEDs; wiring for power was also explained in a prior post. There are additional wires (not shown here) that are joined to power distribution strips only after all the LEDs are pressed into place.

The polyhedron faces were laser-cut from mirrored acrylic. To make the wiring process less error-prone, the order of connections was drawn on the back side of each face with a permanent marker (identical for every face, so this goes fairly quickly):

Pairs of faces were then joined up and are loosely joined with cable ties (there’s a specific alignment: note how the “in” and “out” wires always come and go from the sides); this produces 10 identical diamond shapes. The 10 diamonds were then laid out to match the wiring diagram above, and similarly joined with cable ties, producing a complete 2D map:

Starting from the top-left triangle and following the wiring sequence exactly, each LED pixel (beginning from the microcontroller end) is then pressed into place. This involves a lot of twisting and turning in order to avoid tangles in the wire, which is why the power leads should not be joined to anything yet (the strand needs to turn freely at one end):

Above: one triangle down, 19 to go. Below: all LEDs installed, power not yet connected:

Loosely rolling everything up into a ball at this point revealed a problem. I’d been obsessed with the idea that all of the electronics (including the microcontroller, XBee, power distribution bars and protective plastic covers — a roughly fist-sized wad of stuff) should fit inside the ball, so only a single power cable would protrude. But when folded up, the loops of wire between pixels didn’t allow enough space at the core. This required going through and doubling every loop back on itself:

The power cord would do double-duty as a means of suspending the ball. This may or may not actually be a good idea — I can’t help but imagine there’s some kind of electrical code regulation against doing this, but then IKEA lamps seem to do it all the time. So, purely as an experiment for now, an extra plastic piece locks neatly over the ferrite core at the end of the power cable. This is fed through what will be the top vertex of the polyhedron, where five triangles meet at a point. When it’s all cinched up, the cord won’t slip back out through the hole.

The flat icosahedron map is then loosely rolled up like a burrito, with more cable ties holding it in place. The bottom vertex is closed, then all of the power leads are joined to the distribution bars, the electronics package is screwed together and placed inside, and the top vertex is closed around the power cord.

Three or four passes are then made around all of the cable ties, gradually transforming the shape from a chaotic molten glop into a neatly-ordered polyhedron…albeit a bristly polyhedron at this point:

Two tools can be helpful for finishing. The first, a cable tie gun, is not essential but can really improve the final cinching down of each piece, to get every cable tie uniformly snug. The second is an ordinary nail clipper, to cut each cable tie flush (wire cutters don’t cut them quite flush, resulting in hundreds of sharp little plastic points and a disco ball that’s very painful to handle!).

The microcontroller inside had previously been programmed with the LEDstream sketch — essentially the same as used by Adalight and Adavision, with just a small change to read from the XBee module rather than the USB port. No code had been written for the ball at this point, but the Plasma demo from Adavision would at least show if the ball was receiving data. After plugging it in and firing up the code, it works!

Some ideas didn’t pan out as hoped. Remember those 5 extra LEDs from the wiring diagram? The project used five LED strands, which come in lengths of 25 pixels each (125 pixels total), while the icosahedreon needed only 120 (20 faces x 6 pixels per face). The extra five could have been trimmed off and used in some mini-project, but instead I had the idea to use these to illuminate the interior of the ball, which would then be visible through Adafruit logo-shaped cutouts at each vertex:

In practice, the internal LEDs didn’t provide uniform lighting. They tended to get smooshed up against one face or another, and would throw off the color of the outside LEDs in that specific area. So the code now leaves these LEDs turned off.

“Bronze mirror” wasn’t the best choice of materials; it tends to photograph as almost black. Future iterations will use traditional “clear” mirror.

XBee also didn’t perform as well as hoped, but that’s a post for another day. In the meantime, here’s a dinosaur holding up a disco ball:

Adafruit publishes a wide range of writing and video content, including interviews and reporting on the maker market and the wider technology world. Our standards page is intended as a guide to best practices that Adafruit uses, as well as an outline of the ethical standards Adafruit aspires to. While Adafruit is not an independent journalistic institution, Adafruit strives to be a fair, informative, and positive voice within the community – check it out here: adafruit.com/editorialstandards

Join Adafruit on Mastodon

Adafruit is on Mastodon, join in! adafruit.com/mastodon

Stop breadboarding and soldering – start making immediately! Adafruit’s Circuit Playground is jam-packed with LEDs, sensors, buttons, alligator clip pads and more. Build projects with Circuit Playground in a few minutes with the drag-and-drop MakeCode programming site, learn computer science using the CS Discoveries class on code.org, jump into CircuitPython to learn Python and hardware together, TinyGO, or even use the Arduino IDE. Circuit Playground Express is the newest and best Circuit Playground board, with support for CircuitPython, MakeCode, and Arduino. It has a powerful processor, 10 NeoPixels, mini speaker, InfraRed receive and transmit, two buttons, a switch, 14 alligator clip pads, and lots of sensors: capacitive touch, IR proximity, temperature, light, motion and sound. A whole wide world of electronics and coding is waiting for you, and it fits in the palm of your hand.

Have an amazing project to share? The Electronics Show and Tell is every Wednesday at 7pm ET! To join, head over to YouTube and check out the show’s live chat – we’ll post the link there.

Join us every Wednesday night at 8pm ET for Ask an Engineer!

Join over 36,000+ makers on Adafruit’s Discord channels and be part of the community! http://adafru.it/discord

CircuitPython – The easiest way to program microcontrollers – CircuitPython.org

Maker Business — “Packaging” chips in the US

Wearables — Enclosures help fight body humidity in costumes

Electronics — Transformers: More than meets the eye!

Python for Microcontrollers — Python on Microcontrollers Newsletter: Silicon Labs introduces CircuitPython support, and more! #CircuitPython #Python #micropython @ThePSF @Raspberry_Pi

Adafruit IoT Monthly — Guardian Robot, Weather-wise Umbrella Stand, and more!

Microsoft MakeCode — MakeCode Thank You!

EYE on NPI — Maxim’s Himalaya uSLIC Step-Down Power Module #EyeOnNPI @maximintegrated @digikey

New Products – Adafruit Industries – Makers, hackers, artists, designers and engineers! — #NewProds 7/19/23 Feat. Adafruit Matrix Portal S3 CircuitPython Powered Internet Display!

Get the only spam-free daily newsletter about wearables, running a "maker business", electronic tips and more! Subscribe at AdafruitDaily.com !


  1. Austin Spafford

    Fantastic description of how the whole thing was put together! I especially like the flowers on the corners.

    Seeing the internal cable madness reminds me of this printed ball: http://www.thingiverse.com/thing:6178

    I could understand this being beyond the normal kit level, but maybe the design could be shared via Thingiverse?

  2. Just wondering if this is possibly going to be offered as a kit at some point?

  3. Vernon: there’s a good chance of that, yes…though the end result won’t be exactly what we’re seeing here. These posts will hopefully shed some light on the design and decision-making processes, trade-offs that need to be made, and heroic failures. 🙂

  4. This would be awesome as a kit, even if you just sold the panels that would be cool.

  5. I bet you would build a pretty big list if you were to take pre-orders for the kits.

    Sign me up.


  6. Regarding the mapping of LED’s, I had a similar problem when I made my LED coat (e.g. http://youtu.be/1U0F70cCNfQ ). I wanted to have location data vertically from the bottom of the coat, radially (from the front seam, left around the back, and back to the front) and the distance from my heart.

    My solution was to install all the LED’s arbitrarily. My setup consisted of modules that drove 5 LED’s each, so I wrote some code that set the 5 LED’s on each module to red, yellow, green, blue, and violet, and then would blink each module according to its number (module 0 stayed on, module 1 blinked once, #2 twice, etc.) I then measured the location data for each LED and put it into a spreadsheet. Using the spreadsheet functions, I output C code to be included back in the source for the controller.

    Once I was done, I had all the dimensional data I wanted but I didn’t have to place each LED in some pre-calculated location.

Sorry, the comment form is closed at this time.