Archive for category Amateur Radio

Raspberry Pi Serial vs. TNC-Pi2 vs. APRX

The APRX iGate program I’m using produces a hardware & software event log file:

2016-09-03 11:24:40.368 TTY /dev/serial0 read timeout. Closing TTY for later re-open.
2016-09-03 11:25:10.373 TTY /dev/serial0 Opened.
2016-09-03 11:32:05.485 CLOSE APRSIS heartbeat timeout
2016-09-03 11:32:15.495 CLOSE APRSIS reconnect
2016-09-03 11:32:15.776 CONNECT APRSIS
2016-09-03 12:25:11.154 TTY /dev/serial0 read timeout. Closing TTY for later re-open.
2016-09-03 12:25:46.154 TTY /dev/serial0 Opened.
2016-09-03 15:50:14.905 TTY /dev/serial0 read timeout. Closing TTY for later re-open.
2016-09-03 15:50:46.155 TTY /dev/serial0 Opened.
2016-09-03 16:50:51.155 TTY /dev/serial0 read timeout. Closing TTY for later re-open.
2016-09-03 16:51:26.155 TTY /dev/serial0 Opened.

I have no idea what’s going on with the “read timeout” messages. They seem to occur almost exactly a hour apart, except when they’re a few hours apart. The TNC-Pi2 board includes a PIC processor; maybe it loses track of something every now & again, but APRX only notices if it happens in the middle of a read operation.

The APRSIS server connection drops every few days and APRX seems well-equipped to tolerate that.

All in all, it’s working fine…



Red Oaks Mill APRS iGate: KE4ZNU-10

APRS coverage of this part of the Mighty Wappinger Creek Valley isn’t very good, particularly for our bicycle radios (low power, crappy antennas, lousy positions), so I finally got around to setting up a receive-only APRS iGate in the attic.

The whole setup had that lashed-together look:

KE4ZNU-10 APRS iGate - hardware

KE4ZNU-10 APRS iGate – hardware

It’s sitting on the bottom attic stair, at the lower end of a 10 °F/ft gradient, where the Pi 3’s onboard WiFi connects to the router in the basement without any trouble at all.

After about a week of having it work just fine, I printed a case from Thingiverse:

KE4ZNU-10 APRS iGate - RPi TNC-Pi case

KE4ZNU-10 APRS iGate – RPi TNC-Pi case

Minus the case, however, you can see a TNC-Pi2 kit atop a Raspberry Pi 3, running APRX on a full-up Raspbian Jessie installation:

RPi TNC-Pi2 stack - heatshrink spacers

RPi TNC-Pi2 stack – heatshrink spacers

You must solder the TNC-Pi2 a millimeter or two above the feedthrough header to keep the component leads off the USB jacks. The kit includes a single, slightly too short, aluminum standoff that would be perfectly adequate, but I’m that guy: those are four 18 mm lengths of heatshrink tubing to stabilize the TNC, with the obligatory decorative Kapton tape.

The only misadventure during kit assembly came from a somewhat misshapen 100 nF ceramic cap:

Monolithic cap - 100 nF - QC failure

Monolithic cap – 100 nF – QC failure

Oddly, it measured pretty close to the others in the kit package. I swapped in a 100 nF ceramic cap from my heap and continued the mission.

The threaded brass inserts stand in for tiny 4-40 nuts that I don’t have. The case has standoffs with small holes; I drilled-and-tapped 4-40 threads and it’ll be all good.

The radio, a craptastic Baofeng UV-5R, has a SMA-RP to UHF adapter screwed to the cable from a mobile 2 meter antenna on a random slab of sheet metal on the attic floor. It has Kenwood jack spacing, but, rather than conjure a custom plug, I got a clue and bought a pair of craptastic Baofeng speaker-mics for seven bucks delivered:

Baofeng speaker-mic wiring

Baofeng speaker-mic wiring

For reference, the connections:

Baofeng speaker-mic cable - pins and colors

Baofeng speaker-mic cable – pins and colors

Unsoldering the speaker-mic head and replacing it with a DE-9 connector didn’t take long.

The radio sits in the charging cradle, which probably isn’t a good idea for the long term. The available Baofeng “battery eliminators” appear to be even more dangerously craptastic than the radios and speaker-mics; I should just gut the cheapest one and use the shell with a better power supply.

I initially installed Xastir on the Pi, but it’s really too heavyweight for a simple receive-only iGate. APRX omits the fancy map displays and runs perfectly well in a headless installation with a trivial setup configuration.

