Learn :

Laser Display

Laser Display

(PIP - Project in Progress)

Laser Display

Main Objective:

    Is to take a 2D image file and project it using a laser pointer on to a flat surface. 


The Idea:

    Is to use two mirrors, two motors to move the mirrors, a laser pointer, and a PIC microcontroller with serial input to receive the image from the host computer and control the mirrors and laser. The image will be conditioned in and transferred by Processing. The result will be an image that looks a bit like a big POV or a red and black old style computer display.


    Build and move X mirror motor.

    Build and move Y mirror motor.

    Control X motor.

    Control Y motor.

    Project a single dot along the X axis with the X motor and mirror.

    Project a single dot anywhere in the the X-Y working range of the display.

    Condition a small image into big dots using processing.

    Transfer the image to the PIC, and have it displayed.

Future objectives:

1. Larger display image.

2. Using a movie file as a moving animated display image.

PART 1. Building the X mirror

After taking apart a laser printer I found a five sided mirror that was mounted to a motor that is used to reflect the laser and draw each line. I thought this would be ideal to use to scan the laser dot from right to left. N.B. DO NOT USE THE LASER DIODE that is in the laser printer. It produces an invisible laser beam that could blind you. The motor was not suitable for hacking so I un-mounted the mirror and modified a computer fan to spin it. First I removed the fan blades, cut an access hole into one side for the laser, then I mounted the mirror onto a round piece of brass that I had turned on a lathe to get the fit just right and mounted that onto the motor.

With the laser aimed at the mirror and the motor turn on, I get a nice line projected onto a nearby surface.

PART 2. Building the Y mirror

After the X mirror produces a line from side to side it is up to the Y mirror to move the line up or down to produce a complete image. The idea of using another spinning mirror seemed too complicated, and moving a mirror with a servo seemed too slow. (I don’t have a high speed servo). Hacking a hard drive read-write head came to mind. The thinking is that it is must be precise, if you can read data off a hard drive by it’s position and it should be relatively fast since hard drive read write times are quite small. 

Initial testing involved connecting a volt meter to the voice coil leads on the head mechanism. It showed that the voltage was around 5 volts and that when the head moved (powered by the logic board on the hard drive) it seemed to use a differential voltage as opposed to a variable one. 

The next step involved removing the HD logic board and soldering on two small wire leads onto the flat ribbon cable that comes from the RW head. I then connected 4.5 volts from a battery pack to the coil, and by switching the polarity back and forth I could get the head to move from one extreme to the other. I figured if I could get it to switch back and forth fast enough it would be possible to control the exact position of the head. So I built a quick and dirty Arudino program that would read a potentiometer value and output a variable PWM (pulse width modulation) signal and feed that into a circuit that would switch the current back and forth depending on the pulse that it receives. Here is a small video of the results. Note the large amount of “buzz” noise that the frequency of the Arduino PWM produces in the hard drive.

Since only the RW head and not the entire HD is going to get used I decided to remove most of the extra parts of the HD.

For the Y mirror I am using a surface mirrored mirror that I pulled from an old scanner. This mirror is going to get mounted on to the RW head arm but perpendicularly. Below is the sequence of striping down the HD. After removing the delicate RW arm, the case was cut easily with a hack saw. I cleaned it up by filing.

In order for the laser line from the X mirror to reflect off of the Y mirror but allow the Y mirror to rotate, the Y mirror has to be mounted as close as possible to the axis of rotation. (Otherwise the mirror would move out of the beam.)

To do this the RW Head was removed, and painters masking tape was used to block off the bearings and protect the ribbon cable. The heads were gently sawed off, then the rough cuts were filed smooth. After deciding on a length of 1 1/4” for the mirror, (just by holding it near the X mirror and guessing how big the beam would spread) a drop of oil was applied to the mirror and using a ruler and a regular glass cutter it was cut to size. The RW head was remounted into the case to make it easier to epoxy the mirror into place at a 90° angle to the case.

Here is the completed Y motor with mirror. The ribbon cable was preserved, since this cable fit well and was designed to flex even though only two traces in it are being used.

PART 3. Controlling the Y Motor

Initial testing showed voltages of 0 and 5 volts on the voice coil when measured with a multi-meter.

Experimenting showed that the HD arm moved back and forth when current was passed one way then the other through the coil. 

The assumption was that; if the current was switched back and forth fast enough, it would be possible to position the arm at any point along it’s swing. And by using PWM it would be possible to change the amount of polarity on the coil and thus it’s position. 

Here is what was planned and what it looked like on the scope

This “worked” but not well, here are the problems that surfaced;

1. When the PWM frequency below 19 khz made a lot of noise.

2. The arm does not maintain it’s position steadily.

