Overview

Circuit Python Powered

In this project we’ll take a look at the process of building an LED acrylic sign using NeoPixels and Circuit Python. The 3D printed case houses all of the electronics making a simple portable sign. You can engrave just about anything on the acrylic and it makes a pretty sweet project for your desk.

Using Circuit Python to drive the NeoPixels allows you to easily reprogram them so don't have to recompile code each time you want to make a tweak or try out a new animation. 

Signs, Logos and Lamps

You may have seen an LED acrylic sign at a bar, restaurant or similar establishment. You can get pre-made ones from retailers like Amazon and Target. You can even get them personalized from places like Etsy. Just search around and you can find almost any logo, phrase or graphics etched or engraved into the acrylic.

Designing your own signs however allows for creativity and experimentation. You can make something that has never been done before. 

NeoPixel LEDs

Most of them use a single color LED strip. Others feature RGB LED strips where you can choose from either of the three colors. These are limited and typically do not fade between the color spectrum.

NeoPixel LEDs however, allow fine control over each pixel. This lets you fade between different colors to create amazing animations. Rainbow cycles, color wipes and sparkles, just to name a few possible sequences. 

Engraving, Etching, Laser or Milling

There's several methods of getting a design onto acrylic. Most common process is done using a laser cutter – A powerful laser burns onto the surface. Another method uses a CNC milling machine – An engraving bit spins at high speeds and draws the design onto the surface. You can even do this by hand using a rotary tool such as a Dremel power tool with a special engraving bit.

Light Guiding Acrylic

The acrylic material I used is specifically designed for making edge lit acrylic signs. Lucite is a light guiding acrylic that features light diffusing particles. This is great for edge lit engraving because it provides even illumination.

From Inventables:

Developed specifically for edge lit applications, including lighting and signage, this LGP continuous cast acrylic is formulated with evenly dispersed illuminating particles to provide bright, even illumination. Suitable for use with LEDs, fluorescent and cold cathode light sources.

Prerequisite Guides

If your new to electronics and the Adafruit Feather M0 Express, I suggest you walk through the following guides to get the basics. The Adafruit Feather M0 Express guide will walk you through setting it up with CircuitPython.

Parts & Components

You'll need just a couple a parts to build this project. You have the option to choose from two Adafruit Feather M0 boards. You also can choose different batteries (capacities).

1 x Adafruit Feather M0 Express
Designed for CircuitPython - ATSAMD21 Cortex M0
1 x NeoPixel Stick
8 x 5050 RGB LED with Integrated Drivers

Batteries

A couple of different capacity to choose from. I recommend the bigger 500mAh, but you can go with smaller if you want to save some capital. 

1 x 3.7v 100mAh
Lithium Ion Polymer Battery
1 x 3.7v 150mAh
Lithium Ion Polymer Battery
1 x 3.7v 350mAh
Lithium Ion Polymer Battery
1 x 3.7v 500mAh
Lithium Ion Polymer Battery

Tools & Supplies

Hardware, rubber feet, wires, that sorta thing.

1 x Lucite Light Guide Acrylic Sheet
1/4" Thick – 8 in × 12 in – Cast sheets with light diffusing particles
6 x M2.5 Machine Screws
Phillips Flat Head Machine Screw A2 SS M2.5 x .45 x 5MM
1 x Bumper Feet
Little Rubber Feet – Pack of 4
1 x 30AWG Wire
Silicone Cover Stranded-Core Wire - 30AWG in Various Colors
1 x Solder Wire
Solder Spool - 1/4 lb SAC305 RoHS lead-free / 0.031" rosin-core - 0.25 lb / 100 g
1 x Heat Shrink Tubing
Multi-Colored Heat Shrink Pack - 3/32" + 1/8" + 3/16" Diameters
1 x Mounting Putty Tack
Loctite Fun-Tak Mounting Putty 2-Ounce

Cool Tools!

These things really do help make building the project smoothly. You don't need them all of them, but I recommend them.

1 x Othermill Pro
Compact Precision CNC + PCB Milling
1 x Ultimaker 3
3D Printer
1 x Wire Strippers
Hakko Professsional Quality 20-30 AWG Wire Strippers - CSP-30-1
1 x Wire Cutters
Flush diagonal cutters - CHP170
1 x Soldering Iron
Adjustable 30W 110V soldering iron - XY-258 110V
1 x Panavise
Panavise Jr. - PV-201
1 x Helping Third Hands
Helping Third Hand Magnifier W/Magnifying Glass Tool - MZ101

Circuit Python Powered

In this project we’ll take a look at the process of building an LED acrylic sign using NeoPixels and Circuit Python. The 3D printed case houses all of the electronics making a simple portable sign. You can engrave just about anything on the acrylic and it makes a pretty sweet project for your desk.

