One POV Display to Rule Them All!




Introduction: One POV Display to Rule Them All!

About: Trust me I'm an engineer


I really like POV (persistence of vision) displays! They are not only interesting to look at but also a big challenge to develop them. It's a really interdisciplinary task. You need a lot of skills: mechanical, electronic, programming and so on!

I've always wanted to build my own and make it as big and as capable as possible. One year ago I did it! It was a lot of work and very complex to do. I like these kind of challenges. So it was fun ;-)

Now I also want you to build one yourself. You can take this as a guide to develop your own or just follow the instructions to get a copy of my POV display. I will try to point out all the challenges I had to overcome to make mine.

I iterated on my design to make it as easy as possible to rebuild.
There are no SMT components and everything should be solderable by beginners. Don't get me wrong, it's still a very big challenge to put everything together. But it should be doable!

WARNING: This project contains LEDs which are updated with
high speeds and potentially trigger seizures for people with photosensitive epilepsy!

How does it work?

Here you can read how a POV display works in general.

First we need a source which streams a video signal. In the original design I did it over WIFI. I wrote a program to capture the screen of a computer and send this data to an ESP8266 via WIFI. The problem of this approach is that the ESP8266 was too slow and the WIFI bandwidth was just enough for 16 FPS. So now we use an ESP32. I was thinking that all problems are fixed, but it turned out that the ESP32 also doesn't offer more bandwidth over WIFI than the ESP8266. The ESP32 has enough computational power to decode a video stream though. So I ended up sending JPEG images over WIFI to the ESP32. Therefore the ESP32 hosts a website. On this site you can select images or videos and the website will then stream JPEGs to the ESP32. JPEG decoding needs a lot of memory so we have a problem there too. But it works for the moment. Maybe I will come up with a better solution later.

Next we need to control the LEDs themself. For this to work we need to know the exact position of the LEDs at every moment. Therefore I added a Hall effect sensor. Every rotation it passes a magnet and thus enables the detection. Then we measure the time of the rotation. We assume that the next rotation will take the same time. Therefore we can calculate our position. This process is repeated over and over. To control the LEDs we use an FPGA. We could also use a microprocessor but it will probably be too slow. The most outer LEDs need to be refreshed around 10.000 times per second. An FPGA is easily up to the task and will do that with less jitter.

If the LEDs need to be updated that often, we also need fast LEDs. In my original design I was using APA102 LEDs. They have a refresh rate of around 20KHz. I tried to get LED strips with these LEDs but the online seller sent me SK9822s and would tell me they are the same (happened twice ...) So we will use the SK9822. They only have a refresh rate of 4.7kHz, but this will hopefully be enough. They also have a slightly different protocol. Just be aware. So the ESP32 is pushing the image frames to the FPGA. The FPGA is then controlling the LEDs.

Now the LEDs just need to rotate. Therefore we use a DC motor. This motor is controlled over a PWM signal from an ESP8266. The ESP8266 is also connected over WIFI to the ESP32. Therefore we need only one sensor to measure the rotation speed. In the original design I used two.

More Information about the system can be found in my video about the original design.


I used the following Tools:

  • 3D printer
  • Solder iron
  • Hot glue
  • Super glue
  • Micro USB Cable
  • Scissors
  • Drill + wood drill 3 4 8 and 12mm
  • Screwdriver
  • Flat pliers
  • Side cutter
  • Wire stripper
  • Paint supplies
  • Sand paper


I opened a TINDIE store. So you can buy a kit if you want and help me do more projects like this ;-)


As always everything you see here is published as open source.


There a some things I want to improve in the future:

  • Higher color resolution from 12 bit to 24 bit => therefore we need an FPGA with more RAM =>

    Cmod A7, they are pin compatible :-)

  • ESP32 with PSRAM to avoid memory problems

  • Fix the brush problem ...


Custom made parts

You need to order them or order a kit from me!

