Introduction: Simple Arduino POV Wand

Persistence of Vision or [POV] is an optical illusion whereby multiple discrete images blend into a single image in the human mind. I.e. when you look at a working fan, you'll see its blades forming a transparent circle! But, Why?!

The eye hold information for an instant longer than it's there and the brain merges those images together in one scene. This is because that the images we see take about tenth of a second to be registered in our brains, so when the blades move in a time less than tenth of a second, the brain combines the images of the different positions of the blades together and we start to see that circle.

See this video for further explanation..

Step 1: Layout

In this instructable, I'm making an array of LEDs that displays letters and symbols in parts. As we move on, you'll understand it more and more. So, let's begin with the hardware.

The main steps are:

  • Required Tools
  • Wiring
  • Code

Step 2: Tools

  • 7 LEDs ( any color )
  • 7 Resistors (220 ohm)
  • Arduino UNO
  • Breadboard
  • 9v battery with battery holder
  • Zip tie
  • Jumpers
  • Staples
  • A camera ( with slow shutter speed )

Step 3: Wiring

#01:Put the Arduino and the breadboard back to back, then tie them together with the zip tie.

#02: Put the jumper wires between the arduino and the breadboard according to the order displayed in Image n.2

#03: [optional] Wire a 9v batterry to the Vin and GND terminals in the Arduino board to be able to use the project without the USB cable connected to your laptop.

Step 4: The Code

Before uploading this code to your Arduino, you can modify the message to display through the first two lines in the code. Just open the arduino sketch and change the message length and the message itself.

Customize your message, upload your code, then wave your wand in front of a camera set to a long shutter speed.

Step 5: How Does the Code Work?

The main idea of this code is to divide any input text input into characters, then divide each character into columns, then display the columns on a single column LED array with a short period of display time separating each column.

Assume that you're displaying the letter "S" on a 5x7 LED Matrix. You may describe the state of the LEDs in each column (from top to bottom) in binary like this:

Column1:[ Row1: LOW Row2: HIGH Row3: HIGH Row4: LOW Row5: LOW Row6: HIGH Row7: LOW ]

in short, Column1: LOW - HIGH - HIGH - LOW - LOW - HIGH -LOW or 0 1 1 0 0 1 0

and for the rest of columns it will be like this:

Column2: 1 0 0 1 0 0 1

Column3: 1 0 0 1 0 0 1

Column4: 1 0 0 1 0 0 1

Column5: 0 1 0 0 1 1 0

On the 7 LEDs, the code will display Column1 for about 8 milliseconds, then Column2, and so on.

You'll find some tips and comments in the code itself, just try to read it.

Thanks \ (u_u) /


stonez56 made it! (author)2017-09-09

Thanks for this tutorial! I have made two sets with my kids and enjoyed this new toy for the entire afternoon!

Akash Sharma22 (author)2017-06-16

Nice made you friend Saeed. I hope my POV wand display work. I made with your steps.

MineRIvel (author)2017-02-02

how to code in 10 led display? pls help

ronakpadia1996 made it! (author)2016-12-07

Awesome project! I attached it to ceiling fan!

Yaseenin made it! (author)2016-08-07


liam8253 made it! (author)2016-06-27

Didn't have zip ties, so I used yarn. Will use this project for a birthday party activity.

electric guy (author)2016-04-25


carlosedeleonm made it! (author)2016-03-29

using a protoboard and assembler code for microchip pic microcontroller!!

thanks for the tutorial,

Turbotrazan made it! (author)2016-01-20

Thanks for the great tutorial :)

ajmal hassan (author)2015-10-18

What is the specific speed at which you should move your hand so that we can see it clearly?

HyosikB made it! (author)2015-10-13

Thanks.... I can do it now.. cause of you ^^

I modified your source code for more character( include small letter ).

/* it is 5*7 bit map font */

