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.
Features:
- 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.
Description
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.
Note:
FM modulation with the DDS9850 generates few harmonics , but it does not matter with a very QRP power.
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.
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.
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

Now sold the ICS511. Viewing the signal on pin 5 of the ICS511.
You must obtain a sinusoidal signal 144.800MHZ frequency.

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 .
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 |
Conclusion
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.
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
J’aimeJ’aime
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 là, et le code Arduino (sans carte mSd) est déja disponible ici : DRAPRS
73
Anthony
J’aimeJ’aime
Hello,
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,
MIchael
J’aimeJ’aime
Hello Michael,
if you want to do AFSK take a look at :
https://hamprojects.wordpress.com/2015/07/01/afsk-dra818-aprs-tracker/
Use google traduction.
73
Anthony
J’aimeJ’aime
[…] 29/06/2015f4goh […]
J’aimeJ’aime
Michael, I would like to know the inductance values of the three VK200’s in the aprs tracker.
thank you, Frank, WA6UJJ
J’aimeJ’aime
Hello,
Vk200 is about 17/18uH
73
Anthony
J’aimeJ’aime
Thank you so much…
J’aimeJ’aime
Bonsoir, merci pour la publication de cette balise qui m’intéresse beaucoup.Je me déplace beaucoup pour mon travail à l’étranger comme actuellement en Égypte.J’aimerais bien avoir sur moi une balise en permanence afin de prévenir en cas d’urgence. Je ne sais pas si un signal APRS peut être entendu très loin. bien sur, il me faudrait un GPS intégré pour fournir les coordonnées géographique.Avez vous une idée de ce qui pourrait me convenir ?
Merci d’avance
73,s F5SSB
J’aimeJ’aime
Hi. pleas can you tell me diam of copper wire 0.8mm??
thank you in advance
Best Regards
J’aimeJ’aime
0.8 to 1mm. i found it in computer PC AC/DC power supply.
J’aimeJ’aime
thank you
J’aimeJ’aime
i noticed this need mote capacitance on input trimmer
J’aimeJ’aime
https://facebook.com/story.php?story_fbid=2636314759975888&id=2312112109062823
J’aimeJ’aime
Is it possible to modify this design to emit an A3X (AM Double Sideband, Full Carrier) signal consisting of a 1600-300 Hz sweep tone repeating twice per second? I’m looking to build an inexpensive transmitter to emulate an ELT signal, but on non-emergency VHF frequencies, for RDF training.
J’aimeJ’aime
hello, if you want to generate AM modulation with an ad9850 you need to add a MCP41010 at the output of ad9850 and generate 1600-300hz sinus with spi interface. MCP41010 seems up to 280Mhz. you find this chip on some ad9833 module, but up to 12.5 MHz.did you test this program ? https://github.com/f4goh/VHFBEACON/blob/master/examples/fox2/fox2.ino this is a FM modulation but it can be work for RDF training. 73
J’aimeJ’aime