Introduction: One POV Display to Rule Them All!
Motivation
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.
Tools
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
Order
I opened a TINDIE store. So you can buy a kit if you want and help me do more projects like this ;-)
OSH
As always everything you see here is published as open source.
Updates
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 ...
Supplies
Custom made parts
You need to order them or order a kit from me!
1 * Main PCB (gerber files are under the folder gerber main.zip)
1 * Motor Driver PCB (gerber files are under the folder gerber motor.zip)
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
2 * Carbon Bruches Dremel 4000
2 * Bearings 6803ZZ
2 * Motor Mount 775
1 * Power Supply
1 * Button 8mm
2 * XT30PB Plug Male and Female PCB
2 * XT30 Plug Male and Female Cable
2 * 1N5400
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 Release.zip 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.
WING1:
- G1: 5 LEDs (most outer group)
- G2: 6 LEDs
- G3: 8 LEDs
- G4: 14 LEDs
WING2 - WING4:
- 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 "192.168.4.1".
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 :-)