Monthly Archives: January 2026

FoxScope 2m – 144 MHz ARDF Receiver – Part 6 – Usage

By Per Magnusson, SA5BYZ

This is the sixth part in the article series about the FoxScope 2m ARDF receiver and describes how it is used. It is assumed the reader knows how radio direction finding in general is done on the 2 m band.

The receiver has an alphanumeric LCD, a rotary encoder with a built-in push button and a membrane keyboard with four keys.

The LCD can show four lines of text, but it can also merge two lines into one, forming a row with twice as tall characters. This mode is used on the main screen to make the most important information (received signal strength) more salient. It is not used in the menu system.

The rotary encoder is used to e.g. set the gain, set the frequency and navigate in the menu system. The four buttons are mostly used as quick-access function keys for various features.

Feature Overview

The software features include:

  • Up to 9 pre-programmed frequencies
  • Quick cycling between pre-programmed frequencies
  • Audio RSSI (received signal strength indicator), helping to pinpoint the precise direction in which the signal is strongest
  • Numerical RSSI on the screen (independent of gain setting)
  • Numerical max RSSI of the previous fox
  • AGC, activated by a button press
  • Real time clock
  • Audio beeps at selectable positions in the transmit cycle, e.g. at 30 s and 50 s
  • Indication of which fox should currently be transmitting
  • Indication of which pen color to use for the current fox
  • Battery indicator

Display Overview

The most common display state during a race is shown below with annotations explaining the various items.

During a race, one is more or less exclusively in the display state above where the gain is adjustable by the rotary encoder and the line with the gain and the current RSSI are at double height. The following information is shown:

  • The blinking block cursor indicates that the gain setting is activated.
  • The gain is set to 30 dB in this case
  • RSSI is in this case 9.0 dB
  • The R at the end of the first row indicates that Audio RSSI is enabled
  • The frequency is 144.7375 MHz
  • The peak RSSI during the previous transmit cycle was 13.5 dB
  • The battery is close to fully charged
  • The time is 15:18:38
  • Fox number 4 should be transmitting
  • The pen color for this fox is yellow

One might have expected a distance estimate in meters rather than a dB RSSI reading. I have so far avoided to implement that conversion in this receiver (I have it on my 80 m receivers) mainly because at 2 m, there are factors (mostly terrain) that very significantly affect the signal strength, so a distance reading becomes very unreliable in many cases. So, I think it is better to learn how to convert the dB reading to an idea of the distance, taking the terrain into account.

Here are some very rough guidelines for what RSSI readings might mean in terms of distance when using typical transmitters:

  • 90 dB, you are standing in/on/under the antenna
  • 80 dB, a few tens of meters from the antenna
  • 60-70 dB, you might be able to run to the fox in one or two minutes
  • 40 dB, on the order of 1 km left, or the terrain is blocking the signal

Setting the Gain

While the gain item is selected (blinking block cursor at the top left of the screen), the gain can be modified by rotating the encoder knob. The action is accelerated, so quick rotation results in progressively larger gain steps being taken, while slow rotation keeps the gain steps small.

In practice, this method of setting the gain usually only has to be used when making small adjustments. To quickly adapt to the change in signal strength when one fox stops transmitting and another one starts, it is much more effective to press button 1 for “auto gain”. Key 1 may or may not also be conveniently available as an extra button reachable by the thumb while still holding the handle. This way of adjusting the gain saves valuable time.

Audio RSSI

The main lobe of a 3-element Yagi or other reasonable antenna used in ARDF is not particularly narrow. Instead, the peak is rather flat and it can be hard to determine the precise direction of the maximum by trying to listen to changes in volume on the order of a dB. But the software can easily discern such small changes and can help.

The audio RSSI works by translating the signal strength to a tone with a pitch (frequency) that depends on the signal strength. This tone is added to the normal received audio, but is often at a significantly different frequency, making it possible to discern the two.

It turns out that it is much easier for the human ear to pick out small changes in pitch compared to small changes in volume. The audio RSSI tone depends on the amplified signal, such that a higher gain setting results in a higher pitch. There is also an additional feature that there is a sudden jump upwards in pitch when the signal reaches a certain threshold. By adjusting the gain such that this jump occurs just at the tip of the antenna lobe, it becomes relatively easy to find the precise direction of the maximum signal.

Pressing the auto-gain button while the antenna is pointed approximately towards the maximum, sets the gain very close to this ideal gain setting. One may have to make a fine adjustment, either by pressing the button again with the antenna in a slightly different direction, or by adjusting the gain by a dB or maybe two by rotating the knob.

If this feature is not desired, it can be turned off by holding the key 1 down for at least one second. It can then be re-enabled by another long press on key 1.

Navigating Between Functions

To access other features than setting the gain, one clicks on the encoder and the block cursor changes to an underline.

Another thing that happens is that the bottom row changes from displaying the time and which fox is transmitting, to show what the functions of the four membrane keys are.

The four keys have the following functions in this state:

  • Key 1, Auto Gain, as explained above. Holding this button for more than 1 second toggles audio RSSI, which is indicated in the display by the R at the top right changing to an x.
  • Key 2, IF bandwidth, cycles between an IF bandwidth of 21 kHz, 6 kHz and 3 kHz. Lower bandwidth means lower noise floor, but also that the frequency setting must be closer to the actual frequency of the fox. The bandwidth setting affects the step size when manually adjusting the frequency. This feature is rarely needed, but could be useful if some fox is particularly weak.
  • Key 3, cycle between pre-programmed frequencies. Frequency 1 of 2 is active in the photo above.
  • Key 4, activate the gain setting and toggle between showing time or key labels on the bottom row.

At this point, rotation of the knob moves between items on the screen. One can e.g. move one step to the frequency setting:

Here the underline cursor is at the beginning of the frequency. To change the frequency, one has to click on the knob to select the current item:

This makes the second row taller at the expense of the first row. The underline cursor also moves to show which digit in the frequency is being adjusted. As mentioned previously, the IF bandwidth setting affects how much the frequency is changed for each step of the encoder. At 21 kHz, the step size is 10 kHz. At 6 kHz, the step size is 2 kHz while at 3 kHz IF bandwidth, the step size is 1 kHz.

Clicking the encoder deactivates the frequency item and one can move on to either of the four items at bottom of the screen. This means that one can use the encoder to activate the functions of the membrane keys. This is a redundant safety feature as I once had a membrane keyboard fail during a training, which then limited what I could do with the receiver until the hardware was repaired.

As mentioned previously, holding key 1 for a second or more toggles whether audio RSSI is present. If it has been disabled, the R at the top right changes to an x:

The menu symbol (“hamburger”) at the bottom right is the gateway to the menu system. One does however not get into the menu by pressing key 4, but by navigating there using the encoder and pressing the encoder. This is not something one normally has to do during a race, but rather when configuring the receiver in preparation of a race. Here the underline cursor is under the hamburger symbol:

The top of the menu looks like this:

The down-arrow at the bottom right indicates that there are more items further down. The S in “Set” on the top row currently has the underline cursor. Scrolling down, one can see the rest of the menu:

The X at the bottom right is a menu item that exits the menu. The menu can also be exited by pressing 4.

The functions of the menu items are as follows:

Set t=0

This is at the top of the menu since there is a small chance it can be useful during a race. Activating this rounds the seconds in the real time clock to zero. The idea is that if the transmissions are out of sync with the clock in the receiver, one can activate this function exactly when one fox stops and the next starts transmitting to synchronize the clock to the foxes.

Having the clock match the transmissions ensure the beeps (normally indicating 30 seconds and 50 seconds) come in the correct phases within a cycle and that the fox number shown on the LCD is correct.

Lock frequency

Activating this makes the receiver find the strongest frequency peak within the pass band (normally 21 kHz wide) and retune to that. Could perhaps be useful if the transmitters are slightly off. I don’t think I have ever had to use this function in a race and it is not thoroughly tested.

Frequency table

This is where frequencies can be pre-programmed.

When the function is entered, the first menu item, number of frequencies, is selected, so rotating the knob changes how many frequencies there are in the list. From 1 up to 9 frequencies can be pre-programmed. Normally only 2 are used, the frequencies of the foxes and the one for the beacon.

When editing the frequencies, one can press the keys 1 and 2 to move to a more or a less significant digit in the number. Only the digits representing 1 Hz to 100 kHz can be directly edited, but it is possible to select frequencies between 143.9 MHz and 146.1 MHz (by e.g. adjusting the 100 kHz digit).

Selecting Apply stores the programmed values. Selecting X (or pressing 4) before the values have been stored exits the menu without saving the changes.

Clock settings

This where the real time clock can be set. (It is by the way also synchronized to the computer clock when uploading software to the receiver.)

The current time is shown at the top. The minutes can be incremented or decremented by the menu items min++ and min–. Likewise for the seconds. There is also an option to set the seconds to 0. Normally one only has to adjust the time buy a few seconds and using these functions is the easiest way of doing that. The settings take effect immediately, so “Apply” at the bottom of this menu should not be selected after using these.

There is also an option further down to directly set hours, minutes and seconds arbitrarily. A 24h clock is used.

A word of warning: “Apply” applies the time that has been entered in the “Set:” item, so if you just adjusted the time using the features at the top, you should NOT select “Apply” before exiting the menu as that would overwrite the clock with a value you probably do not want to set the clock to.

Event settings

This is the menu where one specifies particular features of the upcoming race, namely start time, number of controls (foxes) and the time per control. These values are used by the receiver to e.g. calculate which fox is currently active.

Beep settings

There are just two settings here. The timing for a single beep and for a double beep relative to the fox transmission cycle.

Normally I have these set to give one beep at 30 seconds to let me know that we are halfway through a cycle and a double beep at 50 seconds to signal that there is just 10 seconds left. If set to 0, the beep will not occur.

Misc settings

Here we can set:

  • What the gain should be set to when powering on the receiver
  • The contrast of the LCD, between 0 and 63 (there is probably no reason so set it to anything other than 63)
  • The audio volume of the beeps. The beep is played repeatedly while adjusting this, to help determine a good level.
  • The volume of the audio RSSI signal. The tone is played repeatedly while adjusting this, to help determine a good level.

Colors

I use up to five different colors to draw bearings on the map. To help me not mix up the colors, there is as mentioned previously a field on the main screen where the color of the current fox is shown. This menu allows the user to define which color is associated with which fox. The colors available for selection are RED, GRN, BLU, YEL and BLK. Up to nine foxes can be associated with a color.

Factory reset

If the settings become totally messed up or directly after building a receiver, it can be useful to return to default settings throughout. This menu item enables that. To prevent accidental clearing of hard-won optimized settings, the menu item has a safety feature that only does the clearing if the number 5 is entered (via the rotary encoder) before exiting the item. The number starts at 0 when the item is selected.

Gain cal

This item allows entering and storing gain calibration values specific to the receiver. As described in the article about the RF board, there are two PIN-diode based gain/attenuation control circuits in the frontend and the effect they have on the gain can vary a little from unit to unit.

Using the “Gain lab” (see next section) and a signal generator (or test transmitter), it is possible to determine the effect the settings have on the gain. After having done that, the values can be entered here. The calibration values are then used when calculating what RSSI value to show in the LCD. The displayed RSSI value should of course not be dependent on the gain setting (as long as the signal is well above the noise floor for the current configuration), so it is necessary to take the gain of all the stages in the signal chain into account when doing this calculation.

There are four values that can be entered here:

  • BaseGain: Normally this is left at 0 dB, but it could be useful to adjust it if it is important to make several receivers show precisely the same RSSI for the same incoming signal strength.
  • InputAtt: This is the difference between disabled and enabled attenuation right at the input, while the LNA is in its low-gain state.
  • Att+LNA: This is the difference between high and low gain in the LNA while the input attenuation is enabled.
  • NoAttLNA: This is the difference between maximum sensitivity (no attenuation at the input and maximum LNA gain) and minimum sensitivity (attenuation at the input and minimum LNA gain).

Remember to click on “Apply” after entering these values.

Gain lab

There are several stages in the signal path where the gain (or attenuation) can be set. The gain control used during a race orchestrates all these settings to (hopefully) maximize dynamic range for the required sensitivity, so the user only has to select a single number and not worry about the details.

The purpose of the gain lab feature is to help in development and troubleshooting of the gain control routine and also to allow direct measurement of the effect various gain/attenuation stages have, so that they can be entered in the Gain cal menu.

Gain lab is not particularly polished and somewhat cryptic, partly due to the limitation of the small LCD. So don’t expect it to be perfectly intuitive. The description here is probably necessary to make sense of it.

Let’s start with the five numbers on the third row. These are the current settings of the five different stages that comprise the total gain. All of these are menu items that can be directly controlled. They are in order:

  • Input attenuation; can be either 0 (attenuation enabled) or whatever value it is set to in Gain lab (e.g. 19 dB)
  • LNA gain; can be either 0 (minimum gain) or some value like 13 dB (depending on Gain cal settings)
  • IF gain; can be either 0, 20 or 40 dB (this is assumed to be quite accurate and cannot be calibrated)
  • Input gain in the audio codec; can be from -96 to +24 dB, but the values used are from -20 to +24.
  • Software gain; from 0 to 50 dB

The two numbers on the fourth row are the raw signal strengths in dBFS (dB relative to full scale) as seen on the I and Q channels from the audio codec. Increasing the gain by 10 dB should increase the reading by 10 dB if everything is calibrated correctly and the input signal remains the same (and is significantly above the noise floor).

9.2 in the top right corner is the RSSI in dB, as displayed on the main screen. Changing the gain should not change this number. Again, under the assumption that everything is calibrated correctly and the input signal remains the same (and is significantly above the noise floor).

The top left item, 30 dB above, is the normal gain setting. Adjusting this adjusts the values on the third row in the way that the gain control routine works. So, this provides an opportunity to see how the gain control routine distributes the gain. The thought behind it is to not have more gain than necessary early in the chain so that we reduce the risk of saturating any stage if a strong blocker is present. Higher gain early in the chain improves noise performance, but that is only of interest if the signal we are listening to is weak and it comes at the expense of worse blocker performance, so it is only at the higher gain settings that the input attenuation is removed, higher LNA gain is enabled and the IF gain is increased above 0 dB. As a few examples: 60 dB of gain is currently the limit where the IF gain is increased above 0 dB while 64 dB of gain is where the input attenuation is disabled.

The menu item “Zero” applies an offset to the raw dBFS readings on the fourth row to set them to zero at the current input signal and gain setting. This makes it easier to see the number of dB the signal strength changes when a gain setting is adjusted. This is obviously quite useful when figuring out the proper values for the Gain cal menu.

“dBFS” is also a menu item. Activating this removes the offset that was applied by “Zero” and thus reverts the readings on the fourth row to be in dBFS.

Here is an example where the total gain has been increased to 100 dB. Note that most numbers on the third row have gone up, indicating e.g. that the input attenuation is disabled, the LNA is in the high-gain mode and the IF gain is at 40 dB. The signal strengths shown on the fourth row did not go up by 70 dB, but this is easily explained by the fact that there was no input signal, so only noise contributed to the signal. A significant portion of the noise came from late in the chain, so increasing gain early in the chain does not amplify this noise.

After activating “Zero” dBFS”, the readings on the fourth row are close to 0:

So how does one use Gain lab to figure out the values to enter into the gain cal menu?

The best way is probably to use a signal generator capable of generating a 144.5 MHz tone at e.g. -50 dBm. The tone does not have to be AM modulated. In fact, it is probably better if it is unmodulated.

  1. Start with a total gain (upper left) of 30 dB, which should set the first three numbers on the fourth row to zero. The readings on the fifth row is -83.7 and -83.1 on my receiver in this case.
  2. Select “Zero”
  3. Toggle the first number (input attenuation) on line three. (The actual value shown is the one entered in Gain cal.)  Note down the readings on line four. In my case they are 18.7 dB. This value should be entered as InputAtt in Gain cal.
  4. Set the first number to 0 and toggle the second (LNA). This gives 16.9 dB in my case. This shall be entered as the Att+LNA value in Gain cal.
  5. Make both the first and the second numbers non-zero. This gives me 32.5 dB. This shall be entered as the NoAttLNA value in Gain cal.

If a suitable signal generator is not available, the same calibration can be done with a fox hunting transmitter at a suitable distance. But it may be harder to get stable readings if the transmitter turns off the carrier between the dits and dahs.

FoxScope 2m – 144 MHz ARDF Receiver – Part 5 – Mechanics

By Per Magnusson, SA5BYZ

The receiver is mechanically based mostly on 3D-printed parts. The antenna is described in a previous article, so this section focuses on the mechanics of the receiver itself.

The 3D models can be downloaded via the following link:

Link to a zip-file with the files:


[ZIP]

