In this project we’ll show you how to build a POV LED wand. Adafruit DotStar’s deliver high speed PWM making them great for Persistence Of Vision. It’s powered by Adafruit’s Circuit Python, making it really easy to change and modify. The Adafruit Feather shows up as a USB drive so you can drag and drop the code. The handle and wand were designed to be 3D printed and houses all of the electronics.


As the LEDs move in space, they flash different parts of an image, building up an image in your brain. Using a long (several seconds) camera exposure, a single row of LEDs under computer control displays an image one line at a time while it's carried or rolled across the frame. The combined result is a luminous picture floating in air.

Circuit Python Powered

The software running this build was written in Circuit Python. This means there's no "post-processing" for the images making it super easy to drag-n-drop new images onto the CIRCUITPY USB Drive! All of the image processing is done on the fly, straight off the flash chip.

Simple Design

The design is reminiscent to a wand, so it's meant to be held in hand. It's fun to wave this thing around. The Feather and battery are housed in the handle and secured with machine screws. The handle is split in two halves that snap fit together. The LED strip is tapped to a  stick thats designed to be clamped to the handled. An on/off switch is fitted inside the handle and easy to access. 

POV Builds!

There's certainly no shortage of POV projects on the Adafruit Learning System (Just search for POV). From talented makers like Limor FriedErin St. Blane, Becky Stern and Phillip Burgess, these are by far the most impressive. This POV build, however, uses the Adafruit Feather platform – You get built-in USB battery recharging, prototyping area, and extra power and ground pins which results in a build with less parts. The Adafruit Feather form-factor is perfect for this sort of thing!

Here's a list of some of the POV projects on the Adafruit learn system. Each uniquely designed and developed with different platforms, components and software. Each one is special in their own right!

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. See the DotStar guide for more information on how they work.

Parts & Components

You'll need just a couple a parts to build this project. The DotStar LED strip comes in a meter long with 144 pixels. The 2200mAh lipo battery connects directly to the Adafruit Feather. A slide switch will power the circuit on and off. The Adafruit Feather M0 Express has built-in USB recharging.

1 x Adafruit Feather
M0 Express for Circuit Python
1 x DotStar LED Strip
144 LED/m One Meter Long Strip – High Density
1 x Slide Switch
Breadboard-friendly SPDT Slide Switch
1 x 2200mAh Battery
Lithium Ion Cylindrical Battery - 3.7v 2200mAh


Hardware, solder, wires, heat shrink, that sorta thing.

4 x M2.5 Machine Screws (Short)
M2.5 x .45 x 5MM
1 x M2.5 Machine Screw (Long)
M2.5 x .45 x 12MM
1 x M2.5 Screw Tap
1 x 30AWG Wire
Silicone Covered Stranded
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 NITTO Tape
Nitto (Permacel) P-02 Double Coated Kraft Paper Tape

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 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

Light Painting

This is a nice tool for creating light paintings. I'm surprised how much detail can fit in 32 pixel tall graphics, text, shapes and patterns. Images with a lot of color really show just how vibrant the DotStar LEDs can be. Rainbows and other multi-colored patterns look amazing! 

Turtles In The Kitchen

Yep, I'm running out of things to do with this. Here's me in the kitchen with some evil turtles from that one game. Can't really tell why I'm wearing sunglasses inside but I'm sure it was only for documentation purposes.

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 144 LED/m high density strip does not have labels for serial clock and data signals, so you'll need to use the power and ground labels to reference the correct pins.

In my build, I wired up 2 separate LED strips (Data Not Chained). I decided to leave this out in the circuit diagram for clarity purposes.  The second LED strip share the SCK and MO pins, however the power and ground have their own pins.

Wired Connections

The DotStar strip has labels noting the power and ground pads as well as an arrow for depicting the flow of the data. The 2200mAh battery plugs directly into the Adafruit Feather.

  • 3V from Feather to +Power on DotStar Strip
  • MO from Feather to Data Input (DI) on DotStar Strip
  • SCK from Feather to Clock Input (CI) on DotStar Strip
  • EN and GND on Feather to Switch

Setup Adafruit Feather M0 Express for CircuitPython

We'll need to get our Feather board setup so we can run CircuitPython code. First thing we'll need to do is connect the board to your computer with a microUSB cable. Then double-click on the reset button to put it in "UF2" boot-loader mode. The NeoPixel will turn green. The board will then show up as a USB storage device on your computer named "FEATHERBOOT". 

Follow the guide below to setup the firmware, once complete, come back here and proceed.

Some CircuitPython programs require extra libraries that are written in Python, but this project uses only modules that are built into CircuitPython, so you don't need any additional libraries.

Upload The Code

Copy and paste the code below into a new text document (using your favorite texteditor). Save the file and name it as code.py

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

Prepping Images

The images must be in 24-bit BITMAP format. JPG and GIF formats are not supported! The maximum dimensions for images are 72px wide by 32px tall. Use an image preview / editing application or online converter to save the image out as a .BMP (bitmap).

Bitmap Images

