Introduction: Persistence-of-Vision Neopixel Display
This is a Neopixel-based LED display where the strips are motorized, but the images they display remain stationary. Any possible design can be written to the Neopixels, including animations that can be as complex as you like, and that design will stay stationary relative to the viewer even while the Neopixel strips themselves move back and forth.
This project was inspired by an LED light show at a concert I recently attended, which used LED strips in a similar fashion to create mesmerizing chandelier-like dynamic sculptures.
If you plan to make this project, I recommend reading through the entire instructions carefully right before you start building to make sure you understand it!
This Instructables is a work in progress! Steps are currently being written and footage is being added.
Supplies
To build this project, you'll need to have these skills:
- Basic woodworking
- Intermediate soldering
- 3D printing
You'll need to 3D print the following components:
You'll also need the following materials:
- One Raspberry Pi Pico, with all header pins soldered on
- One half-height breadboard
- Eight mini solderable breadboard-style PCBs, like these: https://www.amazon.com/EPLZON-Solderable-Breadboard-Gold-Plated-Electronics/dp/B0D6FZ2PFJ
- Eight 100μF electrolytic capacitors
- Eight meters of Neopixel strip at 144 pixels/meter with adhesive backing
- Eight 1m-long rigid aluminum LED channels with diffuser layer, to mount the Neopixels in (I got black ones, but this is a matter of preference)
- Stock of 18AWG wire for carrying signal
- Stock of 12AWG wire for carrying power
- Fifty or so WAGO inline lever nuts
- Eight NEMA17 bipolar stepper motors, rated for a minimum of 50 oz•in of torque
- Mine came with the necessary wires to connect them, you'll need to source these if yours don't
- Eight A4988 stepper motor drivers, rated for a minimum of 1.5A output current
- One 5V 40A (or more) screw-terminal power supply capable of accepting whichever standard of AC power your region uses
- Two 12V 10A (or more) screw-terminal power supplies, with the same caveat as above
- Three AC power cords to connect those power supplies to a wall outlet, ensure they are as long as you'll need
- (Optional) One power strip to consolidate the three power cords into a single one
- About eighty DIN rail screw-mount terminal blocks, mounting rail, and bridge bars. I bought four individual DIN rail terminal block kits with 20 each because they included all of these components and came with an assortment of colors.
- (Optional, but highly recommended) One 1m length of slotted wire duct to manage all those power cables. I used 1.6" wide by 1" tall duct, but I recommend using a taller size.
- About 5 meters of 1"x6" wood stock, in two 2m sections and one 1m section
- About 3 meters of any equal or smaller measurement of wood stock, in two 1m sections and two 0.5m sections
- Sixteen M3x10mm bolts
- About twenty wood screws, at least long enough to hold three 1" sections of wood together
- About twenty wood screws that are shorter than 1", so they can be used for mounting without punching through the wood
- (Optional) Wood stain of your choice
Feel free to scale this project up or down as you prefer, use a different microcontroller, or make any other adjustments! Just be mindful of the amount of GPIO pins required. My Raspi Pico has 26 usable pins, which is just enough for 8 Neopixel strip modules at 3 pins apiece—the strip itself uses one, the motor moving it uses two more.
Step 1: Build the Frame
This wooden frame should be 2m tall and roughly 1m wide. I built mine taller, but didn't need the extra height or additional crossbeam at the top. Use the 1"x6" wood stock for the vertical sections, oriented parallel to each other and joined with 1m horizontal sections as so:
- One 1m-long 1"x6" beam spanning the top (this would be the second beam down from the top in my photos)
- One 1m-long beam of any measurement about 1m below the top beam
- One 1m-long beam of any measurement along the bottom
Use the remaining 0.5m sections to create the "feet" visible in the photos, and attach them with at least four screws spaced well apart from one another. You can center them on the frame, or leave it mostly hanging out the back as I did to make sure people wouldn't trip over it while looking at the front.
Once the frame was complete, I sanded it and stained it with jet-black wood stain because it matched the black LED channels I got. Feel free to finish it with your choice of stain or paint, just be sure to sand & clean it first.
Step 2: Attach Mounting Hardware
Screw the wire duct to the back of the top horizontal beam, at the lowest point on the beam.
Screw your DIN mounting rail onto the beam about an inch above that, equally spaced along the entire beam.
Once the mounting rail is installed, divide your terminal blocks into 8 groups, where each group should have 2 blocks dedicated to 12V power, 2 blocks dedicated to 5V power, and 3 blocks dedicated to ground. (Mine are sorted by red for 5V, white for 12V, and black for ground.) Add an extra 5V power block to one of the groups, then install that group of terminal blocks at the rightmost end of the mounting rail. This extra 5V block will allow us to provide power to our microcontroller. Next, bridge the three ground blocks with a bridge bar (cut to size), then do the same for the three 5V blocks and the two 12V blocks. This ensures each of those sections will carry the same power, and lets us connect components easily and non-permanently.
Step 3: Route the Power
You can install the power supplies wherever you like, or simply keep them separate from the final assembly (just be mindful of voltage drop if you run the DC power lines a significant distance). My power supplies only had two places for mounting screws, and they were too wide to line up with the crossbeams, so I chose to mount the power supplies on a few pieces of scrap 1/8" plywood which could then be screwed onto the frame with short wood screws.
To avoid carrying too much current over individual wires, I used one 12V power supply to power the left four motors (left zone) and the other to power the right four motors (right zone). I also ran two pairs of wire from the 5V 40A power supply, and split the power for the Neopixels into the same zones. Be mindful of where your power lines will run when you mount the power supplies.
Once the power supplies are mounted, run one pair of 12AWG wire from one 12V power supply to the leftmost terminal block group (attach positive to the 12V section and negative to ground), the wire the other 12V power supply to the rightmost terminal block group. Next, connect two pairs of 12AWG wire to two distinct outputs on the 5V power supply and run these pairs to the same terminal block groups. Finally, use 12AWG wire to connect the three sections of each terminal block group together with the same sections in each group within their zone (12V to 12V, 5V to 5V, ground to ground) but KEEP THE LEFT AND RIGHT ZONES SEPARATE! This is critical to ensure the power zones doesn't overlap and force 40A through a single 12AWG cable, which WILL start a fire. See the note on the above photo to make this explicitly clear. You should connect the left and right zones with a common ground, but that's it.
Finally, you'll need to connect the three AC power cables to the three power supplies. If you're in North America, the color coding is likely Line (hot) = black wire, Neutral = white wire, and AC ground = green wire. Don't plug these into the wall yet!
Once you're done routing the power, it's time to make the things to receive power!
Step 4: Solder Motor Control Boards
To connect the A4988 stepper motor control boards, I used these little solderable breadboards for fairly convenient but also very permanent installation. You'll want to use them to connect all the necessary wires for the motors, using 18AWG wire. If you can get solid core wire, it makes the soldering a little easier.
You'll need to solder:
- One 100μF electrolytic capacitor directly between VMOT (+) and GND (-), to protect against momentary power surges when the power supplies are turned on
- Both GND pins on the board to a short length of ground wire (you can just connect the length of wire to the same row as one GND pin and the other GND pin to that row as well with a tiny piece of wire)
- VMOT to a short length of 12V wire (i.e. whatever color wire you're using for your 12V runs)
- VDD to a short length of 5V wire
- RST and SLP to each other (the SLP pin is floating if left unconnected, this is the easiest way to pull it high)
- STEP and DIR to two lengths of wire, these ones are the signal pins that have to run to the Raspberry Pi but it's easier to use a short little bit of wire and connect that to the correct length of wire later than measure out & solder the correct length now
- 1A, 1B, 2A and 2B to the stepper motor control wires. Be sure to get these the right way round: 1A and 1B should connect to one stepper coil, 2A and 2B should connect to the other.
Repeat 7 more times, and you should have 8 control boards ready to go! If you used solid core wire like I did, you can simply connect the 12V, 5V and ground wires to the corresponding sections on each terminal block group and bend the wires over such that the board is sitting on top of the terminal blocks (like in my photo). Leave the stepper control wires and STEP/DIR signal wires dangling for now.
Step 5: Assemble & Install Motor Mechanisms
To assemble the motor mechanisms, you'll need to 3D print 8 copies of the following files. I recommend 3D printing the gear racks and pinions with at least 4 walls to ensure strength.
Once 3D printed, the housings can be installed on the motors, the spur gears can be installed on the motor axles (with the help of a mallet if necessary, it's meant to be tight), and the motor assemblies can be press-fit onto the beam directly above the control boards. Plug the motor control wires into the motors and they're all set for now.
If the press fit is too loose, add shims or adjust the STL file as needed. It's important that these don't fall off.
Step 6: Install Microcontroller, Route Signals
"Installing" the Raspberry Pi Pico was pretty simple: I just stuck it to the right end of the top beam (in back) with the adhesive on the back of the breadboard. Be sure you leave enough space to plug in a USB cable for programming and testing.
Once secured, the Pico can be connected to the stepper control boards—but be sure to get the correct pins. The RP2040 chip on the Pico has 8 hardware PWM blocks that can run independently of the main core, which I make use of in order to run the motors smoothly at the same time as the Neopixels are being handled by the main core. The motors need to be wired like this:
Motor 1: STEP -> GP8, DIR -> GP9
Motor 2: STEP -> GP10, Dir -> GP11
etc.
until motor 8: STEP -> GP22, DIR -> GP26
You can use WAGO inline connectors to connect the correct length of wire for these, and you must use solid-core wire for this so that you can plug them into the breadboard.
Finally, run a grounding wire from the rightmost terminal block group to a ground pin on the Pico. You'll run a power cable as well eventually, but not yet, as that would make the circuit try to pull way more current than it should when you connect to the Pico with a USB cable to program it.
Step 7: Code Microcontroller, Test Motors
If you're using the same setup as me, the coding will be as easy as copying and pasting code.py into your CircuitPython-enabled Raspberry Pi Pico, and installing the required libraries if you haven't got them. Then DISCONNECT the Pico from USB and run a 5V cable from the rightmost terminal block group into the Vsys on the Pico (pin 39) to power it along with everything else. Only once the USB cable is disconnected may you plug in the three power supplies and observe the motors to ensure everything's working. It may take a few seconds before the Pico boots up and starts sending signals, so be patient. Once you can see every motor moving steadily, you can move to the next step.




