Homebrew APRS – Arduino Uno KISS TNC

So, What’s all this about?

Last week I was looking on eBay at what rigs and equipment was around and found some transceivers with APRS and thought “I don’t have anything that can do APRS, That could be handy when I go out to the bush and there are no mobile phone towers in range, say if I got stuck. These prices are a bit high for something I wouldn’t use much though.”

So then I looked at APRSdroid and saw that it can be connected to a radio, either directly (but you have to use vox) or via a TNC. I looked at TNCs online and saw not only that they can be expensive but that there isn’t much to them and went looking for some ideas on building one.

I have several Arduinos here and figured this would be a good starting point. But figuring out how to not only generate the 1200 baud AFSK signal but also receive it and process it looked pretty hard. Luckily some people have done this work for us… So lets not waste any more time figuring that out.

Among various projects the MicroModem/MicroAPRS projects stood out and I went shopping for a shield proto board and a couple components I was short of.


What do I need if I want to do this?
  • Amateur radio licence (In Australia, Standard or Advanced ONLY)
  • A 2m FM Transceiver ( I used a cheap Baofeng GT-3TP)
  • Arduino. This can be any 16MHz (Important) Atmega328p based board like the UNO, SparkFun RedBoard etc.
  • A protoboard/protoshield/breadboard/whatever… somewhere to build the components. I would suggest a shield format as it allows you to disconnect the board in 1 hit from the Arduino
  • 1x bluetooth module (HC06)
  • Some wire
  • Soldering iron
  • Solder
  • 1x 2N7000 MOSFET
  • 2x 270Ω resistors
  • 3x 1kΩ resistors
  • 2x 2.2kΩ resistor
  • 1x 3.9kΩ resistor
  • 1x 8.2kΩ resistor
  • 1x 10kΩ resistor
  • 3x100kΩ resistor
  • 1x 100nF ceramic capacitor
  • 1x 1μF ceramic capacitor
  • 1x 4.7μF electrolytic capacitor
  • 1x LED for TX and 1x LED for RX OR 1x RGB LED(I used an RGB led with blue RX, red TX)
  • 1x 2.5mm and 1x 3.5mm TRS plugs and some nice headphone lead OR A pre-wired Speakermic lead (This is for Baofeng, Kenwood handheld radios etc. other radios will have different connectors)
  • 1x 3.5mm TRRS plug and socket (Optional but nice, I haven’t done this yet but I probably will)

OKAY, I have all that, now what?

If you can follow it, I have made a circuit on Tinkercad HERE

On the breadboard shown above, 29h is the audio input and so goes to the speaker pin of the radio (for the Baofeng this is the Tip of the 2.5mm TRS plug) and 30h is the ground (and the PTT GND) and it goes to the shield (GND) of the same plug.

29b is the audio output and so goes to the mic pin of the radio (For the Baofeng this is Ring of the 3.5mm TRS plug) and 30b is the Ground (and the PTT+, so do not ground this wire in the circuit, as it will trigger PTT, that’s what the MOSFET is for, it will ground this line when we are transmitting, causing the radio to go into transmit mode and also providing the ground for the TX signal.)

Also, here is the circuit it basically follows from the original designer (Mark at unsigned.io):

Circuit diagram from unsigned.io

After you have built it, in whatever form you choose to, you will need to remove your circuit from the Arduino (This is why the shield configuration is easiest). You cannot upload reliably to the Arduino with the bluetooth module connected as it interferes with the USB serial data, they are parallel to each other.

Now, download this hex file and load it into your Arduino.


How the hell do I do that?

If you are on Windows and have the Arduino IDE installed, open a Windows Command Prompt.

You will have to change the Arduino folder to wherever you installed it, the COM port to match the one your arduino shows up as, and the file near the end to wherever you saved the hex file. – KEEP THE “:i” at the end.

D:\Arduino\hardware\tools\avr\bin\avrdude -v -C D:\Arduino\hardware\tools\avr\etc\avrdude.conf -p atmega328p -c arduino -P \\.\COM4 -b 115200 -U flash:w:microaprs-5v-kiss-latest.hex:i

