Table of Contents


Mega CycloHex is a beautiful set of hexagonally-nested rings with 228 RGB LEDs, six touch pads, and an Adafruit QT Py SAMD21.

I have RGB LEDs in just about every form they come: strips, strings, rings, discs, etc. I constantly seek new and novel forms.

The six mounting screws are connected to pins (A0-A3, A6 & A7) on the SAMD21 QT Py, which supports capacitive touch on these pins. Most other QT Py / XIAO boards, such as the RP2040, do not support capacitive touch.


  • Size: 7.83 x 7.23 x .063 inch (199mm x 183.6mm x 30 mm)
  • Designed in the US by Jason Coon of Evil Genius Labs


  • 19 x 12 WS2812B 5050 RGB LED Rings: $31.06
    • These particular rings have two sets of three pads (5V, DI, GND) & (5V, DO, GND) and are much easier to wire and assemble.
    • The rings with only four pads (DI, 5V, GND, DO) are much harder to wire and assemble, as they require either soldering two 5V & GND wires to the small pads, or the creation of 5V & GND busses. Also the mounting holes do not match the acrylic design attached below.
    • Watch out for other listing that may show six pads, I ordered several and they arrived with only four pads.
  • 22AWG flexible stranded hookup wire with silicone insulation: $16.95
    • You can use any small gauge flexible wire, but I really like this kit of 6 different color spools.
  • Metric button head hex socket screws/bolt & washer kit: $21.59
    • Actual hardware needed:
    • 6 x M2x16mm button head hex socket screws/bolts
    • 6 x M2x6mm button head hex socket screws/bolts
    • 6 x M2 washers
  • M2 hex standoff kit: $9.99
    • Actual standoffs needed:
    • 6 x M2x10mm hex standoffs
    • 6 x M2x4mm hex standoffs (or M2x5mm, or M2x6mm, depending on diffusion desired)

      The larger the standoffs used between LEDs and the front acrylic, the more diffused (or blurred) the LEDs will appear.

  • M2 Nylon screw/bolt kit: $7.99
    • Use plastic screws/bolts, as the LED rings do not have enough room for metal M2 hardware without possibly shorting out the LED contacts.
  • 6 x M2.2 solder ring terminals: $8.31
  • Adafruit QT Py SAMD21
  • Black LED Acrylic: $16.17 plus ~$18 shipping, depending on your location
    • Only the front piece actually needs to be Black LED acrylic, the mount and back can be cut out of cheaper acrylic or other materials.
  • JST-SM pigtails: $9.99

Laser Cut Acrylic Parts

Parts Cost

These costs do not include shipping. Also not included: your time, which is priceless.

I already had most of the parts on hand, so my total cost was lower, of course.

Part Qty Total
LED Rings 19 $27.55
M2 Metal Bolt Kit 1 $21.59
Wire Kit 1 $16.95
Black LED Acrylic 3 $16.17
M2 Standoff Kit 1 $9.99
JST-SM Pigtail 1 $9.99
M2 Nylon HW Kit 1 $7.99
M2.2 Solder Rings 1 $7.99
Qt Py SAMD21 1 $7.50
Total 25 $125.72


Open source example firmware and web application:

Flash this code, using Arduino, PlatformIO, etc, to your QT Py.

Note that if you use different LED rings, or wire them in a different order, then you’ll need to adjust the coordinate maps in the code.

Pixelblaze Settings & Map

If you’d rather use one of the amazing Pixelblaze WiFi LED Controllers by ElectroMage you won’t be able to utilize the touch pads, but you will be able to control it via wi-fi via the awesome web UI!

Here are the settings and maps I use:

  • Limit Brightness: 25
  • LED Type: WS2812 / SK6812 / NeoPixel
  • Pixels: 228
  • Color Order: GRB (note this may be different if you used different LED rings)



LED Ring Layout & Order

