In high school I created an analogue audio transceiver using a laser pointer (see project here). For a University course I decided to step things up a notch and transmit digital data back and forth between two devices.
The project uses two atmel avr atmega644p processors (although any with a hardware UART will work) and the atmel stk500 development board for programming and serial communication.
The transmitter is simply a dollar store laser pointer that is switched on and off by a transistor connected to the hardware uart tx pin of the atmega. In my project data is received on the rx pin of the hardware uart from a PC-RS232 serial connection on the stk500. This data is then just passed straight to a transmit function which outputs it on the tx pin. To avoid burning out the laser and to save power I have included a small inverter circuit between the atmega and the laser pointer. This turns the standard uart ‘high’ when idle into a low.
The receiver consists of a photo-transistor, which is then also connected to an inverter circuit to correct the uart signal, and then to the uart receive pin on the other atmega. The processor then sends any data received back out on the transmit pin, which is connected to another PC via RS232.
I originally used a CdS photocell for the receiver, which acts as a photoresistor (decreasing resistance with increasing light intensity) and ended up playing with some op-amps to increase the gain on the signal and using one as a comparator try and turn the modulated analog voltage signal from the cell into a digital signal. This however was a complete failure as the response time (rise specifically) for the cell was nearly 0.1 seconds, way too slow for digital communications ( <300 baud!). After switching it out for the transistor I also eliminated the need for the op-amp which was cleaning up the signal and the one I used as a comparator (which is also incredibly slow).
It turns out the project is pretty simple on the hardware side, and if you have any experience with programming the atmega’s and serial communication the code should be pretty basic as well.