Showing posts with label light. Show all posts
Showing posts with label light. Show all posts

Voice over laser

So now that I have the laser, I might as well try fun stuff out with it. Like modulating the beam. I know hams have experimented with long-range laser communication, so maybe it could even work.

So I built a poor girl's beam modulator. It is, in essence, a sophisticated optical apparatus which I call a "Laser". It consists of a piezo buzzer stolen from a defunct fire alarm, a piece of a makeup mirror I broke, and lots of Blu-Tack, among other things. The piezo buzzer is directly connected to my laptop's audio Line Out, so I can make it buzz arbitrary signals. The piezo makes the mirror vibrate, which causes deviations in the beam's direction. Kind of like a DMD, except not digital nor micro.

[Image: A mess of wires and components attached to a mint tin using blu-tack. A laser module is pointing at a piezzo buzzer at an acute angle. A piece of mirror is glued onto the piezo buzzer. The laser and piezzo buzzer are connected to wires that lead out of the picture.]

The receiver side is situated a short distance away. It is just a simple wide-spectrum photodiode. It connects to another sound card's Line In. When the beam deviates a little, it won't directly hit the diode any more, and this causes the diode voltage to fluctuate. This should allow us to send information over the channel.

[Image: A photodiode attached to a cassette case using blu-tack. A piece of paper is attached to the base of the diode, and a line of red laser light is visible on the paper, also hitting the diode.]

I found a piece of audio with a folk tune in the beginning followed by a lady reading out numbers. I applied a suppressed-carrier single-sideband modulation at 6 kHz, so as to avoid the hum caused by lighting in the room. It's painfully trivial using SoX and Perl, by the way:

open(S,"sox salakalastaja.wav -t .raw -e signed -|");
open(U,"|sox -b 16 -c 1 -e signed -t .raw -r 44100 ".
       "- ssb.wav sinc 6000 -n 4096");
 
while(not eof(S)) {
  read(S,$a,2);
  print U pack("s",unpack("s",$a) *
          cos(($n++ * 2 * 3.141592653589793 * 6000) / 44100);
}
 
close(U);
close(S);

I still need to make some amplifiers. The piezo could take a lot more voltage, but line level only goes so far. Also, the unamplified output of the photodiode is very weak at -90 dB, so we're almost hitting the 16-bit quantization floor. Here's a sine wave being transmitted over the laser:

[Image: Spectral power plot of three signals with no frequency scale. The blue signal has a single peak scaled as 0 dB. The red signal has a -90 dB peak at the same frequency. The green signal only has background noise. Noise floor in all three is at -120 dB.]

However, audio from initial crude testing is actually pretty intelligible. In the beginning, you can hear the 50 Hz buzz caused by flickering lamps, and then me tuning the heterodyne to 6.000 kHz. The noise mostly comes from 16-bit quantization/dithering.

The infrared impulse

Imagine a movie party with friends. Just as the 237-minute Love Exposure is about to start, you feel the need to have a remote controller. You remember the spare TV remote lying around. You also happen to have an infrared phototransistor from a Hauppauge HVR-1100 PCI card. So you quickly try to come up with a way to receive the signals using stuff you readily have at home.

[Image: A television remote control with a couple dozen buttons and the label 'Hauppauge!'.]

Far-fetched? Well, it did happen to me. The movie was some great stuff, so I decided to sit and watch it instead. But the next day, I finished this remotely useful contraption. (Of course proper USB IR receivers are cheap on eBay and well supported on Linux, but hey.)

Long story short, I connected the phototransistor directly into the sound card's line in by soldering the leads to a stereo jack. The sound card is becoming my favorite method of sampling the outside world into the computer.

[Image: A stereo miniplug with its lead connected to a phototransistor.]

And sure enough, pressing the button "1" on the remote produces this waveform:

[Image: An oscillogram with 12 strong downward spikes of two distinctly different durations.]

By comparing the timing to some common IR protocols I found out the signal is Manchester-encoded RC-5. After running-average type lowpass filtering, thresholding and Manchester decoding in Perl, we get these 14 bits:

[Image: Spikes from the above spectrogram superimposed with a regular clock signal and interpreted so that when a clock tick coincides with a spike, a logic one is produced, and when it coincides with zero, a logic zero is produced.]

The first "11" is a start bit sequence, then follows a toggle bit that tells whether this is a repeat or a new keypress. The rest is an address field (11110b = 1Eh) and the command itself (000001b = "number 1").

Yay, no new hardware needed!