Assembly Instructions

  1. Solder a JST-SM socket pigtail (the one without the pins) to the QT Py. Solder the red wire to the 5V pad, the center wire (green on my JST-SM pigtail) to the MO pad, and the GND wire (white on mine) to the GND pad.
  2. Peel any protective coverings from the acrylic mounting plate.
  3. Align the LED rings with the mounting holes and wiring cutouts on the acrylic mounting plate.
  4. Mount the LED rings to the acrylic mounting plate using plastic/nylon M2 screws and nuts.
  5. Carefully flip over the mounting plate with LED rings mounted, so that you can access the solder pads.
  6. Tin the input pads (5V, DI, GND) on the center LED ring.
  7. Carefully solder the JST-SM pin pigtail (the one with the pins inside the shroud) wires onto the input pads of the center LED ring, ensuring there are no shorts between the pads. Solder the red wire to the 5V pad, the center wire (green on mine) to the DI pad, and the GND wire (white on mine) to the GND pad.

Important! - repeat these steps each time you connect another LED ring. It’s much easier to find and fix problems, such as short-circuit connections between wires/pads, as you go rather than troubleshoot at the end with them all connected. If a short-circuit does happen and the connected LEDs get damaged, there’s less to replace if you test as you go.

  1. Check for shorts between the pads. Use a multimeter’s continuity tester if possible.
  2. Connect the QT Py to the center LED, and plug the QT Py in to a power source via the USB-C port.
  3. Ensure the LED lights up.

  1. For the connections between the rings, I used red wire for 5V, black for GND, and blue for DI/DO.
  2. Strip a very short amount of insulation from the end of the wire.
  3. Tin the wire and the output pads of the center LED ring with a small amount of solder.
  4. Carefully solder the end of the wire to the output pads of the center LED ring pad.
  5. Leaving at least a little slack, measure and cut the wire to go from the output pad of the center LED ring to the input pad of the nearest LED ring to the left (refer to the layout & order image above).
  6. Repeat for the other wires from the center ring to the next ring (5V, DI->DO, GND).
  7. Repeat the Important! testing steps above (check for shorts, connect the controller, ensure the connected rings light up.

Repeat the steps above to connect each LED ring, one at a time, testing each new LED ring as you go.

  1. Strip and solder wires (I used white) onto the M2.2 solder ring terminals.
  2. Leaving at least a little slack, measure and cut the wire to go from one of the six mounting holes on the back of the mounting plate to the location where you’ll mount the QT Py. I mounted mine in the bottom middle.
  3. Strip and solder the other end of the wire onto one of the QT Py touch pads. See the diagram above.
  4. Repeat for the other touch wires.

Acrylic Enclosure Assembly Instructions

  1. Peel any protective coverings from the acrylic front plate.
  2. Insert M2x16mm screws through the six holes in the front acrylic piece, with the screw heads on the matte side.
  3. Thread the short M2 standoffs (4mm, 5mm, 6mm, etc) onto the screws on the back glossy side of the front acrylic.
  4. It’s easier if you leave the standoffs loose until after inserting the screws through the mounting plate.
  5. Repeat for each of the six screws and holes in the front.
  6. Carefully align and insert the screws through the mounting plate.
  7. Hand-tighten the screws and standoffs.
  8. Flip it over and put the ring terminals onto the mounting screws, in the order shown above.
  9. Hand-tighten M2x10mm standoffs onto each of the six screws.
  10. Plug in the QT Py and make sure all of the LED rings light up, and that touching each of the six mounting screws triggers a wave from that location.
  11. Use double-sided foam or VHB mounting tape to secure the QT Py to the back of the mounting plate.

  1. Peel any protective coverings from the acrylic back plate.
  2. Place the back plate onto the standoffs, making sure the wall mounting hole is at the top.
  3. Secure the back in place with six M2x6mm screws.

Share your work!

Possibly the MOST IMPORTANT step: please take lots of photos and videos of your Mega CycloHex and share them with me!

  • If you’re on Mastodon, you can find me there at
  • If you’re not on Mastodon, please join!
  • If, for some reason, you don’t want to join Mastodon, you can find me on Instagram at @jasoncoon.
  • If, for some reason, you’re not on either Mastodon or Instagram, but you’re still hanging on at Twitter, you can find me at @jasoncoon_, but I’ll be honest, I’m not going to be very active there any more.