Instructables
loading
loading
Picture of Persistence of Vision Wand
IMG_2612 copy.jpg
IMG_2593 copy.jpg
Screen shot 2012-03-14 at 6.31.57 PM.png
Screen shot 2012-03-14 at 7.03.06 PM.png
Persistence of Vision (POV) Wands are a fun way to create interesting long exposure photographs and light displays.  The wand consists of a single row of LEDs controlled by an Arduino Uno.  When the wand is turned on it appears to be flickering in a random pattern, but if you move it quickly back and forth, you will see text or an image appear.  This wand project is incredibly customizable, I've included all CAD files, firmware, build documentation, and schematics.  Feel free to choose your own color LEDs, write personalized messages, and maybe even add something new to the project!



Parts list:

(1x) Arduino Uno REV 3 Radioshack #276-128
(20x) Amber Super-bright LED Indicator Radioshack #55050630
(1x) Arduino Proto Shield Radioshack #276-140
(1x) 9V Alkaline Battery Radioshack #23-866
(1x) Heavy-Duty 9V Snap Connectors Radioshack #270-324
(20x) 1/4 watt resistors (sample calculation below)

      from the specs of the LEDs I used:
      "Continuous forward current: 25mA"
      "Forward voltage: 3V"

      using the following relationship:
      V(volts) = I(amps) * R(ohms)
      rearranged to:
      R = V / I

      we can calculate the resistance as follows:
      voltage across resistor = 5V - 3V = 2V
      2V / 0.025A = 80ohms

      I used 100 ohm resistors so that the LEDs wouldn't be operating at their maximum ratings.  Check the datasheet of the LEDs you use to calculate these values.

I've attaching a fritzing document with a breadboard and schematic view of the circuit (and included them above) for reference.
 
Remove these adsRemove these ads by Signing Up
1-40 of 175Next »
ftj1020 days ago

@amandaghassaei can you give me the working code cause i cant run my program there are to many error when I try to compile my codes

Paste here the error log. Before you do that try to replace "boolean" to "const boolean" in all the code, it worked for me in this way.

Hi again!! @mergim halimi. I already replace the "boolean" to "const bolean" but theres an error again

Arduino: 1.6.1 (Windows 7), Board: "Arduino Uno"

sketch_mar16a.ino:1:1: error: expected unqualified-id before '/' token

sketch_mar16a.ino:8:15: error: 'povtext' was not declared in this scope

sketch_mar16a.ino: In function 'void loop()':

sketch_mar16a.ino:858:9: error: 'povtext' was not declared in this scope

This is another error ive got can you help me to fix this??. Thank you

here's the code that occured after i changed the values,.

Arduino: 1.6.1 (Windows XP), Board: "Arduino Uno"

Build options changed, rebuilding all

FYP1LVPH0OJ0IKJ.ino:678:49: error: 'sendToWand' declared as function returning a function

FYP1LVPH0OJ0IKJ.ino:706:49: error: 'sendToWand' declared as function returning a function

FYP1LVPH0OJ0IKJ.ino:734:49: error: 'sendToWand' declared as function returning a function

FYP1LVPH0OJ0IKJ.ino:762:49: error: 'sendToWand' declared as function returning a function

FYP1LVPH0OJ0IKJ.ino:790:49: error: 'sendToWand' declared as function returning a function

FYP1LVPH0OJ0IKJ.ino:818:49: error: 'sendToWand' declared as function returning a function

FYP1LVPH0OJ0IKJ.ino:846:49: error: 'sendToWand' declared as function returning a function

FYP1LVPH0OJ0IKJ.ino:874:49: error: 'sendToWand' declared as function returning a function

FYP1LVPH0OJ0IKJ.ino:902:49: error: 'sendToWand' declared as function returning a function

FYP1LVPH0OJ0IKJ.ino:930:49: error: 'sendToWand' declared as function returning a function

FYP1LVPH0OJ0IKJ.ino:959:49: error: 'sendToWand' declared as function returning a function

FYP1LVPH0OJ0IKJ.ino:987:49: error: 'sendToWand' declared as function returning a function

FYP1LVPH0OJ0IKJ.ino:1017:49: error: 'sendToWand' declared as function returning a function

FYP1LVPH0OJ0IKJ.ino:1046:49: error: 'sendToWand' declared as function returning a function

In file included from FYP1LVPH0OJ0IKJ.ino:26:0:

FYP1LVPH0OJ0IKJ.ino: In function 'void sendToWand(const boolean*)':

FYP1LVPH0OJ0IKJ.ino:1081:33: error: 'letterArray' was not declared in this scope

FYP1LVPH0OJ0IKJ.ino:1085:33: error: 'letterArray' was not declared in this scope

