What is it?

LibAPRS is a library for the Arduino IDE, that makes it easy to write your own APRS applications for a MicroModem, or compatible build. It allows you to send and receive APRS packets, location updates and messages using simple functions in the Arduino IDE. All the AFSK modulation/demodulation, AX.25 handling, and such is running transparently in the "background" in interrupts, so you can focus on implementing exactly what you want!

How do I get started?

The easiest way is to install the Unsigned.io Board Support Files in your Arduino IDE. There is a guide available on this page. When you add the files, LibAPRS will be automatically included. Remember to select "MicroModem" as the board for the library to become available (even if you are using a self-built modem).
You can also download the latest version of the library from the LibAPRS GitHub page, and place it in your Arduino libraries folder.
Take a look at the included example for an explanation of the different functions.

Resource usage

Compiling an Arduino sketch with just the library and nothing else uses around 4000 bytes of flash and 831 bytes of RAM, so there should be plenty of space left to implement your application. The library uses TIMER1 for running the interrupts, so don't change TIMER1 configuration!

Found a bug?

LibAPRS has been used in many different projects, from hoppy to commercial products, but there might still be bugs hiding somewhere. If you find one, please report it so I can fix it!

34 thoughts on “LibAPRS

  1. First of all, compliments for your work, it’s very interesting!
    I’ll give it a try on arduino as soon as I have some free time.
    I was wondering, can this library be easily modified to achieve a simpler ask1200 modem without the specific features of aprs, but mantaining the other features, as the ccir checksum or CDMA?
    Best regards.
    PS I’ve recently sent you an email to the address reported in your contact section, but it may have been lost.

    1. Hi Dan! I did get your mail, I have just been very busy finishing up everything regarding the new MicroModem release. I will send you a reply to your mail tomorrow!

      1. Mark:
        Can you copy me on your response to Dan Re: simple AFSK 1200 baud modem. I have the same interest. And I also want to implement CSMA without KISS. Your guidance is appreciated.
        p.s. you should also have an order from me for a test modem. thx

      2. Hi Mark
        I’m interested too on data transmission (no APRS) could you copy me too ?

      3. Also interested in this. May start modifying the library myself but if there has already been work done I would love to see it.

  2. In the example you use a GPS lib. Do you hav a link or something for that lib?

  3. Hi.
    I see you helped Tanner with changing the way the PTT works. High for RX and LOW for TX.
    I have looked through the files but cant seem to find the same lines i any of the lib files. Can you pleas advice on how to go about? Im trying to use the same radio as Tanner (DRA818V) in a tracker..

  4. Oy there,
    Thanks for this really nice lib. Looking incredible while browsing threw the code.
    My question is quite simple, you were talking about sending raw data and anything else with this library. Would it be possible to interact on the arduino console with serial monitor to send data directly, like you described at the MicroAPRS page. (! or #) or setting your callsign with c. I was not able use this commands nor have I found them in the library.
    Best regards

    1. To do this with the library, you would need to make a simple command parser yourself. If you need hints on how to do it, take a look at the source code for the SimpleSerial version of MicroAPRS!

  5. I am interested in this project. I was looking to do something like this myself so I could customize it as I have a couple projects in mind, but this is the next best thing. I have noticed that you don’t call out any pins for the communication. Is it possible to define different pins for different functions, or can I only uses the ones you defined (and which ones are those)? I also see you have a message command and position command, is it possible to just pass raw APRS data to it?
    Thank you for taking the time to make this library.

  6. i found the library on github, and I must really commend your work. The code is well-written and clearly documented. It’s one of those times where I enjoy reading code! Thumbs up!

  7. Hi everybody,
    can someone tell me if (and how)I’can send telemetry string with LibAPRS.
    What will be the syntax in arduino sketch ?
    I’want it to being displayed in APRS.fi web site.

  8. Hi, i’m using a arduino nano to send telemetry data with LibAPRS.
    It work very well . But as i add more feature , it come short of ram memory.
    Since i don’t use receive function i’wonder if i can delete some code in the library to free up space…
    Someone can help ?

    1. If you’re not receiving at all, you could decrease the size of the receive buffers to almost nothing to save a lot of RAM. That’d be the first thing I’d look at, probably the easiest!

      1. Thank you Mark,
        I’look at in AFSK.h file and changed that line :
        #define CONFIG_AFSK_RX_BUFLEN 64
        #define CONFIG_AFSK_RX_BUFLEN 1
        is that ok ?
        it dind’nt made difference to the free dynamic memory …

    2. Hi Isidore

      Can you share the right syntax for telemetry support?
      I nee to add 2-3 sensors and can not find HOW TO.

      Thanks in advance
      Eitan B

  9. I am trying to build the openmodem code and after fixing the case of Serial.h includes I still get bluetooth errors in main init and in the User/IO is there a known fix for this issue?

    1. Hi Bill
      There should be no issues with case in Serial.h. Are you maybe trying to build this inside the Arduino IDE? Also, what MCU are you targeting?

  10. The send commands work fine with string constants, but sting variables give an error in the Arduino IDE when trying to send a variable message:

    APRS_sendMsg(“123456789”, (myData.length())); // sends the length I want but obviously dummy data
    APRS_sendMsg(myData, (myData.length())); // gets an error cannot change string to void*

    The coding examples all use string constants.
    Any assistance would be welcome.

    1. Hi Ken
      That’s because the function expects a pointer to a char array. You can pass your string as a pointer by prefixing it with a “&”. So something like: APRS_sendMsg(&myData, myData.length()) should probably do.

      Pointers in C can be a bit confusing, and it’s definitely worth reading up on, it’ll save a lot of time and frustration in the long run! 🙂

    1. This is great! Thank you so much for the work! I’ll accept the pull request shortly.

Leave a Reply

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