Using Circuit Python to drive the NeoPixels allows you to easily reprogram them so don't have to recompile code each time you want to make a tweak or try out a new animation. 

Signs, Logos and Lamps

You may have seen an LED acrylic sign at a bar, restaurant or similar establishment. You can get pre-made ones from retailers like Amazon and Target. You can even get them personalized from places like Etsy. Just search around and you can find almost any logo, phrase or graphics etched or engraved into the acrylic.

Designing your own signs however allows for creativity and experimentation. You can make something that has never been done before. 

NeoPixel LEDs

Most of them use a single color LED strip. Others feature RGB LED strips where you can choose from either of the three colors. These are limited and typically do not fade between the color spectrum.

NeoPixel LEDs however, allow fine control over each pixel. This lets you fade between different colors to create amazing animations. Rainbow cycles, color wipes and sparkles, just to name a few possible sequences. 

Engraving, Etching, Laser or Milling

There's several methods of getting a design onto acrylic. Most common process is done using a laser cutter – A powerful laser burns onto the surface. Another method uses a CNC milling machine – An engraving bit spins at high speeds and draws the design onto the surface. You can even do this by hand using a rotary tool such as a Dremel power tool with a special engraving bit.

Light Guiding Acrylic

The acrylic material I used is specifically designed for making edge lit acrylic signs. Lucite is a light guiding acrylic that features light diffusing particles. This is great for edge lit engraving because it provides even illumination.

From Inventables:

Developed specifically for edge lit applications, including lighting and signage, this LGP continuous cast acrylic is formulated with evenly dispersed illuminating particles to provide bright, even illumination. Suitable for use with LEDs, fluorescent and cold cathode light sources.

Prerequisite Guides

If your new to electronics and the Adafruit Feather M0 Express, I suggest you walk through the following guides to get the basics. The Adafruit Feather M0 Express guide will walk you through setting it up with CircuitPython.

Parts & Components

You'll need just a couple a parts to build this project. You have the option to choose from two Adafruit Feather M0 boards. You also can choose different batteries (capacities).

1 x Adafruit Feather M0 Express
Designed for CircuitPython - ATSAMD21 Cortex M0
1 x NeoPixel Stick
8 x 5050 RGB LED with Integrated Drivers

Batteries

A couple of different capacity to choose from. I recommend the bigger 500mAh, but you can go with smaller if you want to save some capital. 

1 x 3.7v 100mAh
Lithium Ion Polymer Battery
1 x 3.7v 150mAh
Lithium Ion Polymer Battery
1 x 3.7v 350mAh
Lithium Ion Polymer Battery
1 x 3.7v 500mAh
Lithium Ion Polymer Battery

Tools & Supplies

Hardware, rubber feet, wires, that sorta thing.

1 x Lucite Light Guide Acrylic Sheet
1/4" Thick – 8 in × 12 in – Cast sheets with light diffusing particles
6 x M2.5 Machine Screws
Phillips Flat Head Machine Screw A2 SS M2.5 x .45 x 5MM
1 x Bumper Feet
Little Rubber Feet – Pack of 4
1 x 30AWG Wire
Silicone Cover Stranded-Core Wire - 30AWG in Various Colors
1 x Solder Wire
Solder Spool - 1/4 lb SAC305 RoHS lead-free / 0.031" rosin-core - 0.25 lb / 100 g
1 x Heat Shrink Tubing
Multi-Colored Heat Shrink Pack - 3/32" + 1/8" + 3/16" Diameters
1 x Mounting Putty Tack
Loctite Fun-Tak Mounting Putty 2-Ounce

Cool Tools!

These things really do help make building the project smoothly. You don't need them all of them, but I recommend them.

1 x Othermill Pro
Compact Precision CNC + PCB Milling
1 x Ultimaker 3
3D Printer
1 x Wire Strippers
Hakko Professsional Quality 20-30 AWG Wire Strippers - CSP-30-1
1 x Wire Cutters
Flush diagonal cutters - CHP170
1 x Soldering Iron
Adjustable 30W 110V soldering iron - XY-258 110V
1 x Panavise
Panavise Jr. - PV-201
1 x Helping Third Hands
Helping Third Hand Magnifier W/Magnifying Glass Tool - MZ101

Circuit Diagram

Circuit Diagram

This provides a visual reference for wiring of the components. They aren't true to scale, just meant to be used as reference. The NeoPixel wiring in this circuit best fits the assembly when it's oriented inwards.

3.3V Power with NeoPixels

You can power NeoPixels from the 3V pin and they work just fine. The SK chips are very happy with 3V logic and 3V power. The first chip will automatically raise the voltage. 

Wired Connections

  • Switch to Enable pin on Adafruit Feather
  • Switch to GND pin on Adafruit Feather
  • DATA IN from NeoPixel to 6 on Adafruit Feather
  • 4-7VDC from NeoPixel to 3V on Adafruit Feather
  • GND from NeoPixel to GND on Adafruit Feather