FYP1LVPH0OJ0IKJ.ino:1089:33: error: 'letterArray' was not declared in this scope

FYP1LVPH0OJ0IKJ.ino: At global scope:

FYP1LVPH0OJ0IKJ.ino:1103:51: error: 'sendToWand' declared as function returning a function

FYP1LVPH0OJ0IKJ.ino:1131:49: error: 'sendToWand' declared as function returning a function

FYP1LVPH0OJ0IKJ.ino:1159:49: error: 'sendToWand' declared as function returning a function

FYP1LVPH0OJ0IKJ.ino:1187:49: error: 'sendToWand' declared as function returning a function

FYP1LVPH0OJ0IKJ.ino:1215:49: error: 'sendToWand' declared as function returning a function

FYP1LVPH0OJ0IKJ.ino:1244:49: error: 'sendToWand' declared as function returning a function

FYP1LVPH0OJ0IKJ.ino:1272:49: error: 'sendToWand' declared as function returning a function

FYP1LVPH0OJ0IKJ.ino:1301:49: error: 'sendToWand' declared as function returning a function

FYP1LVPH0OJ0IKJ.ino:1330:49: error: 'sendToWand' declared as function returning a function

FYP1LVPH0OJ0IKJ.ino:1358:51: error: 'sendToWand' declared as function returning a function

FYP1LVPH0OJ0IKJ.ino:1386:49: error: 'sendToWand' declared as function returning a function

Error compiling.

This report would have more information with

"Show verbose output during compilation"

enabled in File > Preferences.

"can you pls!! upload here the program that you used,. the program that is no need to be edited and ready to upload in an arduino"

Hi!! Did you change anything in thprogram or just the boolean to const boolean??? @mergim halimi

Hi Amanda, and others, I was wondering if we can upload a code in this project that shows the analog clock or digital clock. ( A beginner in arduino coding ) . Btw I made this, it works great, I just don't know how to make these pics, I tried to record a video but, hmm. not working, I changed the value of the refreshrate but almost the same, any suggestions ??

barrubond1 month ago

Hi Amanda, this project is great!, indeed i chose to replicate it for a school project, we do have a laser cuter, also a CNC Router to cut it out, but I can't see the adobe document to cut the wand :(, Can you tell me where it is? please, if you have the .DXF file it will be great!! Thank you very much, and great job!!

jamesbrosuk1 month ago

superb, i'll be trying this as my first project

Hi Amanda, As I said I worked on your project and it worked, but the problem is I ve to wave the Wand very fast in order to make the Alphabets visible. I even tried changing the delay, not working so fine. Wld you suggest me whether to increase the delay or to decrease to make it more attractive. Thanks in Advance

motu_aj1 month ago

Hi Amanda,

I used your code, but made some changes

- I drew some alien faces, ships, star etc...instead of just letters

- I used a Ardiuno Nano v3

- Used just 19 LEDs ( no space for 20th LED on my Circuit board)

http://amitjain1980.blogspot.in/2014/11/magic-wand...

Thanks

Amit

_20141108_233523.JPG
amandaghassaei (author)  motu_aj1 month ago

so cool!

Finished product

IMG_20150129_155805_1422527315517.jpg
iivanovskis made it!10 months ago

Thanks, cool :)

IMG_1196.JPGIMG_1175.JPG
amandaghassaei (author)  iivanovskis1 month ago

just saw this, looks great!

Andrew Cleveland made it!7 months ago

Worked like a charm. Thanks. I saw a similar thing spinning but it was using rgb LEDs and could stream video. It was obviously bought but still pretty impressive.

IMG_7832.jpg

nice! yeah this pov stuff can be taken pretty far. It'd be fun to adapt this project to rgb.

remi.longin made it!6 months ago

Thank you from France, Amanda.

I love your projects. Stay happy

P1040336.JPGPICT4214.JPG
amandaghassaei (author)  remi.longin1 month ago

thanks! looks awesome!

shiblee3 months ago
At last, I am successful. It is really a great Instructable. Thankyou very much indeed.
amandaghassaei (author)  shiblee1 month ago

what did you have to change to get it to work?

Hi Amanda, I tried my Hands on your project. Its really nice n its working perfectly. Thanks for uploading such a nice piece of work.

amandaghassaei (author)  miginstruments1 month ago

thanks for the comment, glad to hear it!

ВладимирК3 made it!2 months ago

Thank you from Russia! I've added to your program numbers and punctuation marks. It turned out like this:

DSCN1012_resize.jpgDSCN1001_resize.jpgDSCN0975_resize.jpg
nice! can you post the code?

Of course! Collect: http://pastebin.com/XMqKASdp

what did you do to make it work?

shiblee3 months ago
I have done everything but couldnot upload the firmware, cause it shows error during compiling. #include:<avr/pgmspace.h>is probably the problem, couldnot load the library as it doesnot take. Can anyone help?
tejanaveen4 months ago

