VHF Beacon and APRS Tracker (English version)


This little low cost FM transmitting card can be used for different applications, like:

  • APRS Tracker
  • APRS WX station
  • APRS for sounding balloon
  • Fox hunt
  • Beacon for emergency exercice

Most of the time , the transmission of an APRS signal is AFSK , that is to say, an electronic card is connected to the BF input of a conventional transceiver. This is often bulky and power hungry.

The proposed system is totally different from what he usually does is because the electronic card includes the FM transmitter, the AX25 / APRS protocol and decoding NMEA frame.


  • Large VHF coverage (50 MHz to 200 MHz)
  • low cost (25/30$)
  • APRS protocol included
  • FM AX25 modulation
  • 4,8V power voltage
  • Input / output connector (GPS, Sensors)
  • Lower consummation
  • 0.5W VHF POWER


The outpout power is about 0,5W and that’s enough for most applications.

The mounting goal is to have a full APRS transmitter for a very low cost (25/30$).

The ATMEGA328P is in fact an Arduino uno, and you need serial FTDI interface to program it.

The Arduino program contains all software layers to generate FM AX25 like a classical tracker and transmitter separatly.

Indeed, the microcontroller drive the dds to simulate FM modulation and generate 1200Hz and 2200hz signal as predict the ax25 protocol.

Since the DDS is limited in higher frequency, it is necessary to add a multiplier for generating a VHF frequency.

The J3 input / output connector is used for GPS receiver or weather station sensor


As you can see, the weather station, used here for measure temperature, can be recharged by a solar cell and thus dispense with external power.


balise VHF_sch

The scheme is organized around an ATMEGA328P, a DDS module (ad9850) and a PLL multiplier ISC511.

The ATMEGA328P drive DDS AD9850 in SPI transfert, but this one comes out a HF signal. You must add a ICS511 multiplier to generate the VHF signal. It ends with a classical 2N4427 transistor amplifier delivering a power of 0.5 W at 5V

TTL output Qn DDS is perfect to control the ICS511. Indeed DDS SINA SINB filtered tensions are too low for the ICS511.

The ICS511 is configured by 8 multiplier with to set the logic level 1 inputs S0 and S1. OE Output Enable command will allow the ATMEGA328P to easily generate modulation for fox hunting.


FM modulation with the DDS9850 generates few harmonics , but it does not matter with a very QRP power.


Power must be 5 V, the card does not have regulator because it can be powered by four 1.2V AA batteries.

Note the P-channel MOSFET will turn off the DSS supply when there is no transmission, it will avoid consuming too much power if the system is powered by a battery. Consumption is reduced to 20mA.

Programming :


In reality ATMEGA328P contains a copy of an Arduino UNO bootloader. It will add a USB serial adapter card to program the microcontroller.

The interface that connects to the J2 connector. (J9 jumper in position 2-3). J9 jumper in position 1-2 when no programmer connected to it to prevent inadvertent Reset.

J3 connector, you will connect the GPS to pins 2 and 3, as well as analog inputs if the card is used in APRS weather station.

J3 pinout

LED D2 is used to view the FIX GPS

If the LED is flashing, the GPS is connected properly and it was not until the FIX. If the LED is illuminated when the FIX GPS time is over and the frames will soon be transmitted.

The adjustable capacitors is used to obtain a VHF max output power

Assembly and testing

Download PCB files here :

VHF Beacon and APRS Tracker PCB files

The assembly does not pose any particular problems, start by soldering SMD components, supports the Arduino and DDS except U2 (ICS511) and the 2N4427 transistor Q42.

componants 3D copper 3D

Make a copy of a Bootloader Arduino into a blank ATMEGA328P.

Connect ATMEGA328P and USB adapter module TTL series and strap J9 connector between pin 2-3. (programming mode)

In the programming environment for Arduino, check the operation of the download. Select the Blink example, change the line int led = 13; by int led = 5;

After downloading the program, the D2 LED should blink.

Test DDS

Insert the DDS on the electronic board.

We must now install the libraries that control the DDS and AX25 protocol.

Download the zip files on the github :