I used Adobe Photoshop to import, scale and tweak artwork. Scaling images down can get mangled, so it's necessary to touch up or even redraw images. Using Sharper Bicubic interpolation works well on 8bit style graphics.

What If I Don't Have A 3D Printer?

Not to worry! You can use a 3D printing service such as 3DHubs or MakeXYZ to have a local 3D printer operator 3D print and ship you parts to you. This is a great way to get your parts 3D printed by local makers. You could also try checking out your local Library or search for a Maker Space.

3D Printed Parts

All of the parts are 3D printed with FDM type 3D printers using various colored filaments. All of the parts are separated into pieces to make 3D printing easier. Assembly is pretty easy and straight forward. Use the links below to download the STLs files.

3D Model & Components

All of the parts were designed in Autdoesk Fusion 360 and available to download and modify. The source contains 3d models of components such as the DotStar LED strip, 2200mAh battery, slide switch, and Adafruit Feather. You can use these models for reference in your future enclosure designs!

Long Stick

The stick is actually 248mm long, making it almost too big to fit on standard-size bed of a 3D printer. So, the model was rotated at 45 degrees, set diagonally across the bed. This orientation allows the stick to be 3d printed on a bed ~215mm x 215mm, like the Ultimaker 3

Minimum bed-size: 185mm x 185mm 

Slide Switch Wires

In order to power the circuit on and off, the slide switch will need to be connected to the Adafruit Feather. We'll need to two pieces of wire. These wires can about the length of the board.

Prep Wires

Using wire stripper, remove a bit of insulation from the tips of each wire. These 30AWG silicone covered wires are stranded, so it's a good idea to tin them with a bit of solder. This will make it easier to connect them to the switch and it prevents the strands from fraying. 

Solder Wires to Switch

We only need two out of the three terminals on the slide switch. Using wire cutters, snip one of the pins – either the far left or right but not the middle! You can also trim them short, about half their length is good. Add a bit of solder to the two short terminals and solder the wires to them. A helping third hand is great for keeping the switch steady while soldering wires.

Connect Switch to Feather

With the switch now connected to the wires, you can solder them to the EN (enable) and GND (ground) pins on the Adafruit Feather. I normally tin the through-holes with a bit of solder before adding wires. A PCB vise like the Panavisr Jr is great for holding the board up while soldering.

Test Switch & Battery

You can test the switch by plugging in the battery to the JST port on Adafruit Feather. The on-board NeoPixel LED should power on when the switch side is actuated. If everything works, proceed to the next page!

Count Pixels

In this project we're using 32 DotStar LEDs but you can optionally use more or less – It's up to you! However, the stick was designed for 32 LEDs. Either way, it's good idea to count multiple times and cut once.

Plan The Cut

It's a good idea to think about how you're going to cut the strip. The DotStar LEDs are very close to each other and it's easy to accidentally cut the pads too short. I suggest using a flush diagonal cutters to make flush cuts. The ends of LED strips may have wires and hotglued ends already on them, so it may be necessary to remove them. Another option is to have a "sacrificial pixel" like mentioned in Beck's Guide.

Signal Direction

It's important to be aware of the signal direction. The arrows on the strip depict the flow and direction of the data. The wires coming from the Adafruit Feather going to the DotSar strip this way [Feather]→[LED Strip]

Two Strips

If you'd like to make the wand have LEDs on both sides, you can cut another strip with the same pixel count. This is optional, so you can choose how many pixels you want. We won't be needing the protective sheathing, so you can remove them from the strips.

Tin Pads

The pads on the DotStar strips are fairly small, so it's best to use a fine tipped soldering iron. Add a tiny bit of solder to the pads, this will make it easier to attach wires to them.

Be careful not to melt any LEDs with the tip of the soldering iron!

Wires for Strip

Now it's time to make some wires! Each strip needs four wires to connect to the Adafruit Feather. If you'd like to use two strips, you'll need to make two sets of wires. These will need to be long, about 150mm in length (or the length of the handle). Use pieces of heat shrink tubing to keep the wires bundled together.

Prep Wires

Since these are stranded wire, it's a good idea to tin them. Using wire strippers, remove a bit of insulation from the tips of each wire and then add a bit of solder. You can use different colored wires to help tell the connections apart.

Connect Wires to Strip

Be sure to double check the data flow before soldering the wires to the pads! Solder each wire to the pads on the DotStar strip. Use common colors like red for voltage, blue for ground, etc. 

Wired Strips

If you're using two strips, you'll need to wire those up. I used a few pieces of heat shrink tubing to keep the wires bundled together. Both have similar wire lengths and colors to keep it consistent.

Connect Feather

Now it's time to connect the strips to the Feather! Connect the voltage power wire from the strip to one of the available 3V pins. Connect ground from the strip to one of the available ground pins. Then, clock input to SCK and data input to MO. Remember, these are not labeled on the high density strip, so you'll have to reference the circuit diagram to get the right connections. 

Connected Strips

Wiring up two strips gets a little cluttered because you'll need to share the SCK and MO pins with two wires. However, the Adafruit Feather has several power and ground pins, yay!

Final Circuit

