The Morning Star

More commonly known as a "mace", this medieval weapon has been popularized by one of DC Comics heroines, Hawkgirl. Hawkgirl carries a mace made of Nth metal, which generates electric currents and repels magical energies. 

From Wikipedia:

A morning star is any of several medieval club-like weapons that included one or more spikes. Each used, to varying degrees, a combination of blunt-force and puncture attack to kill or wound the enemy.

3D Printing & Electronics

This project is uses 3D Printing and electronics to create a cosplay prop that lights up. The head of the mace is an icosahedron with 18 individual spikes. Inside the head is a NeoPixel Jewel that glows bright and animates a color wheel. The handle houses an Adafruit Trinket and 2200mAh battery. On the bottom of the pommel features a metal pushbutton with a red LED ring.

There's a total of 28 3D printed parts, most of which screw together via custom threads. This project utilized some special filaments such as Wood and Steel composite PLA materials, making an interesting combination. 

Get Inspired & Remix

If a Moring Star isn't your jam, you could easily use this tutorial as a guide for making a number of different cosplay props. The components and circuit can totally be used in lots of different ways, for example, this could be a sword, battle axe or even a wearable gauntlet. 

The goal of this project is to inspire cosplayers and prop makers to use electronics in their builds. By incorporating micro-controllers and NeoPixel LEDs, you're giving your props that extra dimension, adding value and depth that makes it stand out.

Prerequisite Guides

We suggest walking through the following guides to get a better understanding of the components and Arduino IDE. We also have great tutorials on learning how to solder.


All of the components used in this project are listed below and in the right hand sidebar. 

Tools & Supplies

You'll need some tools and supplies to complete this project, but feel free to improvise and use any materials you like.

Lighting Effects

The photos shown here are not photoshopped, they're just taken with a long exposure. This results in the "Light Painting" effect that's a common photography technique. NeoPixel LEDs can get pretty bright, enough for the diffusion to be visiable even in well lit environments.

Wired Connections

The circuit diagram above shows how the components will be wired together. This won't be 100% exact in the actual circuit but it's a very close approximation. Some of the connections, such as the positive and negative pads on the bottom of the Trinket, are not visible in the diagram, so it's a good reference, but not exact. Note, the order of the connections on the push button are different than the physical one.

  • Adafruit Trinket Power to C1 on Push Button
  • Adafruit Trinket GND to GND on JST Switch
  • Adafruit Trinket GND to GND on NeoPixel Jewel
  • Adafruit Trinket BAT+ to PWR on NeoPixel Jewel
  • Adafruit Trinket #0 to Data Input on NeoPixep Jewel
  • Push Button LED + to GND on JST Switch
  • Push Button LED – to C1 on Push Button
  • JST Switch + to NO on Push Button 

Battery Power

The circuit will be powered by a 3.7V 2200mAh Lithium ion cylindrical battery via JST connection. The battery plugs directly into the Switched JST-PH 2-pin breakout board.

Getting Code Onto Trinket

In this portion of the guide, we'll get code uploaded to the Adafruit Trinket micro-controller. If you don't write / understand code, don't to worry! You don't need to be a programmer to be able to upload prewritten code :-) 

We'll walk you through the whole process. 

First, visit the Trinket tutorial page by clicking the button below. Follow the instructions to download & setup the Arduino IDE and install drivers.

Make sure you are able to get sketches compiled and uploaded, especially the blink example in the tutorial. Once you are comfortable with using the Trinket, you can continue!

Install Adafruit NeoPixel Library

Next, we need to add support for NeoPixels.

Visit the Adafruit NeoPixel tutorial to install the NeoPixel library!

Uploading Code to Board

Now that we have the Adafruit boards & NeoPixel library installed, we can get our code ready to upload onto the board. Select all of the code listed below in the black box and copy it to your clip board. Then, in Arduino IDE, paste it in the sketch window (making sure to overwrite anything currently there). Next, goto the Tools menu > Board and select Adafruit Trinket (if you're using the 3V Adafruit Trinket version use Trinket 8Mhz. If you're using the 5V Trinket, select Trinket 12Mhz). Now you can click on the "check mark" icon to verify the code. If it's all good, we can continue to upload the code to the board.

Connect USB Data Cable to Trinket