can i use arduino Duemilanove instead of UNO

amandaghassaei (author)  tejanaveen4 months ago
yes
jeet5559 months ago

hello dear sir i'm make this project on ceiling fan but fan is rotating anti clockwise so

characters are not show properly so please help me how can do

jmacutong10 months ago

hi. I'm currently working with this project. But my professor wants some modifications..He wants to have 3 switches/push buttons wherein pressing each button will display different messages. Can you please help me do it? Thanks. :)

you can use other atmega328p-pu chip with other message when you push other button then the other chip should be on and first one should be down you can also use atiny85!

amandaghassaei (author)  jmacutong10 months ago
that's a little tricky bc I'm using all the i/o pins on the Arduino to control the leds. The easiest solution would be to remove a few leds from the wand and use those free pins to control the buttons. Alternatively, you could use something like the 74hc595 to control the leds and free up some pins for inputs.
TANYUNSHENG10 months ago

Hai, i reduce the number of LED to 16. And i change the source code but its doesn't work. Can u please help me check and see ? and i also written using ARDUINO library commands. Below is the source code.


#include <avr/pgmspace.h>

String povtext = "LIKE";//PUT YOUR MESSAGE HERE!!- must be in all caps, spaces are fine, no punctuation

byte refreshrate = 1;//delay time for pixels to refresh in milliseconds- experiment with different values

//get length of string povtext

int dimtext = povtext.length();

//letterArray to make sure firmare is loaded correctly- each led should light up in order upon turning on

boolean load[]= {

1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,

0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,

0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,

0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,

0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,

0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,

0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,

0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,

0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,

0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,

};

//variables

byte n; //variable for loops

byte t; //variable for loops

byte l; //variable for loops

//The letters of the alphabet- edit the look of these if you want, just make sure the letters m and w are 15 pixels wide and the rest are 12 pixels

boolean letterA[] PROGMEM = {

0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0,

0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,

0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,

1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1,

1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,

1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,

1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,

1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,

1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,

1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,

1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,

1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,

1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,

1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,

1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,

1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,

};

boolean letterB[] PROGMEM = {

1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,

1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,

1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1,

1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,

1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,

1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1,

1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,

1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,

1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,

1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,

1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1,

1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,

1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,

1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1,

1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,

1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,

};

.....C to Y( too long to paste here)

boolean letterZ[] PROGMEM = {

1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,

1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,

1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,

0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0,

0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0,

0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0,

0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0,

0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0,

0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0,

0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0,

0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,

0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,

0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,

1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,

1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,

1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,

};

void sendToWand(boolean letterArray[]){//function to get array data

for (byte t=0; t<12; t++){ //for each time step

for (int pin= 13; pin>=0; pin--){

if (letterArray[(13-pin)*12+t]) {//if matrix element == 1 then turn led on

digitalWrite(pin, HIGH);

}

else {//if matrix element == 0 then turn led off

digitalWrite(pin, LOW);

}

}

//the following lines address the analog pins indivially and set them either high or low depending on matrix element

if (letterArray[14*12+t]) {//if matrix element == 1 then turn led on

digitalWrite(A5, HIGH);

}

else {//if matrix element == 0 then turn led off

digitalWrite(A5, LOW);

}

if (letterArray[15*12+t]) {

digitalWrite(A4, HIGH);

}

else {

digitalWrite(A4, LOW);

}

if (letterArray[16*12+t]) {

digitalWrite(A3, HIGH);

}

else {

digitalWrite(A3, LOW);

}

}

}

void sendToWandMW(boolean letterArray[]){//function to get array data

for (byte t=0; t<15; t++){ //for each time step

for (int pin= 13; pin>=0; pin--){

if (letterArray[(13-pin)*12+t]) {//if matrix element == 1 then turn led on

digitalWrite(pin, HIGH);

}

else {//if matrix element == 0 then turn led off

digitalWrite(pin, LOW);

}

}

//the following lines address the analog pins indivially and set them either high or low depending on matrix element

if (letterArray[14*12+t]) {//if matrix element == 1 then turn led on

digitalWrite(A5, HIGH);

}

else {//if matrix element == 0 then turn led off

digitalWrite(A5, LOW);

}

if (letterArray[15*12+t]) {

digitalWrite(A4, HIGH);

}

else {

digitalWrite(A4, LOW);

}

if (letterArray[16*12+t]) {

digitalWrite(A3, HIGH);

}

else {

digitalWrite(A3, LOW);

}

}

}