unsigned char Font5x7[][5] = {

0x00, 0x00, 0x00, 0x00, 0x00 ,// (space) // 32

0x00, 0x00, 0x5F, 0x00, 0x00,// ! // 33

0x00, 0x07, 0x00, 0x07, 0x00,// " // 34

0x14, 0x7F, 0x14, 0x7F, 0x14,// # // 35

0x24, 0x2A, 0x7F, 0x2A, 0x12,// $ // 36

0x23, 0x13, 0x08, 0x64, 0x62,// % // 37

0x36, 0x49, 0x55, 0x22, 0x50,// & // 38

0x00, 0x05, 0x03, 0x00, 0x00,// ' // 39

0x00, 0x1C, 0x22, 0x41, 0x00,// ( // 40

0x00, 0x41, 0x22, 0x1C, 0x00,// )

0x08, 0x2A, 0x1C, 0x2A, 0x08,// *

0x08, 0x08, 0x3E, 0x08, 0x08,// +

0x00, 0x50, 0x30, 0x00, 0x00,// ,

0x08, 0x08, 0x08, 0x08, 0x08,// -

0x00, 0x60, 0x60, 0x00, 0x00,// .

0x20, 0x10, 0x08, 0x04, 0x02,// /

0x3E, 0x51, 0x49, 0x45, 0x3E,// 0

0x00, 0x42, 0x7F, 0x40, 0x00,// 1

0x42, 0x61, 0x51, 0x49, 0x46,// 2

0x21, 0x41, 0x45, 0x4B, 0x31,// 3

0x18, 0x14, 0x12, 0x7F, 0x10,// 4

0x27, 0x45, 0x45, 0x45, 0x39,// 5

0x3C, 0x4A, 0x49, 0x49, 0x30,// 6

0x01, 0x71, 0x09, 0x05, 0x03,// 7

0x36, 0x49, 0x49, 0x49, 0x36,// 8

0x06, 0x49, 0x49, 0x29, 0x1E,// 9

0x00, 0x36, 0x36, 0x00, 0x00,// :

0x00, 0x56, 0x36, 0x00, 0x00,// ;

0x00, 0x08, 0x14, 0x22, 0x41,// <

0x14, 0x14, 0x14, 0x14, 0x14,// =

0x41, 0x22, 0x14, 0x08, 0x00,// >

0x02, 0x01, 0x51, 0x09, 0x06,// ?

0x32, 0x49, 0x79, 0x41, 0x3E,// @

0x7E, 0x11, 0x11, 0x11, 0x7E,// A

0x7F, 0x49, 0x49, 0x49, 0x36,// B

0x3E, 0x41, 0x41, 0x41, 0x22,// C

0x7F, 0x41, 0x41, 0x22, 0x1C,// D

0x7F, 0x49, 0x49, 0x49, 0x41,// E

0x7F, 0x09, 0x09, 0x01, 0x01,// F

0x3E, 0x41, 0x41, 0x51, 0x32,// G

0x7F, 0x08, 0x08, 0x08, 0x7F,// H

0x00, 0x41, 0x7F, 0x41, 0x00,// I

0x20, 0x40, 0x41, 0x3F, 0x01,// J

0x7F, 0x08, 0x14, 0x22, 0x41,// K

0x7F, 0x40, 0x40, 0x40, 0x40,// L

0x7F, 0x02, 0x04, 0x02, 0x7F,// M

0x7F, 0x04, 0x08, 0x10, 0x7F,// N

0x3E, 0x41, 0x41, 0x41, 0x3E,// O

0x7F, 0x09, 0x09, 0x09, 0x06,// P

0x3E, 0x41, 0x51, 0x21, 0x5E,// Q

0x7F, 0x09, 0x19, 0x29, 0x46,// R

0x46, 0x49, 0x49, 0x49, 0x31,// S

0x01, 0x01, 0x7F, 0x01, 0x01,// T

0x3F, 0x40, 0x40, 0x40, 0x3F,// U

0x1F, 0x20, 0x40, 0x20, 0x1F,// V

0x7F, 0x20, 0x18, 0x20, 0x7F,// W

0x63, 0x14, 0x08, 0x14, 0x63,// X

0x03, 0x04, 0x78, 0x04, 0x03,// Y

0x61, 0x51, 0x49, 0x45, 0x43,// Z

0x00, 0x00, 0x7F, 0x41, 0x41,// [

0x02, 0x04, 0x08, 0x10, 0x20,// "\"

0x41, 0x41, 0x7F, 0x00, 0x00,// ]

0x04, 0x02, 0x01, 0x02, 0x04,// ^

0x40, 0x40, 0x40, 0x40, 0x40,// _

0x00, 0x01, 0x02, 0x04, 0x00,// `

0x20, 0x54, 0x54, 0x54, 0x78,// a

0x7F, 0x48, 0x44, 0x44, 0x38,// b

0x38, 0x44, 0x44, 0x44, 0x20,// c

0x38, 0x44, 0x44, 0x48, 0x7F,// d

0x38, 0x54, 0x54, 0x54, 0x18,// e

0x08, 0x7E, 0x09, 0x01, 0x02,// f

0x08, 0x14, 0x54, 0x54, 0x3C,// g

0x7F, 0x08, 0x04, 0x04, 0x78,// h

0x00, 0x44, 0x7D, 0x40, 0x00,// i

0x20, 0x40, 0x44, 0x3D, 0x00,// j

0x00, 0x7F, 0x10, 0x28, 0x44,// k

0x00, 0x41, 0x7F, 0x40, 0x00,// l

0x7C, 0x04, 0x18, 0x04, 0x78,// m

0x7C, 0x08, 0x04, 0x04, 0x78,// n

0x38, 0x44, 0x44, 0x44, 0x38,// o

0x7C, 0x14, 0x14, 0x14, 0x08,// p

0x08, 0x14, 0x14, 0x18, 0x7C,// q

0x7C, 0x08, 0x04, 0x04, 0x08,// r

0x48, 0x54, 0x54, 0x54, 0x20,// s

0x04, 0x3F, 0x44, 0x40, 0x20,// t

0x3C, 0x40, 0x40, 0x20, 0x7C,// u

0x1C, 0x20, 0x40, 0x20, 0x1C,// v

0x3C, 0x40, 0x30, 0x40, 0x3C,// w

0x44, 0x28, 0x10, 0x28, 0x44,// x

0x0C, 0x50, 0x50, 0x50, 0x3C,// y

0x44, 0x64, 0x54, 0x4C, 0x44,// z

0x00, 0x08, 0x36, 0x41, 0x00,// {

0x00, 0x00, 0x7F, 0x00, 0x00,// |

0x00, 0x41, 0x36, 0x08, 0x00,// }


//////////////////// Message to Customize ///////////////////

#define msgLength 11


char msgBody[] = "Ahmad Saeed"; ///

////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////

#define delayInChar 3

#define delayBetweenChar 5

#define LED1 1

#define LED2 2

#define LED3 3

#define LED4 4

#define LED5 5

#define LED6 6

#define LED7 7

byte msgCode[(5 * msgLength) + 10];

boolean pintState;

int columnNum = -1;

void setup() {

for(int i=LED1; i<=LED7 ; i++ ) pinMode(i, OUTPUT);


void loop() {

//// Convert all text to binary array ////////////////////////

for (int c = 0; c < (sizeof(msgBody)); c++) {

addChar(msgBody[c]); //

} //

//Add a little space after each character //

addChar(' '); //

addChar(' '); //


//// Display the binary arrays after all characters are coded //

for (int c = 0; c < (sizeof(msgCode)); c++) { //

for(int i=6;i>=0;i--) digitalWrite(LED1, msgCode[c] / (byte)pow(2,i) % B10); //

delay(delayInChar); //

// if the character is finished, take a longer off period //

if ((c + 1) % 5 == 0 ) { //

for(int i=LED1; i<=LED7 ; i++ ) digitalWrite(i, LOW); //

delay(delayBetweenChar); //

} //

} // // ////////////////////////////////////////////////////////////////


void addChar(char y)


for(int i=0;i<5;i++) addColumn(Font5x7[(int)y - 32][i]);


void addColumn(byte x)


columnNum += 1;

msgCode[columnNum] = (x);


robotmaster1 (author)2015-10-06

I'm not robot master at all and while optimistic, this is my very first project and I require some help. Where do the staples come in? Sorry, I am doing this without any outside help.

Thank you

Cirith (author)robotmaster12015-10-12

Check out Step #3 photo from Step #3. He's just used the staples as small jumpers on the breadboard between the Arduino wires and the LEDs. You could use any other short wires to make the connection over the center divider in the breadboard or span the gap with the positive leg of the LED itself.

xavik made it! (author)2015-09-08


A question: I did it on arduino nano using an old data floppy disk, but using VIn with 9V battery seems not to be enough to supply the nano ... How can I operate it without usb wire power supply? The idea is isolate it and then put it spinning on a old hard disk and see what happens :-)

Maybe you can comment a little bit more the code functions?

Thank you!!

Foto del 8-9-15 a les 10.25-1.jpg
rocketman221 made it! (author)2015-09-05

Cool, this convinced me to make one from some junk I had laying around. I mounted mine to a motor to make it spin. I also used an ATtiny2313 instead of the Arduino. I had to rewrite the code to get it to fit on a 2KB chip though. I was going to etch a circuit board for it, but I couldn't find a socket for the ATtiny, but I might make one later.

Have you thought about adding an accelerometer to make the text never appear backwards?

azharz (author)2015-09-03

Going to try this. Love that staples idea!

PRO DR MR BOB (author)2015-09-02

is there a pov watch with a spinning blade in the middle? Think it might be my next project inspiered by this

stringstretcher (author)2015-09-02

Great instructable, well done!!

Mahmoud Alaa (author)2015-09-01

Good Job man!!

wannabemadsci (author)2015-09-01

Excellent opening photo. The long exposure time did a wonderful job showing off the persistence of vision concept.

kubarbaz (author)2015-09-01

Really good instructions my friend :) Well done.

CovMakerDad (author)2015-08-23

Hi Ahmad, I really like what you have put together. I think I will run this by some of our Makerkids.

Thank you

DIY Hacks and How Tos (author)2015-08-23

Awesome project.

About This Instructable




Bio: Maker, Mechatronics Student, and amateur Graphic Designer.
More by ahmadsaeed:Simple Arm made with DC motorsControlling Bipolar Stepper Motors with Arduino [without library]Simple Arduino POV Wand
Add instructable to: