What is it?
MicroModem is an open-source implementation of a 1200-baud AFSK / Bell 202 modem on the popular ATmega328p microprocessor. MicroModem can be used for things like ham radio APRS, AX.25, TCP/IP over SLIP, experimentation with mesh-networks, long-range wireless communication with sensors (Or friends! Or strangers!). It basically comes in two flavors: Prebuilt or DIY.
It is simple enough that, if you have some basic electronics experience, you can understand and build it yourself with a few components and an Arduino. You can also get a more advanced and prebuilt, fully tested MicroModem directly from me. I manufacture them personally, to the highest quality.
Please note that the resources listed here for building your own MicroModem are for an earlier, more simple version, than the one I currently offer for sale. While the two modems are functionally identical, the version I offer for sale has some technical refinements, and is implemented as an integrated board with MCU, USB and everything on one board, measuring only 3×5 cm. The DIY version is a board with all the external circuitry needed for turning a standard Arduino (or compatible like Microduino) into a MicroModem!
Can I buy it?
Yes! If you don’t feel like building it yourself, I sell a completed version flashed with the firmware of your choice, fully tested and ready to go. Just visit my shop and browse through the options! Buying the modem from me helps me fund continued development of the firmware and hardware. I also sell kits for the easy-to-build version. The kit comes with a PCB and all needed through-hole components for easy assembly!
Here’s a list of specifications for the version I offer for sale. If you have any other questions regarding specs, just send me an email, or ask in a comment on this page.
- ATmega328p @ 16MHz (2KB RAM / 32KB flash)
- Powered from USB or external regulated 5V source
- 51mA idle power consumption
- Operating range: -20°C to 70°C (non-condensing)
- Modulated analog output level adjustable from approximately 15mV to 1.5V peak-to-peak
- Minimum analog input level for good decode is about 100mV peak-to-peak
- ADC running on 3.3v reference
- Arduino compatible (You can program the board from the Arduino IDE, over USB)
- USB Mini-B (USB-powered)
- Audio out (modulator output)
- Audio in (demodulator input)
- Ground x2
- VCC (5V) x2
- 3.3V output (Max current 50mA)
- PTT_V+ (for Kenwood style PTT)
- PTT (logic level PTT signal)
- UART – RX / TX (Arduino pins D0 & D1)
- I2C – SCL / SDA (Arduino pins A4 & A5)
- SCLK (Arduino pin D11)
- MISO (Arduino pin D12)
- MOSI (Arduino pin D13)
- DTR (Reset pin)
- Flexible firmware support, use one of the provided firmwares, or create your own!
- APRS KISS
- APRS SimpleSerial
- SLIP TCP/IP
- Arduino APRS library available, create your own APRS firmwares easily!
- All firmwares are Open Source, and available on GitHub
- Hardware design is Open Source, and available on GitHub
How do I build it myself?
If you want to build MicroModem yourself, you should have a look at the GitHub repository for MicroModem. It contains all the source-code, schematics, PCB layout, documentation and everything you need to get started. If you’re not familiar with GitHub and just want to get going, here’s the basic resources:
- Quickstart Guide (with assembly notes)
- PCB Layout
- General purpose firmware
- If you want to use this for APRS, take a look at MicroAPRS, the APRS firmware for MicroModem
The general-purpose firmware
The MicroModemGP firmware is ideal if you want to build your own applications running over radio, or just want to experiment. It lets you send packets over almost any radio with up to 792 bytes of data per packet. This means you can also use SLIP to use the modem as an TCP/IP interface. The MicroModemGP firmware features forward error correction (12,8-hamming code), 12-byte interleaving, and CRC checksumming on all packets. It should be easy to expand the protocol to support addressing and routing, encryption, or whatever you find useful. If you have a cool idea but aren’t sure how to go about it, let me know and I will try and help! The protocol was written as an example of how to implement a basic protocol with error correction.
Don’t expect live video-streaming and rocking out to DI.fm over this though. This is only 1.2 kilobits per second. Loading Hackaday Retro took around 15 minutes when I tried. If you’re not using TCP/IP you will have better throughput than that though. But TCP/IP works fine for very simple synchroneous-style connections (like: connect to server -> send request -> wait for response -> send another request -> receive another response -> disconnect). Anything complicated, and you will get a lot of packet loss!
I designed MicroModem to be as simple an introduction to digital wireless communication as possible, while still being very flexible and functional. Micromodem will let you learn the basics in how to build digital wireless systems from scratch, and also offer an interesting platform to build further projects on. I hope you will find it educational and useful!
The source code for the modem firmware is very heavily commented, and should be easy to understand. In fact there is more comments than actual code most places. Some of the concepts can be a little daunting just from looking at the code, but it is actually all quite simple, when taken one step at a time. If you have any questions, drop me a comment here and I will try to help out.
Connecting to a Radio
You will need to connect the Audio In port of the modem to the speaker output of your radio, and the Audio Out port of the modem to the input of your radio. Most handheld radios will need microphone level audio on the input port, otherwise the transmitted audio will distort, making packets hard to decode. You should also also connect GND from your radio (usually the GND pin of the speaker jack) to the GND port of the modem. The PTT circuit works by closing a switch (using a MOSFET) between the PTT+ and PTT_GND pins. Most Kenwood-style handhelds will have +3v on the ground pin of the MIC jack, that will trigger PTT when connected to the ground pin on the SPK jack. The PTT connector supplies a logic-level PTT signal. If you can trigger your radios PTT like this, use this connector instead.