This Arduino shield will make an end to your 1st project being an LED to be flashed. Now you are able to connect a display (which we are all hooked to anyways) and generate a virtual LED that is going to blink in every color you have ever dreamed of.
Now seriously, the Arduino family of compatible boards is lacking a solid hardware support option to display images, animations or video. This board provides an analog composite video display with integrated frame buffer memory accessible through SPI bus. It will not display 4K video but somebody will hack it to run Doom, Joust or Ultra-Cricket. PAL and NTSC output formats are supported, resolution is up to 720x576 with reduced color count. Yes, there are software solutions available to generate video or RGB signals, but they use critical timing code and a lot of the available computing power of the limited uC.
A 2Mbit SPI FLASH memory is available on-board to store font character bitmaps or graphics.
The heart of this design is the VLSI VS23S010D-L chip. It is a 1 Megabit SPI SRAM with Serial and Parallel Interfaces and Integrated Video Display Controller, which outputs a composite video signal. Unused memory can be used for graphics tiles, which can be copied into the image data by the internal fast memory block move hardware.
Possible video resolutions, PAL and NTSC modes might be exclusive depending on the mouted crystal (4.433618MHz or 3.579545MHz):
The chip has a 3.3V interface, so a level shifter logic is required, which is done by a 74LVC4245A buffer. It is able to handle SPI Mbps speed better that a simple FET based level shifter. A footprint for a 512Kbit EEPROM for bitmaps and character memory is added, but is probably too slow for effective operation. The current version does have a 2Mbit SPI FLASH chip for better speed and memory size. Now I am dreaming of SPI DMA, which just gave me an idea of a small PLD and a parallel flash memory to implement that.
Rev3 of the board (with added SPI FLASH) is being designed, might be the final one if things go well. Writing SW is so hard in comparison. Currently NTSC 320x200 and PAL 300x240 resolutions are working with an identical color map. This is important to have an unified RGB to YUV conversion table. Both resolutions have 8bit color depth.
The board uses the Arduino IOREF voltage to translate between 3.3V on the shield side and the respective IO voltage on the Arduino side. This shield works together with UNO and also with any 3.3V system that uses the Arduino form factor and pinout, without modifications.
- Lead-free components and soldering
- Operating supply voltage 4.5V - 20V
- Board IO voltage (IOREF) 1.5V - 5.5V
- Composite Video Output
- Maximum resolution 720x576 in 4 colours
- Implemented resolutions: NTSC 320x200 with 256 colours (40x25 characters text mode) and PAL 300x240 with 256 colours (37x30 characters text mode)
- Crystal: NTSC 3.579545MHz or PAL 4.43618MHz
- Communication interface: SPI up to 38MHz
- Video Frame Buffer: 1Mbit = 128KByte
- Flash: 2Mbit = 256KByte
- EEPROM: up to 2Mbit (optional, not populated)
- IO connectors Arduino compatible
- Size: 61.3mm x 53.4mm (2.4" x 2.1")
This board is for sale in my Tindie Store.
Software library and design files are available on my Github page. Updates are happening.
Text output on my new 7" display. Now I can work on my desk instead in front of the 40" TV.
And a scope plot of a nice NTSC video signal displaying the color test image.
Using the board with an Arduino MEGA or DUE requires a special cable to connect the SPI interface and a few extra commands to disable some pins on the controller. Another option would be to use a SPI soft core and map the same SPI pins as the UNO. I have not tried it yet.
To use my Video Display shield (and any other UNO shield that wants to talk SPI) with my MEGA clone, this is what I did:
Connect the SPI communication signals through jumper wires to the shield.
SCK: Mega pin 52 -> Uno shield pin 13 - orange wire
MOSI: Mega pin 51 -> Uno shield pin 12 - brown wire
MISO: Mega pin 50 -> Uno shield pin 11 - blue wire
The slave select pin 53 does not need to be wired, as it is mapped as a normal GPIO in a normal Uno sketch. The picture for the pin numbers 50-51 on the Mega connector is misleading due to the parallax.
(The RCA connector is not in a ideal location for the wire jumpers. Here is a reason for another spin).
It is also possible to cut a piece of the PCB to get access to the SPI header.
Make pins 11 to 13 on the Mega inputs or tri-stated outputs.
Add the define somewhere in the header file for the shield or at the beginning of the sketch
Add the code to disable the pins that are used by Uno for SPI in the setup() function
#ifdef MEGA pinMode(11, INPUT); pinMode(12, INPUT); pinMode(13, INPUT); #endif
This was all I needed to do and the MEGA was happily configuring the Video Display shield and outputting the test patterns. Connecting to the DUE is similar but tricky because the DUE SPI connector is sitting under the shield. To get better access I would raise the shield with an extra set of headers.
Here are some comparison pictures. All pictures are 8 bit color depth.
NTSC resolution is 320x200 PAL resolution is 300x240.
Finally I have got the animation demo with the famous Amiga Boing ball running. The video quality is not stunning, but it shows what is possible with very little program overhead once the memory is set up.
The to-do list for software is still long.
Currently working on a function to display images sent over UART.
On the hardware end, a cable and more software to support grey scale VGA is next.