Picture of Arduino Laser Show with Full XY Control
Update! See Step 32 to find out how to use this project with a green laser!

Also - checkout the LaserTweet Instructable to make this project display data from Twitter:

This project uses an Arduino and some cheap audio speakers to create a real laser show with full X and Y axis control.

The included source code lets you easily draw text and even simple pictures!

View the demo video to get an idea of what this project can do.

You should be able to get most components locally (besides the Arduino).

Assuming you already have an Arduino - expect to spend roughly $35 on this project.

If you can upload a program to an Arduino and solder - you can probably build this project in an afternoon.

Users who have built this project:
mattbeowulf -
minhenes (using "real" galvos) -
hydronics -
benhgd -
(Post a comment with your link - and I'll add yours to this list)
Remove these adsRemove these ads by Signing Up

Step 1: A Bit About Laser Shows

Picture of A Bit About Laser Shows
Most laser shows use galvonometers (the little boxes in the picture) or "galvos"  to aim their mirrors.

Galvonometers are electromechanical devices that rotate to different angles based on how much voltage they are provided.

A minimum of two galvos are used - one for "X" (horizontal) control and one for "Y" (vertical control).

The laser show's controlling electronics quickly adjusts galvo voltages, and turns the laser on and off - moving it around so quickly that it appears to create a persistent image.

Commercially available galvos can move to up to 50,000 different points each second.

Galvos tend to be expensive - so we'll be making our own out of audio speakers!

1-40 of 187Next »
hydronics3 years ago
Hey, I basically copied your instructable but put it in a portable container to make a strategic gerilla propaganda 'box'

Going forward I would recommend using a stronger laser... This would allow you to hit a building or billboard at a mysterious distance... I tried to buy a stronger, $14 green laser from China but the china laser circuit did not allow cycling ON/OFF at quick rate like the cheap laser is used...(this is called blanking in the laser light show industry) You could rewrite the code to be more cursive in nature and less ON/OFF dependent... It would be fun to play with the programming in such a way and easy for a beginner... its all cartesian coordinates... that means easy!

thanks again for all the hours of dinking around....

nothinglabs (author)  hydronics3 years ago
that's awesome!!!

had similar problems trying to use a green laser too.

suspect it's possible to get it a green laser working with some tweaking - the driver circuits are a bit more involved than is intuitive... (think they tend to involve temperature feedback and such).

RickE317 days ago

13.8v main PS --->|--->|--->|--- 11.7v to Arduino

Using 3 1N400x diodes.

RickE317 days ago

An easy way to drop the supply voltage to the Ard from any power source would be to add an appropriate number of 1N4001 diodes (or any 1N400x series diode) in series with the V+ line from your main power supply. For every 1N4001 you add, it will reduce the voltage to the Ard by .7 volts.

If you needed to make sure that "13.8v" was more Ard friendly, add 3 or 4 diodes, and run the entire project off one power supply.

13.8 - 2.1 = 11.7v (3 diodes)

13.8 - 2.8 = 11v (4 diodes)

Even if it's really a 12v supply, adding 4 diodes will result in 9v to the Ard. Plenty.

Easier than heatsinking an LM7805 running off the main V+, which is the other option.

davejavu1969 made it!1 month ago

Probably one of the coolest projects I've ever built :-D - Massive props to Rich for the brilliant work. I used two 70w Sony speakers that I got from the local car boot sale for £1 each! Works really very well. Have got Arduino IDE running on Raspberry Pi. And I've mounted it all in a flight case so it's portable.

nothinglabs (author)  davejavu196926 days ago
nice build!! glad your having fun with the project.


amazing! I want to make this.

Hi Rich, simply bloody awesome project :)

Am currently in the process of building this to run on the Raspberry Pi. Am going to code in Python as that is what I know. Looked at the arduino code to get my head around it but got one major question.. Are you forming the images by scanning row by row, top to bottom and then only turning laser on at correct moments or are you drawing the outlines of the shapes and then turning on / off between each shape?

Hope that makes at least some sense!

Thx again - brilliant project.
nothinglabs (author)  davejavu19691 month ago
Hi Dave -

Shapes are formed via vector-style drawing - shapes are actively outlined by the galvos (speakers) as opposed to being drawn raster-style.