There are many descriptions of the fiddling required to convert the Pi 3’s serial port device names back to the Pi / Pi 2 “standard”. I did some of that, but in point of fact none’s required for the TNC-Pi2; use the device name /dev/serial0 and it’s all good:

serial-device /dev/serial0 19200 8n1 KISS
callsign $mycall # callsign defaults to $mycall
tx-ok false # transmitter enable defaults to false
telem-to-is false # set to 'false' to disable

Because the radio looks out over an RF desert, digipeating won’t be productive and I’ve disabled the PTT. All the received packets go to the Great APRS Database in the Cloud:


An APRS reception heat map for the last few days in August:

KE4ZNU-10 Reception Map - 2016-08

KE4ZNU-10 Reception Map – 2016-08

The hot red square to the upper left reveals a peephole through the valley walls toward Mary’s Vassar Farms garden plot, where her bike spends a few hours every day. The other hotspots show where roads overlap the creek valley; the skinny purple region between the red endcaps covers the vacant land around the Dutchess County Airport. The scattered purple blocks come from those weird propagation effects that Just Happen; one of the local APRS gurus suggests reflections from airplane traffic far overhead.

An RPi 3 is way too much computer for an iGate: all four cores run at 0.00 load all day long. On the other paw, it’s $35 and It Just Works.


LF Loop Antenna: GPS Frequency Check

I stuck some old 12 V 7 A·h batteries in my homebrew power supply for the HP 3801A GPS Time / Frequency Standard, fired it up, put the antenna where it could see a good chunk of the sky, gave it a day to warm up / settle out, and it’s perfectly happy:

------------------------------- Receiver Status -------------------------------

SYNCHRONIZATION ............................................. [ Outputs Valid ]
SmartClock Mode ___________________________   Reference Outputs _______________
>> Locked to GPS                              TFOM     3             FFOM     0
   Recovery                                   1PPS TI -38.3 ns relative to GPS
   Holdover                                   HOLD THR 1.000 us
   Power-up                                   Holdover Uncertainty ____________
                                              Predict  366.2 us/initial 24 hrs

ACQUISITION ............................................ [ GPS 1PPS CLK Valid ]
Satellite Status __________________________   Time _____ +1 leap second pending
Tracking: 4        Not Tracking: 6            UTC      18:22:19     22 Jul 2016
PRN  El  Az   SS   PRN  El  Az                1PPS CLK Synchronized to UTC
  3  34 104   48   * 1  36  48                ANT DLY  0 ns
 17  62 308  103     6  27 220                Position ________________________
 19  39 281   50    11  21  58                MODE     Hold
 28  80 133   64   *22  Acq .
                    24  12 319                LAT      N  41:39:32.328
                    30  15 191                LON      W  73:52:26.733
ELEV MASK 10 deg   *attempting to track       HGT               +82.87 m  (MSL)
HEALTH MONITOR ......................................................... [ OK ]
Self Test: OK    Int Pwr: OK   Oven Pwr: OK   OCXO: OK   EFC: OK   GPS Rcv: OK
scpi >

The FFOM 0 entry says the Frequency Figure Of Merit is “within specifications” of 10-9, averaged over one day. That means the actual frequency should be within 0.010 Hz of 10 MHz.

Feeding the 10 MHz frequency reference into the (equally warmed up) HP 8591E spectrum analyzer and selecting an absurdly narrow span produces a comforting sight:

HP Z2801A GPS Receiver - 10 MHz ref - HP 8591E

HP Z2801A GPS Receiver – 10 MHz ref – HP 8591E

Given the horizontal resolution, that’s dead on 10 MHz.

So, yeah, that signal at 57-ish kHz really isn’t at 60.000 kHz:

Loop - 40T 1nF - spectrum

Loop – 40T 1nF – spectrum

Which is good to know …



External Li-Ion Pack: More Sawing

Two of the external Li-Ion battery packs I’m using with the bike radios seemed to fail quickly after being charged, so I sawed them open to check the state of the cells. This time I used the fine-tooth cutoff blades, rather than a coarse slitting saw:

Li-Ion pack - sawing case

Li-Ion pack – sawing case

As before, a 2 mm depth-of-cut, done 0.25 mm per pass after the first millimeter, seems about right. I didn’t saw the front of the case near the jack, which proved to be a mistake; the interlocked case halves need cutting.

No cell trouble found, which leads me to suspect an intermittent short in the battery-to-radio cable that trips the battery protection circuit. The spare cables went into hiding during the shop cleanout, so I can’t swap in a known-good cable just yet; of course, the existing cable behaves perfectly on the bench. The suspect cable is now on my bike and, if the problem follows the cable, further surgery will be in order.