Software Setup

Install CircuitPython

Before you start you'll need to install CircuitPython onto your Feather. We have full introduction guide that will get your board loaded up

Download Adafruit CircuitPython NeoPixel Library

Now we need to get the Circuit Python NeoPixel library.

Follow this link to learn how to install neopixel.mpy into your Feather's library folder

Upload The Code

Copy and paste the code below into a new text document (we recommend using Mu). Save the file and name it as main.py

Once the files has been uploaded to the drive, the Feather will automatically reboot and run the code. No upload button (say whaaat?!).

Text Document Formatting

If you're not using Mu, watch out for text formatting! When making your text document, you need to ensure the file is set as Plain Text. Most common text editing applications, like TextEdit for MacOS will save text documents as .RTF (rich text format) by default. You can quickly change an RTF text document to plain text by using selecting "Make Plain Text" under the Format menu. You can also change the format in the applications "Preferences" menu.

Line Spaces and Invisible Characters

If you are still finding your code isn't quite working and running. You can try copying the code into a different text editing software, such as Microsoft Word, save it out as a .txt format with line spacing and then convert it to the .py file extension. Sometimes text editors will add invisible characters like line breaks and tabbed spaces.

Color Fill

The code below will "fill in" all of the NeoPixel LEDs with a single color. This is great if you just want a simple always on LEDs with no animation. If you want to change the color, type in different numbers in the line with strip.fill([0, 0, 0]) to whatever RGB (red, green blue) color values you'd like. For example, an orange color would be 255, 120, 0.

from digitalio import *
from board import *
import neopixel
import time

pixpin = D6
numpix = 8

led = DigitalInOut(D13)
led.direction = Direction.OUTPUT

strip = neopixel.NeoPixel(pixpin, numpix, brightness=0.5)

while True:
    strip.fill([50, 0, 100])
    strip.write()

Rainbow Animation

The code below will make the NeoPixel LEDs fade between different colors in the RGB color spectrum.

from digitalio import *
from board import *
import neopixel
import time

pixpin = D6
numpix = 8

led = DigitalInOut(D13)
led.direction = Direction.OUTPUT

strip = neopixel.NeoPixel(pixpin, numpix, brightness=.5)


def wheel(pos):
    # Input a value 0 to 255 to get a color value.
    # The colours are a transition r - g - b - back to r.
    if (pos < 0):
        return [0, 0, 0]
    if (pos > 255):
        return [0, 0, 0]
    if (pos < 85):
        return [int(pos * 3), int(255 - (pos*3)), 0]
    elif (pos < 170):
        pos -= 85
        return [int(255 - pos*3), 0, int(pos*3)]
    else:
        pos -= 170
        return [0, int(pos*3), int(255 - pos*3)]

def rainbow_cycle(wait):
    for j in range(255):
        for i in range(len(strip)):
            idx = int ((i * 256 / len(strip)) + j)
            strip[i] = wheel(idx & 255)
        strip.write()
        time.sleep(wait)

def rainbow(wait):
    for j in range(255):
        for i in range(len(strip)):
            idx = int (i+j)
            strip[i] = wheel(idx & 255)
	strip.write()

while True:
    rainbow(0.001)

Engraving Acrylic

Vector Artwork

Whether you're using a laser cutter, CNC milling machine, or even engraving by hand, you'll need vector artwork. If you're interested in engraving the Adafruit Circuit Python, you can download a SVG file of the artwork. Click the green button below to download the file.

3D Printing

3D Printed Enclosure

The case is designed to house all of the electronics. I designed the two parts to snap fit together so there’s no need for additional hardware. The two pieces lock together making a tightly secured enclosure. The PCBs are secured to the bottom cover using M2.5 (.45 x 5mm) machine screws.

Materials, Filaments

Choose your preferred material, PLA is what I used. Composite wood PLA and CoffeePLA might look more interesting. You can use strong materials such as ABS, Nylon, PETG, etc. just be aware the tolerance may vary when using materials other than PLA.

Size & Dimension

This drawling shows the dimensions of various features. Here's a list of some of the important things.

  • Case – 84mm x 84mm x 12.5mm
  • Acrylic Slot – 50.4mm x 6.8mm x 5.5mm

Modify Case Design

If you'd like to make adjustments to the case, you can download the Fusion 360 Archive for free and modify the model using your preferred CAD modeling program (STEP, IGHS, Solidworks, STLs, etc.). The design is parametrically driven with User Parameters, so it's very really update values such as the tolerances, thickness, height and number of buttons. The design will automatically update and scale depending on the values. Watch my "Layer by Layer" tutorials to get an in-depth walkthrough of the model.

Switch

Switch Prep

