After extensively testing the Vp-Digi on my solar-powered APRS digipeater, I developed a self-contained solution for implementing an APRS digipeater that combines the outstanding performance of this STM32-based node with the compactness of a VHF RTX module like the SA818V.
The SA818 is a low-cost and high-performance integrated walkie-talkie module with a built-in high-performance microcontroller, narrow-band RF transceiver, and a standard UART interface at 3.3V, making it perfectly compatible with the Raspberry Pi’s native UART.
The output power is unfortunately quite low, just 1 watt, but sufficient for applications where the station is a “fill-in” digipeater that is listened to by igates in very favorable positions.
The module also features a non-volatile memory that allows you to store all your settings and retrieve them each time you power it on.
The Raspberry Pi, however, has only one serial port, which must therefore be used, via user-adjustable jumpers, both for initial programming of the RTX module and for interfacing to the BluePill running VP-DIGI.
In addition to the external BluePill circuitry already mentioned in the VP-DIGI project, which includes filters and audio input and output matching, a harmonic filter is also required on the SA818 output to meet spurious emissions regulations.
After some research, I replicated the filter from this project: https://sites.google.com/site/kamhien2017
BTW, many thanks to Suryo, who designed the filter, for the support during construction and optimizations.
The interesting feature of this project is the double use of the board. It can be used in conjunction with the raspberry, or in stand-alone. In the first case, direwolf, aprx, or similar softwares can be used to implement an igate, if the RPI is connected to the internet. In the second case, a digipeater can be easily done. Only a USB power connection is needed.
Moreover, the board can act as kiss modem, and in this case the kiss port is the USB of the bluepill.
At the beginning of the project, I intended to fit all the components within the Raspberry Pi’s footprint, but then I decided to enlarge the board and work more comfortably. It’s probably possible to fit everything on a double-sided PCB the same size as the RPI, but the routing is a bit laborious and requires the use of very small SMD components and several via holes to connect from one side to the other.
For a first prototype, I decided to work with PTH components and a PCB that’s about twice the size of the RPI.
The PCB can be connected to the RPI via the classic 2×20 connector and spacers aligned with the holes at the corners of the RPI.
Here below, some 3D pictures of Kicad:



Some picture of the board are reported here:




The schematic is very simple and can be found below:
The blue pill can be connected to the main board by mean of two 20pin socket strips.
All the material can be easily found on ebay or Aliexpress. The total cost is about 25€.
For tuning purposes, I placed a sloder-jumper at the filter input, together with a miniature RF socket (IPEX). During the tuning, a solder joint can be made in order to connect the input filter to the port of a VNA. After the tuning, the joint can be moved to the output of the SA818.
The filter worked perfectly at first attempt, without any tuning. Here below, the S21 can be seen.

The attenuation of the 2nd harmonic is about 41dB, and the in-band attenuation is about -0,6dB, which is very good.
A jumper can be used to switch between High and Low power of the SA818. Another jumper is used to activate the digipeater mode, as already implemented in the schematic diagram of Vp-Digi.
Two Jumpers are placed on the TXD and RXD lines of the Raspy. Putting the jumper between pin 1 and pin 2 of the strips, the Raspy Uart will be connected to the SA818 UART, for the first programming.
Once the programming is finished, the jumpers can be moved between pin 2 and pin 3 in order to connect the Raspy Uart to the VP-Digi Uart, allowing the creation of a Serial Kiss port that can be used by all the most popular APRS Softwars.
The SA818 can be easily programmed using Raspberry console and this nice command tool: https://github.com/0x9900/SA818
Before install this nice application, python3 must be installed on the raspberry:
sudo apt install python3-pip -ysudo pip install sa818
The embedded UART of the Raspberry must be enabled:
sudo raspi-config
navigate to Interface Options > Serial port select “No” for login shell over serial, then “Yes” at the end for enabling, then reboot to apply the modifications.

Alternatively, add:
enable_uart=1
to the /boot/config.txt file (or /boot/firmware/config.txt for newer OS).
If everything is OK, if you connect the hat to the raspy and type:
sa818 --port /dev/ttyS0 radio --frequency 144.800 --squelch 0 --bw 0sa818 --port /dev/ttyS0 volume --level 8
you will set the SA818 to work properly in conjunction with the VP-Digi, and you should get this answer from the application:

I measured the output power of the SA818 and is very close to 1W declared on the datasheet. In Low power mode, it’s about …
Here below, the measurement made with my TinySA and a 30db attenuator.
Low power, is about -25dBm:

High power is about 30,4dBm:

Here below, the measurement made on the 2nd harmonic shows about -55dBc attenuation referred to the carrier:

After the success of the filter, I experienced a problem in the audio part. Unfortuntately, I didn’t noticed that the maximum audio level of the SA818 is too low for correctly driving the Analog Input of the STM32 microcontroller.
In fact, the max out of the SA818 reported on the datasheet is 700mV:

While the input of the bluepill is referred to 3.3V , and the user manual of VP-Digi suggest to adjust the audio level so that most packets have a signal level of around 50%. In my case, with the trimmer fully clockwise, the audio level of the packet was about 20%.
To fix this, I added an audio amplifier between the audio out of the SA818 and the input stage of the VP-Digi audio interface.
I bought this compact PCB based on LM386 IC:

I removed the pin strip and sticked the board on the bottom of my PCB, and I made connection with small wires for wirewrap:

After the installation, I noticed the the audio level was always too high. On the datasheet, I read that the gain is internally set to 20 but it can be modified from 20 to 200 by placing a resistor and capacitor between pins 1 and 8:

I removed R1 from my board and the I finally had a good audio decreasing SA818 audio level to 2 (“sa818 –port /dev/ttyS0 volume –level 2”) and with both the trimmer of my board and the trimmer of LM386 adjusted more or less in the center!
To adjust the audio level, connect to Vp-digi via serial port using minicom and go in “monitor mode” as suggested by the VP-Digi manual, then just listen for some incoming packets for tuning:
minicom -D /dev/ttyS0 -b 9600
After, the tuning, the audio level should be around 50% and the positive and the negative percentage (values between brackets) should be the same:

The board is actually under test and it seems to be very stable.
I will start to develop a new PCB layout with SMD components, which allow to reduce the overall pcb dimensions, and will include the LM386 that now is applied externally.
I’m preparing some sensitivity test, for comparing this board with a standard RTL-SDR dongle, but I will publish the results as soon as I get the attenuators from aliexpress necessary for the tests, so stay tuned… 🙂
73’s
IZ7BOJ
Update 1/6/2026
I got the attenuators and I did some simple sensitivity tests.
It’s worth noting that the method is very rudimentary, but the scope is to have some “quick and dirty” numbers.
A Vector Signal Generator would be needed for a professional test.
The setup was made of a remote station which transmits a beacon every 30seconds, and a local station including both my receiver under test and a nooelec RTL-SDR dongle. After the antenna, there are a fixed and an adjustable attenuator, then a power splitter which delivers the signal to the receivers.
On the RTL-SDR side, I used rtl-fm software for raw data, and direwolf decoder.

The variable attenuator is increased until one of the two receiver begins to lose packets.
Here below, the results are reported:

Every row of the table refers to an observation period of 10minutes, which corresponds to 20 transmitted beacons.
The column “att” refers to the value set on the variable attenuator and it’s our reference in dB for the sensitivity
“Dec vpdigi” shows the packet decoded by the receiver under test, while “dec rtlsdr” says the packets decoded by rtlsdr dongle, which is our reference.
While the tx station was transmitting, I started to increase the attenuation on the rx side until some packets were lost, and stopped when no packets were decoded anymore.
It seems that the dongle sensitivity decreases faster than my board. You can see this behaviour considering the orange area, which represents the zone with packet loss.
In green you can see 100% decoding and in red 0% decoding.
If we consider the 50% packet loss, the dongle is about 4.5dB more sensitive than my board, but if we consider higher packet loss, like 2 or 3 packet decoded, the difference is only 1dB.
I think it could depend by different slope of analog and digital filters of the rf front-ends.
An important difference is that with RTL-SDR we have a full 16-bit (or even 32-bit) software pipe, which is used to pass the audio data from the rtl-fm software and the modem (direwolf in this case).
With STM32F103C8T6 used on the VP-DIGI , we have a 12-bit ADC with all it’s non-idealities and noise, and the ENOB would probably be at most 10 bits (in some optimistic case).
VP-Digi is quite a “crude” design with close-to-zero control of the analog signal path. Amplifying the signal in an early stage to reach close to 3.3V peak-to-peak is crucial for limiting the noise and making use of these 9-10 effective bits.
All in all, ENOB and uncontrolled electrical design are the major factor for sensitivity degradation.
At the end of this analysis, I would consider the results acceptable.

























































































