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

11 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.

Leave a Reply

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