void setup() {

pinMode(A3, OUTPUT);

pinMode(A4, OUTPUT);

pinMode(A5, OUTPUT);

for (int pin=1; pin<14; pin++){

pinMode(pin, OUTPUT);

}

for (int pin= 13; pin>=0; pin--){//turn on each digital pin sequentially for 100ms

digitalWrite(pin, HIGH);

delay(100);

digitalWrite(pin,LOW);

}

//the following lines turn on each analog pin individually

digitalWrite(A5, HIGH);

delay(100);

digitalWrite(A5,LOW);

digitalWrite(A4, HIGH);

delay(100);

digitalWrite(A4,LOW);

digitalWrite(A3, HIGH);

delay(100);

digitalWrite(A3,LOW);

}

void loop() {

//space at beginning of text

PORTB = 0;

PORTD = 0;

digitalWrite(A5,LOW);

digitalWrite(A4,LOW);

digitalWrite(A3,LOW);

delay(refreshrate*3);

for (n=0; n<dimtext; n++) {//go through each character of povtext and call function sendToWand to display letter

if (povtext.charAt(n)=='A') {

sendToWand(letterA);

}

else if (povtext.charAt(n)=='B') {

sendToWand(letterB);

}

else if (povtext.charAt(n)=='C') {

sendToWand(letterC);

}

else if (povtext.charAt(n)=='D') {

sendToWand(letterD);

}

else if (povtext.charAt(n)=='E') {

sendToWand(letterE);

}

else if (povtext.charAt(n)=='F') {

sendToWand(letterF);

}

else if (povtext.charAt(n)=='G') {

sendToWand(letterG);

}

else if (povtext.charAt(n)=='H') {

sendToWand(letterH);

}

else if (povtext.charAt(n)=='I') {

sendToWand(letterI);

}

else if (povtext.charAt(n)=='J') {

sendToWand(letterJ);

}

else if (povtext.charAt(n)=='K') {

sendToWand(letterK);

}

else if (povtext.charAt(n)=='L') {

sendToWand(letterL);

}

else if (povtext.charAt(n)=='M') {

sendToWandMW(letterM);

}

else if (povtext.charAt(n)=='N') {

sendToWand(letterN);

}

else if (povtext.charAt(n)=='O') {

sendToWand(letterO);

}

else if (povtext.charAt(n)=='P') {

sendToWand(letterP);

}

else if (povtext.charAt(n)=='Q') {

sendToWand(letterQ);

}

else if (povtext.charAt(n)=='R') {

sendToWand(letterR);

}

else if (povtext.charAt(n)=='S') {

sendToWand(letterS);

}

else if (povtext.charAt(n)=='T') {

sendToWand(letterT);

}

else if (povtext.charAt(n)=='U') {

sendToWand(letterU);

}

else if (povtext.charAt(n)=='V') {

sendToWand(letterV);

}

else if (povtext.charAt(n)=='W') {

sendToWandMW(letterW);

}

else if (povtext.charAt(n)=='X') {

sendToWand(letterX);

}

else if (povtext.charAt(n)=='Y') {

sendToWand(letterY);

}

else if (povtext.charAt(n)=='Z') {

sendToWand(letterZ);

}

else if (povtext.charAt(n)==' ') {

PORTB = 0;

PORTD = 0;

PORTC = 0;

delay(refreshrate*3);//off for 3 pixels

}

//space between each character

PORTB = 0;

PORTD = 0;

PORTC = 0;

delay(refreshrate);

}

//space at end of text

PORTB = 0;

PORTD = 0;

PORTC = 0;

delay(refreshrate*3);

}

jmacutong made it!10 months ago

I made it!. I presented this project to my professor and I've got a good grade. But he is insisting what he wants - the three push buttons with three different messages. He said that he can increase my grade if i am able to do it. My plan is to reduce the LEDs to free some pins but i'm afraid i can't edit the codes. Also i dont know the codes for the push buttons and where i will put it. Can you please help me?? I really want to have a high grade on that subject.

HAHA.jpg.png
m0sama made it!10 months ago

Thanks a lot for this extremely useful instructable. I made it and added a Bluetooth module to it (Bluetooth Gold Mate) to allow controlling the message shown on the POV Wand through an Andriod device (instead of having it hard coded). I made a brief video that describes my project here. Thanks again!

http://youtu.be/8MPuFQb0CjY

IMG_1166.JPGIMG_1136.JPG10171665_10202341466002513_7392959235502717194_n.jpgIMG_1154.JPG
amandaghassaei (author)  m0sama10 months ago

wow! great project, that's a great idea!

Macs931 year ago
(removed by author or community request)
amandaghassaei (author)  Macs931 year ago

start by wiring up 16 leds and running the same code, you'll see that all of the letters are cut off, you can go in and change the bit array (still leaving them 12x20) so that they form the letters nicely at less than 20 px. That's the easiest solution.

(removed by author or community request)
1-40 of 175Next »