We are a generation that love sound and light – can’t do without them really. Our most preferred time of day is night, or what we would call evening. We are particularly well acquainted with technology; doesn’t hurt these days. Our prerequisite for everything is that it be ‘cool’. Put it all together and in a stroke of brilliance, and a little help from our friend the internet, we have the ideal solution – a laser harp.

A laser harp, what on earth is that? Sounds kind of fancy doesn’t it? Well, it is basically what it says it is. The laser harp is an electronic instrument where a motor, a light sensor, a microprocessor Arduino, and, I’m sure you’ve guessed, a laser collaborate to produce beams, each representing a note (we will elaborate for those who care to read on). This harp though doesn’t have a frame: its strings stretch out infinitely into space – we know no boundaries.

Our inspiration was a video we had watched online and found rather fascinating. Apart from the fact that the prospect of creating it without too much expenditure, mental or monetary, was exciting, it seemed a project providing scope for learning in different areas, especially since we wanted to present it as a complete product. Part research, part reverse engineering led us to figure out its functioning. Admittedly, we have not contributed any addition to the original creation, but to achieve it was in itself gratifying. And there’s always room for originality and improvement in the future. 

If you like our instructable please vote for it at the top  right corner of the page!

For making this laser harp you will require basic soldering skills, and some experience working with the arduino.

Word of caution: Lasers are very harmful for the eyes, make sure you wear appropriate eye protection.

Our Video will be ready in another 12 hours! Do come back and check it out!

Here's the link to the video that inspired us :

Step 1: Overview of the harp

The basic outline of the harp:
A laser beam is shone. A stepper motor with a mirror divides it into nine beams. When one or more of the beams are cut, the light sensor (Light Detecting Resistor, LDR) detects it. According to the corresponding motor positions, it sends signals to the Arduino, which in turn produces the respective notes through a computer or keyboard.

How the beam is created:
A mirror is attached to the motor. The laser beam is directed to the mirror. The motor rotates in steps, hence stepper motor. With every step the motor takes, the position of the mirror changes, deflecting the beam in a different direction every time. The steps take place fast enough for the beams to appear as if they are simultaneously present.