1 * Main PCB (gerber files are under the folder gerber

1 * Motor Driver PCB (gerber files are under the folder gerber

4 * Corners 3D 1 Print (stl file is under the folder 3D corner.stl)

1 * Main PCB Holder 3D 3 Print (stl files are under the folder 3D holder1.stl,holder2.stl,holder3.stl)

1 * Brush Holder 3D 2 Print (stl files are under the folder 3D brush1.stl and brush2.stl)

Standard Parts

Be careful, some of the links include 10 or even 100 piece packages.

1m * SK9822 LED Strip with 144 LED/m

1 * Cmod S6 FPGA

1 * Geekcreit 30 Pin ESP32 Development

1 * Geekcreit D1 mini V2.2.0 ESP8266

4 * 74HCT04

5 * DC-DC 5V 4A

1 * DC Motor 775

44 * 100nf 50V

9 * 220uf 16V

10 * Neodymium Magnet 10mmx2mm

1 * Hall effect sensor

2 * Carbon Bruches Dremel 4000

2 * Motor Carbon Brushes

2 * Bearings 6803ZZ

2 * Motor Mount 775

2 * DC Jack 5.5 x 2.1mm

1 * Power Supply

1 * Button 8mm

2 * XT30PB Plug Male and Female PCB

2 * XT30 Plug Male and Female Cable

2 * 130Ohm 1/4W Resistor


2 * 1N5400

1 * Single Row Pin Header

1 * Female Header

1 * Cable 30AWG

1 * Cable 22AWG

Hardware store

1 * MDF 500mm x 500mm x 10mm

1 * MDF 100mm x 500mm x 10mm

4 * MDF 200mm x 510mm x 10mm

1 * acrylic glass 500mm x 500mm x 2mm

12 * Metal Corner 40mm x 40mm x 40mm

40 * Wood screw 3mm x 10mm

6 * M3 spacer 12 mm

M3 and M4 screws

3m * Cable 2.5mm2 single wire/ stiff

Black paint for the MDF Wood

Build Time: ~ 10 hours

Build cost: ~ 300€

Step 1: Download Files

To start we first need to download everything that is needed for this project.

Go to the repository release page here.

Then download from the last release and unpack it on your computer.

Every time I reference to a file in this instructibles you will find it there ;-)

Step 2: Program Firmware

Step 2.1: Program FPGA

To program the FPGA we need to install a software from xilinx:

For Windows 10 you need to install: ISE Design Suite for Windows 10 (~7GB)

For Windows 7 or XP you can install: Lab Tools (~1GB)

After installing Open ISE iMPACT and click "No" if asked and also "Cancel" for a new project form. Connect the FPGA Board Cmod S6 and wait for the drivers to install. Double click on boundary scan. Then right click on the new window and choose "Initialize Chain". Click "No" again and close the new form. Now you should see a symbol "SPI/BPI", double click on it. Choose the file "SPIFlash.mcs". In the new form choose "SPI PROM" and "S25FL128S" and Data Width "4". Click "OK". Then single click on the "FLASH" symbol again. It should be green now. Then press "Program". Click "OK" on the new form and wait. This can take some minutes.

Well done, the FPGA is ready ;-) You can unplug It again!

Step 2.2: Program ESP32

Install the esp32 core on the Arduino ID, you can follow this tutorial. V1.0.2 is recommended.

Needed libraries:

  • AutoPID by Ryan Downing V1.0.3 (can be installed over the library manager)
  • ArduinoWebsockets by Gil Maimon, modified by me (download the zip file and install it)

Open the file povdisplay.ino in the folder povdisplay.

Choose under tools board: "DOIT ESP32 DEVKIT V1". Leave the other settings as they are.

Connect the esp32 board over USB and download the program.

Step 2.3: Program ESP8266

Install the ESP8266 core on the Arduino ID, you can follow this tutorial.

No libraries needed!

Open the file motordrive.ino in the folder motordrive.

Choose under Tools Board: "Generic ESP8266 Module". Leave the other settings as they are.