Good luck with the project (feel free to contact me via

Tachyon2 months ago

First, this is really cool and it's the first time I've seen one of these that can be built easily and for minimal cash. Nice.

However, one thing has me really perplexed. The way the mirrors are mounted, they are going to be moved parallel to the Z axis of the speaker. (ie up and down with the cone). But they are also mounted to the "pivot" which is also hard mounted the the speaker frame. In theory this setup shouldn't work (well) since the mirror should be fighting against the pivot stick as it tries to move up and down in a rigid plane and is resisted by the pivot stick which is hard mounted to the frame and which it is hard mounted to. This should resist pivoting and distort the image. My only guess is that the bamboo skewer and the paper of the speaker cone both deform enough to overcome this and allow the mirror to move in a motion that approximates pivoting, but doesn't actually pivot perfectly.

I think if I were to try this, I'd be inclined to mount the mirror on an actual pivot (ie glue a small straw to the back and run the skewer through the straw. Then mount that pivot skewer offset from the centre line of the speaker so that the edge of the mirror aligns with the centre of the cone. Then glue another section of straw to the edge of the mirror, parallel to the pivot straw. split the straw in the middle and run a piece of skewer through it and glue another piece of skewer from that skewer to the top, centre of the speaker cone. Essentially forming a T shape that can pivot at the T end. Now you have a mirror that truly pivots freely on it's centre line.

Putting the pivot point (straw) at other points that the centre of the mirror can changed the mirror deflection for larger or smaller intended display sizes / distances.

Just a thought. Comments anyone?

nothinglabs (author)  Tachyon2 months ago
The angle of deflection of the mirror is relatively small - enough so that the hot glue allows for some pivoting (if it didn't things would break apart immediately).

I think I tried some experiments with a hinge a few years ago - but don't think it resulted in an improvement (worth trying though).

Have fun!

I want to make a laser show, too. I'm mostly interested in beam shows, not graphics shows. My considerations:
I was planning to use very small speakers, such as some 50mm 3W speakers available for as low as $3. Even though their excursion is tiny, my idea is to glue a lever to the speaker and then glue it VERY close to the mirror rotation axis, so the mirror would tilt a lot. This would also allow to have really small mirrors (reduced inertia of moving parts = great) and have the added benefit of allowing better operation on higher frequencies (small speakers respond better to higher frequencies), and I guess its performance wouldn't be bad on low frequencies since SPL is irrelevant, we only need excursion to tilt the mirror.
Also, I don't want to use an Arduino, I want to use full-fledged computer software to control the output. Eventually, I would record the audio output from the PC and play directly from a tiny mp3 player. It all would make for a very portable solution, maybe even pocketable.
Any tips on great laser animation software which works nicely with an audio DAC (I mean, with the computer's sound output)? Preferably free software with lots of beamshows available! :P

Hi elias, I am currently experimenting with using audio.. have you had any luck? I believe the setup described in the tutorial enables the system to reproduce around 60k points per second (?). Using uncompressed audio at a rate of 44100 hz I think you could sample 44100 points per second (not sure if that is correct tho...).

nothinglabs (author)  elias.alberto2 years ago
Don't have any specific advise on controlling from PC.

Sounds like a great project / please post details here as you make progress.
jlocke8 made it!10 months ago

I used your instructable and made this in 2011. I used it to project a laser show against a building to propose to my wife! Thank you so much for your project and instructions!

Like hydronics, I put it into a self contained box, and added a battery and inverter so I can truck it around. I modified the code to draw some other images and say my personal message.

Thank you nothinglabs!

nothinglabs (author)  jlocke89 months ago
that's awesome!
pulse_wid10 months ago

I have some small galvos that I wanted to run with this code. I ran the galvos from pin 5 and 6. The x-axis mirror was bottoming out within it's range so I put in a 5.6Ω resistor to reduce the current. The diodes I put in because I thought they would protect the arduino?

The x-axis works fine but I cannot get the y-axis to move the mirror much, it barely moves and not very often. The peak volts the x-axis put out was 1.2 volts, y-axis was only .24 volts, this was over a period of over a minute. I reset the Arduino many times and got the same results. I tried reassigning the pins and switching out the galvos but the y-axis seems to prefer putting out very little power, and will not move the laser. I'm stuck with a laser show on a single axis : (

The laser seems to pulse just fine.

Any thoughts anyone?


nothinglabs (author)  pulse_wid10 months ago

I'd try swapping the X and Y axis pins in code to see what happens.

The way the show typically renders - the Y axis tends to move a lot faster than the X axis. If your using a multimeter to measure - it may not be fast enough to see the signal.

Also - no idea if the arduino can source enough current to effectively drive the galvos (wouldn't shock me if the Y axis got toasted) Might try slowing things way down to see what happens...

ketansodhi10 months ago

Would it be possible to power it with a 19.7V, 4.7A sony laptop charger?

nothinglabs (author)  ketansodhi10 months ago

I think that should work. I'd keep an eye on how hot the TIP120's get. You can dial back the power levels in the code a bit if needed. might try to get 8ohm speakers as opposed to 4ohm.

good luck!

spewlocks11 months ago


cheshirecorn11 months ago


mr79191 year ago

what are x_level and y_level in the code

nothinglabs (author)  mr79191 year ago
x_level and y_level contain the current X / Y position of the laser.

hope this helps!


TCCR2B = TCCR2B & 0b11111000 | mode; This line is giving me the error in the code and i also want to ask whether the exp_move is used to change the orientation of the speakers???

hi , very nice project, i have one question , can you use , and how, instead of speakers, Hard Disk motors :) for X,Y control
hello! could you please put a description online of what the program does and how it works? i dotn work with arduino so i would like to write it on my own for pic MC, but figuring out th elogic might be lots of unnecessary extrawork.. thanks!
nothinglabs (author)  sharkyenergy1 year ago
I'd suggest fully reviewing / digesting the source code / comments. there's a lot of documentation already there and in the instructable

if you have specific questions - let me know and i"ll try to answer.

good luck!

koruptx21 year ago
hi , very nice project, i have one question , can you use , and how, instead of speakers, Hard Disk motors :) for X,Y control
nothinglabs (author)  koruptx21 year ago
I played around with HD motors - never had any luck. I think they need some kind of feedback electronics to position accurately.

You should try it - let me know if you make any discoveries...

Have fun,

Thats magnificent...
DanNixon1 year ago
Just noticed a little error in the setPwmFrequency method, you have "case 1024: mode = 0x7; break;" where is should be "case 1024: mode = 0x07; break;".
nothinglabs (author)  DanNixon1 year ago
yup - that's an error!

if you google it - you can see it's propagated via some commonly copy / pasted code.

good news is that particular line isn't ever called - so has no effect on the project (so I'm gonna leave it be).

SteveNosko1 year ago
OOPS. That is TC = L/R... Time Constant = L/R.
SteveNosko1 year ago
Signed up just to comment. First, I think you have done a stellar job with this. Many guys think of speakers, try something and give up for poor performance. I got interested because of high frequency Piezo tweeters... but moved to less expensive, slower galvos (no longer available)
Many good comments and speculations. I don't know if you or others are still playing with this, but FWIW. Actually, you don't want to damp the back EMF of the speaker. Seems counter intuitive, but I explain. I use real galvos in my laser graphics and the way is to use a current drive (high impedance) instead of voltage drive (very low output impedance, like Sound amps). If you recall, the series LR circuit time constant is L divided by R = L/R. This says that a small R makes the time constant large. The current is slower to build, magnetic field slower to build and cone slower to move. Your transistors are current sources, but as said by another poster, a source/sink drive is better - in essence a "Power OpAmp". Unfortunately, driving 8 ohm speakers requires lots of current. A current drive (Google OpAmp current source) is accomplished by pitting a small resistor in series, to ground, with the coil and feeding the voltage at the top of it back into the OpAmp - yielding a voltage to current converter.
Then you sample the back EMF and use it as feedback, through a pot, so U can adjust it to get the best response. This, however, means that your power supplies (yes you'd need a + and a - supply) have to be high enough voltage to allow this back EMF to go as high as it wants to, so-to speak. The high supply voltage isn't needed to get the high current to flow, just to allow the back EMF to have the room it needs to simply exist. This is called compliance in current source Jargon. The analogy is when a voltage power supply can supply higher current spikes due to requirements of the load. For driving inductance like this (like TV Tube deflection), it turns out that the power supply voltages you choose now becomes one of the limiting factor on the speed you can get out of the 'galvos". Speed being the holy grail of laser graphics. If the back EMF is allowed to hit the power supply rails (thus clipping it), this is equivalent to 'damping' and the response actually starts to slow down and distort the image.

I also would have (I do this for another application) cut away a considerable portion of the speaker cone to allow as fast a movement as possible and reduce damping due to air movement. Don't know if this helps anyone, but FWIW. I am starting the process of putting info on my laser graphics on my web site and will be uploading a schematic for such a drive.

In addition, you should low pass filter (RC low pass) the PWM out before the audio amp.
Yes, an amp down to DC is required (which, internally, many audio amps are already), so it would be possible to turn an audio amp into a DC power OpAmp current source to do this.
Too many plates spinning to go into detail here. Motivated folks can try contacting me on my web site for more...
Cheers, Steve
DBender2 years ago
hello friend, sorry my bad english, I'm from Brazil, I have a problem in my setup, the speakers are Galvos with 12v and some are moving sluggish, what could be? thank you
nothinglabs (author)  DBender2 years ago
are you using he code as provided?

If so - thing should be moving pretty quick. I would try reverting to the code as provided if you've changed anything.

Besides that- easiest way to increase speed is to change "float exp_move =" to a smaller number.

Look at step 29 for more tweaks.
Hi guys from Nothing labs.
This is a really great project... im exited to get it going.

I am new with all this laser stuff and getting more involved every day.

I just did a spirograph and works nice but now i want to have some kind of scanner controled with an arduino.

Your project seems very easy to do and looks realy nice, but my question is if this setup would work with hard disk drives as galvos instead of speakers?

I would really apreciate your response.
Best regards,

Alejandro C. from Colombia
nothinglabs (author)  alejocorrear2 years ago
Hard drive galvos depend on having a feedback mechanism - that this project doesn't really have a method to deal with. Might be possible to make work - but would take a bunch of re-working...

Have fun!


JensonBut2 years ago
Probably a lot easier thatn all the other ones....
1-40 of 187Next »