Hey! This is an old blog post about MicroAPRS. For the most up-to-date info and latest firmware downloads, check out the MicroAPRS page.

I’ve had a few people ask me how to use MicroModem for APRS stuff, and since APRS is awesome, I figured it would probably be a good idea to create an APRS-specific fork of MicroModem to make it much easier to use it for APRS applications. So here it is, the first version of MicroAPRS. It still needs many features, and may contain some bugs, since this is basically just two days of work, but it all works and it makes it quite easy to send and receive APRS packets with MicroModem. Here’s a short demo:

For info on how to build the hardware, refer to the MicroModem post, and the documentation included in the GitHub repo. Once you have the modem built, and the firmware flashed, you can control it over the serial connection.
Here’s the GitHub repository.

General info

Commands are sent to the modem over a serial connection. To connect to the modem, use 9600 baud, 8N1. Generally, the first character of your command specify what you want to do, such as setting an option or sending a packet. For example, you can send a packet with the content “Hi APRS” by sending “!Hi APRS” to the modem. The “!” character specifies that all following data should be treated as packet content, and be sent out. But please note that “Hi APRS” is not really a valid APRS packet, even though it will be sent out, digipeated and such just fine. It just doesn’t follow any “supported” packet format.

Serial commands

Command Description
!<data> Send raw packet
@<cmt> Send location update (cmt = optional comment)
#<msg> Send APRS message
c<call> Set your callsign
d<call> Set destination callsign
1<call> Set PATH1 callsign
2<call> Set PATH2 callsign
sc<ssid> Set your SSID
sd<ssid> Set destination SSID
s1<ssid> Set PATH1 SSID
s2<ssid> Set PATH2 SSID
lla<LAT> Set latitude (NMEA-format, eg 4903.50N)
llo<LON> Set latitude (NMEA-format, eg 07201.75W)
lp<0-9> Set TX power info
lh<0-9> Set antenna height info
lg<0-9> Set antenna gain info
ld<0-9> Set antenna directivity info
ls<sym> Select symbol
lt<s/a> Select symbol table (standard/alternate)
mc<call> Set message recipient callsign
ms<ssid> Set message recipient SSID
mr<ssid> Retry last message
ma<1/0> Automatic message ACK on/off
ps<1/0> Print SRC on/off
pd<1/0> Print DST on/off
pp<1/0> Print PATH on/off
pm<1/0> Print DATA on/off
pi<1/0> Print INFO on/off
v<1/0> Verbose mode on/off
V<1/0> Silent mode on/off
w<XXX> Set preamble time in ms
W<XXX> Set transmission tail time in ms
S Save configuration
L Load configuration
C Clear configuration
H Print configuration


To set your callsign to XX1YYY-5, and then save the configuration, send these three commands:


To send an APRS message to ZZ5ABC-1 with the content “Hi there!”, send these commands:

#Hi there!

To send a location update, with the comment “MicroAPRS”, you can do something like this:


To send an APRS message to ZZ5ABC-1 with the content “Hi there!”, using a raw packet, send this command:

!:ZZ5ABC-1 :Hi there!{01

Here’s an example of how to send a location update with power, height and gain information, using a raw packet:

!=5230.70N/01043.70E-PHG2410Arduino MicroAPRS

62 thoughts on “MicroAPRS

  1. Mark,
    The command for the sc ( set SSID ) in this version is not working…
    I type sc8 but the output was 9W2SVT–25, I type any number but it still output as –25
    The previous version sc command seems to be working …
    I reset the modem a few times but still the same results…
    Bcos of this, I did not test the Save or Load config to the EEPROM…

    1. Ah, I must have messed something up. I made a couple of quick updates earlier to slim down the compiled size a few kilobytes, and must have overlooked something. Thanks for the notice! I’ll have a look right away…

      1. Ok, I re-flashed with the latest firmware and tested the sc (SSID) is working and the Save to EEPROM is also working… and it auto reload the settings from the EEPROM… this Save to EEPROM feature is awesome ..

        1. Yep, if it detects a saved configuration, it will load it πŸ™‚ Glad you like it!

  2. Mark,
    good job on MicroAPRS/Modem. For the APRS could you add the configurable delay before tx please, adjustable in milliseconds 0-1000. That would mean it can be more robust in transmission with some radios.

      1. Thanks for posting that Stanley! And still sorry for not really working on MicroAPRS, but I’m almost done rebuilding my house, so soon I will have time again πŸ™‚
        I will add a configurable preamble when I get back to MicroAPRS πŸ™‚

        1. Dear Musti,
          This is good stuff.. what are you using this for ?
          I was also thinking of using the NavSpark for my APRS Tracker but later switch to Mini Pro 5V / Teensy 3.1 instead…
          Currently using 2 pieces of Arduino Mini Pro and as for the GPS, I have tried a few from Skylab SKM53 and uBlox Neo-6m … Tried a BD2 GPS but the tinyGPS+ libs does not support the NMEA sentences ….
          My repo are here : https://github.com/stanleyseow/ArduinoTracker-MicroAPRS

          1. Stanley,
            I have seen you project, very nice work as well.
            The purpose of MicroAPRS+Navspark is to have a very compact and low-cost tracker (microaprs 6USD, Navspark 25USD, radio 35USD) to clip onto a radio and either use in a car or outdoor activities. The design here is really just joining two existing projects with minimal effort.
            Navspark is nice, because it has a very extensive gps library on board and you can do a lot of calculations, not just getting the location.

  3. Hi Mark,
    I build and flashed the latest firmware to an arduino pro-mini board and it works like a charm!
    But unfortunately, it seems failed to decode some of my aprs traffic records.
    I tried to analysis the recorded wave files in cool-edit and all seems ok. I tried some other APRS device which is equipped with FX604 and the decode is success.
    Any suggestions on that kind of compatible issue ?
    I could provide those files if you need.

    1. Hi Shawn!
      Thanks for the feedback! It would be cool if you could send me the recordings to my email, then I can try it out with some of my builds and see why it doesn’t decode. Did you try adjusting the output volume of the radio up and down a bit? I generally find that you need to find that “sweet spot” of volume to get the best decode results.

      1. Mark,
        The files are sent to you via email and please check with that.
        By the way, I found that CrossPack-AVR on OSX makes a 28K image with MODEM_DEBUG=1 and ENABLE_HELP=1, while avr-gcc on ubuntu12 produce a 32K+ image.
        Hope that helps.

    2. Hi, I hv been using arduino UNO/mini-pro for a while running the Microaprs firmware and this is what I found out about the decoding issue :-
      When the HT (mine is a wouxun UVD1P ) running on built-in battery, the decode works fine..
      When I run the HT using a battery eliminator plugged into a 12V SMPS, the noise from the SMPS seems to have travelled to the Microaprs ( seen using an oscilloscope ) … and the decode is intermittent …
      When I run the HT using a linear 12V power supply (that was used to power up my mobile rig), this is better with less noise but the 60Hz from the mains can be seen on the oscilloscope…
      I search the web for some bandpass filters calculators to only allow 1200-2200Hz freq to pass into the MicroAPRS, it does improve the decoding a bit… but I did not have a complete test as I was more focusing on sending APRS packets instead of receiving them at the moment…
      Hope this info helps to give you a bit of hint on where to look …
      I hv another APRS product net51tnc with FX604, if you could passed me the files too, I can help to test it out too..

      1. Stanley,
        I’v tested those files with a FX604 device. Actually I got those files from the author of the 51TNC boards. πŸ˜‰

    1. Hi Shawn! Sorry I was a bit slow getting back to you! It’s strange, but I just tried out the files you send me, and they all decode fine here both the “fail-to-decode” and “hard-to-decode” ones. Only thing I can think of might be that the arduino is a little off frequency. I have seen this a couple of times, where the clock frequency of the processor will be so far off 16 MHz that the timing for decoding will be wrong and the phase synchronization algorithm will not be able to keep up. You can measure the frequency of the processor and manually key the offset it into the “FREQUENCY_CORRECTION” constant in “hardware.c”.
      Your SMD version is cool! Please let me know how it works and send me a photo if you have it manufactured!

  4. Hi,
    I would like to buy one of your modems, but everything is listed as out of stock. Do you know when there will be stock?
    Also, where are you based? Europe, us, uk?

    1. Hi Bastiaan!
      Thanks a lot for your interest! When I put them up for sale I only had a small stock of the modems, and they sold out much quicker than I had anticipated! I ordered a new batch of PCB immediately, but the lead time is a few weeks for the manufacturing.
      The good news is that the new batch of PCBs was shipped a few days ago, and is currently in transit. According to the tracking information, I should have them on the 24th of october. Then I can start assembling more modems, so you will be able to order one very soon! I let you know once I have the PCBs in hand πŸ™‚
      I am based in Denmark, in Europe.

      1. Thanks for the response!
        I will wait till you have them in stock. Im in the Netherlands, so no customs-hassle.

        1. Hi Bastiaan!
          I now have stock again, so I can send you a modem! πŸ™‚
          I don’t know if you wanted the version in a case, but that is the only one currently not available, as I’m upgrading the design on the case a little. I will probably have it finished this evening, so if you wanted the case, hang tight a little longer!

  5. Dear Mark,
    Any plans to support KISS TNC in the near future ??
    Currently, how are your users using the modem from a PC ?
    Any PC APRS software that supports the current command line version ?

    1. Hi Stanley!
      Yes, I am definitely going to implement the KISS serial protocol very soon. There is currently no PC software that supports the current MicroAPRS serial protocol. It was made to make it simple for a human being to talk to the modem over a serial connection, and easy to write your own software to control it, for example from another Arduino. Anyways, KISS support is coming, and I hope to have it going really soon. I just wanted to get new new boards tested and building a few of those before I started messing with the firmware again πŸ™‚
      Other good things coming in the near future includes an Arduino IDE compatible APRS library for using with the modem. This will make it really neat and easy to create your own firmware straight from the Arduino IDE, so people wont have to know about makefiles and avrdude and hex images and such πŸ™‚

      1. Mark.. glad to hear that…
        Yes, I’m using another Arduino to control the modem using commands, so far it is working really well and easy to debug too ( just see the commands being sent out )…
        For KISS TNC functions to PC/linux s/w, I was testing the http://www.mobilinkd.com/2014/09/11/arduino-kiss-tnc/ ( also another BERTOS forks ) and found that it uses fewer components yet able to Rx and Tx just fine…
        For loading the firmware, currently, I’m using Xloader to load both the MicroAPRS firmware (unmodified, need to be done once) and my SVTrackR firmware updates to my customers ..
        Xloader is really easy to use and no need for them to learn those avrdude commands…

  6. Hello Stanley
    > For KISS TNC functions to PC/linux s/w, I was testing the http://www.mobilinkd.com/2014/09/11/arduino-kiss-tnc/ ( also another BERTOS forks ) and found that it uses fewer components yet able to Rx and Tx just fine…
    Today, for the beginning, i also did test at least the receiving function and there was no problem when using it in conjunction with APRSDROID.
    Did you really test Tx mode also?
    I can hardly imagine, it also will work without those 4 resistors connected to D4-D7.
    The original Mobilinkd schematics also is showing it.
    73 de Klaus, DJ7OO

  7. Hi Mark,
    is there a way to make PTT LOW active?
    Because i use a tiny transmitter which can be directly triggered via the MCU.
    But it needs a LOW PTT trigger. So some people can save a part more (transistor).

    1. Hi Taner!
      Yes, that would be quite simple! Unfortunately it is not implemented as setting in the modem at the moment, but you could easily modify the source for this. Look at line 146 in hardware.c:
      PORTD = (afsk_dac_isr(modem) & 0xF0) | BV(3);
      This line sets the output for the DAC, and also triggers the PTT pin HIGH. The ” | BV(3)” is what sets bit 3 on PORTD (which is the PTT pin) to high on transmit. You could simply leave this out, to have it pull the pin LOW instead. You would also need to modify the following lines beginning at line 152:
      if (hw_ptt_on) {
      PORTD = 136;
      } else {
      PORTD = 128;
      Instead you could do somthing like this:
      if (hw_ptt_on) {
      PORTD = 128;
      } else {
      PORTD = 136;
      That would make sure that the pin was set HIGH when nothing was going out. I hope this helps!

  8. Hi Mark,
    it works. Thank you!
    For a future precompiled version of your firmware:
    I think it makes sense to make TX preamble time configurable via Serial command because every transceiver is different. So not every user must compile itself.

    1. Great to hear it works!
      Yes, I agree with the configurable preamble. I will include an option for this in the next release. I am working on some different things now, so will include that as well πŸ™‚

  9. Hi Mark,
    Great project – I just found it today. Now I have to setup my AVR programming environment on Windows 8.1 and try to flash a mcu … BTW, I have mentioned your project on my blog, hope that’s OK for you πŸ˜‰
    Kind regards from Switzerland
    Stefan, HB9TWS

    1. Hi Stefan!
      Thanks a lot for the mention on your blog! That’s very cool! I’m glad that you’ve found it useful, and I hope your version of the modem will work great! I don’t know if you have previous experience with flashing the ATmega MCUs directly in circuit, but here’s a few tips πŸ™‚ I find it easiest to first flash an arduino-compatible bootloader (like Optiboot) over the SPI interface. You can use another arduino with an ISP sketch uploaded for doing that. Then afterwards, it’s easy to just flash new firmwares with a USB to serial adapter from the computer. I normally use the “avrdude” program for this, but I don’t know if it’s the same on windows. Anyways, here’s an example of how I use it when I flash a new MicroAPRS firmware:
      avrdude -p m328p -c arduino -P /dev/ttyUSB -b 115200 -U flash:w:images/Modem.hex
      The -p switch specifies what MCU we are programming, the “-c arduino” because we have an arduino-compatible bootloader, -P is obviously the serial port, -b is baudrate and finally -U specifies the operation to do (operate on flash memory):(write):(filename):(format) πŸ™‚

  10. Hi, Mark
    i have repetead you MicroAPRS , everything works well, the only thing that is missing is KISS support
    Also, is it possible to make the speed more than 9600? 9600 is very slow.
    Thanks a lot,

  11. Hi Dmitry! Great to hear you build it and it’s working great! You are in luck, because I have just finished implementing KISS support for MicroAPRS. I am actually testing it right now with Xastir on linux, and it is working great πŸ™‚ You can see packets on APRS.fi here:
    I will test it a little bit more and then I will release precompiled binaries and source later today probably πŸ™‚
    You can easily change the baudrate in the source-code if you want! Just have a look at line 87 in the main.c file, it should be apparent there πŸ™‚

  12. Dear Mark..
    Would like to seek your advise on adding a bandpass filter circuit on A0 …
    As I am adding a OLED display, getting clean signal on A0 is really important for effective packet decoding during mobile operations…
    In my case, I notice my Rx LED keeps blinking even though there are no packets from the radio…
    I suspect there are lots of line noise ( Peak to Peak 100mW ) coming from both the radio ( powered by a car battery / battery eliminator ) and from the 5V USB supply from the PC ..
    I notice the below URL have a slightly different circuit than yours..
    What are you thought on this ?

    1. Hi Stanley
      I agree it is a good idea to add some more filtering to the input, and as you suggest this should be reasonable to do with a bandpass, or maybe even just a low-pass filter. I’ll have a look at those circuits and test them out. I’ll also draw up a few different filters and test them out as well. Luckily I have a VERY noisy regulator in my car, so that should give me something good to test on πŸ˜‰

      1. Hi there,
        I have build an ATMega 328p based modem running the MicroAPRS software and experienced also some decoding problems with relatively low modulations. I guess filtering the audio signal with a bandpass will improve the situation. I am not able to decode APRS frames from my Yaesu VX-8G which is known for low audio modulation for it’s APRS transmissions. I will do also some more experiments and report my results

        1. Hi Stanley,
          The first two OpAmps are used for filtering the incoming Signal. The resistors and capacitors in these two stages are designed for building a bandpass 1200-2200Hz. This part of the circuit is basically taken over from Josef (look above at the comment from Klaus for the link).
          I did some experiments with the bandpass only and found that a lot of APRS frames could still not be decoded, also the ones coming from my Yaesu VX-8G sitting just next to my APRS receiver. The audio level was two low – even with an excellent SN/R. Since I can’t change the volume on my Receivers data port I added a amplifier stage. The decoding of the amplified and filtered Signal now works very well πŸ™‚
          Of course you could use a FX604 chip which comes with an integrated bandbass filter and an amplifier stage in addition to a modem and Demodulator. But the FX604 supports only V.23 and not Bell 202 signals. If you want to go that route than you would need to use the FX614.
          But in this case you your TNC design would be different – you can’t use the FX614 for the MicroAPRS ( it comes already with the modem/Demodulator part). Maybe you could connect the FX614 to an Arduino and try to find some other software or write it yourself.
          Using the MicroAPRS with some additional parts was a good choice for me: I had all parts at home, I could use the MicroAPRS as is with just some additional parts – and designing analog circuits is fun for me πŸ™‚

          1. Dear Stefan,
            Thank you for the long explanation… and remind me that the FX614 could not be used with MicroAPRS on where my SVTrackR ( http://9w2svt.blogspot.com/2014/07/building-open-source-arduino-aprs.html ) was develop on… just added the codes to support a 0.96″ OLED display …
            I went to electronic street in the city and purchased 2 TL074 for testing purpose…
            Will test this filtering circuit soon .. but my 60x60mm modem board is quite limited space for the extra ICs and components…
            Somehow when I turn the handy volume to 75-80%, it managed to decodes
            “most” of the packets at louder volume…
            Stanley / 9W2SVT / KG7OOY

          2. Some updates, my SVTrackR seems to decodes VX-8G fine using MicroAPRS plus my APRS Tracker … Here are some photos with a 0.96″ OLED tiny display …
            A photo of my tiny display below :-
            Stanley / 9W2SVT / KG7OOY

          3. Hi Stanley,
            inspired from your project i build something similar. But even smaller πŸ™‚
            I made a very very very small and complete APRS transceiver. It is just the size of a matchbox!
            It contains an arduino pro mini as modem (MicroAPRS), an Arduino pro mini as “controller” an 0.96 inch OLED, a small GPS Receiver and an DORJI DRA818V micro VHF Transceiver (1 Watt TX PWR with built in receiver). All this parts fitted in a size of a Matchbox!
            See my pictures:
            At this time, the receiver shows received positions, distance and bearing to received station and incoming messages addressed to me.
            If someone will help me to make this project better, please contact me πŸ™‚
            -Make Software complete
            -show the last received stations in a list (maybe last heard 3)
            -save the last received messages addressed to me (maybe last 5 messages)
            -add two buttons
            -make call/SSID configurable via buttons
            -if possible make software working on ONE AtMega AVR instead two to make board smaller and less power consumption
            -Add a DC-DC UP Converter to make the Transceiver portable via Li-Ion battery.
            -Add a Li-ion charging circuit
            -Design a PCB Layout optimized in Size
            -Add a Low-pass filter to VHF module
            -Design a case to print with 3D printer

          4. Wow, Taner!
            That’s really cool! Great job, I’m really impressed. I’m looking forward to seeing more about this project! Once you’re done I’ll be happy to print a case for you, if you don’t have access to a 3D-printer yourself!

          5. Hi Mark,
            thank you. Your MicroAPRS is essential for my project. So i have to thank you!
            And i bought a 3D printer before one week for this project.
            Thats why i recommender to use Teensy. So i can make everything on one chip!
            I’m looking forward for MicroAPRS for Arduino IDE you are working on. So maybe i can make work everything on one chip.
            When the project finished, only one pcb with one ATmega and Transceiver Module ist enough. The Hardware will shrink about 50% more! So the complete Hardware INCLUDING Li-Ion battery will fit into a matchbox!
            A awesome small APRS Transceiver with internal GPS, 1 Watt TX PWR. Capability to receive APRS Messgaes and so on.
            To save battery consumption. I think its a very good idea to implement MIC-E Format to your MicroAPRS TX Path. So the TX time shrinks. I’s good for frequency economy on heavy used APRS frequency and battery usage.

  13. Hi Guys,
    maybe its a better idea to swap to an “Teensy 3.1” Board instead using a Arduino.
    Teensy is small, really fast (Cortex M4, 72MHz), has a lot of Flash, RAM, built in 12 bit DAC and real ADC inside! No resistor DAC required, so it is easy to build a Modem and i think better signal processing in both ways. No need to pre amp incoming audio to read.
    Internal ADC, maybe no need to filtering the audio from Receiver before!
    And so on…
    Please take a look: https://www.pjrc.com/teensy/teensy31.html

    1. Hi Taner!
      Thanks for the suggestion! I do know about the Teensy, it’s a very nice and very capable board! But it’s a bit overkill for an APRS modem, I think. Also, the Cortex M4 processor on the board is more than double the price of an ATmega, so cost-design wise, I think it would be a bad decision to use a chip that will sit idle most of the time. I am generally moving away from building these modems with pre-made boards like Microduino or Teensy, since it is much too expensive.
      The next version of the modem will be an integrated SMD design with processor, usb and everything on one board. And by using the ATmega chips, I can maintain binary compatibility with hardware that many many people have already. This means that people can easily build the modem themselves, or buy a premade integrated version directly from me, whichever they choose. I think that’s a great model, and really makes the open source nature of the project be directly useful.

  14. Dear Mark / Taner / Stefan / Other MicroAPRS users,
    With the current interests and a few fork of yr MicroAPRS modems, perhaps we should move to the next stage .. continue more detail discuss / collaborations in a group or forums instead of in Comment posting…
    Mark, any suggestions to setup a group in either Google Plus or Yahoo Groups or just plain forum ??
    Stanley / 9W2SVT / KG7OOY

    1. You’re absolutely right Stanley, this is getting a bit unorganized πŸ™‚ I could easily set up a forum on this site. What do you think would be the best approach?

  15. Setting up a forum on your side would give you some more control (capablities, maybe administration) and keep everything together in one place. It would not create new dependencies of your website to some other Services / Servers. Some people might find it easier to setup a Google Group or Yahoo Group than setting up their own forum – but this seems not to be a problem for you πŸ˜‰
    Depending of the activity / amount of users / number of posts / type and size of posts (e.g. pictures) – running your own forum could consume some resources ( cpu, mem, diskspace) of your webserver. But I think you would not have to expect mass usage of your forum that would let kick-in a very high resouce demand.
    So in summary I would think it is basically a matter of your taste πŸ˜‰

Leave a Reply

Your email address will not be published. Required fields are marked *