Design and create glowing scales in your favorite shape and add NeoPixel strand lights inside for a stunning display of animated lights.

These are so easy to add to any costume or design. This guide shows you how to create your design in TinkerCad, a free online 3D design program. You can print your armor at home or use an online printing service. Hot-glue a strand of NeoPixels inside and control your project with a Gemma M0 or microcontroller of your choice.

We've included some easy-to-customize CircuitPython code so you can choose your color palettes and get your costume glowing!


You'll need a NeoPixel strand and a microcontroller, plus a battery or power supply to run your project. For costume applications I like using the Gemma M0 because it's small and compact and really easy to solder to and program. 

Pink polished fingers holding a Adafruit GEMMA M0 - Miniature wearable electronic platform.
The Adafruit Gemma M0 is a super small microcontroller board, with just enough built-in to create many simple projects. It may look small and cute: round, about the...
In Stock

If you want interactivity in your project, like motion sensing or sound reaction, you might want to consider using the Circuit Playground Express instead - it's got a ton of onboard sensors. We've got a lot of guides showing how to use this board. I'm using a Gemma M0 for this project but it will work the same no matter which board you choose.

You will also need some lights! I'm using the NeoPixel LED dots at 2" pitch. This makes for a nice tight design, but we've also got them in the 4" variety if that suits your project better.

Adafruit NeoPixel LED Dots Strand - 20 LEDs at 2 inch Pitch
Attaching NeoPixel strips to your costume can be a struggle as the flexible PCBs can crack when bent too much. So how to add little dots of color? Use these stranded NeoPixel dots!...
In Stock

This project works best with clear or glow-in-the-dark 3d filament. I like the glow kind, because glow in the dark stuff is just so cool, and it will glow like crazy even after you turn the lights off.

Finally, you'll want a battery to power your project. If you're making this for kids, or for a roomy costume like a jacket, I recommend this AAA battery pack. It has an on/off switch and is a safer option than Lithium Polymer batteries, which can explode if they're mistreated. 