3. The arm does not often go to the same spot when the same PWM signal is sent to it.

4. Very low resolution. The PWM value can vary by 256, but the arm only moves in a small band of around 10 values.

Since these results where not satisfactory, I decided to look more closely at the signals going into the voice coil of a working HD. Here is what I discovered.

PART 4. Controlling the X Motor

To control the timing of the laser firing with the position of the X mirror as it spins I added a slotted IR switch. For the IR blocker I used a bent piece of aluminum, and epoxied it to the central spinning part of the motor body. This way, one time per revolution I will know exactly which way the mirrors are oriented.

Psydo Code:

Here is the logic behind lining up the mirror and firing the laser to make a pixel.

1. Loop the MCU until the slotted switch is triggered. (During this waiting time data for the next row is loaded.)

2. Once the slotted switch is triggered, wait the required delay so that the laser will hit the Y-Mirror when fired.  (This is because the sweep of the X-Mirror is much larger then the surface of the Y-Mirror.)

3. Check if the first Pixel is on or off.

4. If it is on, fire the laser long enough to make a dot.

5. If the pixel is off, then wait the same amount of time as making a pixel. (This is so that every line will be the same length, whether on not it has many turned on pixels. )

6. Loop back to #3 until finished drawing the row.

PART 5. Project a single dot(s) along X Axis.

This was supposed to be the easy part, but there where a few problems;

Ch. 1 is the firing of the laser, Ch. 2 is the signal from the slotted switch. Notice that the voltage on Ch 1 (Laser) does not re-stabilize very fast.

Ch. 1 is the firing of the laser, Ch. 2 is the signal from the slotted switch. Here the laser is OFF as soon as the MCU tells it to stop.

During initial testing the laser would make a single dot nicely, but as soon as more then one pixel was fired it would make a dot followed by a line. I thought the project was domed. I tried many things, changing the firing circuit, the timing, the laser pointer but nothing worked. See the Screen shots above. 

The solution came when I was getting desperate and was taking the laser pointer apart again, it ended up being quite a simple fix. The laser pointer has a small circuit board inside it, with a “large” capacitor, connected to the power input. So it was simple staying on too long. I removed the Cap and now it works like a champ.

32 pixels in a single row, being projected and bounced of off both mirrors. The LaserDisplay produces a straight and sharper display then this image shows. The camera had a hard time focusing on a white sheet of paper and I was holding it from one side.

Now that the display was able to project 8 clear pixels, I stepped it up a notch, to 32 pixels. For testing purposes I am leaving the black spaces between the pixels, so that I can count them but later I will adjust the display so the pixels touch one another.

Here is a little video of the display showing a very lame animation. It’s quick and dirty just to see what it would look like.

I first made a small animation using eight pixels; the dot would move back and forth then from out side to the inside and back. This video shows the same animation  x4 so that it uses 32 pixels.

Here is how the parts are positioned.

Now that it’s been a few days it’s back to the voice coil (Y-motor) so that I can get a 2D image ...

Progress Notes.

In thinking of how to move the Y mirror issues of mechanical speed have come up.

At present, drawing one line using the 12V fan motor with only 5 volts applied I get a rotational speed of about 1400 rpm for the X mirror. (You can see that in the scope image capture above, since the frequency of the sensor is 23.4 htz [23.4/sec*60sec/min = 1400rpm) At this rate, there is a slight flicker in the drawing of the line. The line is being draw at 23 frames per second (FPS).

Now to draw a complete image, more than one line is needed! So, at the present speed if the image is 8 dots high then the frame rate will only be 3 FPS. Which will probably flicker badly.

I started experimenting with different speeds of the X mirror to see how the display would react. But, this became quite tedious; changing a setting, programming the PIC and testing every time a slight change was needed. There are four main variable that had to be changed often;

1. PWM value to control the X motor speed.

2. Delay from when the sensor detects the X mirror position to the actual time laser starts firing to hit the correct point on the Y mirror.

3. Size (width) of the laser pixel (ON time of laser).

4. Delay to space adjacent laser pixels.

Always looking for ways to keep things simple, I thought I would start by working on the software interface for the laser display, which would include these variables. This is the result so far;

Laser Display Controller: programmed in Processing , graphical elements built using Interface Builder (part of Apple’s Xcode Developer Tools ).

On the left side you can manually draw the image to be projected or you can open an image file of the correct size that you made in another software. On the right side there are control buttons and fields to enter the variables. The LDC interfaces “pumps” out serial signal to the Laser Display via a USB to Serial board .

This is just testing version, a later version will probably have a larger image area (or frames for an animation) and have automatic selection of the right variables.

Copyright SpikenzieLabs 2019