For the record, the insides look like this:

Li-Ion pack - interior

Li-Ion pack – interior

The cell label seems to show a 2004 date code:

Li-Ion pack - cell label

Li-Ion pack – cell label

Given that I got them on closeout in early 2010, it definitely isn’t 2014.

Unlike some of the other cheap batteries around here, they’ve been spectacularly successful!


LF Loop Antenna: 60 kHz Tuning

The object of soldering all 40 wires in the 5 m hank of ribbon cable  in series is to build a 40 turn loop antenna to receive LF radio signals like WWVB at 60 kHz. The antenna, being basically a big coil of wire, will have an inductance that depends on its layout, so putting a capacitor in parallel turns it into a resonant tank circuit. Given a particular layout (and, thus, an inductance), you can choose the capacitor to make the antenna resonant at whatever frequency you need (within reason).

With the joints soldered & reinforced with epoxy, the inductance across all 40 turns:

  • 535 µH – rolled into a compact bundle
  • 6.66 mH – vaguely circular loop on the concrete floor
  • 5.50 mH – lumpy rectangle on the concrete floor

Back in a slightly different circular layout on the floor:

  • 6.8 mH – across all 40 turns, as above
  • 2.0 mH – across either set of 20 turns from the center tap

Given that inductance varies as the square of the number of turns, you’d expect a factor of four between those two inductances, but that’s not how it worked out.

Hanging the loop from a pair of screws in the floor joists to make a droopy rectangle-oid shape and driving it from a 600 Ω signal generator through a 10 kΩ resistor, it’s self-resonant at 213 kHz. Repeating that with a 470 kΩ resistor drops the resonance to 210 kHz, which isn’t different enough to notice and surely has more to do with my moving the loop while dinking with resistors.

Adding parallel capacitance (measured with an LCR meter, just to be sure) changes the resonance thusly:

  • 9.9 nF → 20 kHz
  • 900 pF → 64 kHz
  • 400 pF → 87 kHz
  • 250 pF → 108 kHz
  • none → 213 kHz

Because the resonant frequency varies inversely as the square root of the capacitance, halving the resonant frequency means you’ve increased the capacitance by a factor of four. Because 250 pF halves the frequency (mostly kinda sorta close enough), the loop’s stray capacitance must be about 1/3 of that: 83 pF.

Yeah, 1/3, not 1/4: the additional capacitance adds to the stray capacitance, so it goes from 83 pF to 250 + 83 pF = 333 pF, which is four times 83 pF.

(If that sound familiar, it’s similar to the resonant snubber calculation.)

The self-resonant frequency of 213 kHz and the 83 pF stray capacitance determines the loop inductance:

L = 1/((2π · 213 kHz)^2 · 83 pF) = 6.9 mH

Pretty close to the measured value from the floor, I’d say.

To resonate the antenna at 60 kHz, the total capacitance must be:

60 kHz = 1/(2π · sqrt(6.9 mH · C)) → C = 1050 pF

Which means an additional 1050 – 83 =  970-ish pF should do the trick, which is about what you’d expect from the 64 kHz resonance with the 900 pF cap above. I paralleled pairs of caps until it resonated at 59.9 kHz.

The -3 dB points (voltage = 1/sqrt(2) down from the peak) turned out to be 58.1 and 60.1 kHz, so my kludged caps are slightly too large or, once again, I nudged the loop.

Figuring Q = (center frequency) / bandwidth = 59.1 / 2 = 30, which works out close enough to Q = X / R = 2600 / 80 = 33 to be satisfying. Using standard 26-ish AWG ribbon cable, rather than crappy 31-ish AWG eBay junk, would double the conductor area, halve the series resistance, and double the Q. Faced with that much resistance, I’m not sure better caps would make any difference.

Attaching the spectrum analyzer through a 470 Ω resistor to reduce the load:

Loop - 40T 1nF - spectrum

Loop – 40T 1nF – spectrum

I’d love to believe that big peak over on the left at 57.1 kHz is WWVB, but it’s not.

What’s more important: the broad hump between 56 and 62 kHz, where the increased amount of background hash suggests the antenna really is resonant, with a center frequency around 59 kHz. The -3 dB points might be 57 and 61 kHz, but at 10 dB/div with 5 dB of hash, I’d be kidding myself.

Dang, I love it when the numbers work out!

