Introduction: Simple Arduino Based POV Display

About: Hi, my name is Nikodem Bartnik. I'm 19 years old. I am into designing, making, programming and electronics. In the future, I want to start a company and make my own products. As for now, you can find my work o…

Small handheld POV display based on Arduino, perfect project for beginners and not only to learn soldering small components and programming. It is simple so don't worry if you haven't any experience, you will be easy able to make this project. It involves making a PCB, (Printable Circuit Board) but you don't have to make it at home, you can use order it in a PCB manufacturer so you will get professional PCBs for super cheap price and you wouldn't have to deal with making them by yourself. We will learn to solder small SMD (Surface Mount Devices) and also some bigger through hold components. Don't forget to check out video above, it explains everything about this project and show how it works.

Thanks for supporting this project to:

JLCPCB for $2 PCBs (48 hours build time): https://jlcpcb.com

So let's start making!

Step 1: Short Story of This Project

When I got my first Arduino as a present for Easter in 2014 I decided to make a POV display, because it was a very effective and I only had few parts like LEDs and resistors. I had no idea on how to make this thing, I even didn't know how POV display works. So I started searching for some explanation on the internet, I made a prototype on the cardboard with breadboard and tape. After a lot of tries I got it working. Then I added a motor to make it spin and it started to work. That's the story of my first Arduino project, that's how I started my journey with Arduino. Since that I build a lot of projects: EggBot, Drone, Voice controlled lamp, FollowBot, Snake robot and a lot of normal robots. So choosing POV display as a first project was great idea. But it's time to make a second version of this project. It's time to make it better, simpler and smaller. So that more beginners can start with this project.

To make it I designed a custom PCB in KiCAD. PCBs were made by JLCPCB.COM, huge thanks to them for supporting this project. Because I already now how POV displays work, I decided to complicate this project a little bit to make it more challenging. The first thing to make it harder was using a KiCAD instead of Eagle, I have never used KiCAD so that's my first design. I also use as many SMD components as it was possible, to reduce it's size and price but also to learn soldering small SMD components, because I haven't a lot of experience with SMD soldering. I made a mistake with PCB design. I used ADC6 and ADC7 pins to control LEDs but it turns out that those two pins can't be used as an output, they are only for analog input. To fix that I added two jumpers between pins PD3 and PD4 and LEDs number 7 and 8. Except this small mistake (or maybe not so small) this project is really good. I am happy that I manage to design a board in KiCAD, produce it, solder and create a code for it. So if you want to make something like this follow the instructions below. If you like it, don't forget to hit that like button, any questions leave in the comments. Happy making!

Step 2: Parts

We will need some small components for this project, but you can buy most of them in every electronics shop without any problems. You can also but them online in DigiKey or something similar. Here is what we will need:

  • Atmega 8
  • SMD Resistors 100Ω in 1206 package (10 of them)
  • SMD Resistors 1.5 kΩ in 1206 package(2 of them)
  • 10 pin ISP Male Connector Header
  • SMD LED 1206 color is up to you
  • SMD Capacitor 100nF package: 1206
  • Break Away Headers - Straight
  • Custom PCB
  • Optical Detector / Phototransistor - QRD1114 There is a place for it on a PCB but I wouldn't use it in this tutorial
  • Soldering iron, the best for SMD components is the one that uses hot air like this: https://goo.gl/D4ddXb

Step 3: Make a PCB

As I said don't worry about this step, you don't have to make it on your own. The easiest and most professional way to make this is to order those PCBs at a professional PCB manufacturer like JLCPCB.COM. They are really professional PCB manufacturer and they have the cheapest prices that I have ever found ($2 for 10 pcs of 10 x10 cm boards). If you prefer to make those boards at home, there is no problem but keep in mind that this is double sided board and it can be hard to make it at home. I made a lot of PCBs at home but never double sided one because it's really hard to mach the top and bottom layer together.

There is also a way to make it on the breadboard, without PCB. Just connect everything like on the schematic above. Program will be the same. Keep in mind that if you use Arduino board you don't have to connect additional capacitors and resistor on the reset pin because they are already installed in the Arduino board.

Step 4: Soldering