However, I personally really prefer the small size of the Lithium Polymer batteries, and since I'm making smaller costume pieces -- a necklace and a bra -- I'm using these smaller batteries.  (And don't forget to get a charger!)

Angled shot of a rectangular lipo battery with a 2-pin JST connector. The battery specs are listed on the body: 3.7V 250mAh.
Lithium-ion polymer (also known as 'lipo' or 'lipoly') batteries are thin, light, and powerful. The output ranges from 4.2V when completely charged to 3.7V. This...
In Stock
Top view of Adafruit Micro Lipo - USB LiIon/LiPoly charger - v1 above a 2-pin JST cable.
Oh so adorable, this is the tiniest little lipo charger, so handy you can keep it any project box! Its also easy to use. Simply plug in the gold plated contacts into any USB port and a...
In Stock

My necklace design also uses this on/off switch, and some silicone stranded wire.

Breadboard-friendly SPDT Slide Switch
These nice switches are perfect for use with breadboard and perfboard projects. They have 0.1" spacing and snap in nicely into a solderless breadboard. They're easy to switch...
In Stock
Silicone Cover Stranded-Core Wire - 25ft 26AWG - White
Silicone-sheathing wire is super-flexible and soft, and its also strong! Able to handle up to 200°C and up to 600V, it will do when PVC covered wire wimps out. We like this wire...
In Stock

You'll also need a hot glue gun and some mesh fabric or tulle to insert into the print.

I'm using CircuitPython and the FancyLED library by Phil Burgess to make pretty animations for my armor. I'm using a "fire" palette for the bra and a "water" palette for the mermaid necklace. These color palettes are really easy to customize.

The Gemma M0 also works with Arduino or with Microsoft MakeCode, so if you prefer using one of those platforms, we have lots of tutorials and code samples in the Adafruit Learning System.

We need to do a bit of setup to get the Gemma M0 working with CircuitPython. Here's what's on this page:

  1. Install the latest version of CircuitPython on the board
  2. Install the necessary CircuitPython libraries
  3. Copy and update the Python code
  4. Save the code to your Gemma

Ready to start? Here we go!

Install CircuitPython

This guide tells you all you need to know about CircuitPython:

For now, I'll just cherry-pick the necessaries, but be sure to read through the guide to get all the nitty gritty details and troubleshooting tips.

Scroll down until you find the Gemma M0 board and click on it. Then click Download for the latest release. A file will download to your computer with a file extension of uf2.

Plug your Gemma into your computer with a USB cable. You may need to click or double-click the Reset button. The board will appear on your computer as a drive called GEMMABOOT. Drag the file you just downloaded onto this drive to install CircuitPython. The disk drive name GEMMABOOT will magically change to read CIRCUITPY.

Note: if you don't see GEMMABOOT, but instead see a drive called CIRCUITPY, that means CircuitPython is already installed. You probably want to follow the instructions to update CircuitPython to the latest version.

Install Libraries

Now we need to install a few libraries onto our board as well. Here's a guide that tells you all you'll ever want to know about installing libraries:

I'll just hit the highlights again to get you up and running.

The above button takes you to a page where you can download the latest library release. Click the big purple button to do so.

Now go to your CIRCUITPY drive and create a new folder called lib. Unzip the Library bundle and find:

  • adafruit_fancyled
  • neopixel.mpy

Drag these two folders/files into your brand new lib folder.

Upload the Code

The last thing we need to add is a file called on the CIRCUITPY drive. This is where the Gemma will look for actual instructions on what to do. Copy the code below into a text or code editor -- we recommend the Mu editor which can be downloaded here.

# SPDX-FileCopyrightText: 2019 Erin St Blaine for Adafruit Industries
# SPDX-License-Identifier: MIT

""" Simple FancyLED example for NeoPixel strip

import board
import neopixel
import adafruit_fancyled.adafruit_fancyled as fancy

num_leds = 17

# Declare a Water Colors palette
palette = [fancy.CRGB(0, 214, 214), # blues and cyans
           fancy.CRGB(0, 92, 160),
           fancy.CRGB(0, 123, 255),
           fancy.CRGB(0, 68, 214)]

# Declare a Fire Colors palette
#palette = [fancy.CRGB(0, 0, 0),       # Black
#             fancy.CHSV(1.0),           # Red
#              fancy.CRGB(1.0, 1.0, 0.0), # Yellow
#              0xFFFFFF]                  # White

# Declare a NeoPixel object on pin D6 with num_leds pixels, no auto-write.
# Set brightness to max because we'll be using FancyLED's brightness control.
pixels = neopixel.NeoPixel(board.D1, num_leds, brightness=1.0,

offset = 0  # Positional offset into color palette to get it to 'spin'

while True:
    for i in range(num_leds):
        # Load each pixel's color from the palette using an offset, run it
        # through the gamma function, pack RGB value and assign to pixel.
        color = fancy.palette_lookup(palette, offset + i / num_leds)
        color = fancy.gamma_adjust(color, brightness=0.25)
        pixels[i] = color.pack()

    offset += 0.02  # Bigger number = faster spin

Once you have the code in your editor, look near the top and find this line:

num_leds = 17

Change this number to reflect the total number of lights you have in your strand. If you have multiple strands soldered to the same pin, just use the number in one of the strands -- for example, I've soldered two strands of 17 lights each to pin D1, and that still counts as 17 pixels, not 34, since they're running in sync with each other.

Customizing Palettes

I've added two different color palettes for the animations accessed from the Control Pad:  a "fire" and a "water" palette. You can customize these fairly easily in the code. The power of the FancyLED library allows you so much control when it comes to choosing custom colors and animating them smoothly.

Find the palette definitions in the code:

# Declare a Water Colors palette
palette = [fancy.CRGB(0, 214, 214), # blues and cyans
           fancy.CRGB(0, 92, 160),
           fancy.CRGB(0, 123, 255),
           fancy.CRGB(0, 68, 214)]
# Declare a Fire Colors palette
#palette = [fancy.CRGB(0, 0, 0),       # Black
#             fancy.CHSV(1.0),           # Red
#              fancy.CRGB(1.0, 1.0, 0.0), # Yellow
#              0xFFFFFF]                  # White

Uncomment the last four lines of to use the Fire palette instead of the water palette. (Remember to comment out all the lines in the water palette declaration as well)

You can use CRGB values or CHSV values to choose colors, or use them both at the same time. There are also multiple ways to declare values and a lot of control over how spread out the gradients can be.

This is explained in detail in the FancyLED guide so take a look to find out all you need to know about creating your own custom color palettes.

Save the code on your CIRCUITPY drive, called

That's it! 

The scales are designed in TinkerCad. I made two versions: a heart shaped pattern and a mermaid scale pattern. I've also designed an enclosure that fits a Gemma M0, on/off switch and 350mAh battery (included with the mermaid scale design).

I've uploaded the finished versions to Thingiverse for easy download. Or, if you want to customize your own design, you can follow along with the video below.

Video Transcript

In this video I’ll show you how to design some heart shaped scales for 3D printing on mesh fabric, designed to fit Adafruit’s NeoPixel light strands inside.

We’ll use TinkerCad to design the scales. TinkerCad is a free online 3D design program that’s really easy to use. If this is your first time using TinkerCad, work through a couple beginner tutorials first to get a the hang of moving around the workspace.

Create a new design and give it a name. I called mine “heart armor”.

First we’ll model a rough shape our NeoPixel strand dot. I measured one of the dots with my calipers and added a little extra room for glue, and came up with some dimensions.

Drag a box hole into your workspace and make it 30 mm long and 9.6 mm wide. Make it 4 mm tall.

Scroll down in your shapes window and grab a half sphere. Make it 18mm deep and 15 mm wide, and set a height of 7mm. Convert it to a hole and align it with your box. Combine the two shapes. Now we have a cutout that we can use underneath our scale armor shapes, which will leave just the right amount of space for the light and the wires.

Drag it out of the way for now. Also, I always like to copy and paste my design elements so I have a backup of the original, in case I accidentally stretch it or lose track of it somehow.

Now it’s time to create the scales. You can use any shape you want, but shapes that nest together nicely are going to look best. Drag your shape out into your workspace.

Drag your light cutout hole into the middle of the shape and mess around with the size until it looks the way you want and fully covers the light dome while allowing the wire cutouts to extend on both sides. The align tool is useful here to get it just right.

TinkerCad has a lot of great shapes to choose from, but they’re all pretty simple and basic. I want a rounded top to my heart. TinkerCad doesn’t have a tool for this, so we’ll have to get a little clever.

Drag another half sphere onto your workspace. Think of this as a slicing tool - whatever sticks out the top of your half sphere will get sliced off. Move and drag and align until you get something that looks the way you want. Experiment — you can always redo this if you don’t like it.

Drag a box over your half sphere so that it’s completely covered and the bottoms are aligned. Change your half sphere to a hole, then group the box and sphere to make a cutout.

Change this new cutout shape to a hole, and group it with your heart shape to round off the top. Be sure your NeoPixel cutout still fits inside.

I want a little more variation in my armor so I’m going to make three slightly different sizes of hearts, just to make it look more interesting. I’ll copy and paste and then resize by a couple millimeters. I’m going to keep the thickness the same for each size for this project. If the heart is too thick, the light won’t shine through quite as well.

Make sure your light cutout still fits nicely under all sizes.

Align and combine each heart with a light cutout. I still like to keep one in the corner, to copy from.

This is a great time to stop and do a test-print, to make sure you’re happy with the different sizes, and that the lights fit and shine through nicely.

Once you’re happy, it’s time to start creating your scale pattern. Use copy and paste to align your scales the way you want.  If you’re using the 2” pitch lights, try to keep the cutouts slightly less than 2 inches apart from each other so the lights reach from one scale to the next scale easily.

Group all the scales together, then export them as an .stl file to send to your 3d print software.

I’m using Cura as my slicing software. Import the model and choose your print settings. You’ll want to print without support. We also want to tell the software to pause at about 2 millimeters so we can add the mesh fabric in. In Cura, you can do this under the Extensions menu option.

I’m printing in glow in the dark or clear PLA, since I’ve found that lets the light through the best. Start your print job and it will pause at 2 mm. Secure a piece of mesh fabric firmly over your print bed with tape or clips, then resume the print.

Once it’s finished, use a knife to carefully slash the fabric in all the holes, to make room for the NeoPixels. Use hot glue to press the pixels in place.

Add some code and a battery, and enjoy your glowing scale armor.

Solder to the IN end of the pixels -- usually the one with the male connector attached. To be sure, check the back of the pixels with a magnifier -- you can see tiny writing or an arrow indicating the direction of data flow.

  • NeoPixel Red Wire --> Gemma Vout
  • NeoPixel Middle Wire --> Gemma D1
  • NeoPixel Remaining Wire --> Gemma G

If you want to add an on/off switch, solder the middle pin and one of the side pins (doesn't matter which) in line with the red power wire on your battery.

This isn't necessary -- you can use the on/off switch on the face of the Gemma to control the lights. However, if you don't add a physical switch, take note that the Gemma will always be drawing the tiniest bit of power, and this will eventually drain your battery. So, don't leave your battery plugged in while your project is hanging in the closet or you'll get dressed and ready to play only to find a dead battery.

Find the OUT end of your NeoPixel dot strand. This is usually the end with the female connector and no extra power wires. Snip the connector off -- we'll solder it to the Gemma so we can plug the IN end of the NeoPixel strand into it.

Solder the red wire to Vout, the middle wire to D1 and the remaining wire to G. If you've already uploaded your code, this is a good time to plug in your light strand and test to be sure everything is working.

If you're making a bra or shoulder armor, or anything with two synched up sections, you can solder two connectors onto the Gemma and the two sections will run in sync with each other.

If you want to add a power switch, carefully cut the red wire from your battery and solder each side onto the middle and one of the side legs of your switch. It doesn't matter which side leg you use, either will work.

Use hot glue to fix a NeoPixel dot inside each scale. It's helpful to put a little thought into layout beforehand, to be sure your lights will reach each scale. Your wires may go outside the grooves a bit on the corners, but I've found this doesn't matter too much with the finished product.

You can cut any remaining unused NeoPixels off the end of your strand. You can also solder in some extra wire between pixels if needed to reach all the scales on your design.

My Mermaid Scale necklace design also includes a printable enclosure for the Gemma, battery and switch. I didn't use this for the bra -- I just glued the scales to the outside of a bra and tucked the Gemma and battery inside the cups. But for a necklace, I want a tidier solution since I don't want the electronics to show.

I cut off the ugly, scratchy connector, and soldered three white wires to the IN end of my NeoPixel strand, and glued them to the back of the necklace. The wires measure just the right length to go halfway around my neck to reach the enclosure pod, which will sit under my hair at the back of my neck.

It's important to keep straight which wire is which! Mark or carefully trace the wires before soldering to the Gemma. If you mix them up, the lights won't work.

I cut three more white wires the same length for the second side of the necklace chain, and added a necklace closure to the end. You can find these at any craft or beading store. I added a zip tie at the other end, and glued them into one of the wire slots on the bottom of the case.

Hot glue the power switch into the slot at the top of the enclosure pod, being sure not to get any glue in the switch mechanism.

Add another zip tie to the three wires coming from the Gemma. This will serve as strain relief and keep the weight of the necklace from pulling the wires out through the case. Plug the battery in and nestle the Gemma down on inside the case.

Tuck the battery inside the case on top of the Gemma.  I also cut a piece of felt as a backing to the necklace so it's more comfortable to wear, and glued the other side of the necklace closure onto the felt.

Bend the backing of the case to slip it inside the rails on both sides. It might take some adjusting to get the wires to be just the right length so the necklace hangs right where you want it.

This guide was first published on Sep 25, 2019. It was last updated on Jul 18, 2024.