Arduino APRS Tracker

An APRS tracker is easy to build these days.

I had decided to build one for portable use (plan is to be used on hiking, but also in my car) powered from Lithium Ion battery and with all components running on 3.3V. Transmit of APRS messages is done through a UV-5R.

The tracker is powered from my favorite Panasonic NCR18650 3400mAH through a MCP1700-3302E LDO regulator, and has plenty of juice for daily use.

GPS is a Adafruit Ultimate GPS Breakout – 66 channel w/10 Hz updates ( not that i need 10 Hz, 1 Hz update is more than enough but i had in stock from a different project, so why not ? (i love it).  You can also use a NEO-6M and change the appropriate define on the code

Arduino is a Pro Mini 3.3V 8 MHz (actually a clone of Deek-Robot Pro Mini)

Up and running on breadboard


Bought a Kenwood cable to avoid the mess with the 2.5 and 3.5 mm audio connectors

BIG FAT WARNING : There is no load disconnect for the battery while charging. DO NOT CHARGE AND USE IT. The charging of the battery will never finish, resulting on explosion, fire etc. YOU HAVE BEEN WARNED

TP4056 Lithium Cell Charger Module with Battery Protection to charge it through USB.

I have started working with the schematic of MicroModem ( but i have modified LibAPRS to make it work.

As long as GPS has a FIX it submits my location every two minutes and i have a button for a single shot APRS update. SmartBeaconing support is included and now is the default

The idea is to create a complete unit with a DRA818V with USB charging.
DRA818V is still on my desk… i have “trouble” designing a good low pass filter for VHF.

Schematic (breadboard version)

Remember power supply needs to be 3.3V

Arduino APRS tracker schematic (for the breadboard version)

Documentation has not been finalized yet and i use multiple libraries making it a bit difficult to handle everything

I have uploaded my working version to github

Remember to change the APRS_CALLSIGN to your call sign

You will need these libraries
libAPRS (modified)


Oh yes !!! We do have also PCB ready credits to aronaut. Thank you !!!

Bill of Materials (breadboard version)

R1 1K
R2 2K2
R3 3K9
R4 8K2
R5 270
R6 10K trimmer
R7 1K
R8 10K
C1 100nF
C2 4.7uF/16V
1 x GPS Module
1 x push button
1 x Arduino Pro Mini 3V3 8MHz
Q1 2N2700/BS170

For using without an external power supply:

1 x Panasonic NCR18650 3400mAH (or your favorite 18650)
1 x 18650 socket
1 x MCP1700-3302E
1 x TP4056

Bill of Materials (PCB version)

Includes the 18650 socket+TP4056


306 responses to “Arduino APRS Tracker”

  1. Michal Avatar

    Billy my ideas for perfect baloon tracker in your project
    Altitiude above sea level in APRS report
    2x BME280 sensors in APRS telemetry
    Battery voltage in APRS telemetry

  2. Stan Avatar

    Could I buy PCB and how much does it cost?
    Best Regards 73!

    1. billy Avatar

      Stan hi,

      I don’t sell boards unfortunately , you can use the gerber files and order directly if needed


  3. Federico Avatar

    thanks for you work!!
    recently i am worked in your program and implement the smartbeaconing function.

    Also implement a new functions on LibAPRS to send Course and Speed in aprs data.

    thanks for sharing your work, this has been very helpful. And Sorry for my english!!!

    73! LU5EFN

    1. billy Avatar

      Thank you Frederico, i will review both over the weekend and merge them.
      Many thanks for your work !!!

      73 SV1QFV

    2. SQ3MP Avatar

      Federico how about to add altitude report to aprs ?

      1. billy Avatar

        It’s already there, try it it you can check it on

  4. SQ3MP Avatar

    I try to upload your heavy job to my board but after verification I receive info : “APRS_setSpeed was not declared in this scope”

    1. billy Avatar

      Please download again the LibAPRS i just committed the missing fix

      1. SQ3MP Avatar

        Dear Bily
        I tested the altitude report on tracker and I have small problem
        APRS frame sent from phone via aprdroid show me on 141m and “Billy tracker” show me on 1280m.
        Is there some possibility of altitude calibration or there is some error in library ?
        Please see screens

      2. billy Avatar


        Can you please check the serial output ? It spits out the altitude from GPS on both meters and feet. If it looks ok then the issue is on the transmission/conversion to APRS message

        Thank you !!!

      3. SQ3MP Avatar

        Checked already the altitude on ublox software and GPS connected to the laptop. On laptop gps shows correct altitude

      4. billy Avatar

        I mean the serial output of the Arduino what is the altitude that it displays ?

  5. Roman Avatar

    Tell me please, I put your firmware on the tracker based on Arduino Pro Mini 3.3V 8 MHz and gps module NEO-6M-0-001, the tracker aprs transmits, but for some reason the SmartBeaconing system does not work, something in your firmware needs to be enabled or the GPS module not suitable for work. I put the firmware from here:
    I can not figure out how to make it work, the coordinates are transmitted by the tracker when updating after 2 minutes. And when turning, turning and changing speed, nothing. I will be grateful for your help.

    1. billy Avatar


      I just checked both pictures, there is no conversion in my code , we get the output directly from TinyGPS.
      Could you please be so kind and do a test the test_with_gps_device.ino from the TinyGPS library ?

      73, SV1QFV

      1. SQ3MP Avatar

        Will check during this weekend, sorry for delay, familiy + work ..

  6. Ari Candra Rahmanaga Avatar

    Nice post,thanks for sharing
    Visit Us

  7. SQ3MP Avatar

    Billy only this “data” I get from GPS, I don’t know what I have done wrong

  8. SQ3MP Avatar

    Ok, I found mistake – here is correct report

    1. billy Avatar

      And the altitude is not reported as around 60 m ?

  9. SQ3MP Avatar

    Yes, GPS reports 60m – it is correct data, but APRS report each time 1200m

  10. SQ3MP Avatar

    According Your next aprs nice project … ( not possible to comment there )
    Not better use diferent low pass filter ? – please see – easy to make and prepare. LFCN-160+ very difficult to get ( expensive item + expensive delivery ) – If You have cheap source for it please let know
    Please consider

    1. billy Avatar

      You are absolutely right, thanks for the comment and the filter option !!!

  11. TA2BW Avatar

    Great project! Is there room for a “busy detect” mechanism?

    1. billy Avatar

      Yes, i have it on my todo list !!!

  12. Fabian Avatar

    Hola te consulto cada cuantos minutos emite la posicion o hoy que oprimir el boton para que lo haga, saludos LU7FDV

    1. billy Avatar

      From google translate: It emits the position every two minutes unless you use the smartbeaconing branch

  13. Fabian Avatar

    Hola si lo hago con arduino nano hay que cambiar algo en el programa ?saludos LU7FDV

    1. billy Avatar

      No change, just be careful with the pinout

  14. Robbie Xin Avatar
    Robbie Xin

    Hi, Billy

    From your Arduino code, we didn’t see any code relevant to pin D4 to D7. Can you pls explain how your code work?

    1. billy Avatar

      It’s part of libAPRS, a small DAC is being implement on PORTD relevant code on

      1. Robbie Avatar

        Thanks Bily!

      2. Robbie Avatar

        Hi Billy,

        I had a read on AFSK. but not sure what lines of code relates to D4 to D7. Can u pls explain?

  15. Robbie Avatar

    Hi Billy,

    I had read AFSK but cannot find lines of code relevant to D4 to D7. Can you pls explain a little further. Thanks!

  16. billy Avatar

    Line 471/473 in the AFSK file

    1. Robbie Avatar

      Thanks Billy

      I try to upload the sketch you provided with FTDI232.

      It gives the following upload error. How can this problem can be fixed?

      avrdude: stk500_recv(): programmer is not responding
      avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0xd5
      avrdude: stk500_recv(): programmer is not responding
      avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0xd5
      avrdude: stk500_recv(): programmer is not responding
      avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0xd5
      avrdude: stk500_recv(): programmer is not responding
      avrdude: stk500_getsync() attempt 4 of 10: not in sync: resp=0xd5
      avrdude: stk500_recv(): programmer is not responding
      avrdude: stk500_getsync() attempt 5 of 10: not in sync: resp=0xd5
      avrdude: stk500_recv(): programmer is not responding
      avrdude: stk500_getsync() attempt 6 of 10: not in sync: resp=0xd5
      avrdude: stk500_recv(): programmer is not responding
      avrdude: stk500_getsync() attempt 7 of 10: not in sync: resp=0xd5
      avrdude: stk500_recv(): programmer is not responding
      avrdude: stk500_getsync() attempt 8 of 10: not in sync: resp=0xd5
      avrdude: stk500_recv(): programmer is not responding
      avrdude: stk500_getsync() attempt 9 of 10: not in sync: resp=0xd5
      avrdude: stk500_recv(): programmer is not responding
      avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0xd5

      1. Robbie Avatar

        Pls do not worry about question. Problem solved!

  17. Robbie Avatar

    Hi Billy,
    With GPS module, I use a module as GY-NEO6MV2. It works well with Arduino UNO.

    But it doesn’t work with Arduino Promini 3.3V.
    Can you pls suggest how to solve this problem? I noticed the model of GPS you used in your project. Wonder if any particular requirement is needed and alternative GPS meed the need of circuit.


  18. billy Avatar


    Ensure that RX/TX are correctly attached and modem is on the correct speed, there is a fellow ham that reported that it Arduino promini works also this module.

    Can you try with the demo program of TinyGPS library ? If it works there it will work also with the APRS tracker


  19. Robbie Avatar

    Thanks Billy. Tested it works with 3.3v

  20. GIANNIS Avatar

    hi. how can i order a pcb? can you give me a site? how cost?

    1. billy Avatar

      Gerbers are provided on github, a new PCB will be available later this month. Costs are around 10 $ directly to the PCB manufacturer

      1. GIANNIS Avatar

        i order 10 pcb`s with shipment 12 euro.

  21. GIANNIS Avatar

    the capacitors is tantalum or i can use single?
    73 SV7PKL

    1. billy Avatar

      Tantalum capacitors, 73 SV1QFV

      1. Giannis Avatar

        Αν βάλω κεραμικούς υπάρχει πρόβλημα? Οι τανταλίου γίνανε σπάνιοι!!!

      2. Giannis Avatar

        Μπορώ να χρησιμοποιήσω κεραμικούς πυκνωτές διότι οι τανταλίου είναι σπάνιο είδος?

  22. Giannis Avatar

    hi. i load the code to arduino and i put it in pcb. nothing happend. i try to press the beacon button nothing again. any idea? thanks.
    73 SV7PKL

    1. LW7EEA Avatar

      Hello, it happened to me. Do you have a GPS signal? the flat neo 6 should flash the led. Greetings

    2. billy Avatar

      Connect to the serial of Arduino. If you don’t have any output you used a 16MHz version. You will need a 8MHz / 3V3 Arduino

      1. giannis Avatar

        το συνδεσα στο serial και οταν παταω το κουμπακι στο arduino μου εμφανιζει Arduino APRS Tracker. για να λειτουργησει πρεπει να βρει στιγμα το gps ή για δοκιμη δεν χρειαζεται?

      2. Giannis Avatar

        i connect to serial and when push the button on arduino write “Arduino Aprs Tracker”. the gps must fix the sats to test the tracker?

      3. billy Avatar

        if there is no GPS fix nothing happens, it will wait for a fix first

  23. LW7EEA Avatar

    Hello, I saw that some friends had the same problem that appears to me. The altitude shows 1280m, when I am currently at 100m. For what is this? can it be corrected? Thank you

  24. LW7EEA Avatar

    Hello, I saw that some friends had the same problem that appears to me. The altitude shows 1280m, when I am currently at 100m. For what is this? can it be corrected?
    Is the sending time between packets fixed, or does it vary according to the speed of movement?
    Thank you

    1. billy Avatar

      If you use the SmartBeaconing version the sending time of packets depends on your speed. As for the altitude difficult to explain/debug it, can you please send me two three lines of the serial output ?

  25. Giannis Avatar

    Τελικά στέλνει μια χαρά με το BAOFENG. Άλλαξα το gps και δουλεύει μια χαρά. Μπορώ να αυξήσω το χρόνο εκπομπής επειδή το δοκίμασα με το vhf module SA828 και αργεί λίγο να ανοίξει με αποτέλεσμα να μη στέλνει όλο το πακέτο.
    73 SV7PKL

  26. giannis Avatar

    Ready in its box with VHF module SA828. It works perfectly with a digipeater. The test is left how long the battery lasts and if necessary another will be added.

    73 de SV7PKL

  27. Don Froula - K9CLF Avatar

    There is a significant bug in the NMEA conversion code that does not put a leading zero for longitudes less than 100. This causes the packet to be rejected or the position information not to display in most APRS decoders, including the Yaesu FTM-300, APRSIS and

    I solved this by borrowing a NMEA converter routine from another project and changing the flat and flon variables to “long” from “float”, then calling the update lat/lon routine version written for long variable position variables. The new NMEA conversion routine also requires “long” position variables.

    I also removed the display routines for smaller code size and a less battery-hungry profile.

    Works fine now. The rest of the code is excellent.

    1. billy Avatar

      Thanks for letting me now , could you please file it under the github page ideally with your proposed fix ?

  28. Russ Avatar

    Can you explain the reasoning behind the different values for the audio output resistors?

    1. billy Avatar


      It forms a basic DAC (actually a Binary Weighted DAC) to create the audio signal



  29. VU3FCF Sai Charan Avatar
    VU3FCF Sai Charan

    Hello, We are building a CANSAT and trying to implement an APRS System for tracking it. I would like to know how can we do that using Arduino and how should whole System should be tracked from the ground station. would require some help.

  30. Daniel Octavandine Avatar

    It’s really nice and meaningful. It’s really cool blog. Linking is very useful thing. you have really helped lots of people who visit this blog and provide them useful information. Thanks for sharing, let’s Visit Us

  31. John van Venrooij Avatar


    Thank you for your program it is wonderfull.
    Its works very fine.
    Now the question HI.
    You use pin 13 ( internal led ) for checking that TX is done. I would like this on a other pin pe pin 2 . I can’t find where i have to do this in the program .
    Can you help me?

    ’73 John

  32. billy Avatar

    Hi John,
    Its a bit complicated.
    LED is defined on line 32
    #define LED_TX_PIN 5
    Pin 5 is the PB5 on PORTB.
    You will need to change the #define LED_PORT PORTB to the relevant PORT for the Atmega328 and the pin accordingly, use this pinout as a reference


    1. John van Venrooij Avatar

      Hi Billy,

      It work’s.
      Excellent service.

      ’73 John

  33. billy Avatar

    It needs a bit of code cleanup 🙂 . many thanks for your comments

  34. Mike Hung Avatar
    Mike Hung

    I followed all the breadboard schematic but I can’t get the module to trigger signal to my walkie. anyone can share the experience? GPS LED is blinking.

    1. billy Avatar

      Mike can you check that is a change on the PTT while you transmit ?

      1. Steve Avatar

        Hi Billy,
        Is it possible to change the baud rate so to use it as a /MM APRS Tracker?

      2. billy Avatar

        Sure you can do that, change the GPSSerial.begin(9600); to the baud of your choice


  35. Leandro Avatar

    Hi Billy, I’ m planning to build a simple tracker and I found you project, which is exactly what I need to do that. Since I’m very noob in knwoledge to program Arduino, but I´m ok in electronics, I want to ask you if in your project it´s possible to retrieve the TX and RX data BEFORE they’re converted to audio AFSK, to connect it to a external modem IC (like the TCM3105, AM7910, etc) intended for more robust transmission. Have you and idea to do such that?
    Thank you very much in advance!


  36. billy Avatar

    Hey ,
    I have read the pdf of TCM3105 but i don’t understand what is the expected input of TX (i assume analog but in what format ?)

    LibAPRS implements the AFSK modem in software , which means it needs a complete rewrite. You can have a look at AFSK_dac_isr (in LibAPRS/AFSK.cpp)

    What i am saying here is that if you can understand what is the analog input needed to have a proper APRS message it could be possible.


  37. Joe G0EVB Avatar

    Is there a way to specify how long into the 2 minutes the packet is started? So that several of these running on GPS time could be programmed to transmit at different times and avoid packet collisions?

    Joe G0EVB

    1. billy Avatar


      I do understand the need but it is not implemented , ideally we should monitor the frequency and then decide if we should transmit or not.

      Its not random but it is 2 minutes after you got a GPS fix, you could add some randomness on the 2 minutes +- 10-15 seconds


      1. Joe G0EVB Avatar


        Thanks for the response. Would that be achieved by altering line 97 to be e.g. 1.9 instead of 2?

        aprs_update_timer_id=timer.setInterval(1.9*TIMER_MINUTES, setAprsUpdateFlag);

        73 de G0EVB

      2. billy Avatar

        That would do it, alternative change the #define TIMER_MINUTES 60L*1000L value

  38. Fingsen Avatar

    No fix detected
    0/0/2000 198:96:72 9959.99N/99959.99E Altitude m/ft: 1000000.00/4200

    Could anyone explain this for me ?

    1. billy Avatar

      Give it some time for your gps module to get a fix, or move it outside for better view to the satellites

  39. Fingsen Avatar

    The program code was uploaded successfully, but only one line of Arduino APRS Tracker appeared in the serial monitor and there was no other action.
    The GPS information uploaded successfully a few days ago will be displayed every second after the Arduino APRS Tracker message. Is this an error in the program?

  40. Lutz Avatar

    Hello Billy,
    I try to use your software with an Arduino Uno and a Garmin Etrex for GPS-Data.
    The compilation was successful and I made following changes:

    75: Serial.begin(4800);
    76:  GPSSerial.begin(4800);
    200: GPSSerial.begin(4800);
    110: Serial.write(c); // uncomment this line if you want to see the GPS data flowing
    53: SoftwareSerial GPSSerial(GPS_RX_PIN, GPS_TX_PIN, true);
    24: #define ADC_REFERENCE REF_5V
    33: char APRS_CALLSIGN[]=”myCall”;

    The Etrex-data scroll down until the Etrex find a position. Then the monitor stops and nothing further happens. No AFSK-signal is to be heard even when I close the switch at pin 10 to GND.
    What can I do?

  41. Lutz Avatar

    Hello Billy,
    can you give me please hints to work with an arduino uno?
    regards Lutz

    1. billy Avatar

      Hey, can you please try the smartbeaconing branch on github ? If you dont see data coming out then its is GPS parsing related

  42. Lutz Avatar

    Hello Billy,
    thank you for your reply! I found that update-pin 10 was permanent low. I changed to pin 8 and than the arduino continued after a position fix. Meantime it works more but not complete. I will see….
    Regards Lutz

  43. Nicolas LU9CNS Avatar

    Hi Billy, I’ve been working on your project quite a bit for the last 2 years. We are together with some friends who do SOTA activations, sending about 30 PCBs to be manufactured.

    Due to their specific need, we would like to know if it is possible to modify the code so that it sends emergency beacons using the same switch that your design has.

    For example, if the button is held down for 5 seconds or pressed 5 times, instead of sending the standard beacon, it sends a beacon reporting an emergency.

    Is this possible?

    Thanks again,
    Nicholas LU9CNS

    1. billy Avatar


      Perfect Nicolas, happy to hear that. Have a board working with the code as it, and we will make it happen one way or another

      73 SV1QFV

  44. Sam Avatar

    Hey there, just wanted to pick your brain behind why you have 4 resistors with resistances that follow powers of 2. I am learning to launch weather ballloons.

  45. billy Avatar

    Hey its the simplest form of a DAC 🙂 or as it is called R-2R DAC

    1. Samuel Mindel Avatar

      That’s what my buddy thought. He’s a big binary fan and we were just talking about how more kids should be taught to add in binary on their hands!

      The impression I get of r2r ladder systems is that they require precise resistors to obtain the desired weighted average. I.e. if my resistance across r3 is 3.6k ohms instead of 3.9k, my signal is gonna get garbled?

      Additionally, any other pointers for doing this off the Uno? I read through Lutz’s comments but we arent having GPS problems but the radio continues to be our nemesis. We can get push to talk active on a sample board when we apply a voltage but can’t get it to run when we package with your code and transistors.

      Im sorry I’m question dumping so feel free to answer some, all or none I guess but I’m gonna fire off one more:
      Does PTT activate when a voltage is applied across the transistor which opens the gate and then shorts PTT? Is that why occasionally we can get PTT activate on a board with no active voltage applied across the board?

  46. billy Avatar


    Yes the FET (not transistor) does a PTT short with the ground when a voltage of 3.3V is applied, just be carefull with all the loose wires: they are gathering noise from the environment

Leave a Reply

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