Soldering SMD components is a very precious task. For me it's hard because my hands are shaking all the time, but I manage to do it and if I can do it, you can do it too. The best way is to use a soldering paste instead of standard tin. Firstly put a little bit of soldering paste on all of the pads and then put on components. Remember about polarity of diodes, you can measure that with multimeter. Try to Beas precious as you can especially with atmega. When all of the components are on it's place turn on you soldering iron, the easiest way to solder that is to use a hot air soldering iron so that you even don't touch the components. You can also use a oven to do so, or a normal soldering iron with a tip, but that is the hardest way because you can easily move the components. When soldering is done clean up your board and look for any shorts with a multimeter. After soldering all SMD components, the small ones you can add THT components like programmer connector and break out headers. When everything is properly soldered we can move on to another step!

I used ADC6 and ADC7 pins to control LEDs but it turns out that those two pins can't be used as an output, they are only for analog input. To fix that I added two jumpers between pins PD3 and PD4 and LEDs number 7 and 8. If you use my board design you also should do that, I will upload fixed board when it will be ready.

Step 5: Code

This code base on my first Arduino project ever. I just changed few thinks in it and adjust values. You can simply upload it to Arduino and enjoy your POV display. If you want to modify it to print custom text simply change loop body. As you can see to display text we have to call a method with every letter of text that we want to print. I define most of the characters that we need to print something so expect normal letters you can also find some characters like ?, !, colon, dot and numbers.

You may be curious how this code works. So firstly we divide each character, letter, whatever we want to print into 5 columns of 0 and 1. Then when we call a method to print for example A we print those coulombs one after another there are 10 rows in each column and that let's us print a symbol. Time between each column is about few milliseconds. Here is how A looks like and how we can interpret it:

int A[] = {1,1,1,1,1,1,1,1,0,0, 0,0,0,1,1,0,0,0,1,1, 0,0,0,1,1,0,0,0,1,1, 1,1,1,1,1,1,1,1,0,0};

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

0 1 1 0

0 1 1 0

1 0 0 1

1 0 0 1

1 0 0 1

1 1 1 1

1 1 1 1

1 0 0 1

1 0 0 1

1 0 0 1


Can you see A above? That's how POV display works. Whenever there is 1 LED is turned on, when there Is 0 LED is off. And that's how every other character is stored on the Arduino as a table of 0 and 1.

