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 (https://www.adafruit.com/product/746) 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

Update

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

https://www.aliexpress.com/item/DIY-2-pin-4-Wire-Speaker-Mic-Cable-Spring-Line-for-Baofeng-UV5R-Kenwood-TK370-Linton/32734963747.html

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

https://www.aliexpress.com/store/product/5x-TP4056-Lithium-Charger-Module-with-Battery-Protection-Micro-USB-5V-1A-TE420/1895489_32646760134.html

I have started working with the schematic of MicroModem (http://unsigned.io) 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
https://github.com/billygr/arduino-aprs-tracker

Remember to change the APRS_CALLSIGN to your call sign

You will need these libraries
libAPRS (modified) https://github.com/billygr/LibAPRS
TinyGPS http://arduiniana.org/libraries/tinygps/

PCB

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

https://github.com/billygr/arduino-aprs-tracker/tree/master/archive/PCBv1%20KiCad%20(5.0.2)

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

https://github.com/billygr/arduino-aprs-tracker/tree/master/archive/PCBv1%20KiCad%20(5.0.2)

Comments

309 responses to “Arduino APRS Tracker”

  1. Michal Avatar
    Michal

    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
    Stan

    Hello,
    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

      SV1QFV

  3. Federico Avatar
    Federico

    Hi!!
    thanks for you work!!
    recently i am worked in your program and implement the smartbeaconing function.
    https://github.com/fnabarlats/arduino-aprs-tracker/tree/newfunction

    Also implement a new functions on LibAPRS to send Course and Speed in aprs data.
    https://github.com/fnabarlats/LibAPRS/tree/newfunction

    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
      SQ3MP

      Federico how about to add altitude report to aprs ?

      1. billy Avatar

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

  4. SQ3MP Avatar
    SQ3MP

    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
        SQ3MP

        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 ?
        http://imgurl.pl/img2/screenshot20200805-161949firefox_5f2fc3037dce1.jpg
        http://imgurl.pl/img2/screenshot20200805-161943firefox_5f2fc355e4885.jpg
        Please see screens

      2. billy Avatar

        Hi,

        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
        SQ3MP

        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
    Roman

    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: https://github.com/billygr/arduino-aprs-tracker/blob/master/arduino-aprs-tracker/arduino-aprs-tracker.ino
    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

      Hi,

      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
        SQ3MP

        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
    SQ3MP

    Billy only this “data” I get from GPS, I don’t know what I have done wrong
    https://www.dropbox.com/s/kc801mzg6wydk0l/gpstest.JPG?dl=0

  8. SQ3MP Avatar
    SQ3MP

    Ok, I found mistake
    https://www.dropbox.com/s/60tdvd4ujomqc60/Gpstestok.JPG?dl=0 – here is correct report

    1. billy Avatar

      And the altitude is not reported as around 60 m ?

  9. SQ3MP Avatar
    SQ3MP

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

  10. SQ3MP Avatar
    SQ3MP

    Billy
    According Your next aprs nice project … ( not possible to comment there )
    Not better use diferent low pass filter ? http://599.cz/view.php?cisloclanku=2018082201 – 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
    Regards

    1. billy Avatar

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

  11. TA2BW Avatar
    TA2BW

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

    1. billy Avatar

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

  12. Fabian Avatar
    Fabian

    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 https://github.com/billygr/arduino-aprs-tracker/blob/smartbeaconing/arduino-aprs-tracker/arduino-aprs-tracker.ino branch

  13. Fabian Avatar
    Fabian

    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 https://github.com/billygr/LibAPRS/blob/master/AFSK.cpp

      1. Robbie Avatar
        Robbie

        Thanks Bily!

      2. Robbie Avatar
        Robbie

        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
    Robbie

    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

    Hi,
    Line 471/473 in the AFSK file
    Billy

    1. Robbie Avatar
      Robbie

      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
        Robbie

        Pls do not worry about question. Problem solved!

  17. Robbie Avatar
    Robbie

    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.

    Thanks
    Robbie

  18. billy Avatar

    Hi,

    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

    Billy

  19. Robbie Avatar
    Robbie

    Thanks Billy. Tested it works with 3.3v

  20. GIANNIS Avatar
    GIANNIS

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

    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
        GIANNIS

        i order 10 pcb`s with shipment 12 euro.

  21. GIANNIS Avatar
    GIANNIS

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

    1. billy Avatar

      Tantalum capacitors, 73 SV1QFV

      1. Giannis Avatar
        Giannis

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

      2. Giannis Avatar
        Giannis

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

  22. Giannis Avatar
    Giannis

    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
      LW7EEA

      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
        giannis

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

      2. Giannis Avatar
        Giannis

        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
    LW7EEA

    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
    LW7EEA

    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
    Giannis

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

  26. giannis Avatar
    giannis

    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.

    https://photos.app.goo.gl/9ouNCbGFfqvTaxrMA
    https://photos.app.goo.gl/uA1LpPoeA3H2r2JW6

    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 APRS.fi.

    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
    Russ

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

    1. billy Avatar

      Hi,

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

      Yours,

      Bill

  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

    HI,

    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 https://github.com/billygr/LibAPRS/blob/master/device.h 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

    https://upload.wikimedia.org/wikipedia/commons/c/c9/Pinout_of_ARDUINO_Board_and_ATMega328PU.svg

    73,
    Billy

    1. John van Venrooij Avatar

      Hi Billy,

      It work’s.
      Thkn’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
        Steve

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

      2. billy Avatar

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

        Billy/SV1QFV

  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!

    Leandro
    LU8DOI

  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.

    73

  37. Joe G0EVB Avatar

    Hi!
    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?

    Thanks,
    Joe G0EVB

    1. billy Avatar

      Hey,

      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

      73

      1. Joe G0EVB Avatar

        Hi,

        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
    Fingsen

    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
    Fingsen

    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
    Lutz

    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
    Lutz

    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
    Lutz

    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

      Hey,

      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

      Billy
      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

    Hey,

    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 *