Hello,
I'm working on a colour LED display that can stream video from my PC to it. The resolution will be in the several hundred pixels but I'm not giving a definite value until I do a more large scale test of the brightness and speed of multiplexing the LED matrix. By binary selecting the rows using a collection of multiplexers it's possible to construct a very large LED matrix with a limited number of pins. My inspiration came about when I found hundreds of RGB LEDs selling cheap on eBay.
My first observation of the brandless LEDs is that when I run each of the RGB pins at the recommended voltage each of the colour channels emit light at a different strength; red overpowers green, and green overpowers blue. This could easily be solved by calibrating the resistance to each colour channel, but I could not find the correct combinations of resistors to use to produce a perfect 'white'. I instead used a software solution which allows me to easily calibrate 'white' by eye in real-time by scaling the PWM output for each colour channel.
The LEDs have non-diffused lenses so when looking at them directly you can see the individual colour channels and there is no illusion of mixing colours. This was very simply solved in a test where I covered the head of the LED in masking tape. From the sides the colours were evenly blended together, but when looking directly at the tip of the LED it was still possible to see small blended rings of red, green, and blue. Any sort of paper and even some fabrics (such as white wool socks) would blend the colours nicely except for the rings at the very tip.
I've seen many LED displays where the LEDs are spaced out circle dots with a gap in between each pixel and I would like to avoid this. My aim is to have square and borderless pixels much like in a real display. I created a small white paper cube that I poked an LED (without masking tape on the head) in to. I was disappointed at first when I looked at the cube from the top, since I could see clearly visible red, green, and blue rings projected onto the top of the paper cube. To my surprise I noticed the side of the cube was evenly lit and the colour channels were perfectly blended together, so in my display the pixels will be constructed out of paper cubes with the LED's mounted sideways in them.
I experimented with different shades of paper (black, grey, white) and the brighter the paper is the more evenly lit the side is, so the paper cubes will have to be white.
I want be able to operate with the full RGB colour space, but I was unable to make the 'pixel' glow deep colours (brown, navy, etc). I was only able to reproduce fully bright hues and whites. The pixel would glow a faint orange if I tried to produce brown for example. This is due by LEDs using additive colour mixing, and because the paper is white (and when the LED is viewed with the naked eye it is clear) I can only add to that colour, not subtract from it, which is why I am unable to reproduce deeper colours. Likewise, if I'm in a lit room then the pixel is white when there is no power being fed to it, and it is impossible to subtract from the white paper to create 'black'.
By printing black on the outside of the paper and leaving the inside white I was able to reproduce the full colour range. When I used fully black paper the light did not bounce around inside of the cube before leaving the side, so it was not evenly distributed across the area of the pixel. However when the paper was white inside the light was able to evenly distribute itself, and black on the outside I had a dark base to 'add' colours to. The LED is powerful enough to emit through the black ink, and I am able to recreate brown, navy, and other deep colours to my heart's content. The other advantage is that in a fully lit room an off pixel still appears 'black' not white or grey as I've seen in other LED displays.
I still have a few problems to solve before I purchase the materials to create a much larger display and construct and wire up hundreds of pixels.
When there are two cubes next to each other and one LED is fully lit while the other is not lit at all then light will leak through the lit cube into the unlit cube making it glow slightly. To avoid leaking I will need to construct the side of the cubes out of either a white material that won't allow light to go through (cardboard?) or put small sheets of some dense or dark material (aluminium foil or black cardboard) between each cube without creating a visible gap between the pixels.
I have to make sure the interrupt timer frequency a multiple of the PWM frequency, while still maintaining a steady refresh rate, but this seems trivial and I have got a so-far working timing solution that I won't be able to fully test until I have the majority of the LEDs wired up.
The LEDs need to be gamma corrected. Just like how I must scale the output of each channel to calibrate 'white', each colour channel also fades at a different rate therefore I am going to have to calculate a gamma value for each colour channel.
I'm going to control the LED display from the PC side. To simplify the software development, if I can use the USBSerial class I will. 115,200bps will allow approximately 18 frames to be transmitted per second. I already have implemented code on the Maple that receives the frame via the USBSerial and saves it in to a secondary buffer, that flips with the primary buffer being displayed when a full frame has been received. A frame takes up 830 bytes stored in memory (pixel values + gamma + white scale), while a frame can be transmitted uncompressed in 801 bytes containing pixel values alone - if transmission speed in an issue this could be shrunk further to 401 by encoding each channel using 4-bits.
Since the frames will be streamed to it from the computer, my goal is to eventually use the LEDs to display images, video, and even create minigames (http://www.spike.com/blog/64-pixel-mario/93546) to play on it.