I printed most of the parts using PETG which is tough, reasonably heat resistant and relatively easy to print with. I used a 0.4 mm nozzle. Some of the parts (gaskets) are printed in flex material (TPU).

The main part of the box is the bottom:

It prints mostly without supports, but some may be helpful at the USB connector and perhaps at the power switch:

There are twelve holes where M2.5 heat-set inserts shall be, well, inserted. The holes are designed to fit IUB-M2.5-1 inserts, which are sold by Mouser under the part number 153-IUB-M2.5-1. I used a soldering iron set to 250 degrees or something like that to press down the inserts in a controlled manner. There are also dedicated tools to do this.

This is what it may look like with the inserts in place:

To fasten the box to the antenna, one has to glue clamps to the bottom side. These clamps will see some force pulling the layers apart, so it can be a good idea to print them with 3-4 perimeters. The newest version of the 3D files for the clamps has some added tiny holes (not shown here) around the nut-slots to ensure even more perimeters are formed where the strength is needed.

I used epoxy as glue and a simple fixture to keep the clamps aligned. There are two areas with recesses on the bottom where the clamps shall be glued. The recesses make the surface uneven, which makes the glue stick much better.

The fixture holding the clamps in place during gluing:

A piece of 16 mm electrical pipe of the same type used for the antenna should also be placed in the clamps to perfectly align them. Such a tube is also perfect for applying some weight during gluing to make the glue joints thin and strong.

When the glue has set, it is time to put the RF board in the box. In an attempt to reduce water ingress around the SMA connector, I designed a little gasket that can be printed in TPU or some other flex material:

To make this really effective, I think it needs some help of silicone as well.

The power switch also has a TPU gasket (which probably needs some silicone too to be waterproof):

Two ~2 cm long wires need to be soldered between the power switch and the USB board.

The USB board can be pressed towards the panel to compress the gaskets of the USB and audio connectors using a little excenter piece that rotates around an M2.5 screw:

The RF board (with its shield properly in place) is secured by the nut at the SMA connector and four 6 mm long M2.5 screws.

The 1500 mAh LiPo battery fits next to the RF board while the USB board sits in the other end of the box. Notice that the excenter has been rotated by about 30 degrees to push the board towards the panel to the right. The other screw secures it in position.

The USB board holds the battery in place and is secured by one 10-12 mm long M2.5 screw and one that is 6 mm long.

The Processor board plugs into the RF-board and is initially held in place only by the two M2.5 x 6 screws to the right:

The Teensy Micromod is locked in place by a countersunk M2.5×4 screw, preferably with a little Loctite or other compound to ensure it does not unscrew itself.

A 30 mm long 20-pole FFC cable with 0.5 mm pitch and contacts on the same side on both ends connects the processor board and the USB board. Flip down the locking flaps to secure the connection after the cable has been inserted.

The LCD rests on a 3D-printed standoff, which also helps form a shield around the Teensy.

Place this standoff under the LCD board and wrap copper tape from the top of the LCD board around the walls of the standoff. Solder the copper tape to the LCD board and place EMC gaskets with 2×2 mm cross section on the bottom surfaces:

To make it easier to put the LCD board correctly onto the connector of the processor board, one can print a little shroud and put it around the processor board socket. This prevents the pin header from fitting if it is misaligned:

Plug the LCD assembly into the connector on the processor board and secure it with four M2.5 x 12 mm screws.

Cut a 33 x 52 mm piece of 1 – 1.5 mm thick clear polycarbonate or other transparent plastic that is suitable as a window over the LCD. Glue this (using e.g. epoxy) to the inside of the top cover. There is a 34 x 53 mm recess in which this window fits. Take care to not get significant amounts of glue on the visible part of the window, while still forming a glue joint that is waterproof all around.

Let the glue set.

Insert the connector and cable of the membrane keyboard through the rectangular hole in the box front:

There is adhesive at the back of the keyboard, but I think this is too unreliable for this application, so I recommend gluing the keyboard with epoxy. It might be a good idea to place masking tape above and below the keyboard before applying the glue to get less messy glue squeeze-out results than I did.

It should be possible to tear off the masking tape before the glue sets to remove the excess glue. The keyboard needs to be kept under pressure while the epoxy sets.