Connect the esp8266 board over USB and download the program.

Step 3: Solder PCBs

STEP 3.1 Solder motor driver PCB

The following components are soldered:

  • WEMOS1 (Geekcreit D1 mini V2.2.0 ESP8266)
    • Solder the pin headers to the WEMOS board
    • Solder the Female Headers on the PCB
  • DCDC (DC-DC 5V 4A)
    • Use 4 pins form the pin header and solder the DC-DC converter directly to the board
    • Be careful of the orientation, it should match the silk screen
  • CN1 (DC Jack 5.5 x 2.1mm)
  • 1N5400
    • Be careful of the orientation, the white line on the diode must be on the same side as the line on silk screen
  • 220u (220uf 16V)
    • Be careful of the orientation, the white line must be on the opposite side of plus on the silk screen
  • R1 and R1 (130Ohm 1/4W Resistor)
  • Q1 and Q2 (MOSFET IRF3708PBF)
    • Be careful of the orientation, the metal back must be on the side with the thick line on the silk screen
  • MOTOR (XT30PB Plug Female PCB)
    • Be careful of the orientation, the round end must be on the side marked on the silk screen
  • LEDS and TASTER (XT30PB Plug Male PCB)
    • Be careful of the orientation, the round end must be on the side marked on the silk screen

STEP 3.2 Solder main PCB

The following components are soldered:

  • CMODS6 (Cmod S6 FPGA)
    • There should be pin headers included. Solder them on the PCB
  • ESP (Geekcreit 30 Pin ESP32 Development)
    • Use Female Headers and solder them on the PCB
  • DCDC1 - DCDC4 (DC-DC 5V 4A)
    • Use 4 pins from the pin header and solder the DC-DC converter directly to the board
    • Be careful of the orientation, it should match the silk screen
  • POWER_TEST (DC Jack 5.5 x 2.1mm)
  • D1 (1N5400)
    • Be careful of the orientation, the white line on the diode must be on the same side as the line on the silk screen
  • POWER (XT30PB Plug Female PCB)
    • Be careful of the orientation, the round end must be on the side marked on the silk screen
  • C1, C3, C4, C6, C7, C9, C10, C11 (220uf 16V)
    • Be careful of the orientation, the white line on the capacitor must be on the opposite side of the plus on the silk screen
  • C2, C5, C8, C12 (100nf 50V)
  • IC1 - IC4 (74HCT04)
    • Be carefule to align the cutout of the IC with the marking on the silk screen

STEP 3.3 Hot glue

The main PCB will rotate very fast. So we need to glue the capacitors (C1, C3, C4, C6, C7, C9, C10, C11) onto the PCB to avoid problem. Just use an hot glue for that.

Step 4: Prepare Strips

STEP 4.1 Cut the strip into pieces

Remove the water protection with scissors.

We need four WINGs and each wing contains four groups. One WING is special, it has one more LED than the others.


  • G1: 5 LEDs (most outer group)
  • G2: 6 LEDs
  • G3: 8 LEDs
  • G4: 14 LEDs


  • G1: 5 LEDs (most outer group)
  • G2: 6 LEDs
  • G3: 8 LEDs
  • G4: 13 LEDs

Therefore we need 129 LEDs and our strip has 144 so we have some tolerance for a wrong cut ;-) In the worst case you can solder the cut.

Cut as centered as possible between the LEDs.

STEP 4.2 Solder cables to the LED strip

On each of the LED strip segments solder two 30AWG wires on the clock and data pin. These are the two pins in the middle. Be careful to solder them on the input of the LED strip. Normally, arrows show the direction of the data flow. The cables should be around half a meter long

Cut away everything from the other side of the stripto avoid a short between data and clock pins of the different groups when we put the WINGs together.

STEP 4.3 Solder capacitors

On each group solder two capacitors (100nf 50V) on the back of the LED strip segments at each end. For G4 also solder one in the middle. The cables should go under the capacitors to leave some space but not too much.

