Monday, May 30, 2011

Tutorial: Video output from your Arduino

This is chapter thirty-five of a series originally titled “Getting Started/Moving Forward with Arduino!” by John Boxall – A seemingly endless series of tutorials about the Arduino universe. The first chapter is here, the complete series is detailed here. Any files from tutorials will be found here.

Welcome back fellow arduidans!

In this chapter we will examine something different – the ability of our Arduino and compatible boards to create composite video output. In other words, displaying stuff from the Arduino on a TV. A lot of people were unaware of the ability to do this, however the process is very simple and not difficult to implement from a hardware perspective. Within this chapter we will learn to construct the minumum hardware required and demonstrate basic functions to get started.

To whet your appetite, here is a quick video demonstration of what is possible:

You can’t expect too much from a 16 Mhz microcontroller without a video card… but the price is right, and with some imagination and the right functions you can do quite well. To make this happen we need to knock out some hardware of our own (or you could buy a kitinstead). Connection is very easy. First we need to locate three pins on our Arduino board. They will be used to output Sync, Video and also GND. For those with Arduno Uno/Duemilanove/Freetronics Eleven etc Sync is digital 9, video is digital 7 and GND is … GND. If you have a Mega/Mega2560 Sync is digital 11 and video is D29. There is also the ability to generate audio with the methods in this article, and if you want to do this the Uno (etc.) pin is digital 11 or 10 on the Mega.

The monitor or television used needs to have a composite video-in socket (jack). For those with older televisions that have a VCR connected, you could use the video-in socket on the VCR.

The schematic for video out is very simple, you only need two normal 0.25W resistors and a video lead:

(tronixCAD v1.0…)

If you’re not up for soldering into an RCA plug, a simple way is to chop up a standard video lead as such:

Then just wire the termination of the two resistors to the centre core (“pin”) and GND to the shield. For the purpose of this article I have made a quick TV-out shield that also includes a thumb joystick (as reviewed here).

A real triumph of engineering… however it solves the problem. The vertical trimmer is connected to A0;  the horizontal to A1; the button to digital 8 via a 10k0 pull-up resistor. Next, you will need to download and install the arduino-tvout library. It can be found here. We will use the version. Copy the downloaded folder into the ../arduino-002x/libraries folder and restart the Arduino IDE. Those of you who may have a nootropic design Hackvision – please note your library is different.

Now to see how to integrate TV-out into our sketch. We will run through the basic functions which integrated with your imagination should see some interesting results…  So let’s go!

For every project, place these two lines at the top of your sketch:

#include <TVout.h>  TVout TV;

The first brings in the library, and the second line creates an instance of TV to use with the library functions. Next, we need to activate TVout and select the appropriate broadcast standard (PAL or NTSC). In void setup() use either

TV.start_render(_NTSC) // for NTSC (or)
TV.start_render(_PAL); // for PAL system

Now for the main functions. The first one of interest will be:


which … clears the screen. Or if you would like to fill the screen with white, use


Moving on – to write some text. First we need to select a font. There are three basic fonts to choose from:

  • font4x6 (each character being 4 pixels by 6 pixels, etc.)
  • font6x8
  • font8x8

Well there is four, but it wouldn’t display for me. Working on it! To choose a font use:

TV.select_font(font4x6); // using font4x6

Then to write the text, choose the screen location with:


then display the text with:

TV.print("Hello, world..."); // etc

You can also use TV.println(); to add a carriage return as expected. Display single characters with a position in the one function using:

TV.print_char(x,y,c); // c is the character to display

So let’s have a look at the various fonts in action with the following sketch (download):

Example 35.1

/* Example 35.1 - arduino-tvout text demonstration > chapter 35 | CC by-sa-nc */  #include #include TVout TV;  int d=10; // for delay purposes char c='X';  void setup() { TV.begin(_PAL); // for PAL system TV.clear_screen(); }  void loop() { TV.select_font(font4x6); for (int a=0; a<6; a++) { for (int b=0; b<128; b++) { TV.print_char(b,a*6,c); delay(d); TV.clear_screen(); } } delay(1000); TV.clear_screen();    TV.select_font(font6x8); for (int a=0; a<6; a++) { for (int b=0; b<128; b++) { TV.print_char(b,a*8,c); delay(d); TV.clear_screen(); } } delay(1000); TV.clear_screen();    TV.select_font(font8x8); for (int a=0; a<6; a++) { for (int b=0; b<128; b++) { TV.print_char(b,a*8,c); delay(d); TV.clear_screen(); } } delay(1000); TV.clear_screen(); }

Now to move into the 1970s with some basic graphical functions. We have a screen resolution of 128 by 96 pixels to work with. When planning your display, you need to ensure that the sketch never attempts to display a pixel outside of the 128 x 96 screen area. Doing so generally causes the Arduino to reboot.

Question – When did colour TV broadcasting start in Australia?

First let’s start with basic pixels. To draw a pixel, use:


where x and y are the coordinates of the pixel, and z is the colour (1 = white, 0 = black, 2 = inverse of current pixel’s colour). You want more than a pixel? How about a line:


Draws a line from x1, y1 to x2, y2 of colour colour. (1 = white, 0 = black, 2 = inverse of current pixel’s colour).

Rectangles? Easy:


Draws a rectangle with the top-left corner at x,y; width w, height h, colour and optional fill colour.

Circles are just as simple:


Draws a circle with centre at x,y; radius r pixels, edge colour, optional fill colour.

Now to see these functions in action with the following sketch (download):

Example 35.2

/* Example 35.2 - arduino-tvout font demonstration II > chapter 35 | CC by-sa-nc */  #include TVout TV;  int d=100; // for delay purposes int x1,x2,y1,y2,r=0;   void setup() { TV.begin(_PAL); // for PAL system TV.clear_screen(); randomSeed(analogRead(0)); // seed the random number generator }  void pixels() { TV.clear_screen(); for (int a=0; a<200; a++) { x1=random(128); y1=random(96); TV.set_pixel(x1,y1,2); delay(d); } delay(1000); TV.clear_screen(); }  void lines() { TV.clear_screen(); for (int a=0; a<96; a++) { TV.draw_line(0,a,127,a,1); delay(d); } delay(500); for (int a=0; a<96; a++) { TV.draw_line(0,a,127,a,0); delay(d); } TV.clear_screen(); delay(500); }    void circles() { TV.clear_screen(); for (int i=0; i<30; i++) { TV.draw_circle(64,48,i,1,0); delay(200); TV.draw_circle(64,48,i,1,1); delay(200); TV.draw_circle(64,48,i,0,0); delay(200); } delay(1000); TV.clear_screen(); }    void loop() { pixels(); lines(); circles(); }

And for the video demonstration:

So there you have it, a start with Arduino and TV-out. Sorry about the short post but unpaid time is rare at the moment. In the near future we will continue with displaying bitmap images and gaming. To keep up with new articles, stay tuned for upcoming Arduino tutorials by subscribing to the blog, RSS feed (top-right), twitter or joining our Google Group. Furthermore, a big thanks to for the arduino-tvout library

If you have any questions about the processes or details in this article, please ask in our Google Group – dedicated to the projects and related items on this website. Sign up – it’s free, there is the odd competition or give-away –  and we can all learn something.

Otherwise, have fun, stay safe, be good to each other – and make something!

No comments:

Post a Comment