It’s faintly possible the spectrum analyzer calibration is off by 2.5 kHz at the low end of its range. The internal 300 MHz reference shows 299.999925 and it puts FM stations where they should be, but the former could be self-referential error and the latter lacks enough resolution to be comforting. I must fire up the GPS frequency reference, let it settle for a few days, see whether it produces 10.000000 MHz like it should, then try again.

The original measurements:

Loop antenna tuning - measurements

Loop antenna tuning – measurements


LF Loop Antenna: Joint Soldering

Given five meters of 40 conductor ribbon cable, the object is to make a 40 turn five foot diameter loop antenna by soldering the ends together with a slight offset. After squaring off, marking, and taping the cable ends, I stripped the wires:

LF Loop Antenna - wire stripping

LF Loop Antenna – wire stripping

Twirling those little snippets before pulling them off produced nicely twisted wire ends with no few loose strands. Separate the individual wires, wrap with transformer tape to prevent further separation, run a flux pen along the wire ends, tin with solder, repeat on the far end of the cable.

Tape one end to the ceramic tile. Align the other end with a one-wire lateral offset and the stripped sections overlapping, then tape it down. Slide a paper strip between the ends, passing under every other wire, to separate the top pairs from the bottom pairs, then tape the strip in place:

LF Loop Antenna - wire prep

LF Loop Antenna – wire prep

Grab each left wire with a needle point tweezer, forcibly align with the corresponding right wire, touch with the iron, iterate:

LF Loop Antenna - top solder joints

LF Loop Antenna – top solder joints

The red wire trailing off to the left will become the center tap.

Slide a strip of the obligatory Kapton tape underneath the finished joints, slobber on enough clear epoxy to bond the insulation on both sides of the joints into a solid mass, squish another strip atop the epoxy, smooth down, wait for curing.

Untape from the tile, flip, re-tape, solder the bottom joints similarly, add Kapton / epoxy / Kapton, and that’s that:

LF Loop Antenna - complete joint

LF Loop Antenna – complete joint

Prudence dictates checking for end-to-end continuity after you finish soldering and before you do the Kapton + epoxy thing, which is where I discovered I had 80 Ω of distributed resistance along 200 meters of cable. A quick check showed 40 Ω at the center tap and 20 Ω at the quarters (the black wires on the left mark those points), so it wasn’t a really crappy joint somewhere in the middle.

The joint and its dangly wires cry out for a 3D printed stiffener which shall remain on the to-do list until I see how the loop tunes up.


eBay Listings: Read Carefullly

What’s wrong with this picture? (clicky for more dots)

eBay - 40 pin IDC cable - header

eBay – 40 pin IDC cable – header

Not obvious?

Here’s the description, slightly reformatted for clarity:

New 5m IDC Standard 40 WAY 1.8” Multi-Color Flat Ribbon Cable Wire Connector


Type: IDC standard.

10 colors, 4 group, total 40 pcs cables per lot

5 meter per lot.

width: 4.7 cm / 1.8 inch

Package content: 5M Flat Color Ribbon Cable

If you divide the 1.8 inch cable width by its 40 conductors, you find the wires lie on a 45 mil pitch. If you were expecting this “IDC standard” cable to fit in standard insulation displacement cable connectors with a 50 mil pitch, you’d be sorely disappointed. You can get metric ribbon cable with a 1 mm = 39 mil pitch, but this ain’t that, either.

Here’s what an individual eBay wire (black jacket) looks like, compared to a wire from a standard ribbon cable (red jacket):

Ribbon cable - 26 AWG - eBay vs standard

Ribbon cable – 26 AWG – eBay vs standard

A closer look at the strands making up the wires:

Ribbon cable - 26 AWG - eBay vs standard - strands

Ribbon cable – 26 AWG – eBay vs standard – strands

As nearly as I can measure with my trusty caliper, the eBay ribbon cable has wire slightly smaller than 30 AWG, made up of seven 40 AWG strands, as opposed to standard 26 AWG wire made of seven 34 AWG strands. The good stuff might be 28 AWG / 7×36 AWG, but I was unwilling to break out the micrometer for more resolution.

I’d like to say I noticed that before buying the cable, but it came to light when I measured the total resistance of the whole cable: 80 Ω seemed rather high for 200 meters of 26 AWG wire. The wire tables say that’s about right for 31 AWG copper, though.

Changing the AWG number by three changes the conductor area by a factor of two, so you’re getting less than half the copper you expected. Bonus: it won’t fit any IDC connectors you have on the shelf, either.

Turns out a recent QEX article suggested building an LF loop antenna from a ribbon cable, so I was soldering all the conductors in series, rather than using connectors, and it should work reasonably well despite its higher DC resistance.