Copy AD9850SPI VHFBEACON and directories in the libraries directory of arduino software.

Download in ATMEGA328P testDDS.ino the sample program located in VHFBEACON / examples

DDS the power LED should on.

With an oscilloscope view the QN signal pin 8 of DDS. Trim the DDS potentiometer to obtain a square wave duty cycle 0.5

DDS TTL output

Now sold the ICS511. Viewing the signal on pin 5 of the ICS511.

You must obtain a sinusoidal signal 144.800MHZ frequency.

ICS 511 Output

Finish by solder the 2N4427 transistor Q42.

With a power meter trim capacitors in order to have a maximum output power.

Programs samples

APRS Tracker: tracker.ino

APRS frame is encoded simply and directly in a unsigned char array table track[ 72] .

It will thus modify the various data fields according to your callsign and your location .

unsigned char     track[72]={‘F'<<1,’4′<<1,’G'<<1,’O'<<1,’H'<<1,’ ‘<<1,0×60,              //avant APTT4 7 octets (0-6)
‘F'<<1,’4′<<1,’G'<<1,’O'<<1,’H'<<1,’ ‘<<1,(‘0’ + 12) << 1,     //F4GOH-11 7 octets (7-13)
‘W'<<1,’I'<<1,’D'<<1,’E'<<1,’1′<<1,’ ‘<<1,(‘0’ + 1) << 1,     //WIDE1-1 7 octets (14-20)
‘W'<<1,’I'<<1,’D'<<1,’E'<<1,’2′<<1,’ ‘<<1,(‘0’ + 1) << 1 | 1 , //WIDE2-1   fin ssid lsb =1 7 octets (21-27) 0x03,0xf0,                                                     //ctrl, pid 2 octets (28-29) ‘/’,’1′,’5′,’0′,’4′,’5′,’2′,’h’,     //heure 8 (30-37) ‘4’,’8′,’5′,’1′,’.’,’2′,’0′,’N’,’/’,’0′,’0′,’2′,’2′,’0′,’.’,’9′,’2′,’E’,     //lat, long 18 octets (38-55) ‘>’,’7′,’3′,’ ‘,’A’,’n’,’t’,’h’,’o’,’n’,’y’,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘};               //commentaire 15 car octets (56-71)

Connect the GPS to pins (TX) 2 and 4 ( RX) J3 connector without forgetting the GND pin 8. Caution must be a TTL compatible signal 0,5Volts . If necessary, add a MAX 232 Driver between GPS and J3 . (J3 pinout.png)

A power-up is complete, the LED D2 will flash until the GPS FIX .

To adjust the transmission frequency, just change the following line

Beacon.freq = (144650000) / 8;

The frames are sent every 10 seconds . To change the time interval change the following line :

Beacon.GPGGA.pperiod = 10;

APRS weather : weather.ino .

F4GOH Weather station

Obviously, there is no weather sensors connected to the J3 connector. It is for you to make a software change according to your needs.

If we want for example to change the value of the temperature, it will change the table at index 62 (   ‘t’,’.’,’.’,’.’, )

unsigned char     wx[90]={‘F'<<1,’4′<<1,’G'<<1,’O'<<1,’H'<<1,’ ‘<<1,0×60,               //avant APTT4
‘F'<<1,’4′<<1,’G'<<1,’O'<<1,’H'<<1,’ ‘<<1,(‘0’ + 11) << 1,     //F4GOH-11
‘W'<<1,’I'<<1,’D'<<1,’E'<<1,’1′<<1,’ ‘<<1,(‘0’ + 1) << 1,     //WIDE1-1
‘W'<<1,’I'<<1,’D'<<1,’E'<<1,’2′<<1,’ ‘<<1,(‘0’ + 1) << 1 | 1 , //WIDE2-1   fin ssid lsb =1
0x03,0xf0,                                                     //ctrl, pid
‘!’,’4′,’8′,’5′,’1′,’.’,’2′,’0′,’N’,’/’,’0′,’0′,’2′,’2′,’0′,’.’,’9′,’2′,’E’,     //lat, long
‘_’,’.’,’.’,’.’,           // direction du vent en degrés // info weather APRS101.pdf p74
‘/’,’.’,’.’,’.’,           // vitesse du vent m/s a confirmer
‘g’,’.’,’.’,’.’,           //g = gust (peak wind speed in mph in the last 5 minutes).
‘t’,’.’,’.’,’.’,           //t = temperature (in degrees Fahrenheit). ex 025, Temperatures below zero are expressed as -01 to -99.
‘r’,’.’,’.’,’.’,           //r = rainfall (in hundredths of an inch) in the last hour.
‘p’,’.’,’.’,’.’,           //p = rainfall (in hundredths of an inch) in the last 24 hours.
‘P’,’.’,’.’,’.’,           //P = rainfall (in hundredths of an inch) since midnight.
‘h’,’.’,’.’,               //h = humidity (in %. 00= 100%).
‘b’,’1′,’0′,’2′,’0′,’2′,   //b = barometric pressure (in tenths of millibars/tenths of hPascal). décipascal
‘A’,’L’,’E’,’C’};           //code id du fabricant de la station météo 4 car max

For example, to change the temperature, you can inhale temp () function; and connect an NTC 10K on Analog input A0 of ATMEGA328P through the J3 connector.


The approach will be:

– Reading of the ADC on A0

– Calculate Temperature in degrees Fahrenheit

– Conversion of the value in 3 ASCII characters

– Copy of ASCII characters in the picture wx [] indices 69-71

You can now decode the frame with your favorite receiver

Balloon: balloon.ino

The principle adopted is virtually identical to the weather program, except that the frame is adapted to transmit telemetry.

The approach will be:

– Reading of A1 to A5 ADC

– Conversion of 8-bit value

– Conversion of the value in 3 ASCII characters

– Copy of ASCII characters in array balloon [] from the 77 index

Of course, you can adapt your program according to your convenience.

// sounding ballon char array
unsigned char   balloon[116]={‘F'<<1,’4′<<1,’G'<<1,’O'<<1,’H'<<1,’ ‘<<1,0×60,             //avant APTT4 7 octets (0-6)
‘F'<<1,’6′<<1,’K'<<1,’F'<<1,’I'<<1,’ ‘<<1,(‘0’ + 11) << 1,     //F4GOH-11 7 octets (7-13)
‘W'<<1,’I'<<1,’D'<<1,’E'<<1,’1′<<1,’ ‘<<1,(‘0’ + 1) << 1,     //WIDE1-1 7 octets (14-20)
‘W'<<1,’I'<<1,’D'<<1,’E'<<1,’2′<<1,’ ‘<<1,(‘0’ + 1) << 1 | 1 , //WIDE2-1   fin ssid lsb =1 7 octets (21-27) 0x03,0xf0,                                                     //ctrl, pid 2 octets (28-29) ‘/’,’1′,’5′,’0′,’4′,’5′,’2′,’h’,     //heure 8 (30-37) ‘4’,’8′,’5′,’1′,’.’,’2′,’0′,’N’,’/’,’0′,’0′,’2′,’2′,’0′,’.’,’9′,’2′,’E’,     //lat, long 18 octets (38-55) ‘>’,’1′,’8′,’0′,   //Course degrees (56-59)
‘/’,’0′,’0′,’5′,   //Gps speed knots (60-63)
‘/’,’A’,’=’,’0′,’7′,’2′,’9′,’6′,’6′, // Altitude (feet) (64-72)
‘/’,’A’,’1′,’=’,’0′,’0′,’0′, // Télémetry 0 (73-79)
‘/’,’A’,’2′,’=’,’0′,’0′,’0′, // Télémetry 1 (80-86)
‘/’,’A’,’3′,’=’,’0′,’0′,’0′, // Télémetry 2 (87-93)
‘/’,’A’,’4′,’=’,’0′,’0′,’0′, // Télémetry 3 (94-100)
‘/’,’A’,’5′,’=’,’0′,’0′,’0′, // Télémetry 4 (101-107)
‘/’,’ ‘,’B’,’a’,’l’,’l’,’o’,’n’};   //comment 15 car octets (108-115)

Fox hunting : fox.ino

This program control Output Enable of the ICS51, That’s produces a « beep beep » to the desired frequency.

Controls summary  in VHFBEACON library

Instructions Comments
DDS.begin(13, 9, 8); Initialize DDS with pinouts
DDS.calibrate(125001100); Calibrate DDS, 125000000 typical
Beacon.begin(4, 5, 6, 7); Initialize Beacon with pinouts
Beacon.GPGGA.pperiod =10; Interval in seconds between two transmission, when GPS is connected,
Beacon.GPGGA.debug = true; Show $ GPS sync in serial monitor, when GPS is connected
Beacon.GPGGA.dumpNmea = false; Show Nmea Sentence in serial monitor, when GPS is connected
Beacon.mode =0; 0: fm mode1:SSB USB mode
Beacon.modulation(1); 1 : Enable ics511 Output0 : Disable ics511 Output
Beacon.freq = (144800000) /8; Set frequency for beaconDon’t forget to divide by 8
Beacon.ddsPower(0); 0: DDS Power off1: DDS Power on
Beacon.GPGGA.sync =0; Internal Flag to see if it’s time to send, when GPS is connected
Beacon.sendpacket(track, sizeof(track)); Send AX25 packet as described in unsigned char arrayAdd automatically start and end flag between datas


This little digital transmitter , make you many services for APRS experiments at close range. The card is cheap to make and easy to integrate into a classic electric box . The Arduino software is modified depending on your applications. I installed a mini APRS station in my garden with a 6V solar cell without changing the batteries since 10 months.

Thanks to F1LVT, who inspired me for the concept.

Balise d’exercice 121,375 « Demi-Cube »

VHF Beacon and APRS Tracker (English version)

8 réflexions sur “VHF Beacon and APRS Tracker (English version)

  1. Bonjour, votre article sur la balise APRS m’a beaucoup intéressé.
    Je voudrais bien faire une balise pour mon quad au Québec. J’habite en FRance mais j’ai une maison au Québec. Est-ce que vous seriez intéressé pour me vendre les circuit imprimé monté et testés ? (sans la partie Arduino que je pourrais faire moi même) ?

    Je ne sais pas si au Québec une puissance de 0,5 W est suffisante. Est-ce que vous auriez un petit ampli 12 V dans vos cartons ?

    Meilleures salutations

    Thierry Vorms


    1. Bonjour,
      Merci pour l’intérêt porté au montage.
      Je ne vends pas de kits montés.
      Vous trouverez le PCB en PDF, sur github, VHFBeacon
      La réalisation est à la charge du lecteur.
      Cependant si c’est pour faire de l’APRS, un Arduino et un module VHF DRA818V 1W devrait plus vous convenir.
      L’ensemble est très facile à monter, même sur une plaque à essai.
      Dans cette version il y aura la possibilité de sauvegarder les coordonnées GPS sur une carte mSd en fichier KML lisible avec google earth.
      L’article est , et le code Arduino (sans carte mSd) est déja disponible ici : DRAPRS




  2. Michael Horwat dit :

    I am interested to make your APRS tracker, but as standalone unit, so without AD9850 and ICS511, for GPS data and telemetry.
    Till now I have make some change in code, first time tracker send GPS data and after few second send telemetry with weather data. I have uncommented AD9859 library in VHFBEACON.c and also in my changed balloon.ino.
    I become clear sound from Arduino Uno but frequencys are 2400 Hz and 4800 Hz for APRS, not 1200 Hz and 2400 Hz like must it be.
    Do you maybe know what is wrong with frequencys?
    Or best will be if you have time or maybe any another who have make this, that you help me so that I can change code, so that he work without AD…. and ICS…
    We have plans launch one small weather balloon and for us is important that we have weather telemetry and also GPS data so that we can see altitude, speed and reading from severes sensors for weather.

    Your code is the best that I found on internet, very simple but best for APRS with Arduino and clones.
    Congratulations on so good code.

    Best regards,


  3. Frank Mead dit :

    Michael, I would like to know the inductance values of the three VK200’s in the aprs tracker.
    thank you, Frank, WA6UJJ


Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s