STEP 4.4 Put the WINGs together

For each WING lead the wires from G1 through G2 and then these wires through G3 and the same with G4.

STEP 4.4 Solder the groups together

Now we need the copper cable (cable 2.5mm2 single wire/stiff). Cut it in eight pieces of around ~30cm length. Strip the insulation of all wires. Straighten the cables as much as possible. You can fix one end in a screw clamp and hold the other with flat pliers and then hit the pliers with a hammer.

Fix the cable on one side to make working with it easier. Then solder the first group to it. Align the LED strip segment with the cable and solder it on one side to the two capacitors. The cable should rest flat on the LED strip. Continue with the next group. Be careful that the distance between two LED groups is also 7mm. In the end all LEDs should have the same gap between them. Continue with the other two groups. On the last group solder all three capacitors to the wire.

Then cut the cable at the end. Continue with another cable on the other side of the strip.

Now the first WING is finished! Do the same for the other three Wings.

STEP 4.5 Bend the capacitors

Just bend all of them to make the strips thin.

Step 5: Solder the Strips on the Main PCB

STEP 5.1 Check polarisation

First we need to know the polarisation of the LED strip. In other words: Where 5V and ground is relative to the PCB. This really depends on the LED strip you have and can be any way around.

Hold one WING onto the main PCB. The arrows on the LED strip must point to the center of the PCB. Now look if 5V is on the DATA or the CLOCK side of the pins.

If the 5V is on the DATA side you are good and you can use the 2.5mm2 copper to solder the LED strip directly to the PCB.

If not, you need to use a 22AWG cable to cross out the two sides. Therefore, solder the cable to the LED strip and cross out the left and right side and solder that to the PCB.

STEP 5.2 Solder 2.5 mm2 cable

Use the rest of the 2.5 mm2 copper cable and strip all. Solder them on the top side of the PCB. Cut the soldered wire at the same height around 1cm.

STEP 5.3 Solder the first WING

Use the longer WING and position it on the PCB (LEDs1) as shown on the silk screen. Solder it to the 2.5 mm2 wires. Make really strong connections this will see a lot of force during rotation! Then connect the cables for Group 1 to G1 Data and G1 Clock.

Don't forget to solder the power connection as described above.

Connect the ESP32 and the FPGA (48 and 1 is on the marked side) and power the board with the power supply.

The most outer LEDs should blink blue now (can take up to 40 seconds to do so). If not, check if you connected CLOCK and DATA the right way.

STEP 5.4 Hall effect sensor

Solder a Female Pin header (with three pins) to the Hall. Later we will connect the sensor to it.

Solder the sensor (Hall effect sensor) to a male pin header. The links with the senor and the pin header should be around 25mm.

STEP 5.5 Continue with the rest of the WINGS

For LEDs2 - LEDs4 == WING2 - WING4 do the same process as with WING1.

From time to time power the PCB and check if everything is blinking. The pattern starts with the most outer led and goes inwards and starts again.

STEP 5.6 Balance

Try to balance the main PCB in the middle with a pointy object. If one side weighs more, try to add solder to the other side. It doesn't have to be perfect, but too much imbalance will later result in a lot of vibration during operation, which can lead to mechanical problems.

Step 6: First Paint

Step 6.1: Drill

We need to drill some holes:

On the 500*500 MDF board we need two holes. Look at the file drill_wood_500_500.pdf and drill the holes according to the plan.

On the 500*100 MDF board we need a lot of holes. Therefore print the file drill_wood_500_100_A4.pdf and align it on the board. Just drill where the holes are marked on the paper.

Step 6.2: Paint

Paint one side of every wood. For the 500 x 500 MDF board it's the side you drilled on.

Paint both sides of the 100x500 wood.

You can also paint the metal corners black. This will look better ;-)

The rest we will be painted when we have assembled everything (the outside of the box).

Step 7: Mechanical Assembly

Step 7.1 Mount the Motor Driver PCB

The PCB is mounted on the 100 x 500 MDF board. Use the spacers (M3 spacer 12 mm) and some m3 screws and nuts.

Step 7.2 Mount brackets

Mount the two brackets (Motor Mount 775) on the 100 x500 MDF Board with M4 screws.

Step 7.3 Prepare Holder

The two barrings (Bearings 6803ZZ) need to be disabled. We just need the two outer rings from it.

Solder 22AWG wires on each of the ring. One black and one red one.

Take the Holder 3D printed parts and assemble them.

Put all seven M3 nuts in their respective holes and slide the ring with the red wire first on the holder, then the spacer and then the ring with the black wire. Add the third piece on top and insert the screws.

Cut the two wires at a distance of 2 cm and solder the jeck (XT30 Plug Male Cable) to it. The black cable goes to the curfed side.

Step 7.4 Mount Motor

Screw the motor (DC Motor 775) to the motor mount in the middle of the 100 x500 MDF board.

Mount the holder on the motor and screw it tight.

Step 7.5 Install Brushes

I planned to use a Dremel brush (Carbon Brushes Dremel 4000). We need the use another coal (Motor Carbon Brushes) because the coal for the Dremel brushes has a too high resistance. I overlooked that in the development process. So we use the motor brushes and sand them to the size of the dremel brushes.

Cut the wire from the motor brush at 5 mm away from the coal.

Then we use sand paper to trim the coal down to the following dimensions: 8.4 x 6.3 x 4.8 mm

One side of the motor brush is 6.1 mm, so we only need to sand two sides.

You can try if it easly slides in the brush holder, then it's fine.

Also try to sand a curve on the top to improve the connection to the metal rings.

Solder a 22AWG wire at the coal for both coals. Use a red and a black wire. Insert the spring from the dremel brush.

Insert the brushes in the brush holder. The brush with the red wire goes in the top. The top side of the holder is a little bit thicker. Be careful that the two springs do not touch each other.

Mount the holder to the base with nuts and m3 screws.

Mount the base of the brush holder to the secound motor mount bracked. Use M4 screws and nuts included with the bracket.

The motor should be able to spin freely.

Guide the two wires between the two brackets.

Cut the two wires at a length so they can just reach the PCB and solder the jeck (XT30 Plug Male Cable) to it. The black cable goes to the curved side.

Solder two 22AWG wires to the motors and cut them at a distance to easly reach the PCB and solder the jeck (XT30 plug female cable) to it. The black cable goes to the curved side.

Step 8: Finish

Step 8.1 Put the box together

Start with the 500 x 500 MDF board facing up (painted side) then mount the 100 x 500 with two metal corners at the position marked as MDF in the file drill_wood_500_500.pdf. Therefore the motor should be in the center of the box.

Then add the side boards (200mm x 510mm), the black side is facing inside. Mount them also with metal corners.

Step 8.2 Paint

Paint the outside of the box black.

Step 8.3 Acrylic glass

Mount the corner 3D printed parts on each corner inside the box. They should have 2 mm distance to the corner.

Glue the magnets on the back side of the corners and add magnets on the front. Put glue on the top and press the acrylic glass onto it.

Step 8.4 Button

Solder two 30AWG wires to the TASTER (button 8 mm) and mount the taster on the 500X500 MDF board in the 8mm hole so that it can be switched from the outside. On the other end solder a jack (XT30 Plug female cable) the polarisation doesn't matter. Connect the cable to the motor PCB (TASTER)

Step 8.5 Mount main PCB

Plug the Hall effect sensor on the PCB. Be careful that you have the right rotation. Align it with the symbol on the silk screen on the PCB. Now you can mount the main PCB on the holder. Use four M4 screws. Don't forget to connect the plug to the main PCB.

Step 9: Startup

Step 9.1 Power up

Connect the power supply to the motor drive PCB.

Then push the button. Now the LEDs should show the test pattern.

When you rotate the LED board manually the test pattern should change color after a full rotation.

If not, check if the Hall effect sensor is aligned properly.

Step 9.2 Connect

Now you should find an WiFi network named "POV Display". Connect to it.

Open the browser and go to the following website "".

The display should start spinning and you should see a static image.

Step 9.3 HAVE FUN

Open a video or an image and play around with the settings on the website.

Have fun and enjoy your POV display ;-)

Step 10: Troubleshooting

This build is very complex and a lot of things can go wrong.

If there are any problems write a comment and I will try my best to help you.

I will document common problems here:

  • No problems so far :-)
Indoor Lighting Contest

Participated in the
Indoor Lighting Contest

Be the First to Share


    • Make It Bridge

      Make It Bridge
    • For the Home Contest

      For the Home Contest
    • Big and Small Contest

      Big and Small Contest



    Question 2 months ago

    Dear IM-Pro,You did a great project.When I tried to do it, I met a problem.Only two of the four light strips can light up normally.When I only solder the power supply of the light strip, the faulty light strip can light up normally. But when I solder data and clock on, it won't light up at all.


    Answer 2 months ago

    The two faulty LED strips can be lit when only power is supplied. This shows that there is no problem with the welding of the light strip.When I solder data and clock on, it won't light up at all.I have swapped the data and clock of the faulty light strip, but the problem still cannot be solved. My pov only has two light strips that can be displayed normally。


    9 months ago

    Dear IM-Pro,
    Thank you for sucha a great opportunity.
    I'm about to walk on your steps by trying to build such a device.
    I'm looking for the FPGA Cmod S6 FPGA but it seems to be impossible to find it anymore.
    Do you know if an other FPGA model could be use and run your code as it please (with no modification as I do not know the FPGA world) ?
    Thank you very much for your help and your kindness,
    Have a great day !


    Reply 9 months ago

    No I'm sorry ... I'm afraid you have to learn a bit about FPGAs ;-)
    I use a lot of IPs so you should stay with xilinx
    Maybe you can use the CMode 7A? But no guarantee ...
    Good luck with you project and have fun!


    Question 1 year ago

    i want to increase size of the pov display what should i do in code to increase the lenght of strip


    Question 1 year ago

    Bro,can I use non addresseable leds(normal rgb smds)with led drivers?


    2 years ago

    The hall sensor is output 12v to the CmodS6 is it normal it will burn the card??


    Reply 2 years ago

    The hall sensor has an open collector output. The fpga is pulling the port high over an internal pullup resistor with the right voltage and if the hall sensor detect something it is just pulling the pin to ground.


    2 years ago

    which version of xilinx did you use for the project i wanna compile with 14.7 but in vain error


    Reply 2 years ago

    The version sounds right. What was the error message?


    3 years ago

    good day battery wiring diagram you used?


    Reply 3 years ago

    I did not use any batteries


    Question 3 years ago

    Hey im-pro, I was wondering if I could run video output to it.


    Answer 3 years ago

    I did write you an answer ... did you get it? Its even shwon on my profile.


    Reply 3 years ago

    Thank you. I must have missed the description when I was reading through it.


    Reply 3 years ago

    No this is my old build. And no you can not. We would need an other position sensor to make manually control possible.


    Reply 3 years ago

    Don't you think about POV for bicycle? Sending data through WiFi from Android.


    3 years ago

    Did you consider building the wings with a PCB and individual LEDs instead of the strips? I understand the need to have different refresh cycles depending on how near or far the LEDs are from the outer edge. A PCB might be more soldering but easier to assemble and provide nearly perfect spacing between the LEDs. Just a thought.

    Kudos us for a great project! I am saving my money to buy a kit soon!


    Reply 3 years ago

    Yes I did this with my original design. But I did not want smt components because a lot of people are not able to solder them .... But looking back this is not for everyone to build because it's to complex anyway :-( ai tried my best to simplify it ...

    Have fun ;-)