If this works, you can unplug the Arduino from the computer, put your shield back on, plug it into power (NOT your pc’s USB port), and your radio and if you did everything right…

Nothing happens.

Oh yeah, you have to download and set up APRSdroid on your phone.

Then in your phone’s settings, pair with HC-06, or whichever bluetooth name appears when you turn on your new device.

Go into preferences in APRSdroid, and set it up with your callsign and which picture you want and your other details and then go to “Connection Preferences”. Select “Connection Protocol” and choose “TNC (KISS)”, Connection Type should be “Bluetooth SPP”. Client Mode should be checked, now select “TNC Bluetooth Device” Pick your new device from the list and APRSdroid is ready to roll. (it will automatically connect from now on).

Turn your radio on and tune it to your region’s APRS frequency (Australia is 145.175MHz), and hit “Start Tracking” on the main screen in APRSdroid.

You should now be able to find yourself on aprs.fi shortly after your signal is transmitted.

You may have to play with the radio’s volume knob to get a level the TNC likes for successful decoding of other people’s signals.

Screenshot of what I recieved from others on my way home from work.
Photo of my TNC in the dark.

Okay, your instructions suck.  Where can I find more information from someone I can understand?

unsigned.io is the place to go to find more information.

However the circuit diagram above is lifted direct from Mark’s website or the linked Github (Can’t remember which), and it was the closest I could find to instructions. Between the two circuit pictures above there should be enough information for most people who are interested in building radio gear to make it work.

Note I did not design the TNC, all I did was build it and add bluetooth and write up this blog post. Credit to Mark from unsigned.io for doing all the hard work.

And thanks also to Jharwin in the comments below for letting me know a few mistakes I made.

73s – VK3DAN

