Persistence of vision (POV) displays use the limits of human motion perception to create the illusion of continuous images using fast-moving display components. Our initial project goal was to create a programmable 7×8 LED matrix that spins to create a 3D persistence of vision (POV) display. We wanted the display to include a handful of preset images defined by a user which could be enhanced with 3D visual effects such as rotation. Recognizing that the 3D goal was ambitious, we also outlined an intermediate goal of creating a 2D POV display with enhanced functionality and user interactivity. We first achieved our intermediate goal of creating a 1D array of 10 LEDs that spins to create a 2D POV display. We also created a graphical user interface (GUI) that allows the user to draw the image or text they want shown. This can be used to generate both static images and small-frame animations by controlling the speed of display rotation. For links to videos of what we built, check out the media page. Initially, memory limitations on the PIC microcontroller we were using presented a challenge to implementing the 3D display, but recently we were able to get the system set up. Some videos of the 2D system are below; some better quality videos are available here, but they take a while to load.
This project involved a number of mechanical, electrical, and software challenges; these challenges are described in more detail in the “mechanical,” “electrical,” “firmware,” and “software” tabs of this site.
The major mechanical challenge we faced was designing a robust rotating system capable of transmitting power to the display circuitry. We powered the display using a commercially-available rotating connector from Mercotac. The mechanical system also had to be sufficiently reliable to withstand multiple tests at a minimum rotation speed of 10 Hz to achieve persistence of vision. For more details, see the mechanical system description.
The main challenge when designing the electrical system was to control 40 LEDs with a single PIC for the 3D system. To accomplish this, the LEDs were split into four columns of 10 LEDs each which could be selectively turned on and off by controlling the LED ground with a MOSFET transistor. For more details, see the electrical system description.
In order to achieve persistence of vision, the rotating LEDs must be turned on and off at short, controlled time intervals. We initially attempted to control this timing using interrupts on a PIC18F2455 microcontroller, but determined that manual control of motor speed by adjusting input current was sufficient for the display, and added more flexibility in creating animated images on the display. Another key challenge that we encountered when developing the firmware for our system was storage space on the PIC18F2455. We modified our image storage approach to compensate for this to some extent, but were still limited by the amount of space needed for a 3D system. For more details, see the firmware description.
The final consideration for our project was user interactivity. While commercial POV displays present a static image, our display was intended to be customized. Therefore, we created a GUI in Python to enable users to draw an image for the display; it also allows users to save the image they have drawn as a text file. For more details, see the software description.
Another challenging aspect of the project was finalizing a mechanical system in time to test the functionality of our electrical and software systems. As none of the members of our team were mechanically inclined, this took an especially large amount of time and limited our ability to build in additional capabilities to the display.
In the near future, we hope to test our system with a larger PIC (the PIC18F2550, with 36 kB of program memory) with enough space to create a 3D display since we have the physical framework for such a display configured. Alternate solutions include using an external serial EEPROM for data storage or removing the internal PIC bootloader for programming in lieu of an external programmer such as a PICkit.
We can also extend the abilities of our current system now that we have a working base display. While we have used our system to display frame-by-frame animations, we could also investigate using matrix transformations to create image effects (rotation, translation, dilations) in order to minimize added memory constraints. This could also be extended to any uploaded image instead of being limited to a predetermined frame.
It’s not quite perfect, but check out some videos of what we made (they might take a while to load) here: something planar and best of all, double helix / double rainbow.
Random floating dots.
There are a lot of interface improvements we could make, but the basic 3D system is set up! One big oversight is that you can only see about half of an image because even though we used plexiglas posts, we didn’t account for the thickness of the LED itself dimming the light. Using a modified version of the same GUI as we used in the 2D system, you can draw and upload what you want to add on the display. While we took off the outer LED post that we were using for the 2D system to improve visibility, the PIC and the GUI are set up so that the 2D and 3D systems are interchangeable. To read more about the firmware changes, read here.