Arduino POV Display: The Best tutorial to Start!

From our STAR Maker – Muhammed Azhar

Arduino POV display

Here is a simple project to amaze every one using an arduino and some LEDs. What we are going to learn here today is the making of a POV display. That is, a Persistence-Of-Vision display. It is made out of just 400 Rupees (6$). This tutorial gives you the whole knowledge to make a simple and a cheap Arduino POV display. We can use this display as a pocket sized portable message showing device, tabletop clock etc.

How does it work?

What is POV(Persistence of Vision)? It can be defined in simple words. When a person sees an object, its image remains in the retina of the eye for a time interval of 1/16th of a second. This phenomenon is known as persistence of vision of the eye. This phenomenon is used in the POV Display to form images. We turn the LEDs on and off in such a way that the different images overlap each other forming letters. For example:

Arduino POV display

Formation of letter “E” with 5 LEDs

1 2 3 <– Time

1 1 1 <– Bulb 1

1 0 0 <– Bulb 2

1 1 1 <– Bulb 3

1 0 0 <– Bulb 4

1 1 1 <– Bulb 5

Each row represents the 5 LEDs we use to make the Arduino POV display and each column is a time interval. Each element in the row represents the state of the LED at that given time.

At t = 1 Bulbs 1,2,3,4,5 are ON

At t = 2 Bulbs 1,3,5 are ON

This way we can visually see the letter E formed by the LEDs but the time interval would be very small in milliseconds. Due to the short time intervals and the ability of the LEDs to turn ON and OFF very quickly we can see the letter E as all the 3 images merge. As the motor is spinning and time passes, each LED moves from one position to the next, and so all these images merge together.

What are the stuff required to do this?

TOOLSArduino POV Display Tools

  1. Soldering iron
  2. Player tool
  3. Wire cutter
  4. Glue gun (Not required for the portable device makeover. It is used only for the table top version.)



ELECTRONICSArduino POV Display Electronic Materials

  1. Arduino Pro Mini (Buy)
  2. Female pin socket for Arduino
  3. Perfboard
  4. 3V Regulator IC
  5. 220Ohm Resistors – 5 No.s
  6. LED – 5 No.s (Although I have shown Green LEDs here, Red is better)
  7. Old Mobile Battery


MECHANICAL PARTSArduino POV Display Mechanical Materials

  1. A wooden block / A plastic tin that has little weight
  2. BO motor 3volt / 12 volt, 500rpm motor
  3. A wheel of BO motor
  4. Nut and bolt – 3 pairs
  5. A scale


Step 1 : Making the circuit for the Portable Arduino POV display

Arduino POV Display Circuit Diagram

Arduino POV Display Circuit Diagram

Arduino POV Display Circuit BoardCut the perfboard to the appropriate size that you want. Then connect the LEDs and solder it as shown in the figure below. Then connect the Arduino case(where Arduino is to be placed). Connect the resistors to the positive pin of the LEDs and connect the negative pins together. Then connect the LEDs to the Arduino. The first LED(on upper side) connects to the Arduino pin 2. Connect the second LED to the Arduino 3rd pin. Connect all LEDs as shown in the circuit diagram. At last connect a pin for mobile battery. For plug and play use, connect a switch. If you don’t have a mobile battery, you can also use a 9-volt battery. In this circuit I have connected a 9-volt battery to the Arduino with a 3V regulator.

Arduino POV Display Soldering

Step 2 : Assembling the Rotary Mechanism for Arduino POV Display

Arduino POV Display Mechanical Assembly
Drill and make holes on the wooden block to attach the motor and connect the motor as shown in the figure. Connect the wheel and screw the two bolts on the holes of the wheel. Then cut a half of the scale and drill two holes and attach the scale and screw it (the electronics part is going to be attached here).

Arduino POV Display Mechanical Assembly

Take a small plastic piece (as shown in the figure above). And connect the plastic piece perpendicular to the scale using the glue gun. Then take another piece of plastic and screw it on the other side of the wheel. Then make the mobile battery pack by soldering extension wires to the terminals. Connect the electronic part (the display board with LEDs) to the perpendicular part and connect the battery to the other side. Balance and fix the wheel on the centre (make the center of gravity on the centre of the wheel). This is for minimizing the vibration, when it rotates.

For my Arduino POV, I changed the Green LED to Red LED because when I capture the video using camera, the green color is not seen clearly. Green color scatters more than Red (red color has the highest wave length) and can only be captured using a camera with better Frames Per Second.

Step 3 : Programming the Arduino POV Display

Arduino POV display

I programmed the Arduino Pro Mini using ‘FTDI USB to serial converter’. You can also program the Arduino Pro Mini using Arduino Uno board. Click here to see how. Buy an FTDI USB to serial converter from here – Ebay

Finally upload the program for Arduino POV display given below:

