This little board has everything you need to save data from a retrocomputer, a PC, a microcontroller or just about anything else you can think off. On the other side of things it'll save data to pretty much any media that can record and play audio. 

This relatively tiny board of less than 50x15mm gives you an easy way to put any old audio device to good use, especially for era appropriate retrocomputer data storage or just for the fun of putting data somewhere new and interesting. 

Finally you have a good excuse to save that old cassette player and put it to good use instead! 

And even better: If you have some old tapes lying around with invaluable data from the 70's or 80's, the Simple Universal Modem, will make it super easy to read the data with a modern MCU, Arduino, Raspberry Pi, since it has an encoding agnostic demodulation interface. 

To demonstrate how it can be used with old hardware - on both sides - I have successfully saved and played back 1200bps data, in Kansas City Standard format, using my #ABN6502 SBC R1 microcomputer. 

Technical description

On the technical side of things this board has a simple 5 stage RC filter along with an Emitter Follower buffer transistor used for filtering and modulating a square wave into a sine-like signal, that will record and playback better on tape and other old mediums than a harsh square wave that contains harmonics and other sources of analog trouble. 

The demodulator consists of a LM393 comparator set up as a zero crossing detector, outputting a nice clean square wave for digital circuits to decode.

Since there's a significant lack of standardization for TRRS pinouts, the modem simply takes advantage of that and leaves the pins jumper selectable according to the silkscreen text on the back of the PCB. 

The TRRS jack's poles are meant to be configured using J1-J4 jumpers. An "iPhone" TRRS cable has the pinout right, left, GND, microphone - "Android" TRRS cable usually is right, left, microphone, GND. A standard TRS cable plugged into this would be right, left, GND, GND - for my 1972 tape deck I used a 3.5mm -> RCA/Phono cable and had it configured for ModIn, Modout, GND, GND, and then had it connected to left line out and left AUX in. 

Caveats include that you still have to generate a square wave and not just a serial signal, but the positive side to that is that you are less locked in to a certain baud rate(considering the tx RC filter can also be changed with new values), adding to the universality of the board. 

I/O requirements

TX:
The component values are configured to expect a 1200/2400Hz FSK modulated square wave on the DataOut(DOut on the silkscreen) pin. This signal is band pass filtered to make a 1V peak to peak sine wave that is output on the ModOut pin(Capacitively coupled) - this signal works best with a "line in"/AUX in on the recording device. A microphone input typically has too much amplification but could work if it's turned down sufficiently. 

RX:
The ModIn pin expects an FSK modulated sine wave(Audio). 1V peak to peak recommended input. Output on the DataIn(DIn on the silkscreen) is a 5V square wave that can be used to decode the FSK decoding using an active low interrupt pin. The ModIn pin is not filtered but capacitively coupled using a 100nF cap. It's been tested using computer audio and tape with 1200/2400Hz FSK.

Software suggestions

For my #ABN6502 SBC R1 I simply generate a square wave using Timer 1 and PB7 for TX and count the interval between falling edges using Timer 1 and CA1 interrupts for RX. The source is open for that project too, so check it out. 

If you just need a cheap way to get data to an MCU or retrocomputer, you can use minimodem (available on many linux package managers and homebrew for macOS) to convert a binary to a format of choice for your project. 

For Arduino, etc, using a timer and interrupts should work perfectly fine too - I haven't had the time to try that out though.