How to make a POV display with the Arduino | With PCB
Hello and welcome back. In this project, we will learn how to make a POV display with Arduino. For that, I have used the Arduino Nano board. Because it’s most suitable for this project. Also, I have designed the PCB for this project. For that, I used the PACBway Company. But, you can use any other PCB manufacturing company.
- PCB Gerber file — Download
POV display
The POV is simply called Persistence of Vision. It’s a fascinating technology that utilizes the persistence of the visual phenomenon. It works by rapidly illuminating LEDs (Light-Emitting Diodes) as they move in a specific pattern. In this project, you can display the text and numbers. This creates an illusion of a solid image in the air, even though the LEDs are actually moving. This is an old technique, but I prefer this technique so I decided to do this project.
I have used the 10 LEDs for this project. If you don’t like to make a PCB, please use a dot board for this project. For that, use the project below.
OK, let’s do this project. The required components are given below.
- Arduino Nano board x 1 — Our Store / Amazon
- LED bulb x 10 — Our Store / Amazon
- 100 ohm Resistor x 10 — Our Store / Amazon
- Female header x 1 — Our Store / Amazon
- Two-pin terminal x 1 — Our Store / Amazon
- 9v Battery x 1 — Amazon / Our store
- 9v Battery clip x 1 — Our Store / Amazon
- DC motor and Toy wheel x 1
Disclosure: These Amazon links are Affiliate links. As an Amazon Associate, I earn from qualifying purchases.
Step 1
Firstly, identify these components.
Step 2
Secondly, order your PCB. You can download the Gerber file using this link. If you don’t need a PCB, please assemble this circuit on a dot board. For that, use the circuit diagram below.
Step 3
Thirdly, place the female header on the PCB and solder it. Please use tape to hold female headers.
Step 4
Next, place the LEDs on the PCB. Then solder these LEDs step by step.
Step 5
And then, place the resistors and two-pin terminal on the PCB. Next, solder these components.
Step 6
After, connect this PCB to the top of the DC motor. For that, I used a normal DC motor. You can arrange it as you like.
Step 7
Then, connect the 9v battery clip to the 9v battery and install it on the center of the PCB.
Step 8
Now, connect the Arduino Nano board to the PCB and install this display on a flat surface. Finally, connect it to the computer.
Step 9
Ok, now copy and paste the following program to the Arduino IDE.
- Code and circuit diagram — Download
int NUMBER9[] = {1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1};
int NUMBER8[] = {0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0};
int NUMBER7[] = {1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0};
int NUMBER6[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1};
int NUMBER5[] = {1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1};
int NUMBER2[] = {1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1};
int NUMBER1[] = {0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
int NUMBER0[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1};
int _[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
int A[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1};
int B[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0};
int C[] = {0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1};
int D[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0};
int E[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1};
int F[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0};
int G[] = {0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0};
int H[] = {1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1};
int I[] = {1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1};
int J[] = {0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0};
int K[] = {1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1};
int L[] = {1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1};
int M[] = {1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1};
int N[] = {1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1};
int O[] = {0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0};
int P[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0};
int Q[] = {0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1};
int R[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1};
int S[] = {0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0};
int T[] = {1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0};
int U[] = {1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0};
int V[] = {1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0};
int W[] = {1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1};
int X[] = {1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1};
int Y[] = {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0};
int Z[] = {1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1};
int* alpha[] = {A, B, C, D, E, F, G, H, I, J, K, L, M, N}; //,T,U,V,W,X,Y,Z};
int letterSpace;
int dotTime;
void setup() {
for ( int i = 4; i < 12 ; i++ ) {
pinMode(i, OUTPUT);
}
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
// defining the space between the letters (ms)
letterSpace = 2;
// defining the time dots appear (ms)
dotTime = 1;
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
}
void printLetter(int letter[]) {
int y;
// printing the first y row of the letter
for (y = 0; y < 8; y++) {
digitalWrite(y + 4, letter[y]);
}
delay(dotTime);
// printing the second y row of the letter
for (y = 0; y < 8; y++) {
digitalWrite(y + 4, letter[y + 8]);
}
delay(dotTime);
// printing the third y row of the letter
for (y = 0; y < 8; y++) {
digitalWrite(y + 4, letter[y + 16]);
}
delay(dotTime);
for (y = 0; y < 8; y++) {
digitalWrite(y + 4, letter[y + 24]);
}
delay(dotTime);
for (y = 0; y < 8; y++) {
digitalWrite(y + 4, letter[y + 32]);
}
delay(dotTime);
// printing the space between the letters
for (y = 0; y < 8; y++) {
digitalWrite(y + 4, 0);
}
delay(letterSpace);
}
void loop() {
for (int a = 0 ; a < 100; a++) {
pattern1();
}
for (int a = 0 ; a < 100; a++) {
pattern2();
}
for (int a = 0 ; a < 100; a++) {
pattern3();
}
for (int a = 0 ; a < 100; a++) {
pattern4();
}
for (int a = 0 ; a < 100; a++) {
pattern5();
}
for (int a = 0 ; a < 100; a++) {
pattern6();
}
}
void pattern1() {
printLetter (H);
printLetter (E);
printLetter (L);
printLetter (L);
printLetter (O);
printLetter (_);
printLetter (_);
printLetter (_);
printLetter (_);
}
void pattern2() {
printLetter (P);
printLetter (O);
printLetter (V);
printLetter (_);
printLetter (_);
printLetter (_);
printLetter (_);
printLetter (_);
printLetter (_);
}
void pattern3() {
printLetter (D);
printLetter (I);
printLetter (S);
printLetter (P);
printLetter (L);
printLetter (A);
printLetter (Y);
printLetter (_);
printLetter (_);
}
void pattern4() {
printLetter (P);
printLetter (R);
printLetter (O);
printLetter (J);
printLetter (E);
printLetter (C);
printLetter (T);
printLetter (_);
printLetter (_);
}
void pattern5() {
printLetter (W);
printLetter (I);
printLetter (T);
printLetter (H);
printLetter (_);
printLetter (_);
printLetter (_);
printLetter (_);
printLetter (_);
}
void pattern6() {
printLetter (A);
printLetter (R);
printLetter (D);
printLetter (U);
printLetter (I);
printLetter (N);
printLetter (O);
printLetter (_);
printLetter (_);
}
- Next, select the board and port. After, click the upload button.
Step 10
Finally, remove the USB cable and connect the 9v battery power to the display. And then, provide a suitable power supply to your DC motor.
Ok, now you can see the text on the display. You can change this text as you like. For that, check the program. The full video guide is below. We hope to see you in the next project or tutorial.
How to make a POV display with the Arduino | With PCB