int delayTime = 1;
int charBreak = 2.1;
int LED1 = 2;
int LED2 = 3;
int LED3 = 4;
int LED4 = 5;
int LED5 = 6;

void setup(){
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
pinMode(LED4, OUTPUT);
pinMode(LED5, OUTPUT);

int a[] = {1, 6, 26, 6, 1};
int b[] = {31, 21, 21, 10, 0};
int c2[] = {14, 17, 17, 10, 0};
int d[] = {31, 17, 17, 14, 0};
int e[] = {31, 21, 21, 17, 0};
int f[] = {31, 20, 20, 16, 0};
int g[] = {14, 17, 19, 10, 0};
int h[] = {31, 4, 4, 4, 31};
int i[] = {0, 17, 31, 17, 0};
int j[] = {0, 17, 30, 16, 0};
int k[] = {31, 4, 10, 17, 0};
int l[] = {31, 1, 1, 1, 0};
int m[] = {31, 12, 3, 12, 31};
int n[] = {31, 12, 3, 31, 0};
int o[] = {14, 17, 17, 14, 0};
int p[] = {31, 20, 20, 8, 0};
int q[] = {14, 17, 19, 14, 2};
int r[] = {31, 20, 22, 9, 0};
int s[] = {8, 21, 21, 2, 0};
int t[] = {16, 16, 31, 16, 16};
int u[] = {30, 1, 1, 30, 0};
int v[] = {24, 6, 1, 6, 24};
int w[] = {28, 3, 12, 3, 28};
int x[] = {17, 10, 4, 10, 17};
int y[] = {17, 10, 4, 8, 16};
int z[] = {19, 21, 21, 25, 0};

int eos[] = {0, 1, 0, 0, 0};
int excl[] = {0, 29, 0, 0, 0};
int ques[] = {8, 19, 20, 8, 0};

void displayLine(int line){
int myline;
myline = line;
if (myline>=16) {digitalWrite(LED1, HIGH); myline-=16;} else {digitalWrite(LED1, LOW);}
if (myline>=8)  {digitalWrite(LED2, HIGH); myline-=8;}  else {digitalWrite(LED2, LOW);}
if (myline>=4)  {digitalWrite(LED3, HIGH); myline-=4;}  else {digitalWrite(LED3, LOW);}
if (myline>=2)  {digitalWrite(LED4, HIGH); myline-=2;}  else {digitalWrite(LED4, LOW);}
if (myline>=1)  {digitalWrite(LED5, HIGH); myline-=1;}  else {digitalWrite(LED5, LOW);}

void displayChar(char c){
if (c == 'a'){for (int i = 0; i <5; i++){displayLine(a[i]);delay(delayTime);}displayLine(0);}
if (c == 'b'){for (int i = 0; i <5; i++){displayLine(b[i]);delay(delayTime);}displayLine(0);}
if (c == 'c2'){for (int i = 0; i <5; i++){displayLine(c2[i]);delay(delayTime);}displayLine(0);}
if (c == 'd'){for (int i = 0; i <5; i++){displayLine(d[i]);delay(delayTime);}displayLine(0);}
if (c == 'e'){for (int i = 0; i <5; i++){displayLine(e[i]);delay(delayTime);}displayLine(0);}
if (c == 'f'){for (int i = 0; i <5; i++){displayLine(f[i]);delay(delayTime);}displayLine(0);}
if (c == 'g'){for (int i = 0; i <5; i++){displayLine(g[i]);delay(delayTime);}displayLine(0);}
if (c == 'h'){for (int i = 0; i <5; i++){displayLine(h[i]);delay(delayTime);}displayLine(0);}
if (c == 'i'){for (int it = 0; it <5; it++){displayLine(i[it]);delay(delayTime);}displayLine(0);}
if (c == 'j'){for (int i = 0; i <5; i++){displayLine(j[i]);delay(delayTime);}displayLine(0);}
if (c == 'k'){for (int i = 0; i <5; i++){displayLine(k[i]);delay(delayTime);}displayLine(0);}
if (c == 'l'){for (int i = 0; i <5; i++){displayLine(l[i]);delay(delayTime);}displayLine(0);}
if (c == 'm'){for (int i = 0; i <5; i++){displayLine(m[i]);delay(delayTime);}displayLine(0);}
if (c == 'n'){for (int i = 0; i <5; i++){displayLine(n[i]);delay(delayTime);}displayLine(0);}
if (c == 'o'){for (int i = 0; i <5; i++){displayLine(o[i]);delay(delayTime);}displayLine(0);}
if (c == 'p'){for (int i = 0; i <5; i++){displayLine(p[i]);delay(delayTime);}displayLine(0);}
if (c == 'q'){for (int i = 0; i <5; i++){displayLine(q[i]);delay(delayTime);}displayLine(0);}
if (c == 'r'){for (int i = 0; i <5; i++){displayLine(r[i]);delay(delayTime);}displayLine(0);}
if (c == 's'){for (int i = 0; i <5; i++){displayLine(s[i]);delay(delayTime);}displayLine(0);}
if (c == 't'){for (int i = 0; i <5; i++){displayLine(t[i]);delay(delayTime);}displayLine(0);}
if (c == 'u'){for (int i = 0; i <5; i++){displayLine(u[i]);delay(delayTime);}displayLine(0);}
if (c == 'v'){for (int i = 0; i <5; i++){displayLine(v[i]);delay(delayTime);}displayLine(0);}
if (c == 'w'){for (int i = 0; i <5; i++){displayLine(w[i]);delay(delayTime);}displayLine(0);}
if (c == 'x'){for (int i = 0; i <5; i++){displayLine(x[i]);delay(delayTime);}displayLine(0);}
if (c == 'y'){for (int i = 0; i <5; i++){displayLine(y[i]);delay(delayTime);}displayLine(0);}
if (c == 'z'){for (int i = 0; i <5; i++){displayLine(z[i]);delay(delayTime);}displayLine(0);}
if (c == '!'){for (int i = 0; i <5; i++){displayLine(excl[i]);delay(delayTime);}displayLine(0);}
if (c == '?'){for (int i = 0; i <5; i++){displayLine(ques[i]);delay(delayTime);}displayLine(0);}
if (c == '.'){for (int i = 0; i <5; i++){displayLine(eos[i]);delay(delayTime);}displayLine(0);}

void displayString(char* s){
for (int i = 0; i<=strlen(s); i++){

void loop(){
displayString("hello world")

Now all you need to do is power up the module and the motor used to turn the whole system. And then you would be able to see “Hello World” lighting up when the motor reaches the correct rpm as shown below:Arduino POV Display

You can also check out a video of an Arduino POV project done by Amir Ali here:

This is how easy it is to make an Arduino POV display at home. You can make it in an hour or two (depending on your soldering skills :p). Make your own Arduino POV and show it off like a boss. :)

Arduino POV Display

Muhammed Azhar – STAR Maker at DIY Hacking

– I am Azhar, a student from Kerala, India. I am a good maker and I like to show what I make and how to make it.

You can see my blog here –

Recommended Posts
Showing 22 comments
  • Juan

    URGENT: What would be the corrections to the circuit if I can only use the Arduino UNO?

  • sidra tul muntaha

    i want to make this project and having problem in coding can somebody please be kind enough to give a guidlen if i want to show a clock

  • Nabeel Rasheed

    I am an Engineering Student and working on PoV with RGB 10 Leds.
    Mohammed Azhar will you please help to generate code for 10 leds using Demux IC for RGB leds.
    I have searched and worked on your code but unfortunately didn’t find any output through that code if Azhar or anyone who can help me out please send me code on my gmail:

  • Tulga

    pls help me i need show time code

  • Ninad

    Any changes for arduino uno? Circuit doesnt work after uploading the code

  • Niraj

    Hey, I am confused about the negative parts of LEDs. You’ve said to connect the negative parts of the LEDs together, after that we have to connect them with negative of the battery? Also to which pin of the audrino do I connect the positive and negative of the battery to?

  • phaneendra

    hey can i do this with aurodino nano?

    i want to do it as oscillating LED display




      Only need to edit last line. Add ‘ ; ‘ this sigh after the bracket. Like shown below-

      void loop(){
      displayString(“hello world”);

  • Snake47


    I am particularly interested by your project.
    But i have few questions before to work.

    what is the length between motor shaft and arduino assembly ?
    The speed rotation are variable or we need fixed to 500 rpm ?

    Thanks for your work


  • shivam

    hey suggest me some alternative for the regulator IC. its not available in india

  • Harsh

    Please tell me the logic behind those elements of alphabet array in short…
    how come 31 is max?

    • Kevin

      The arrays for each letter define the LEDs to turn on or off to display each vertical line of the letter — it is very clever to use decimal numbers which are then converted on the fly in displayLine() to a binary representation of the LEDs which are on or off. 31 is the same as 0b11111 (all LEDs on which is the maximum number). For example, L (31, 1, 1, 1, 0):


  • anurag k

    what is the length between motor shaft and arduino assembly

  • anurag k


  • Aswin Mohan

    theres a mistake in your programming.There is a ‘;’ after the sentence displayString(“hello world”).It should be like
    displayString(“hello world”);.Otherwise there will be error while compiling


      can please give me your codes for this pov display

  • Amal Shajan

    If you are inly using 5 led’s, ATiny85/45 is more logical choice. It is small and cheaper.

Leave a Comment

1 + 6 =

Start typing and press Enter to search