And here's the final circuit wired up. At this point you should have the Adafruit Feather M0 Express setup and the code already uploaded to the board. You should be able to test out the strips and power the circuit on with the slide switch. If it's all good, then proceed to the assembly.

Install Feather

Place the Feather over the four standoffs on the bottom half of the handle. Line up the mounting holes. Orient the board so the microUSB port is facing the port cutout. Insert and fasten 4x M2.5 x 4mm long flat phillips machine screws.

Install Switch 

Insert the slide switch at an angle and press it in between the walls of the switch holder. 

Switch Actuator

The actuator should be accessible through the outside of the handle. 

Install Battery

The 2200mAh battery can be clipped to the bottom half of the handle. Orient the battery so the cable can reach the JST connector on the Adafruit Feather.

Add NITTO Tape

Grab the stick and add long strips of double-sided NITTO tape. This stuff is strong and will provide a good hold. Carefully place the strip of tape so it lines up nicely with the stick. Peel away the protective backing.

Stick Strip

Before sticking the DotStar strip, make sure the handle will not intersect (touch) with the flexible PCB on the strips. The wiring and strip should have a good amount of clearance. It's a good idea to do a dry fit to see where the stick gets installed to the handle. Once you've determined a good safe zone, place the strip to the stick – Firmly press the full length of the strip to properly adhere. Repeat process for the second strip.

Handle Halves

Grab the top half of the handle. These two will snap fit together. We'll need 2x M2.5 x 12mm long screws to secure the two halves together. It's a good idea to dry fit them to see how they go together.

Install Stick to Handle

Install the stick to the bottom half of the handle by inserting the end with the tabs into the holder near the end. It should slot in and not clip any of the wires or DotStar strip. Arrange the wiring so that they fit through the little cutaway.

Secure Halves

Make sure all of the wiring fits inside the handle. Carefully place the top half of the handle onto the bottom half and press them together – Be careful not to kink any of the wires. Flip the handle assembly over and insert two M2.5 x 12mm long flat phillips machine screws into the two counter bore standoffs. Fasten screws until fully tightened.

Secured Stick and Handle

Thoroughly inspect the handle and stick assembly to ensure nothing is being kinked, mangled or otherwise. The assembly should be pretty solid and sturdy when waving it around.

Final Assembly

The handle should be easy to take apart if you ever need to service the components. When the battery gets low, recharge the battery with USB power supply or hub. 

Long Exposure

The best way to photograph the DotStar LEDs is to use a long exposure. Here are some settings, tips and tricks if you're looking to create some awesome photos.

  • Shoot In The Dark – The environment needs to be dark, so turn off the lights if you're in a room or pick a dark location if you're shooting outside.
  • Use The Flash – If your camera has a built-in flash feature, use it! This will help illuminate your surroundings and yourself or subject.
  • Use a Tripod – You'll want to keep the camera absolutely still to avoid blurry photos.
  • Camera Settings – These are settings we used
    • Shutter Speed: 4" – 8" of a second
    • ISO: (light sensitivity) 320
    • F-Stop: (aperture) 9.0

Shutter Speed

Playing with the shutter speed is the best way to get a desired effect. The longer the shutter speed, the longer the camera's aperture stays open, allowing more light to come in – This results in a "longer" stream of lights. The longer the shutter, the more light is introduced to your photo – If there's too much light, you'll get an overexposed photo. This is a balancing act!


Keeping the ISO values low allows the colors to come through more vividly. If you're looking to get more light intensity, try increasing the ISO values – But be careful not to over expose the photo!


A high F-Stop will result in a sharp photo where the background is more focused with the foreground. However, this minimizes the amount of light from coming through the aperture. A high F-Stop is best when using a flash.

DSLR Cameras

All of the photos in this project were taken using a Canon 5D MKIII with an external flash and a 24mm-70mm lens. To make capturing easier, we used an intervalometer remote with a interval of 4 seconds (with a 2-sec delay on the camera).

Focus The Camera

Is your awesome light painting out of focus? It's a good idea to focus the camera's lens while holding the DotStar strips still in place. You'll want to have a partner to do this! Avoid the Auto-Focus feature if your camera has that. 


Be aware of your surroundings. Are you shooting outside? Is your background interesting? Cluttered?Additional outdoor lighting such as street lights could potentially blow out the LEDs. Are there windows? Reflections on surfaces can potentially introduce unwanted lighting. Think about the composition of the photo. Do you want the light painting to be centered? Following the rule of thirds or looking for a golden ratio?

Mobile Phone Photography

The camera on mobile phones are pretty good but not ideal for long exposure photography. Although possible, it's more difficult to get a great photo with a mobile phone camera than a point-and-shot dedicated camera. Try looking for third-party photography apps that allow you to fine tune the camera's settings.

What About Video?

Most video camera will shot video at a 30FPS (frame per second) which isn't exactly great for long exposures. You can capture the effect on video, but it won't be as fully formed like in a photo. A great way to get around this is to combine a series of photos together to form a "stop motion" type of video. An intervalometer remote trigger is great for this!

This guide was first published on Nov 29, 2017. It was last updated on Feb 29, 2024.