Arduino Laser Projector

I have been playing with Arduinos for about a year now, and I noticed that none of my projects were really utilizing the speed capabilities of the ATmega328 chips. At 16 MHz, they can do a of a lot more than blink LEDs. To improve my appreciation of their capabilities, I wanted to build a project which required very fast and precise timings. That is what motivated me to build a persistence of vision alphanumeric laser projector.
My projector uses a single laser and has only one moving part. 6 mirrors are hot glued to a spinning platform. Each mirror is at a slightly different angle, and each is responsible for 1 of the 6 lines of vertical resolution. One full rotation sweeps the laser across the target 6 times at 6 different heights. An optical sensor detects the start of a rotation and times the laser pulses to produce readable text. Due to the crudeness of construction, the mirrors are only stable within a small range of speeds. Too fast or too slow and the spinning platform wobbles. Consequently, I am forced to use PWM to throttle the speed to exactly 833 RPM. I was able to compensate to a great degree in code for the inaccurate alignment of the mirrors. For example, the mirrors are far from perfectly aligned at 1/6th rotation from each other, and most are not perpendicular to the center axis. Another small issue is the laser’s “warm up” time. If it has not been fired within the last 3 milliseconds, there will be a small delay between power on and illumination. To partially compensate for this, I fire the laser for a brief period between mirrors. I believe the cause of this warm up time is the current control circuitry built into the laser pointer. In theory, I could try bypassing that circuitry and it may fully correct the problem. For the curious, the project was built on an empty DVD player case. I am using the player’s power supply, but everything else was removed. I may eventually move the Arduino and other circuitry into the case, and interface it with the buttons on the front to allow custom strings to be programmed without a computer.

Edit: My interest in this project has continued to increase since posting this video. I have decided to continue making improvements to its design and programming. I have already rebuilt the mirror assembly with larger square cut mirrors and replaced the tiny 5volt motor with a much larger/sturdier 12volt motor. I released a version of the code. It can be viewed and downloaded at

Friendly YouTube user jawedkarimisgay did some research and found a similar laser projector project. For those that are interested, the link is

Duration : 0:6:30

Related Reading:

Incoming search terms:


Be Sociable, Share!

Technorati Tags: alphanumeric, arduino, atmega328, laser, microcontroller, pointer, pov, projector

11 thoughts on “Arduino Laser Projector

  1. @beaver1111111 It …
    @beaver1111111 It looks strange, but nothing too fancy is going on. Normally when you look into an array you have a variable that stores the index value of where you want to look. In this case, that variable is actually stored in another array. The program needs to look into arrays charsToDisplay and lineOrder in order to determine where to look in array Chars. If you are still confused, personal message me and I will explain in more detail.

  2. Hi, I am using your …
    Hi, I am using your project to learn Wiring. One line of code is slightly confusing.
    shifted = the Chars[charsToDisplay[displayChar]][lineOrder[pass]]; I don’t understand the square brackets in the square brackets [[ ]][]. I know it is an array function. I have already gotten the hardware running. Thanks for your help. Daniel Pollit

  3. its so amazing how …
    its so amazing how fast the arduino (ok the at mega328) can be…u did a very nice work…its much about managing the resources when programming a uC

  4. nice copying, you …
    nice copying, you could at least reference other people’s work, so people don’t think you are smart

  5. @tekvax Thanks for …
    @tekvax Thanks for your interest. Now that you ask, I probably will. I hesitate to release it as it is because it currently has a lot of poor programing practices and bugs, plus it is almost completely uncommented. I have decided to continue working on the project, and I am making improvements daily. Within a week or so, I may set up a web page detailing the steps I took to build this project with tips for others to build their own. It will be there that I post code. If I do, I will notify you.

  6. @npaltmp That’s …
    @npaltmp That’s great that you think the chip could be pushed harder. And they don’t consume nearly the amount of power as a desktop computer. So the chips are cheap to purchase and cheap to power. I’m playing with these, too.

  7. @field16 Thanks. …
    @field16 Thanks. Despite the fact that I am timing events down the the microsecond, I still feel that I am not even close to pushing the limits of these chips. If I profiled performance, I bet I would find that the chip spends the vast majority of its time in delay functions. However I do agree with you, this project is a good demonstration, just more so for precision timing and less so for computation speed.

  8. Great work! You …
    Great work! You help demonstrate how much computing power is on the Arduino (or on the ATmega328 itself). I like that you recycled materials to build this. I’ve seen projectors like this that show the date/time on a wall. Nice job.

Leave a Reply