<p>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};<br>int A[] = {1,1,1,1,1,1,1,1,0,0, 0,0,0,1,1,0,0,0,1,1, 0,0,0,1,1,0,0,0,1,1, 1,1,1,1,1,1,1,1,0,0};
int B[] = {1,1,1,1,1,1,1,1,1,1, 1,1,0,0,1,1,0,0,1,1, 0,1,1,0,1,1,0,1,1,0, 0,0,0,1,1,1,1,0,0,0};
int C[] = {0,0,1,1,1,1,1,1,0,0, 0,1,0,0,0,0,0,0,1,0, 1,0,0,0,0,0,0,0,0,1, 0,1,0,0,0,0,0,0,1,0};
int D[] = {1,1,1,1,1,1,1,1,1,1, 1,1,0,0,0,0,0,0,1,1, 0,1,1,0,0,0,0,1,1,1, 0,0,0,1,1,1,1,0,0,0};
int E[] = {1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1, 1,1,0,0,1,1,0,0,1,1, 1,1,0,0,1,1,0,0,1,1};
int F[] = {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,0,0,1,1, 0,0,0,0,1,1,0,0,1,1};
int G[] = {0,0,1,1,1,1,1,1,0,0, 0,1,1,0,0,0,0,1,1,0, 1,1,0,1,0,0,0,0,1,1, 0,1,1,1,0,0,1,1,1,0};
int H[] = {1,1,1,1,1,1,1,1,1,1, 0,0,0,0,1,1,0,0,0,0, 0,0,0,0,1,1,0,0,0,0, 1,1,1,1,1,1,1,1,1,1};
int I[] = {1,1,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,0,0,0,0,0,0,1,1};
int J[] = {0,1,1,1,0,0,0,0,0,0, 1,1,0,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};
int K[] = {1,1,1,1,1,1,1,1,1,1, 0,0,0,1,1,1,1,0,0,0, 0,0,1,1,0,0,1,1,0,0, 1,1,0,0,0,0,0,0,1,1};
int L[] = {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,0,0, 1,1,0,0,0,0,0,0,0,0};
int M[] = {1,1,1,1,1,1,1,1,1,1, 0,0,0,0,0,0,1,1,1,0, 0,0,0,0,0,0,1,1,1,0, 1,1,1,1,1,1,1,1,1,1};
int N[] = {1,1,1,1,1,1,1,1,1,1, 0,1,1,1,0,0,0,0,0,0, 0,0,0,0,0,1,1,1,0,0, 1,1,1,1,1,1,1,1,1,1};
int O[] = {0,0,1,1,1,1,1,1,0,0, 1,1,0,0,0,0,0,0,1,1, 1,1,0,0,0,0,0,0,1,1, 0,0,1,1,1,1,1,1,0,0};
int P[] = {1,1,1,1,1,1,1,1,1,1, 0,0,0,0,0,1,1,0,1,1, 0,0,0,0,1,1,1,0,1,1, 0,0,0,0,0,0,1,1,1,0};
int R[] = {1,1,1,1,1,1,1,1,1,1, 0,0,0,0,1,1,1,0,1,1, 0,0,0,1,0,1,1,0,1,1, 1,1,0,0,0,0,1,1,1,0};
int S[] = {1,1,0,0,0,0,1,0,0,0, 1,0,0,0,0,1,0,0,1,0, 0,1,0,0,0,1,0,0,0,1, 0,0,1,1,1,0,0,1,1,0};
int T[] = {0,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, 0,0,0,0,0,0,0,0,1,1};
int U[] = {1,1,1,1,1,1,1,1,1,1, 1,0,0,0,0,0,0,0,0,0, 1,0,0,0,0,0,0,0,0,0, 1,1,1,1,1,1,1,1,1,1};
int V[] = {0,0,1,1,1,1,1,1,1,1, 1,1,0,0,0,0,0,0,0,0, 1,1,0,0,0,0,0,0,0,0, 0,0,1,1,1,1,1,1,1,1};
int W[] = {1,1,1,1,1,1,1,1,1,1, 0,1,1,0,0,0,0,0,0,0, 0,1,1,0,0,0,0,0,0,0, 1,1,1,1,1,1,1,1,1,1};
int X[] = {1,1,1,0,0,0,0,1,1,1, 0,0,1,1,1,1,1,1,0,0, 0,0,1,1,1,1,1,1,0,0, 1,1,1,0,0,0,0,1,1,1};
int Y[] = {0,0,0,0,0,1,1,1,1,1, 1,1,1,1,1,1,0,0,0,0, 1,1,1,1,1,1,0,0,0,0, 0,0,0,0,0,1,1,1,1,1};
int Z[] = {1,1,1,1,0,0,0,0,0,1, 1,0,0,1,1,1,0,0,0,1, 1,0,0,0,0,1,1,1,0,1, 0,0,0,0,0,0,0,0,1,1};
int dash[] = {0,0,0,0,1,1,0,0,0,0, 0,0,0,0,1,1,0,0,0,0, 0,0,0,0,1,1,0,0,0,0, 0,0,0,0,1,1,0,0,0,0};
int dot[] = {1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,1,1, 0,0,0,0,0,0,0,0,1,1, 0,0,0,0,0,0,0,0,0,0};
int colon[] = {0,0,0,0,0,0,0,0,0,0, 0,0,1,1,0,0,1,1,0,0, 0,0,1,1,0,0,1,1,0,0, 0,0,0,0,0,0,0,0,0,0,};
int leftbracket[] = {0,0,1,1,1,1,1,1,0,0, 0,1,1,0,0,0,0,1,1,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0};
int rightbracket[] = {0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,1,1,0,0,0,0,1,1,0, 0,0,1,1,1,1,1,1,0,0};
int one[] = {0,0,0,0,0,0,1,1,0,0, 0,0,0,0,0,0,0,1,1,0, 1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,}; 
int two[] = {1,1,1,0,0,0,1,1,1,0, 1,0,1,1,1,0,0,0,1,1, 1,0,0,0,1,1,1,0,1,1, 1,0,0,0,0,0,1,1,1,0};
int three[] = {0,0,1,1,0,0,0,1,1,0, 1,1,0,0,1,1,0,0,1,1, 1,1,0,0,1,1,0,0,1,0, 0,1,1,1,1,1,1,1,1,0};
int four[] = {0,0,0,1,1,1,0,0,0,0, 0,0,0,1,0,1,1,1,0,0, 1,1,1,1,1,0,0,1,1,1, 0,0,0,1,0,0,0,0,0,0};
int five[] = {1,0,0,1,1,1,1,1,1,1, 1,1,0,1,1,0,0,0,1,1, 1,1,0,1,1,0,0,0,1,1, 0,1,1,1,0,0,0,0,1,1};
int six[] = {0,1,1,1,1,1,1,1,1,0, 1,0,0,0,1,0,0,0,1,1, 1,0,0,0,1,0,0,0,1,1, 0,1,1,1,0,0,0,1,1,0};
int seven[] = {1,1,1,0,0,0,0,0,0,1, 0,0,1,1,1,0,0,0,0,1, 0,0,0,0,1,1,1,0,0,1, 0,0,0,0,0,0,1,1,1,1};
int eight[] = {0,1,1,1,0,1,1,1,1,0, 1,0,0,0,1,1,0,0,0,1, 1,0,0,0,1,1,0,0,0,1, 0,1,1,1,0,0,1,1,1,0};
int nine[] = {0,1,1,1,1,1,1,1,1,0, 1,1,0,0,0,1,0,0,0,1, 1,1,0,0,0,1,0,0,0,1, 0,1,1,0,0,0,1,1,1,0};
int zero[] = {0,0,1,1,1,1,1,1,0,0, 1,1,0,0,0,0,0,0,1,1, 1,1,0,0,0,0,0,0,1,1, 0,0,1,1,1,1,1,1,0,0};</p><p>int ledAdresses [] = {A0, A1, A2, A3, A4, A5, 3, 4, 0, 1};</p><p>double timeBetweenColumns = 3;
double timeBetweenLetters = 6;</p><p>void setup(){
  pinMode(1, OUTPUT);
  pinMode(0, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(A5, OUTPUT);
  pinMode(A4, OUTPUT);
  pinMode(A3, OUTPUT);
  pinMode(A2, OUTPUT);
  pinMode(A1, OUTPUT);
  pinMode(A0, OUTPUT);
}</p><p>void printLetter(int letter[]){
  
  int y;
  
  for (y=0; y<10; y++){
    digitalWrite(ledAdresses[y], letter[y]);
  }
  delay(timeBetweenColumns);
  
  for (y=0; y<10; y++) {
    
    digitalWrite(ledAdresses[y], letter[y+10]);
  }
  delay(timeBetweenColumns);
  
  for (y=0; y<10; y++){
    
    digitalWrite(ledAdresses[y], letter[y+20]);
  }
  delay(timeBetweenColumns);
  
  for (y=0; y<10; y++){
    
    digitalWrite(ledAdresses[y], letter[y+30]);
  }
  delay(timeBetweenColumns);
  
  for (y=0; y<10; y++){
    
    digitalWrite(ledAdresses[y], 0);
  }
  delay(timeBetweenLetters);
}</p><p>void loop(){</p><p> 
  printLetter(N);
  printLetter(I);
  printLetter(K);
  printLetter(O);
  printLetter(D);
  printLetter(E);
  printLetter(M);
  
delay(30);</p><p>  }</p>

Attachments

Step 6: Test It!

Everything is soldered, program is uploaded so it's time to test our display. Connect a battery to it and try to gently move it in from of your eyes it's hard to see full text with eyes but you should be able to see at least few letters. Of course there should be dark in the room that you are testing it in. To see this effect more clearly use your camera, set it to the long exposure mode and take a photo while moving a display in front of it. You can take some cool photos this way!

Step 7: Conclusion

That's all for this project, I hope you like it, if so don't forget to hit that like button! You can also help my by voting for my project in the contests. If you have any questions, I am here to help you.

Happy making everyone and see you in the next project :)

Follow me on socialmedia:

Facebook: https://goo.gl/ZAQJXJ

Instagram: https://goo.gl/JLFLtf

Twitter: https://goo.gl/JLFLtf

LED Contest 2017

Participated in the
LED Contest 2017

Arduino Contest 2017

Participated in the
Arduino Contest 2017

Epilog Challenge 9

Participated in the
Epilog Challenge 9