With most projects, I like to start with the on/off switch. I’ll first prep the switch by snipping off one of the legs and trimming the remaining two short. Then I’ll tin them with a bit of solder.

Switch Wires

I’ll need cut two pieces of wire for connecting the switch to the Adafruit Feather. Using wire stripper, remove of a bit of insulation to exposed the strands of wires. To keep the strands together and make it easier to attach to the legs of the switch, i'll apply a bit of solder to tin them.

Connect Wires to Switch

Next, I attached the wires to the legs of the switch by them heating up with the tip of the soldering iron. I added a piece of heat shrink to keep the two wires together.

Connect Switch to Feather

Now I can work on connecting the switch to the Feather. I tinned the enable and a ground pin on the Adafruit Feather before soldering the wires in. I used one of the available ground pins on near the prototyping area. 

Test Switch

With the switch now connected to the Adafruit Feather, I can plug in the battery to test out the switch and the circuit. It'll power on when the switch allows current to pass through the enable and ground pins.

NeoPixel

NeoPixel Wires

We'll need three new pieces of wire to connect the NeoPixel stick to the Adafruit Feather. These were slightly longer than the Feather PCB, so about 10cm in length should be fine. Using wire stripper, I removed a bit of insulation and applied a bit of solder to tin the tips of each wire. A piece of shrink will keep the wires bundled together.

Connect Wires to NeoPixel

Now we can work on connecting the wires to the NeoPixel stick. I found the components fit best with the wires oriented towards the PCB, as opposed to pointing outwards. I made sure to tin the ground, power and data in pads on the NeoPixel stick before attaching the wires. 

Connect NeoPixel to Feather

Next, I connected the wires from the NeoPixel stick to the Adafruit Feather. Make sure to connect power from the NeoPixel to the 3V pin on the Adafruit Feather – I mistakenly soldered it to a free pin near the prototyping area. The data in wire can go into any pins, but I choose pin number 6. The ground wire can connect to any of the available ground pins.

Test NeoPixels

If the code has been uploaded to the Adafruit Feather, we can test out the circuit. So if you haven't done so, now is a great time to do so! At this point, it's a good idea to double check the wiring, maybe even shorten them or tidy them up.

Assembly

Hardware Screws

Now it’s assembly time! To secure the PCBs to the bottom cover, I suggest using M2.5 (.45 x 5mm) sized machine screws. (These are linked in the parts list in the overview page). We'll need four screws for the Adafruit Feather and two for the NeoPixel stick.

Insert Screws to NeoPixel PCB

The mounting holes on the NeoPixel stick are slightly smaller than M2.5, so I needed to tap them before securing the PCB to the bottom cover. I suggest keeping the screws inserted so the threads just barely poke through the other side – This made securing the PCB to the bottom cover much easier.

Install NeoPixel to Cover

Place the NeoPixel PCB over the two standoffs in that are located in the center of the bottom cover. Follow the orientation in the photo as it's easy to place it incorrectly. Then, press and hold the PCB down making sure the screw threads are being inserted into the standoffs. Use a screw driver to fasten the screws and fully tighten. 

Install Feather to Cover

Next, place the Adafruit Feather over the four standoffs like shown in the photo. The microUSB port should be facing the outer edge of the bottom cover. Line up the mounting holes with the standoffs and hold it in place. Then, insert and fasten the machine screws to secure the PCB to the bottom cover.

Install Battery to Cover

I used a small piece of mounting putty to tack the battery to the bottom cover – You don't need these but this does keep the battery from moving inside the case. A good spot to tack it is near the NeoPixel stick, like shown in the photo.

Install Switch

Lastly, fit the switch into the holder in between the three walls with the cutout in the lip of the cover. Press it down to snap into place. At this point, I adjusted the wiring so that it's tidy and fully contained within the lip of the bottom cover.

Install Case to Cover

Now we can fit the case over the bottom cover making sure to properly align the two parts. The case has two openings on one side, these are to allow microUSB port and the slide switch. Once in place, press the two parts together to lock them shut.

Rubber Bumper Feet

I added little rubber feet to the four corners of the bottom cover. Just to give the bottom some grip when it's on a table – Otherwise it's pretty slippery and won't stay put.

Install Acrylic to Case

And that’s pretty much it for the assembly. All that’s left to do is install the Acrylic sign. And this just clicks into place. Depending on the tolerances, you may need to apply some force or use a filing tool to sand down the edges of the slot. The tolerances were pretty tight in mine, which made the acrylic fairly secured to the case. 

Recharging Battery

One of the many features of the Adafruit Feather is built-in battery recharging. Simply plug in a microUSB cable from the board to your computers USB hub or a 5V USB power supply to recharge the battery. The Adafruit Feather has a recharging battery LED indicator that lights up yellow to let you know it's recharging. 

This guide was first published on Aug 30, 2017. It was last updated on Aug 30, 2017.