26 Replies to “Homebrew APRS – Arduino Uno KISS TNC”

  1. I can’t find C3 capacitor which is a 1 microfarad ceramic capacitor. Would it be possible if I used 1 microfarad electrolytic cap?

  2. Hi Dan, I am glad I have found your blog about arduino+hc06 as kiss tnc. I am currently confused about the resistor on the gate of the mosfet. On the schematic, it’s 10k ohms. But in your tinker circuit, it’s 1k. Also not sure if the mosfet in your tinker is in correct orientation. I am also very skeptical to here R6 is in your breadboard, did you intentionally removed it? I’m trying to get this setup to work, but no success! You’re the only one I found in the internet to have this. Well documented. Others just post the video after they’ve built it. I want to copy what you did. If you have time can you help me and take a look again at the the tinker you’d created? I know you did it years back. I’m just a new ham from Philippines, and I tried my very best to look ans get all the items on the list, now I have all of them. Not sure also about the .hex you have linked, if it was already omitted versus the one you have to before. Hope you can help me! I want this to work so I can digipeat the ISS. 73! Jharwin DW2JHA

    1. Hi Jharwin,

      Sorry yes there were some mistakes in the tinker. I have added r6 and fixed the other incorrect resistor. Not sure how I screwed that up lol. i think the mosfet is correct now too, that was due to me not checking as my one is reversed to how it is on tinkercad.. I’m not sure what you mean about the hex file, but I have no control over it, as the link simply goes to the latest version of the hex from the MicroAPRS project and the link still works for me if that’s what you mean?

      In regard to your other question about C3, I don’t think you can substitute with electrolytic, perhaps you can find a similar value ceramic cap if not exact? or 2x 500nf ceramics in parallel? or 2x 2microfarad ceramics in series? something along those lines.

      Hope I have been some help 🙂 I’m a fairly new ham too, and fairly new to some aspects of circuits.

      1. Wow! I have never thought you will respond to my comment. Anyway, thanks for updating the tinker circuit.

        I already found a 1uF ceramic capacitor, so that’s a good news from me.

        About the .hex file, I have noticed it was revised from GitHub 7 months ago. Not sure though, what had changed that it might affect your circuit setup.

        If you still have this circuit lying around somewhere, would you like to try download and load that current hex to your Arduino?

        Thank you much Daniel!

        1. Hi Jharwin, I don’t think it will have changed in any drastic way as they guy who does the code sells prebuilt units or kits and it would have to still work on those. But I will try to install it when I get time in the next couple days and make sure it still works.

          1. Hi Dan,

            I know Mark is selling this prebuilt with battery built-in and more of that additional features. But ordering from him will cost much for me as it needs to ship to the Philippines.

            I’ll rather go with what you have for now and build it myself. I have planned on using this rig to transmit/receive packet to the International Space Station using my homemade antenna and wouxon ht. That would be so cool!

            Will look forward to your findings.

            Again, thank you very much for your help!

          2. Hi Jharwin,

            I have uploaded the latest hex file to the arduino and tested. And it didn’t work. BUT then I realised I was still powering it from the pc so it was connected to serial data on the pc, I unplugged it and plugged it in to a mobile phone charger and it works just fine. So that may be your problem, or it could be something else but I can definitely tell you the firmware is ok on my hardware. I did have a few dramas uploading until I figured out changes to the avrdude that comes with the arduino ide. I will change the line for that in the article. Hope this is helpful, and I hope you can get it up and running soon. Cheers, Dan.

  3. Ya-yay! That was my issue. You’re awesome! I owe you a beer! My arduino nano was getting its power from pc via usb also, so that’s was the reason why the my arduino wasn’t responding to any signal coming from the bluetooth module because its serial is connected to PC and not to the BT module! It’s working flawlessly now! I don’t have any aprs traffic from my location or any nearby digipeater so I played around with it a bit. I have hooked up the stereo out of my pc and I connected it directly to the line-in of the microaprs while playing this youtube ISS recorded aprs and 90% of the time it can decode the signal. Just wow!
    https://www.youtube.com/watch?v=PaXkbNVbw1o

    Thanks a lot for your help Dan, 73! I will update you once I reach the ISS digipeater!

    Regards,
    Jharwin DW2JHA

    1. Hi Jharwin,

      I’m glad we could sort it out, and I hope you reach the ISS, I should try that sometime 🙂

      When I wrote the post I was hoping it could help someone, so I’m glad it has, and you helped me fix up the post as well, Thanks!

      And yes, please do let me know when you reach the ISS digipeater!

      Good luck and 73’s,
      Dan

  4. Hi Dan,

    I have an UPDATE on this project. This almost pulled my hair off my head figuring out the problem. This what happened:

    I transferred all the components from the WORKING test breadboard to a mini pcb board. This board that I have designed can accommodate the arduino nano pins, so this pcb is like a shield. Soldered everything. Tripled checked everything before putting power to the 5V line. And to my surprised the mosfet will not close, it stayed in transmit mode. I looked again at the circuit, and everything was exactly the same as I did it on the breadboard except it’s now on a pcb. I pulled out the mosfet to double check, and to my surprised it’s really damaged. The source to drain is shorted. I’m not sure how it was damaged! So I got another new 2N7000 and put it on the circuit, but before soldering it to the pcb, I doubled checked it and it’s working. Now after I soldering it to the pcb, the mosfet again will not disengage! OMG, yep. I looked back again at the circuit looking for wrong connection, or cold solder joints. I have even used my hot air solder gun to somehow reflow the whole circuit board. Put another new mosfet (yeah I have dozen of this mosfet), again the mosfet will not close! 2nd in a row.

    Fortunately I’ve ordered bunch of components with few extras and I have also another nano and hc-06 lying around. To say, I can a build a new set so I did. But NOW I did it on the breadboard AGAIN, made all the connections, burned the hex file to the arduino, and this one it’s working 100% flawlessly, mosfet will not engage until I transmit a beacon or packet. So I was very suprised!! I have tested all the 8pcs of mosfer I have left, and they worked fine in this breadboard.

    SO question arised, maybe the pcb version of this setup has some wrong connection, but no it’s almost identical to the breadboard EXCEPT on the PCB you need to solder the components, while on the breadboard you just insert the legs, to make the connection. So… maybe there’s something wrong with the 2N7000 that it can’t withstand my soldering iron temperature (BUT again NO because I’m soldering only at 200deg celsius). And my soldering skills is I’m sure is good.

    So I googled “2N7000 damaged after soldering”, and boom. This 20-year old design 2N7000 discrete mosfet is prone to ESD (Electrostatic discharge). It doesn’t have any protection to unwanted spike from electrostatic. Then I also found out that my soldering iron is not grounded! So to conclude, my soldering iron is damaging every mosfet that it come contact with! Just wow!

    Solution: To prevent any electrostatic discharge, I’m now wearing anti-static esd wrist wrap. And I soldered the mosfet using surface mounted soldering method – by using hot air gun!!

    NOW my circuit is working! Yay!

    1. Glad you figured it out, my soldering iron is esd-safe so I hadn’t even thought about that. I never built one on a breadboard, just on a prototype shield. I should have, it would have given me time to plan the circuit board out, my prototype board works but it’s an awful mess with no planning at all haha. My day-to-day aprs is handled by the rig I put in my car now but I keep the arduino unit anyway for spare and incase I want to do an aprs based project for something. Maybe I should add a line about the 2n7000 being esd sensitive to the post anyway.

      1. If he hasn’t, I have uploaded what I have now done here. I only did this a couple weeks ago, and haven’t updated the post yet, but I have had the boards made by jlcpcb, assembled and tested one so the gerbers are good. This version can use EITHER (not both, wire one or the other in) the same bluetooth module as described in the blog post, or a raspberry pi zero w. I am currently using this board with the raspberry pi to act as a RX/TX iGate. I power it all through the raspberry pi, but there is a 5v input on the board if you are using bluetooth, can either power it from there or your arduino. There is enough space in the middle for the bluetooth to be mounted flat on the board. a raspberry pi zero will have to be mounted on header pins otherwise it will hit some of the other components.

        KiCad files
        Gerber files for manufacture

        The reason I hadn’t updated yet is I haven’t finished the documentation. but on the board the components are as follows:

        R1: 1k
        R2: 2k2
        R3: 100k
        R4: 1k
        R5: 100k
        R6: 100k
        R7: 270
        R8: 270
        R9: 1k
        R10: 2k2
        R11: 3k9
        R12: 8k2
        R13: 10k
        C1: 100nF
        C2: 1uF
        C3: 4.7uF Electrolytic
        Q1: 2n7000 Mosfet
        RX1: Green 3mm LED
        TX1: Red 3mm LED

        Let me know if you need more info or have questions. 🙂

        Cheers, Dan

  5. Hello!
    Thanks to both of you. Dan and Jharwin.
    The “updates” in the comments are very useful for me.
    I left the Arduino TNC project for a while, and now i’m work in on it again.

    My idea is to make this module, for regular use in my station and mobile, and make a low-cost digipeater. The firmware is just the difference. Hardware is the same for both.

    I’ll been posting my results, and thanks again to share information.

    73’s de Aldo, LU7HQW – FF79SA

  6. UPDATE: One quick way to avoid destroying the MOSFET because of Electrostatic Discharge (ESD) during soldering, is to short all the three pins prior to soldering. Wrap the pins using a thin stranded wire (this will short the pins) then remove this wire after soldering. I’ve found this clever trick to protect the gate of the mosfet which is the pin sensitive to esd.

  7. Hello again, boys.
    The beast is alive… Over the protoboard, now TX and RX.

    The Nano gave me some issues at the moment of programming.

    Classic error stk500 recv() with avrdude. In Arduino software i try to load Blink example, first try, same result. Change to Nano (Old Bootloader) and start to blink. The board is good.

    I modify the command to this, and load the firmware perfectly:
    (First, i made a copy of the bin folder to the root of the HDD, and copy avrdude.conf and the firmware inside this folder, then run this command)

    c:\bin>avrdude -v -C C:\bin\avrdude.conf -p m328p -c arduino -P \\.\COM5 -b 57600 -U flash:w:microaprs-5v-kiss-latest.hex:i

    I bypassed the two resistences to the HC-05 (both direct connection) and APRSDroid send and receive very well right now.

    That’s all the news until now.

    I’m very happy for the results…

    73’s de Aldo, LU7HQW

    1. Hi Aldo,

      I’m glad it is working for you. I am surprised about removing the voltage divider resistors from the bluetooth module as mostly these can only handle 3.3v on their signal pins (arduino’s TX pin should be a 5v signal). But there may be some with protection nowadays, mine is old.

      Thanks, Dan

  8. I’m glad to tell you that i have a WIDEn-n arduino nano digipeater working in a protoboard with Mark’s firmware (MicroDigi) modified by PY5BK, Aurelio. On service since a couple of weeks ago.

    Make some minimal changes in the board design (change 2N7000 mosfet to ON3131 optocoupler, add a 10K variable resistor in the output to the mic connector, etc).

    Thank you so much, Dan, because your tutorial was my first guidance to understand how to make this possible.

    In upcoming posts i’ll be detailing process and sources.

    73’s de Aldo, LU7HQW.

  9. After a couple of months since i started this project, now it’s operational an APRS digipeater based on arduino nano (i call it “Digiduino”) in 2m band, the TNC Bluetooth (I’m planning install it INSIDE a mobile rig) and finishing an UHF digipeater/igate adding a ESP32 (no Rasp or PC needed). All of this, with the same board design

    A lot of thank you, to Dan and Jharwin, because this post and the comments was my first step to realize this little project. And more to come…

    Dan: Can i send you an email to you with some pictures and comments about the board, to publish them here, and it useful to others?

    73’s de Aldo, “LU7HQW-4”

    1. Hi Aldo,

      That’s awesome 🙂

      Yes please do share your pictures and comments, I’d be happy to see it and I can add it to the main post if you like as another example of what can be done with this type of project.

      Thanks, Dan

  10. I made one. Works nicely.
    Just one question, is there a way to get the TX delay to around 300ms or 350ms? Reason is there are radios that has delays opening squelch and therefore has a hard time getting packets. Specially far off stations.
    Anyways, thanks for the write up!

    1. Possibly, but I think it would involve editing the code from micromodem and recompiling. I haven’t played with the code so I can’t say for sure what would be needed.

  11. I installed a BBS software recently and I was able to get my DIY Bluetooth Arduino TNC working as a Serial TNC.
    I ran into some issues. A terminal program running UZ7HO’s soundmodem tried to connect to the Bluetooth TNC but I think the Bluetooth TNC is not receiving it.
    I made two Bluetooth TNC and tried them on but same results.
    Packet Winlink – Bluetooth TNC – Radio ->RF
    BBS -> Bluetooth TNC – Radio ->RF
    The packet winlink setup sends out packets.
    The BBS does not do anything. I did try if the Bluetooth TNC on the BBS Side works and it does but it just does not receive or reply.

    I also tried
    BBS -> AGWPE -> Signalink -> Radio -> RF
    Packet Winlink -> Bluetooth TNC -> Radio -> RF
    When Packet Winlink sends a connect command, BBS Responds but Packet Winlink does not acknowledge back.

    Would the Bluetooth TNC work with BBS or Packet Radio?

    Thanks!

  12. Here at Kootany Lake , a long slender lake, in British Columbia Canada, I discovered that there wasn’t any APRS coverage extending much further to the North. I thought it a good idea to build a KISS TNC digipeater. The idea was to use a pair of Arduino Nano modules, one for just the TNC and the other instead of the Bluetooth to provide my own coding for the APRS to support just the digipeater function. I could then code in the native IDE. We are Off-Grid here so we have 12 volts, although limited. A very simple and frugal receive standby power consumption radio is the Dick Smith 2M kit although it transmits at 10 W. I am using a Raspberry pie for Arduino programing, so the IDE file structure is different from Windows.
    /usr/share/arduino/hardware/tools/avr
    The next file folders are: bin lib and share.
    The file in the Download folder is:
    microaprs-5v-kiss-latest.hex.txt
    Where do I go from here?

  13. I have assembled this project but on a arduino nano.
    Have you ever had problems whit your HC06 module on power up ?
    Mine sometimes wen i power up all stays ON whit ocasional blink and dosnt show up on bluetooth but after some time like 2h it starts blinking again searching for connection

Leave a Reply to Jharwin Barrozo Cancel reply

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