Mobile Horus Binary v2 and APRS Receiving Station with Raspberry Pi

After the previous December HAB launch, I realized that I needed to spend some time on my receive hardware setup in the car. I previously had a VirtualBox VM running Horus-GUI and headless horusdemodlib, but it was very much a kludge. As an upgrade, I wanted to add APRS reception for the balloon 2 meter APRS tracker.

In order to keep track of all the hardware required for this, I created a block diagram using draw.io desktop. Click to make bigger.

Block diagram of system setup

The next sections will describe the different parts of this setup.

RF Filtering

I quickly realized that having two RTL-SDR dongles in close proximity to a 10 or 50 watt transmitter might cause problems. It would certainly desense the receivers during transmission, but it also might cause permanent damage to the dongles. Permanent damage is hard to diagnose because there's no error message saying "broken," it just doesn't receive weak signals (or any signals at all).

Filtering the 441 MHz voice transmission out of the 144.39 MHz APRS receiver is pretty easy, as those frequencies are very far apart. I designed and built a open stub filter for this. Final measurements were 0.4 dB of loss at 144 MHz and ~35 dB loss at 441 MHz, with frequencies further away from 441 MHz being attenuated less.

441 MHz open stub filter

Filtering the 441 MHz voice transmission out of the 431.05 MHz Horus Binary v2 receiver is be a bit more difficult. There's only ~10 MHz of separation between those frequencies, and I wanted at least 30 dB of attenuation.

I decided on a Pass Cavity filter. This type of filter is just a resonant chamber, effectively passing the resonant frequency and attenuating all other signals (except the harmonics). Insertion loss is dependent on how sharp the filter is, which is tunable by rotating the connectors on the top.

I needed to re-tune the unit I had, and in the end I obtained about 1.5 dB of loss at 431 MHz and 27 dB loss at 441 MHz. Any frequencies further away from 431 MHz will be attenuated more.

431 MHz cavity filter

These two filters are installed just before the RTL-SDR dongles.

Amateur Radio

For voice communications between the chase cars and other amateurs using the cross-band repeater, I will use a Kenwood TM-V71A dual-band radio. Uplink is 441 MHz Narrow FM with a PL of 162.2 Hz, and downlink is 145.580 MHz.

One of the lessons learned from the last launch was to have a backup comms channel if the cross-band repeater doesn't work. For this launch, we are planning on using the W6CX 440 MHz repeater on the top of Mt. Diablo, which should provide good coverage in the Bay Area as well as the Central Valley.

For coordination at the launch and landing sites, we will be using 446.5 MHz simplex as backup to the repeaters.

Power

All of the amateur radio equipment I have use Anderson Power Pole connectors for 12v DC power. In addition, I use a 4-port PowerPole splitter for power distribution.

The Raspberry Pi 4 requires 15 watts on a USB-C cable. I picked up a AUKEY CC-Y11 21W car charger with USB-C port, soldered wires to the cigarette plug end, and wrapped it with electrical tape. Not the most elegant, but it works well.

Modified USB-C car charger

Usually only one side of the negative connection on the cigarette plug is electrically connected, so make sure to figure out which side is active. Or solder both negative leads.

Raspberry Pi

The heart of this whole receiving setup is the Raspberry Pi 4 Model B. I added a heat sink and case, and it's running the stock 64-bit Raspberry Pi OS Lite Bookworm. The Lite version doesn't have a GUI, which is perfect because I won't have a screen to plug in.

All of the software is containerized, so "installing" the software is as easy as pulling three docker containers and editing the configuration files. The three docker containers loaded up on the Pi are:

  • horusdemodlib which listens for the Horus Binary v2 signal with a RTL-SDR. This container uploads the decoded packets to Amateur Sondehub and also sends them to the chasemapper container. See my earlier setup guide for this.
  • chasemapper is a program that plots the balloon and your chase vehicle on a web page. Super easy to install, follow the directions here. Make sure to have the GPS active and configured before starting this container.
  • rtl-aprs-igate is a docker container that I wrote which uses a RTL-SDR dongle for APRS reception, and sends the packets to the APRS-IS network.

Note that all three of these containers are just downloaded from the GitHub Container Registry. You don't need to build or compile anything, all you need to do is create and edit some configuration files for each of these containers.

For the USB connections to the RTL-SDR dongles, I would recommend using short USB-A extension cables. This reduces strain on the USB ports, and allows further distance from the Pi to the receiver. Make sure to check the gauge of the USB extension cord, cheap extension cords use thin wires which are not sufficient for the RTL-SDR current draw. My 6-ft USB-A extension cables are 24-gauge DC wires with 26-gauge data wires.

Remember that only 1.2 amps is available for USB devices from the Raspberry Pi 4. Each RTL-SDR dongle requires around 300 mA, so at maximum you can plug three RTL-SDR dongles into a single Pi. Alternatively, an externally-powered USB hub can also be used.

To keep the Raspberry Pi from overheating, I will place something on top of it and the RTL-SDR dongles so the direct sunlight doesn't cause thermal problems.

Laptop

The only purpose of the laptop is to view the Chasemapper interface, which is just a web page served on from the docker container. Chasemapper shows the current balloon location, predicted landing location for a complete flight, landing location if the balloon bursts now, and other telemetry from the balloon. Any modern browser will do, but this laptop needs to have an Ethernet port for direct connection to the Raspberry Pi.

In addition to Chasemapper, we will be able to view the balloon on Amateur Sondehub during the flight.

Network

Internet will be supplied by a phone hotspot, with both the laptop and Raspberry Pi directly connecting. However, my Android phone won't allow the laptop to connect to the Raspberry Pi through the phone, which is a problem. I fixed this by having a Cat6 cable between the Raspberry Pi and laptop, and set up a static network so chasemapper and the docker logs was viewable on the laptop screen.

References

Cavity filter references:

links