Animated Acrylic Frames

This lamp features edge lit acrylic and added NeoPixel LEDs.

The acrylic appear like frame by frame stop motion animation when each panel is lit up one at a time.

Swappable Acrylic Panels

The acrylic panels are swappable so you could use this to make all sorts of creative animations.

We engraved some snowflakes and letters but you could do all sorts of arts and graphics.

QT Py RP2040 and NeoPixels

This is powered by the QT Py RP2040 running Circuit Python. It uses just a single strip of NeoPixel LEDs with a total of eight quarter inch thick acrylic panels.

NeoPixel Strip Holder

The LED strip is fitted into a 3D printed holder with each LED fitting into a little cavity.

Our 3D printed holder keeps the LEDs isolated so the light doesn’t leak into each other.

Prerequisite Guides

Take a moment to walk through the follow guides to get familiar with the parts and libraries.


Video of hand holding a QT Py PCB in their hand. An LED glows rainbow colors.
What a cutie pie! Or is it... a QT Py? This diminutive dev board comes with one of our new favorite chip, the RP2040. It's been made famous in the new
In Stock
NeoPixel Strip price is for a FULL REEL (That's 240 NeoPixels) Select the 1 meter option for a less expensive strip.
Adafruit NeoPixel Digital RGB LED Strip reel wired to a microcontroller, with all the LEDs in a rainbow
You thought it couldn't get better than our world-famous 32-LED-per-meter Digital LED strip but we will prove you wrong! You wanted...
In Stock
USB Type C Cable with Data/Charge Switch
Perhaps your smart phone, tablet, or even your Raspberry Pi 4, charges off of USB, but can you really trust that charging station at the airport? Now you can control when to allow...
In Stock
10 wire Silicone Cover Stranded-Core Ribbon Cable
For those who are fans of our silicone-covered wires, but are always looking to up their wiring game. We now have Silicone Cover Ribbon cables! These may look...
In Stock
Pack of 4 Little Rubber Bumper Feet
Keep your electronics from going barefoot, give them little rubber feet! These small sticky bumpers are our favorite accessory for any electronic kit or device. They are sticky, but...
In Stock

1/4in Acrylic Sheets

The 3D printed parts are designed for 1/4in thick acrylic. Feel free to purchase acrylic sheets from your favorite supplier.
1 x Edge Lit Acrylic
1/4in Thick, 8in x 12in Sheet

The diagram below provides a visual reference for wiring of the components. This diagram was created using the software package Fritzing.

Adafruit Library for Fritzing

Use Adafruit's Fritzing parts library to create circuit diagrams for your projects. Download the library or just grab individual parts. Get the library and parts from GitHub - Adafruit Fritzing Parts.

Wired Connections

The project uses a 60/m NeoPixel strip with a total count of 8x NeoPixel LEDs.

NeoPixel Strip to QT Py RP2040

  • DIN from NeoPixel strip to Pin A0 on QT Py
  • 5V from NeoPixel strip to 5V on QT Py
  • GND from NeoPixel strip to GND on QT Py


The Adafruit board can be powered via USB. In this project, a 5V power supply is used. 

CircuitPython is a derivative of MicroPython designed to simplify experimentation and education on low-cost microcontrollers. It makes it easier than ever to get prototyping by requiring no upfront desktop software downloads. Simply copy and edit files on the CIRCUITPY drive to iterate.

CircuitPython Quickstart

Follow this step-by-step to quickly get CircuitPython running on your board.

Click the link above to download the latest CircuitPython UF2 file.

Save it wherever is convenient for you.

To enter the bootloader, hold down the BOOT/BOOTSEL button (highlighted in red above), and while continuing to hold it (don't let go!), press and release the reset button (highlighted in blue above). Continue to hold the BOOT/BOOTSEL button until the RPI-RP2 drive appears!

If the drive does not appear, release all the buttons, and then repeat the process above.

You can also start with your board unplugged from USB, press and hold the BOOTSEL button (highlighted in red above), continue to hold it while plugging it into USB, and wait for the drive to appear before releasing the button.

A lot of people end up using charge-only USB cables and it is very frustrating! Make sure you have a USB cable you know is good for data sync.

You will see a new disk drive appear called RPI-RP2.


Drag the adafruit_circuitpython_etc.uf2 file to RPI-RP2.

The RPI-RP2 drive will disappear and a new disk drive called CIRCUITPY will appear.

That's it, you're done! :)

Safe Mode

You want to edit your or modify the files on your CIRCUITPY drive, but find that you can't. Perhaps your board has gotten into a state where CIRCUITPY is read-only. You may have turned off the CIRCUITPY drive altogether. Whatever the reason, safe mode can help.

Safe mode in CircuitPython does not run any user code on startup, and disables auto-reload. This means a few things. First, safe mode bypasses any code in (where you can set CIRCUITPY read-only or turn it off completely). Second, it does not run the code in And finally, it does not automatically soft-reload when data is written to the CIRCUITPY drive.

Therefore, whatever you may have done to put your board in a non-interactive state, safe mode gives you the opportunity to correct it without losing all of the data on the CIRCUITPY drive.

Entering Safe Mode

To enter safe mode when using CircuitPython, plug in your board or hit reset (highlighted in red above). Immediately after the board starts up or resets, it waits 1000ms. On some boards, the onboard status LED (highlighted in green above) will blink yellow during that time. If you press reset during that 1000ms, the board will start up in safe mode. It can be difficult to react to the yellow LED, so you may want to think of it simply as a slow double click of the reset button. (Remember, a fast double click of reset enters the bootloader.)

In Safe Mode

If you successfully enter safe mode on CircuitPython, the LED will intermittently blink yellow three times.

If you connect to the serial console, you'll find the following message.

Auto-reload is off.
Running in safe mode! Not running saved code.

CircuitPython is in safe mode because you pressed the reset button during boot. Press again to exit safe mode.

Press any key to enter the REPL. Use CTRL-D to reload.

You can now edit the contents of the CIRCUITPY drive. Remember, your code will not run until you press the reset button, or unplug and plug in your board, to get out of safe mode.

Flash Resetting UF2

If your board ever gets into a really weird state and CIRCUITPY doesn't show up as a disk drive after installing CircuitPython, try loading this 'nuke' UF2 to RPI-RP2. which will do a 'deep clean' on your Flash Memory. You will lose all the files on the board, but at least you'll be able to revive it! After loading this UF2, follow the steps above to re-install CircuitPython.

Once you've finished setting up your QT Py RP2040 with CircuitPython, you can access the code and necessary libraries by downloading the Project Bundle.

To do this, click on the Download Project Bundle button in the window below. It will download as a zipped folder.

# SPDX-FileCopyrightText: 2021 Ruiz Bros for Adafruit Industries
# SPDX-License-Identifier: MIT

This example displays three chase animations in sequence.
import board
import neopixel
from import Chase
from adafruit_led_animation.sequence import AnimationSequence
from adafruit_led_animation.color import (

# Update to match the pin connected to your NeoPixels
pixel_pin = board.D0
# Update to match the number of NeoPixels you have connected
pixel_num = 8

pixels = neopixel.NeoPixel(pixel_pin, pixel_num, brightness=0.8, auto_write=False)

RedChase = Chase(pixels, speed=0.4, color=RED, size=1, spacing=8, reverse=True)
GreenChase = Chase(pixels, speed=0.4, color=GREEN, size=1, spacing=8, reverse=True)
BlueChase = Chase(pixels, speed=0.4, color=BLUE, size=1, spacing=8, reverse=True)

animations = AnimationSequence(

while True:

Upload the Code and Libraries to the QT Py RP2040

After downloading the Project Bundle, plug your QT Py RP2040 into the computer USB port. You should see a new flash drive appear in the computer's File Explorer or Finder (depending on your operating system) called CIRCUITPY. Unzip the folder and copy the following items to the QT Py RP2040's CIRCUITPY drive. 

  • lib folder

Your QT Py RP2040 CIRCUITPY drive should look like this after copying the lib folder and file.

CAD Parts List

STL files for 3D printing are oriented to print "as-is" on FDM style machines. Parts are designed to 3D print without any support material. Original design source may be downloaded using the links below:

  • case
  • bottom-cover
  • holder-acrylic
  • holder-strip

Build Volume

The parts require a 3D printer with a minimum build volume.

  • 210mm (X) x 70mm (Y) x 90mm (Z)

CAD Assembly

The QT Py is installed into the built-in holder on the bottom cover. The bottom cover snap fits onto the case. The LED holder is fitted into the center opening of the case. The acrylic holder is placed on top of the LED strip holder and held in place inside the case. The acrylic pieces are press fitted into the slots of the acrylic holder.

Acrylic Shapes

Download our pre-made shapes to get started. Each acrylic piece features a 20mm tab for press fitting into the 3d printed acrylic holder.

Add custom SVG graphics to the shapes using your preferred software.

The 1/4in thick acrylic pieces can be cut with a laser cutter or CNC mill.

Design Source Files

The project assembly was designed in Fusion 360. This can be downloaded in different formats like STEP, STL and more. Electronic components like Adafruit's board, displays, connectors and more can be downloaded from the Adafruit CAD parts GitHub Repo.

Wire for NeoPixel Strip

Use a 3-wire cable to connect the NeoPixel strip button to the QT Py. Measure and cut the wires down to size. Use the following lengths to trim the cable.

  • 3-wire cable – 127mm (5in)

Wiring NeoPixel Strip

Start by locating the end of the strip with the data input pad. Take note of the ground and voltage pads. Solder the cable with the three wires to the 5+, GND and Data In pads from the bottom of the strip.

Wired NeoPixel

Double check the wires are soldered in the correct orientation with the cable soldered to the back of the strip.

Solder NeoPixel to QT Py

Solder the cable from the NeoPixel strip to the QT Py.

  • DATA IN from NeoPixel strip to A0 on QT Py
  • GND from NeoPixel strip to GND on Qt Py
  • 5+ from NeoPixel strip to 5V on QT Py

Test Circuit

Power up the QT Py with a USB-C cable and either a computer/laptop or 5V USB battery bank. The NeoPixel LEDs should start playing the chase animation.

Install NeoPixel Strip to Holder

Insert the strip in between the groves with the LEDs facing up towards the slots. 

Gently push the strip through the railing until all eight LEDs are seated into the slots.

Use tweezers to help push along the strip through the holder. The LEDs can get stuck so you'll need to slight push down to guide them along.

Installed NeoPixel Strip

Double check all eight of the LEDs are seated in place. The strip should stay in place once installed into the holder.

Install QT Py

Orient the QT Py's USB port with the edge of the bottom cover.

Install the QT Py onto the bottom cover by inserting the PCB into the PCB holders at an angle. 

Slightly bend the bottom cover to allow the front two holders to grab onto the PCB of the QT Py.

Double check all four corners of the QT Py are fitted into the holder.

Case and Bottom Cover

The strip holder is installed into the case through the center opening and held in place with a friction fit.

Orient the case with the outer opening aligned with the QT Py's USB port.

Install Holder

Place the LED strip holder into the center opening of the case with the LEDs facing down.

The case has a cut away to allow the wiring from the NeoPixel strip to pass through.

Press the LED strip holder into the case so the bottom surface is flush with the inner lip.

Installed Holder

Double check the LED strip holder is fully seated into the case.

Check the bottom cover is still oriented with the cases USB opening.

Installing Bottom Cover

Begin to place the bottom cover into the case with the USB area correctly aligned.

Firmly press the edges of the bottom cover into the case until it's fully installed.

Double check the QT Py's USB port is accessible.

Optionally install the set of rubber feet to the bottom cover.

Install Acrylic Plate Holder

Get the acrylic holder ready to install over the strip holder.

The acrylic holder is symmetrical, so orientation can be either direction.

Place the acrylic holder over the strip holder and firmly press it into the cavity.

Install Acrylic

Press fit the acrylic pieces into the slots of the acrylic holder.

If the pieces feel loose, add clear tape to the tabs of the acrylic pieces to tight up the tolerance.

Final Build

Congratulations! Your NeoPixel Acrylic Lamp is ready to power up!

This guide was first published on Dec 21, 2021. It was last updated on Jul 15, 2024.