Morse Code Interpreter

[Sulaiman Habsi] and two classmates put together a Morse Code interpreter as a class project at Sultan Qaboos University. The system listens to a morse code signal using a microphone, then translates that input to text which is displayed on this character LCD.

The breadboarded circuit feeds an audio signal from the microphone, through an OpAmp, to the ADC of an ATmega8 microcontroller. The captured signal is stored as a byte in a special way. The three least-significant bits signify how many total dots or dashes are contained in the character, the remaining bits represent those dots and dashes with zeros and ones. A full description of this process is included in a PDF linked in the article above. As you can see in the video after the break, the hardware waits to process all of the signals once the full message has been received.

This would be a great add-on for a Morse Code practice keyer.

10 thoughts on “Morse Code Interpreter

  1. I’m curious what speed it can handle.

    Anyone remember that Travolta movie where he listened to the local army base’s recorded Morse code. it was played in repeat really fast and he cracked it.

    Something about the Gardens and he told them Spring is late Water the south garden or something.

    Anyways my point, would be pretty cool if it could handle something like that.

  2. I’ve done similar. You might not even need the op-amp. I setup a zero-crossing detector at the input to the micro’s ADC with a decoupling cap, two diodes, and two resistors. Works great.

    1. i would be interested in a project where the arduino can have an audio signal fed into an (analog)? pin and the cw outputted on a 2×16 lcd and maybe a piezo speaker. im sure that there is enough processing power to accomplish this without external interfaces.

  3. Nice start! Glad to see morse code projects here.

    There’s a lot of room for improvement yet. A nice interpreter should do it in realtime and adapt to speed. This is especially important for practice. The code sent by a manual key by unexperienced sender is going to have a lot of speed deviations. Another thing that would be nice to see is a realtime (pseudo)graphical display of incoming signal, so you could see where exactly you make mistakes. For rhythm-challenged people like me it can be very helpful.

    Now that there’s an input opamp anyway, probably 2 of them in one package, one could implement a 2nd order bandpass filter to filter out ambient noise.

    I have other ideas about filtering but they’re unproved and I’m going to keep them for myself for the time being :)

    1. Some kind of pseudo-AI that weighed the likelihood between uncertain characters would be awesome, and help compensate for noise or inexperienced/poorly-skilled senders.

      Eg, if you thought you heard QRZ Q?Z ?RZ, it would figure out that it likely says QRZ QRZ QRZ and display that (with some kind of feedback showing the characters that were deduced).

  4. I’d use a cheap LM567 tone decoder…. Plus I’d listen for a few characters and then determine the speed and spacing of the sender and quickly jump back and decode from the first detected dit or dah.

  5. Pretty cool!

    I designed a headband with a motion detector that is sensitive enough to pick up the heartbeat and can thus easily detect rapid eye movements. And I wrote a program that plays audio tracks when it detects that I am dreaming. I can sometimes hear the songs in my dreams and act on that knowledge — by flying, for example.

    I have been training myself to blink in Morse Code patterns and have started writing a plugin that can decode blinking patterns in hope that I can transcribe live from within a dream one day. You can see my latest debugging session on LSDBase and download the raw data.

Leave a Reply

Please be kind and respectful to help make the comments section excellent. (Comment Policy)

This site uses Akismet to reduce spam. Learn how your comment data is processed.