Use epoxy to also glue the keyboard to the inside of the front panel. The glue joint should form waterproof seals around the LEDs and the encoder. (The photo below is from an earlier version of the front panel PCB which was not quite compatible with the new keyboard pinout, hence the misaligned keyboard connector and the patched ground connector to the pin header.)

Plug in the battery and connect the 127 mm long 24-pole FFC cable to the processor board. Remember to flip down the locking flap to secure the connection after inserting the cable.

Plug the FFC cable into the front board. It is very important to observe the polarity! See the photo below.

To help make the box more waterproof, a gasket should be printed using flex material:

Place the gasket between the two pieces of the box.

Insert six square M3 nuts in the slots at the screw holes in the top piece. A little tack-it or similar sticky material can be useful in helping keep the nuts in place.

Screw the two pieces together using six M3x16 screws.

The encoder needs a knob and one solution is to print one using flex material:

Push it onto the knob shaft.

Insert four square M3 nuts in the slots in the clamps on the bottom side. Again, it is a good idea to secure them using tack-it or similar.

The receiver is now ready to be mounted on the 16 mm antenna boom using M3 x 14 screws.

One optional feature could be added to the receiver, namely a button that is accessible by the thumb while holding the handle. The button can be seen to the upper left in the photo above. The purpose of this button is to allow quick and easy access to activating the AGC while direction finding. By optimizing the gain while pointing generally in the direction where the signal is the strongest, the audio-RSSI (see the description of the software) becomes maximally effective in pinpointing in which direction the signal is strongest. Without this extra button, one has to reach for the top of the receiver and press on button 1 to perform an AGC setting, or use the knob to adjust the gain manually.

The thumb-knob is built into a little housing made of 3D-printed flex material. The box consists of a thin lid with a channel for the cable and the box itself where a piece of perfboard with a tactile switch can be slid in:

I have not made any custom PCB for this. A small piece of perfboard is perfectly sufficient. The tactile switch I used was probably a PTS645SL43SMTR92 LFS, Digikey P/N CKN10880CT-ND. The cable was a very thin two-conductor thing from the junkbox. I drilled a hole in the side of the receiver box, pulled the cable through and sealed it with epoxy. Epoxy was also used to glue the button housing to the clamp at the bottom of the box.

The cable was soldered to the pin for button 1 and ground on the front panel board:

Bill of Materials

Here is a list of the parts that are required in addition to the 3D-printed ones:

The BOM is included as a PDF in the zip archive linked at the top of the article.

FoxScope 2m – 144 MHz ARDF Receiver – Part 4 – Other Boards

By Per Magnusson, SA5BYZ

In addition to the RF and processor boards described in previous articles, there are three simpler boards that make up the electronics of the receiver.

The following files are available for download:

  • Schematics PDF
  • Layouts PDFs
  • Layouts as gerbers
  • BOMs (Bill of materials)

Link to a zip-file with he files:


[ZIP]

LCD Board

The LCD board is very simple. It essentially just contains the LCD and the connector towards the processor board. The LCD is a 16×4 alphanumeric one called EA DOGS164W-A without backlight. It can also be used as 3×16 where one of the rows is twice as high and this mode is used during a race to enlarge either the gain setting and the RSSI indicator, or, more rarely, the frequency setting.

This is all there is to the schematic:

C1 seems to be required by the internal circuitry of the LCD, but is not really mentioned in the datasheet, except that it is present in an example schematic. The decoupling capacitor C2 could probably be skipped as the power consumption is extremely low. The backlight pins are connected, but a module without backlight is used here. The display is configured to use I2C as the interface by grounding the IM1 pin (SPI is another option). Applying a reset pulse after power up is recommended.

The datasheet does not mention what the limits are for the supply voltage. Nominal is 3.3 V, but it seems to run fine on 3.1 V also.

The PCB

The PCB has two layers and is 0.6 mm thick. It is 52 x 47 mm in size. This board is easy to solder manually. The assembly drawings for top and bottom are shown below.

The layout consists mostly of ground planes and this board serves double duty by also being part of the top of a shield box around the processor.

The assembled board looks like this:

The large frame of exposed metal on the bottom side connects to the rest of the shield (formed by a 3D-printed part with copper tape) around the processor.

USB/Headphone Board

This board has the USB and headphone connectors as well as provides the connection for the power switch. It is quite simple without any active components. The schematic is shown below.

J1 is the FPC connector towards the processor board. J2 is the headphone connector wired such that it should work with all (or at least most) 3.5 mm headphones, regardless if they have a microphone or not. J3 is the USB-C connector for charging and firmware updates. Both the headphone jack and the USB connector are waterproof types with gaskets towards the panels, but the waterproofing is unlikely to be perfect because of the uneven surface of 3D-printed walls.

The 5.1 kohm pull-downs on CC1 and CC2 of the USB-C connector, signals to a connected USB host/charger that it should enable 5 V on VBUS. See the article “All About USB-C: Resistors and Emarkers” on Hackaday for more details. If we were to draw more than 500 (or is it 900?) mA from VBUS, we should really check the voltage on CC1/CC2 to see that the source is able to provide that much current. But here it is not strictly necessary. If the receiver is connected via a USB-A to USB-C cable, then these CC pins are not connected and do not matter.

The power switch connects via wires to the through-hole pads TP1 and TP6. Grounding POWER_SW# enables power to the receiver. The pull-up R3 to HP_DETECT# is not populated as there is already another pull-up on the processor board side. SIGGEN/P1 is not used in this 2 m receiver (although it is used for an unshielded inductor that can act as the antenna for a very weak test transmitter for antenna tuning in an 80 m receiver that uses the same board).

VUSB is the voltage from the USB-C connector used for charging the LiPo battery.

The USB_P/N signals carry the USB data.

RIGHT/LEFT_HP are the headphone audio signals. PROG# connects to an optional push-button. This is the processor programming signal that can take it out of some software lock-ups, but is usually not needed. Another PROG# push-button exists on the main board.

HP_DETECT# gets pulled low when plugging in headphones. This is currently not used by the software, but a way to use it as the power-up signal for the receiver is described in the text about the processor board.

J1 is located on the bottom side of the board, while the rest of the components are on the top side. I soldered all these components myself, although both the USB connector and the FPC connector are quite fine pitch. Using a solder paste stencil may help dispensing a suitable amount of solder paste, but someone reasonably experienced with SMD soldering should be able to solder all these connectors with the help of a stereo microscope, a good soldering iron with a thin tip, thin solder wire and perhaps a little flux and solder wick.

Here are the assembly drawings:

And 3D views of the board:

The oval hole in the middle of the board allows a 3D-printed eccentric piece to push the board towards the wall of the box to compress the gaskets of the connectors. This may make the gaskets somewhat more effective, although one probably needs to use e.g. silicone to make the seals truly watertight.

The two copper layers look like this:

Some attempt was made to keep the differential impedance of the USB data lines close to 90 ohms. This board is 0.8 mm thick.

Front Panel Board

The front panel has four buttons, a rotary encoder and three LEDs. These are all supported by a PCB that allows all these parts to be connected via a single FFC cable to the processor board. The front panel board is glued (preferably by epoxy) to the inside of the front panel of the 3D-printed case.

This board is also a very simple 2-layer design. The schematic is shown below.

J1 is the FPC connector towards the processor board. It has 0.5 mm pitch, so requires some skill when soldering. P1 is a pin header to which the membrane keyboard connects. I used the same keyboard from Adafruit in a previous receiver, but apparently it was changed so that the common pin ended up on the other end of the row of pins. I therefore had to patch my boards to accommodate this, but the issue has been corrected in the design shown here. The numbering of the button signals may still be incorrect both here and on the processor board though… Since I was lazy, I did not create symbols and footprints for the LEDs and encoder. Instead, I used test points and manually placed them suitably near holes in the board so that the components could stick out through these and further out through the front. Here are 3D views of the board:

To help reduce water ingress around the encoder, a gasket can be printed using flex/TPU material and put on the encoder before soldering it to the PCB. Adding some silicone to both sides of the gasket is probably a good idea.

The photo below is from an earlier revision of the board where the keyboard connector had to be patched (by offsetting it one notch and adding a new ground connection). The published version does not have this bug.

I made the power LED yellow, the charging LED red and the charging-done LED green. The legs of the LEDs need to be bent in a funny way to reach down to the surface of the PCB. Surface mounting through-hole LEDs like this is perhaps not quite the norm.

This board is 0.6 mm thick to keep weight down.

The legs of the angled pin header need to be cut to be flush with the side of the board that gets glued to the front panel.