Be sure to use a micro USB cable that can transfer data - A USB cable that ONLY charges devices will simply not work. Plug it into the microUSB port on the Adafruit Trinket board and the USB port on your computer (try to avoid connecting to a USB hub). As soon as you plug it in, you'll see a red LED blink on the Adaruit Trinket - This let's you know the board is ready to except code. While the LED is blinking, click on the Upload button (It's a right arrow icon, next to the chekc mark). The Arduino IDE will notify you if the upload is successful and completed.

#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
  #include <avr/power.h>

#define PIN 0

// Parameter 1 = number of pixels in strip
// Parameter 2 = Arduino pin number (most are valid)
// Parameter 3 = pixel type flags, add together as needed:
//   NEO_KHZ800  800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
//   NEO_KHZ400  400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
//   NEO_GRB     Pixels are wired for GRB bitstream (most NeoPixel products)
//   NEO_RGB     Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
//   NEO_RGBW    Pixels are wired for RGBW bitstream (NeoPixel RGBW products)
Adafruit_NeoPixel strip = Adafruit_NeoPixel(7, PIN, NEO_GRB + NEO_KHZ800);

// IMPORTANT: To reduce NeoPixel burnout risk, add 1000 uF capacitor across
// pixel power leads, add 300 - 500 Ohm resistor on first pixel's data input
// and minimize distance between Arduino and first pixel.  Avoid connecting
// on a live circuit...if you must, connect GND first.

void setup() {
  // This is for Trinket 5V 16MHz, you can remove these three lines if you are not using a Trinket
  #if defined (__AVR_ATtiny85__)
    if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
  // End of trinket special code

  strip.begin();; // Initialize all pixels to 'off'

void loop() {

void rainbow(uint8_t wait) {
  uint16_t i, j;

  for(j=0; j<256; j++) {
    for(i=0; i<strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel((i+j) & 255));

// Input a value 0 to 255 to get a color value.
// The colours are a transition r - g - b - back to r.
uint32_t Wheel(byte WheelPos) {
  WheelPos = 255 - WheelPos;
  if(WheelPos < 85) {
    return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  if(WheelPos < 170) {
    WheelPos -= 85;
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  WheelPos -= 170;
  return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);

3D Printed Parts

There's a total of 28 parts the need to be printed. They're listed below in a table. The d2m-spike-face.stl part will need to be printed 18 times. The d2m-frame-a.stl and d2m-frame-b.stl parts are not the same / duplicate of each other. d2m-frame-a.stl features an opening for the d2m-led.stl part.


The "butt" of the handle. The pushbutton goes here.

Print in any material.


The battery, Adafruit Trinket and JST Switch breakout goes in here.

Printed in Wooden PLA Filament.


The rod connects to the handle and the cap.

Print in any color filament using a large brim for better bed adhesion.


The cap is glued to the LED holder and connects to the rod.

Any color filament.


Holds NeoPixel Jewel and is glued to the cap.

Translucent PLA


This is the icosahedron shell. It should be printed in white or transcluent PLA to diffuse the NeoPixel LEDs.

Translucent PLA


Half of the frame that is glued to the outside of the icosahedron.

Printed in Steel PLA filament.


Second half of the frame that is glued to the outside of the icosahedron.

Printed in Steel PLA filament.


Print 18x of these. Glue onto each side of the icosahedron - exept for the top face.

Printed in Steel PLA filament.


Bigger than the spike-face part, ment to go on the top face of the icosahedron.

Printed in Steel PLA filament.

Reorient Parts Flat on Bed

Do not print the parts "as-is". You'll need to reorient the parts so they're flat on the bed. Use your best judgement so they do not require any support material. Most slicing programs will allow you to select a face and place flat on the bed of the 3D printer. 

Large Parts

Some of the parts, such as the rod and handle are fairely large and may not fit on the bed of every 3D printer. these could optionally be printed in halves and glued together.

Support Material & Rafts

Although there are no support material or rafts required, I do recommened adding some brims to the parts for best bed adhesion. The d2m-rod.stl file is a rather tall part (180mm) and could easily topple over while printing, so a large brim can help keep it on the bed of the 3D printer.

Post-Processing & Finishing Techniques

I printed the spikes and the d20 frame halves in Proto Pasta's steel composite PLA. This material can be sanded down and polished using a rock tumbler or polishing compound. The only other parts the were sanded down was the rod. This was sanded and spray painted with a nickel / silver color, which gave it a smooth finish.

Download & Remix

If you're interested in making changes to the design, the source is public so you can download it the original in many different formats such as IGS, STEP, SAT, Google SketchUp, etc.

Repurpose USB Cable

Let's start building our circuit by getting an old USB cable. Chances are you have one laying around. We'll use this USB cable to connect our NeoPixel Jewel to the Adafruit Trinket. The length of the USB cable should be somewhere over 15in (38cm).

Trim USB Cable

Next, we'll need to snip off the connectors from both ends of the cable. Our cable should be approximately 15in (38cm) in legnth. Since this wire needs to connet the NeoPixel Jewel to the Adafruit Trinket, it needs to be long enough to go travel through the 3D printed rod and handle. 

Strip USB Cables

Now we'll need to remove insulation from both ends of the cable using either a pair of wire strippers or a hobby knife. Once you remove the insulation, you'll find four individial wires. There's also very fine strandes of wire and a wrapper of sorts. Go ahead and snip these away, leaving just the four wires. They'll most likely be color coded like shown in the photo.

Strip Wires

We'll only need three of the four wires, so feel free to snip it away. Next, use the pair of wire stirppers to remove insulation from the three wires. We'll expose about 5mm of bare wire.

Tin Wires

Now it's time to tin our three wires by applying a bit of solder to the tips of the bare wires. I suggest using a pair of helping third hands to keep the wires steady while soldering. You'll need to do this for both ends of the cable.

Solder Wires to NeoPixel Jewel

Next, we can connect the three wires to the NeoPixel Jewl. Again, I suggest using a pair of helping third hands to keep things steady while you solder. I like to tin the pads on the NeoPixel Jewel first - applying small amounts of solder to the pins labeled Data Input, 5DC Power and GND. Then, use the tip of the soldering iron to heat up the pads while insterting wires into the pad. Feel free to use the same color scheme for consistency (red to power, black to ground, green to data input). With that complete, we're left with a long cable connected to our NeoPixel Jewel.


Let's gather our components. Here, we'll need our metal on/off button, the JST switch breakout, and the Adafruit Trinket.

Prep On/Off Button

The on/off button comes with a hex washer, go ahead and remove it by unscrewing it from the button. We won't be using it in this project, but I wouldnt disguard it.

Wire for LED

Next, we'll need to get a piece of wire to connect the LED of our push button to power it. So, cut of piece of wire about the length of the push button. Here, I'm using 30AWG silicone cover stranded wire - it's my favorite! Then, use wire strippers to remove a bit of insulation from both ends of the wire, then apply some solder to "tin" them. These helps prevent the strands from fraying and makes it easier to connect to components.

Connect Wire to LED on Button

Now we can tin the leads of the on/off button. Use the tip of the soldering iron to heat up the lead and apply a bit of solder - it should just flow / stick nicely. Then, while heating up the tinned lead labled "+", place the wire onto the heated solder and let it cool. It will fuse to the postive lead of the LED on the on/off button.

Wires for Trinket & JST Breakout

We'll need two sets of two wires, a total of four wires, for connecting our next set of components. They can be the same legnth, approximately the legnth of the Adafruit Trinket. Again, we'll strip and tin both ends of each wire.

Solder Wires to Trinket

OK, now that we have some wires prepaired, we'll use two of them to connecto the positive and negative pads on the Adafruit Trinket. I suggest using a panavise jr. or pair of helping third hands to keep the Trinket steady while soldering. On the bottom of the Adafruit Trinket, you'll see two pads labeld "+" and "–". We can apply some solder to these by tinning them. Then, heat up the solder using the tip of the soldering iron and lay a wire onto the pad. Here, I used blue for negative, red for positive. 

Solder Wires to JST Breakout

Next, secure our JST switched breakout to a panavise jr or helping thirld hands and tin up the pins (GND, GND, + and SW). Then, we can solder on remaining two wires to the + and GND labeled pins. Once that's done, we can connect the wire connected to the negative pad on the Adaruit Trinket, to one of the GND pins on the JST switched breakout.

Heat Shrink Positive Connections

Now we need to connect the positive wire from the LED on the button AND the positive wire from the Adafruit Trinket to the same lead on the button. This can be a little tricky, but I found it easy if both wires were jointed together - you can use a piece of heat shrink tubing (like I have) or a piece of electrical tape will work too. 

Solder Positive Connections to Common

Once both wires are close to each other, you should be able to solder them to the lead on the on/off button labeled C1 (common). I found using a pair of tweezers to hold the wires to be helpful. It's a bit tricky because we need to solder two wires to one lead at the same time. 

Solder Negative to LED

Next, we'll need to connect the negative wire from the JST switched breakout to the negative labeled lead on the LED of the on/off button. This lead will have a "–" symbol on it.

Solder Positive to NO

Now we can connect the positive (+) wire coming from the JST switched breakout to the NO1 (normally open) labeled lead on the on/off button.

Test Circuit

Our circuit is nearly completed! Now is a good time to test it out and see if our connections are working correctly. Plug in the JST connector from the battery to the JST connector on the JST switched breakout. Then, push the on/off button all the way in. It should lock / toggle on and the red LED should light up!

The Trinket should also turn on, a green and red LED light will light up aswell.

Insert Jewel To Holder

With most of our circuitry complete, let's start the assembly! Grab the wired NeoPixel Jewel and thread the end of the cable through the d2m-led.stl part. Then, press the NeoPixel Jewel into the holder until the PCB clips into place.

Insert USB To Cap

Next, thread the end of the cable from the NeoPixel Jewel through the d2m-cap.stl part.

Insert USB To Rod Handle

Now you can thread the wire from the NeoPixel Jewel through the rod.

Bond Holder To Cap

Next, we'll need to attach the d2m-led.stl part to d2m-cap.stl. I used super glue because it dries fast and has a great bond. Once dry, screw on the d2m-cap part onto the rod until they're fully tightened. 

Install Button to Pommel

 Now we can install the button to the pommel. First, we'll need to inser the JST switched breakout and Adafruit Trinket through the hole on the bottom of the pommel. Then, we can press the button in until it's flush with the bottom of the pommel.

Solder NeoPixel Wires to Trinket

Next, we'll need to connect the three wires from the NeoPixel Jewl to the Adafruit Trinket. Positive (red) to BAT+, Negative (ground) to GND, and Data Input to #0.

Final Circuit Test

With all of our connections complete we can test out our circuit. Plug in the JST connector from the battery to the JST connector on the JST switched breakout. Then, push the button until the circuit powers on.

Install Circuit Into Handle

We can fit the battery, JST breakout and Adafruit Trinket into the handle by carefully stuffing each component. You have to be very careful not to break any of the connections and ensure none of the pads from the components touch each other. Start by inserting the battery all the way into the handle. Then, the JST breakut, followed by the Adafruit Trinket. Once they're in a good spot, you can twist the pommel onto the end of the rod until they're fully tightened.

Apply Glue to Frame B

Now it's time to work on the head of the mace. I used E6000 adhesives to secure frame B to the icosahedron shell. Lightly apply glue to the edges and fit it over the top of the shell. Frame B should go over half of the shell - Frame A has an opening that needs to match up with the opening on the icosahedron.

Apply Glue to Frame A

Just like we did for frame B, apply some glue to the edges. Then, orient the frame so the opening lines up with the opening on the icosahedron. 

Join Two Frames Together

Firmly press the two halves together. I layed a 2.5lbs weight on top of the isosahedron to keep the two halves tight. Wait about an hour for the glue to fully cure.

Secure Icosahedron To Rod

Place the handle + rod + neopixel jewl assembly over the opening of the icosahedron. Press down until the d2m-led part snaps into place. Ensure the three mounting holes line up.

We need to secure the head of the mace to the d2m-led.stl part using 4x 4-40 (3/8 long) machine screws. Insert one screw into the one of the holes on the bottom of the part and use a screw driver to fasten the screw until goes through the d2m-led.stl and d2m-shell.stl.


You may find it easier to fasten a screw into each hole to "tap" and create threads before securing the two parts together.

Attach Spikes

Once the icosahedron is secured to the rod+handle assembly, we can work on attaching the 18 spikes to the icosahedron. I used super glue here because it dries fast and has a tight bond. Apply glue to the bottom of each spike and press it down onto one of the 18 faces of the icosahedron. Wait for the glue to dry before starting on the next spike. The tall spike, d2m-spike-top.stl is meant to attach to the head / top of the icosahedron.

Final Build

Wohoo! Our build is now complete. Press the button to turn on the circuit. When you need to recharge the battery, you can use an Adafruit Micro Charger or Adafruit Micro Charger Jack. Unscrew the pommel from the handle to access the battery or circuit. 

This guide was first published on Sep 25, 2016. It was last updated on Sep 25, 2016.