How the harp knows which beam has been cut:
Every beam has a corresponding motor position. When a beam is cut, it reflects onto the sensor, which detects an increase in light intensity. The light sensor then looks for the position of the motor at the instant the beam was cut, and thus identifies the beam in question.
I love how you've managed to simplify the hardware necessary for a laser harp. Well done! Since I already have most of these materials lying about, it looks like a fun project for an idle weekend. <br>I'm also curious how you would go about detecting the height at which a player was cutting the beam in an enhanced version of this instrument-care to share your thoughts? I would love to add that function.
Thank you! I would use an ultrasonic sensor to read the distance of the players hand, which in turn would control the pitch or volume of the midi notes.
Which version of fl studio is used? And can uplease help me with the motor, it isn't working
One of my dreams was to have a laser harp. The only thing I need now is to go buy some 2n222 ULN2003 and, uhm my question was: What kind of/ speed/ steps, steper motor can I use? Hacking some old printer or something, any idea will be appreciated :) <br>Thx, and btw, one of the greatest and really simplest instructable for a complicated stuff that everyone could be amazed with :) Keep it up !
:) <br>The motor ive used is actually salvaged from some old electronics, any kind of stepper will do the job, you might need to modify the code a bit. I would be happy to help, just send me a message.
<p>To be honest, I would LOVE to see you making a Youtube video creating one Laser Harp...it's just 'cause my mind really will have no chance if it is reduced to writing explanation. We are talking about a Laser Harp, it is a complex thing to do, and not everyone has the same talent to make a Laser Harp the easy way like you do. :)</p>
I was actually going to rewrite the code to work directly via usb, not through MIDI... Any ideas about that?
Well, the problem isn't in the code really, now the problem is that I can't find ULN2003 here... Do you know anything compatible to that maybe? :) <br> <br>also it would be cool if there is a way to get 3 lasers and make em switch colors hahaha just sayin :)
and, perhaps a positioning picture (where the circuit is, LDR and stuff would be good, cos I'm really planing to do a &quot;Laser Harp Shield&quot; for this one :)
This is awesome, great instructable!!! If you plan on only using it with the computer, and don't need the midi out jack, couldn't you theoretically use only the arduino, and scrap the usb/midi converter cable? There are loads of arduino projects out there that output midi via the arduino's usb cable (and maybe some software on the computer side too).
You could even make it wireless :) http://www.ladyada.net/make/xbee/midibee.html
Yes, i just checked it out, and it isnt too hard too send MIDI signals over USB! <br>That's a wonderful idea! Thank you!
Great 'ible! I have most of these parts laying around, and have been looking for something to do with some spare laser diodes and steppers. I saw this (or one just like it) on Hack a Day recently, and though 'How cool would it be to make one of these.' Awesome, thanks!
Thank you! Do put up some pics after you are done!
Wow! This is like a visible version of a theremin, and it sounds better, too.
:) That's exactly what i thought i when first saw it!
<p>Una excelente idea de ingenio, dise&ntilde;o y programaci&oacute;n, much&iacute;simas gracias por compartir todo el material! </p>
Thanks dude GREAT WORK!.Im trying this myself so what is the trimpot used for??
<p>It looks like it is there to vary the sensitivity of the LDR light sensor. Did you finish this, I'm about to start.</p>
I know you are using the lrd but the guy that designed the first diy laser harp I know of(been researching for about 6-7 years) was using the IR sensor out of a wii remote. There are a bunch ard hacks for it. <br><br>t
<p>I would like to adapt this code to my stepper motor, can you help me?</p><p>My stepper motor : http://www.instructables.com/id/BYJ48-Stepper-Motor/</p>
<p>Quels sont les caract&eacute;ristiques de votre moteur stepper ? (nombre de pas, angle)</p>
Can anyone tell me how to modify the code to use a 4 wire stepper motor?
<p>im not able to upload code on circuit board</p>
unquestionably THE coolest thing I've EVER SEEN! Great work and awesome 'ible!
<p>could i replace the 5k trimpot with a 4.7k trimpot (https://www.sparkfun.com/products/9941) , and if i &quot;can&quot;, how will it affect the performance of my harp</p>
<p>In the fritzing diagram the stepper has 6 wires, but the pictures seem to only have six, also what colors correspond to what wires from the diagram to the pictures. Also, there is a 5v cable running from the arduino to the bottom power rail in the fritzing, is that necessary because it doesn't seem to be powering anything, there is also a resistor that is attatched to the bottom gnd rail, but there is no gnd power so how is that supposed to work?</p>
I don't know how a power supply 12v dc 2a looks like. Cam some one help me.
<p>Yipppppiii.................. I made it............ Its 100% Working...... Awesome experience to play with it. My setup has 5mW high bright green laser &amp; stepper motor salvaged from printer. I am also generating music from FL Studio...... :) :) Very soon i will post an instructable on it. I am very very thankful of @Pushan Panda &amp; issac_engel for inspiration behind this.<br></p>
<p>hey can u send me a video of your laser harp.</p><p>ayush.sharma2571994@gmail.com</p><p>pls</p>
<p>i will try to send as the size is much larger.</p>
can sm1 send me a video of this.. i wNaa make it badly. for colg project <br>mail is- <br>savarkarmanhas@gmail.com<br>need help..videos. or details something please
<p>Hello Pushan, could you give me specification of the motor stepper ?????</p><p>Many thanks</p><p>Aur&eacute;lien</p>
<p>Hi Aurelien, I don't think this instructable is being supported any more. I completed it recently after many months of trying to get it to work! </p><p>Do an ebay search for item 121684006535 - Unipolar Nema 17 1.8deg Stepper Motor. It works perfectly for this application. I have seen lots of other people trying to use geared steppers - these will not work. </p><p>Hope that helps,</p><p>DP. </p>
<p>I made my own code for this (Using stepper motor library and its much more efficient) and it runs fine. It also includes a start sequence where the laser goes back and forth slowly getting faster and faster until its a line and then it splits apart into the 13 different beams which include all the notes of the middle octave:</p><p>#include &lt;Stepper.h&gt;</p><p>const int stepsPerRevolution = 400; // change this to fit the number of steps per revolution</p><p>// for your motor</p><p>// initialize the stepper library on pins 8 through 11:</p><p>Stepper beamsplitter(stepsPerRevolution, 8, 9, 10, 11);</p><p>int LaserState = LOW; // The variable that stores the state of the laser beam.</p><p>int sensor = 8 ; // Change this value to calibrate your harp's sensor</p><p>int delaylaser = 2000; // If you increase this, the laser will be brighter, but the harp will be less fluid</p><p>int motorspeed = 100; // This variable affects the speed, and fluidity of the harp.</p><p>int stepsize = 2; //size between beams</p><p>int LaserPin = 7; // Tell the arduino that the laser is on pin 7</p><p>int startupspeed = 3;</p><p>int pos = 0; // position of the laser</p><p>int beams = 12; // number of beams</p><p>int pitch;</p><p>void setup() {</p><p> pinMode(LaserPin, OUTPUT); // Setup for laser.</p><p> pinMode(6, OUTPUT); // Setup for status led.</p><p> digitalWrite(LaserPin, HIGH);</p><p> delay(1500);</p><p> //start sequence</p><p> beamsplitter.setSpeed(startupspeed);</p><p> beamsplitter.step((-beams * stepsize / 2)-1);</p><p> for (int x = 1; x &lt; 60; x++) {</p><p> if (x&lt;30) {</p><p> startupspeed = 103 - (100/pow(x, 1.0/4.5));</p><p> }</p><p> if (x&gt;=30) {</p><p> startupspeed = 103 - (100/pow(x, 1.0/1.0));</p><p> }</p><p> beamsplitter.setSpeed(startupspeed);</p><p> for (int pos = beams; pos &gt; 0; pos--) { // turn in other direction</p><p> beamsplitter.step(stepsize); // direction</p><p> }</p><p> for (int pos = 0; pos &lt; beams; pos++) { // turn in other direction</p><p> beamsplitter.step(-stepsize); // direction</p><p> }</p><p> }</p><p> beamsplitter.setSpeed(motorspeed);</p><p> Serial.begin(31250);</p><p>}</p><p>void loop() {</p><p> for (pos = 1; pos &lt; beams; pos++) { // turn in first direction</p><p> beamsplitter.step(stepsize); // switch position</p><p> //delayMicroseconds(delaymotor);</p><p> digitalWrite(LaserPin, HIGH); // turn on laser</p><p> delayMicroseconds(delaylaser / 2);</p><p> if ( (analogRead(0) &gt; sensor ))\ // If the sensor gets a signalx</p><p> {</p><p> digitalWrite(6, HIGH); // Switch on status led.</p><p> noteOn(); // Play note 3</p><p> }</p><p> else if (analogRead(0) &lt; sensor ) // If the sensor does not get a signal:</p><p> {</p><p> digitalWrite(6, LOW); // Switch off the status led.</p><p> noteOff(); // Stop playing note 2.</p><p> }</p><p> delayMicroseconds(delaylaser / 2);</p><p> digitalWrite(LaserPin, LOW); // Turn off the Laser.</p><p> }</p><p> for (pos = beams; pos &gt; 1; pos--) { // turn in other direction</p><p> beamsplitter.step(-stepsize); // direction</p><p> //delayMicroseconds(delaymotor);</p><p> digitalWrite(LaserPin, HIGH); // turn on laser</p><p> delayMicroseconds(delaylaser / 2);</p><p> if ( (analogRead(0) &gt; sensor )) // If the sensor gets a signal</p><p> {</p><p> digitalWrite(6, HIGH); // Switch on status led.</p><p> noteOn(); // Play note 3</p><p> }</p><p> else if (analogRead(0) &lt; sensor ) // If the sensor does not get a signal:</p><p> {</p><p> digitalWrite(6, LOW); // Switch off the status led.</p><p> noteOff(); // Stop playing note 2.</p><p> }</p><p> delayMicroseconds(delaylaser / 2);</p><p> digitalWrite(LaserPin, LOW); // Turn off the Laser.</p><p> }</p><p>}</p><p>void noteOn() // Function to play the notes</p><p>{</p><p> pitch = 60 - (beams + 1) / 2 + pos;</p><p> Serial.write(0x90);</p><p> Serial.write(&quot;0x&quot; + pitch);</p><p> Serial.write(0x7f);</p><p>}</p><p>void noteOff() // Function to play the notes</p><p>{</p><p>pitch = 59 + pos;</p><p> Serial.write(0x90);</p><p> Serial.write(&quot;0x&quot; + pitch);</p><p> Serial.write(0x00);</p><p>}</p>
<p>Hi there, many thanks for your version of this. I had no joy at all with the original code despite many efforts. There are also several errors in the Fritzing diagram too unfortunately. I have got your code running, am using 50mw green module and get lovely sharp beams. </p><p>Am now adding sound and am getting the following error when compiling. This line...</p><p>Serial.write(0x00);</p><p>Causes compile to fail with....</p><p>In Function Void noteOff();</p><p>error: call of overloaded 'write(int)' is ambiguous</p><p>If I take the above line out, the sketch compiles perfectly - but doesn't of course perform as it should. All input gratefully received. </p>
<p>Hi........ First of all congrats on making this successfully. <br></p><p>Is your system working...??? May i request you for a video...???? </p><p>If you can send me video, please mail me on dixitad88@gmail.com</p>
<p>I used a 100mw laser and took the picture in the bathroom after filling it with steam from the shower. </p>
<p>I compiled the code and found this stray &quot;\&quot; on this line:</p><p>if ( (analogRead(0) &gt; sensor ))\ // If the sensor gets a signalx </p>
<p>you're right but i don't think it really affected the code. </p>
<p>Yep! It doesn't make any difference at all.</p><p>I am considering using the L298N H-Bridge IC to drive the stepper mounted on a heatsink. Do you think that an EasyDriver Board could be used instead? I have a couple of them laying around.</p>
<p>Also, if you look at my picture, you see that my &quot;strings&quot; are infact pretty wide and rather thick vs being like a single line. This might be because i'm using a crappy transistor for the laser. Also the beam is ever so slightly off from the position its at when it turns on while it goes in one direction vs the other. for example: beam 3 when the motor is going from right to left could be about .5 cm away from where it is when its going from left to right, these beams do overlap mostly but you can still notice the flickering pretty well. I may just need to replace the transistor. Something else i might try soon is not have the the laser turn on going the other direction. ex: replace the current void loop w/ </p><p>void loop() {</p><p>for (pos = 1; pos &lt; beams; pos++) { // turn in first direction</p><p>beamsplitter.step(stepsize); // switch position</p><p>//delayMicroseconds(delaymotor);</p><p>digitalWrite(LaserPin, HIGH); // turn on laser</p><p>delayMicroseconds(delaylaser / 2);</p><p>if ( (analogRead(0) &gt; sensor ))\ // If the sensor gets a signalx</p><p>{</p><p>digitalWrite(6, HIGH); // Switch on status led.</p><p>noteOn(); // Play note 3</p><p>}</p><p>else if (analogRead(0) &lt; sensor ) // If the sensor does not get a signal:</p><p>{</p><p>digitalWrite(6, LOW); // Switch off the status led.</p><p>noteOff(); // Stop playing note 2.</p><p>}</p><p>delayMicroseconds(delaylaser / 2);</p><p>digitalWrite(LaserPin, LOW); // Turn off the Laser.</p><p>}</p><p>beamsplitter.step(beams*stepsize);</p><p>}</p>
Hi Pushan, excellent instructable. Finally getting around to building this. Quick question, in your fritzing diagram you show 6 wire stepper, but in photos you show 5 wire. Also in the photo the wire is taped so colours change to 4 red and one green. This makes it difficult to see which stepper wire goes to which pin on the uln2003 - can you help identify which is which please? Many thanks! :)
Is there any chance to make a Laser Harp from this kind of stuff? And how?<br><br>Thanks.
<p>Nice Job!!</p><p>I was hoping you, or someone could help me out here with a stepper motor question? Is there anyway a 4 wire stepper will work? or is this not possible without a ground wire?</p><p>Thanks in advance</p>
<p>I've had an issue with this code. The software will say that it needs an &quot;,&quot; or a &quot;;&quot; after I've typed &quot;int sensor = 8 ;&quot;</p>
<p>I have an issue withe the code: </p><p>int sensor = 8 ; </p><p>The software gives me an error (expected ',' or ';' before 'int') </p>
<p>What do I do if the code is having an issue with LaserPin?</p>
Think there's no need for transistor and the stepper motor, could be easier, good instructable

About This Instructable


1,015 favorites


Bio: I am interested in all aspects of design and technology, I take to pottery in times of uncertainty, it is my grounding. The piano is ... More »
More by Pushan Panda: Recover Exhaust Energy Projection mapping Frameless Laser Harp
Add instructable to: