Arduino Encoded and Modulated Laser and Infrared Serial Communication

Introduction: Arduino Encoded and Modulated Laser and Infrared Serial Communication

About: Hi, this page is about robotics, electronics, embedded systems, drones, RC and other cool DIY stuff. I aim to manufacture robots & electronics. To see the projects I am developing, visit my github: https...

Hey there! Do you want to learn how to communicate wirelessly between two computers using lasers / LED's and photo-receivers? Need to send a signal that is robust to noise? Here is the solution for you.

This is an arduino library which enables you to use a simple laser or LED to transmit characters between two arduinos (transmitter arduino with the laser to receiver arduino with a photodiode). Each byte of data is encoded (but not encrypted) to add some robustness to noise during the transmission and then modulated. I originally wrote this as part of a netduino robotics project for uni, but I've since modified it to work with an arduino. I've tested it and it works with an LED also, but the range is slightly better with the laser.

If you want to learn how the code works, read step 1. If you just want to test that it works or incorporate it into one of your projects, skip to step 2.

What you need can be found on eBay:

Step 1: How It Works (In Chronological Order):

1. Hamming(7,4) Encoding:

  • each byte of data (in ASCII: D7 D6 D5...D1 D0, e.g. D3 is 3rd digit of the byte) typed into the serial window is split into its most significant and least significant 4 bits, AKA nibbles: D7...D4 and D3...D0
  • each nibble is encoded via hamming encoding, producing an unsigned 8 bit integer. The extra 4 bits contain information about the original nibble to help detect errors and recover the original nibble in case some of the data was scrambled due to noise in the transmission. The encoding / decoding algorithm has its limits on how much unscrambling it can do but it is certainly more efficient than sending multiple times to improve accuracy.
  • the encoding is as follows: y = x G, where x = (D0 D1 D2 D3) and G is a Hamming(7,4) matrix, producing y = (H0, H1, H2, D0, D1, D2, D3) and then we add an additional bit of even parity at the front y' = (P0, H0, H1, H2, D0, D1, D2, D3) where the parity bit P0 is just the XOR sum of the other bits.
  • the two encoded nibbles (now 8 bits each) are concatenated, least significant byte first to product a 16-bit integer

2. Manchester Modulation:

  • the 16-bit integer is then split into is least and most significant bytes
  • each byte is modulated via manchester modulation: 2 start bits to let the receiver know it is about to receive actual data and not just stray signals, then the byte followed by 1 stop bit, producing 11 bits. Each of those 11 bits is represented with two half-bits: first half-bit is the original XOR'ed with 1 and the second is XOR'ed with 0 instead, this adds a clock pulse into the signal. This produces 22 bits for each byte.
  • the pair of 22 bits are joined end on end, least significant first, producing 44 bits of data

3. Transmission:

The 44-bit data is sent via the laser or LED, 1's are on and 0's are off

4. Manchester De-Modulation:

The 44-bit signal is received by the photo-detector and manchester-demodulated (reverse algorithm of modulation) to reconstruct the 16-bit encoded signal

5. Hamming Decoding:

The 16-bit demodulated signal is then hamming decoded to reproduce the original byte

6. Printing Message:

The byte is then printed on the serial window

Step 2: Install the Library

The library I wrote, LumenWire, can be found on my github repository here. Download it to your computer, you won't need the file though. Just add the HT_LumenWire folder to your libraries folder in the arduino folder on your two computers.

If you come across bugs in the code or have simple recommendations on how to improve the performance or add extra functionality / features, you're more than welcome to let me know in the comments section. Thanks!

Step 3: Test the Setup:

  1. open the arduino application
  2. open File -> Examples -> HT_LumenWire and select either the photoreceiver or transmitter examples
  3. plug in the arduino and select the appropriate COM port, then upload the transmitter / receiver sketches to their respective arduinos
  4. connect the laser as follows: laser VCC pin to pin 6, - pin to ground
  5. connect the photodiode as follows: photodiode signal on pin 7, power pins as normal
  6. open the serial window (spyglass symbol in the IDE) on both computers
  7. point the laser or LED to the photodiode
  8. enter a character or phrase in the serial window on the computer doing the transmitting and press enter to send
  9. you should receive the message on the receiver serial window automatically

Now that you've verified the setup works, what you can do with it is up to your imagination. Do you want to further refine or modify the library to add extra features? Are you planning to incorporate it into a bigger project? Have fun.

If you enjoyed this instructable or found it educational, why not stay tuned for future projects by following me on Instructables and on Facebook / Twitter / Google+.

If you enjoyed this instructable and would like to see more like this, please consider supporting me by purchasing your materials for this project through the affiliate links in the materials section or donating below:


Bitcoin: 1Mqe7et24Lz4DY1RUN4iAQVHkvJsdFArKR

Ethereum: 0x6d8248db1cdea6a783cb6b41ae67bb8e6144f479

Litecoin: LW6PWESqsr8xHw6EJ9WLbsQsAyTvPnwnxJ

Dash: Xemv7jud697v8tQmKfNFoMxfkd17ZayH2t

Your support is greatly appreciated! Happy DIY'ing!



    • Metalworking Contest

      Metalworking Contest
    • Fix It! Contest

      Fix It! Contest
    • Tiny Home Contest

      Tiny Home Contest

    18 Discussions


    Question 4 days ago

    2nd Question: Hey i was wondering if it is possible to use one arduino as the transmitter and reciever. I understand that both codes are using the same timers so perhaps i could change one of them within the library? How would i go about combining both programs? Thank you

    1 more answer

    Maybe you might be able to get away without changing the library. Try combining the code from the two arduino example files (transmitter and receiver codes) into one file. See what happens.

    Hello, Can you modulate two lasers with the same information? What to change the code ?, Thanks!

    1 reply

    Doesn't sound like any changes are needed in the code, just connect two lasers to the same data pin and it should work.


    Question 7 days ago

    Hi, can you explain how i can modify the code to send analog data instead of data from the serial window? Thank you

    1 more answer

    You could probably save the data as a string or array and loop over each character or element of the array. In the loop you would just hamming encode each byte and modulate as in the original code.

    Hey, It gives my that erro,, can you help me out..

    Arduino: 1.6.12 (Windows 10), Board: "Arduino/Genuino Uno"

    C:\Users\TEDY\AppData\Local\Temp\arduino_modified_sketch_373287\receiver.ino:15:32: fatal error: HT_hamming_encoder.h: No such file or directory

    #include <HT_hamming_encoder.h>


    compilation terminated.

    exit status 1

    Error compiling for board Arduino/Genuino Uno.

    This report would have more information with

    "Show verbose output during compilation"

    option enabled in File -> Preferences.

    5 replies

    Hi, have you installed the library? The error you are receiving indicates either the library hasn't been installed (in the libraries folder in the arduino application folder, wherever you've installed the arduino application on your computer) or you haven't restarted the arduino application after installing.

    I have the same problem, however I already included the library as you showed and some other video does, but still the same error

    Or perhaps you just need to update to the latest version of Arduino, as I see yours is outdated. That's another possible reason for error, not very likely, but worth updating just in case.

    Hi Tarek, at this point I see 3 possible errors:

    1. Note that there is more than one libraries folder in the Arduino folder, make sure to put my library in ...\Arduino\libraries and not ...Arduino\hardware\arduino\avr\libraries.

    2. arduino_modified_sketch_373287\receiver.ino, the arduino sketch being used must have the same name as the folder it is in, since they are different, that may be causing error.

    3. Why is your sketch in the AppData folder? Is that a good idea? I'd move it somewhere else like your Desktop or a personal folder for example and try again.

    Anyway, I tested it out on my computer by removing the library from ...\Arduino\libraries and compiling the receiver sketch and I get a similar error to you (except that my sketch isn't in the AppData folder but on the desktop).

    i think you code have a problem because every time i type in transmitting window and all i receive is that word and plus some symbol like "@ or # or $ or % " (1%,2# ,.... )and sometimes it's nothing ( " " ), and missing word ( Ex: Short but i receive is Shrt, shot, sor,... ) . Have you test it already ? we don't buy a receive module like you but i think I just need a sensor with 10K ohm between signal pin and VCC.

    3 replies

    Hi, yes I have tested it multiple times. It seems your problem is most likely on the receiver end. Make sure to use the same model receiver as the one in this instructable otherwise I can't guarantee you'll get the same results as me; my sensor doesn't just have resistors but a capacitor.

    I presume the capacitor is acting with the resistors as a low pass filter to filter out high frequency noise. So in your setup without the capacitor, the noise is coming through along with the signal and causing inteference.

    Hi Tuấn, not yet, I plan to add one and some more pictures / schematics soon. Thanks for asking!