Archive for category Amateur Radio

Satellite Dish Mounting Angle in Norway

A friend asked why Norwegians point their satellite dishes at the ground. After maneuvering Google Streetview around Vadsø for a while, I found a dish in profile:

TV satellite dish - Vadso Norway

TV satellite dish – Vadso Norway

Turns out geostationary orbit is way low, as seen from the top of the world. A bit of doodling shows it’s only 11° above the horizon at 70° N:

TV Satellite Dish - Horizon Angle at 70° N

TV Satellite Dish – Horizon Angle at 70° N

TV satellite antennas have an offset-fed reflector, with the receiver in the lump at the end of the spine sticking out from the bottom of the dish, so as to not obstruct the signal entering the dish. Even though the plane of the reflector points downward, the signal reflected to the receiver comes in from above.

Ain’t science trigonometry grand?


Vacuum Tube LEDs: Now With Morse Code

Adding Mark Fickett’s non-blocking Morse Arduino library turns the tubes into transmitters:

21HB5A on platter - orange green

21HB5A on platter – orange green

The plate cap LED blinks the message in orange, while both LEDs continue to slowly change color as before.

You define a Morse sender object (C++, yo!) by specifying its output pin and code speed in words per minute, dump a string into it, then call a continuation function fast enough to let it twiddle the output bit for each pulse. Obviously, the rate at which the callback happens determines the timing granularity.

However, setting a knockoff Neopixel to a given color requires more than just a binary signal on an output pin. The continuation function returns false when it’s done with the message, after which you can initialize and send another message. There’s no obvious (to me, anyhow) way to get timing information out of the code.

The easiest solution: called the Morse continuation function at the top of the main loop, read its output pin to determine when a dit or dah is active, then set the plate cap color accordingly:

LEDMorseSender Morse(PIN_MORSE, (float)MORSE_WPM);
Morse.setMessage(String("       cq cq cq de ke4znu       "));
PrevMorse = ThisMorse = digitalRead(PIN_MORSE);
if (!Morse.continueSending()) {
ThisMorse = digitalRead(PIN_MORSE);
if (ThisMorse) {             // if Morse output high, overlay
PrevMorse = ThisMorse;;               // send out precomputed colors
<<compute colors for next iteration as usual>>

I use the Entropy library to seed the PRNG, then pick three prime numbers for the sine wave periods (with an ugly hack to avoid matching periods):

uint32_t rn = Entropy.random();

Pixels[RED].Prime = PrimeList[random(sizeof(PrimeList))];

do {
  Pixels[GREEN].Prime = PrimeList[random(sizeof(PrimeList))];
} while (Pixels[RED].Prime == Pixels[GREEN].Prime);

do {
  Pixels[BLUE].Prime = PrimeList[random(sizeof(PrimeList))];
} while (Pixels[BLUE].Prime == Pixels[RED].Prime ||
        Pixels[BLUE].Prime == Pixels[GREEN].Prime);

printf("Primes: (%d,%d,%d)\r\n",Pixels[RED].Prime,Pixels[GREEN].Prime,Pixels[BLUE].Prime);

In the spirit of “Video or it didn’t happen”: YouTube!

The Arduino source code as a GitHub Gist:



Rewiring a Baofeng Battery Eliminator

An aftermarket “battery eliminator” for Baofeng UV-5R radios costs under seven bucks delivered:

Baofeng Battery Eliminator - overview

Baofeng Battery Eliminator – overview

That label seemed … odd:

Baofeng Battery Eliminator - Li-ion Label

Baofeng Battery Eliminator – Li-ion Label

The OEM battery, tucked inside a case that’s for all intents and purposes identical to this one, sports an 1800 mA·h rating that I regarded as mmmm optimistic; I’d expect maybe 1000 mA·h, tops. From what I can tell, the 3800 mA·h label should go on an extended-capacity “big” battery that wraps around the bottom of the radio. Maybe the factory produced a pallet of mis-labeled small packs that they couldn’t fob off on actual customers with a straight face and couldn’t justify the labor to peel-and-stick the proper labels.

Anyhow, it’s not a battery.

The circuitry inside shows considerably more fit & finish than I expected:

Baofeng Battery Eliminator - interior

Baofeng Battery Eliminator – interior

It’s not clear how effective that heatsink could be, given that it’s trapped inside a compact plastic enclosure snugged against the radio’s metal chassis, but it’s a nice touch. Two layers of foam tape anchor the terminals at the top and hold the heatsink / LM7808-class TO-220 regulator in place.

Although I wanted the DC input to come from the side, rather than the bottom, so the radio could stand up, the pack simply isn’t thick enough to accommodate the jack in that orientation. I drilled out the existing wire hole to fit a coaxial power plug and deployed my own foam tape:

Baofeng Battery Eliminator - rewired interior

Baofeng Battery Eliminator – rewired interior

Replacing the foam tape at the top holds the bent-brass (?) terminals in more-or-less the proper orientation, with Genuine 3M / Scotch Plaid adding a festive touch. A groove in the other half of the shell captures the free ends of those terminals, so they’re not flopping around in mid-air.

The jack fits an old-school 7.5 V transformer wall wart that produces 11 V open-circuit. It’s probably still a bit too high with the UV-5R’s minimal receive-only load, but I refuse to worry.

Now KE4ZNU-10 won’t become a lithium fire in the attic stairwell…

While I had the hood up, I used Chirp to gut the radio’s stored frequencies / channels / memories and set 144.39 in Memory 0 as the only non-zero value. With a bit of luck, that will prevent it from crashing and jamming a randomly chosen frequency outside the amateur bands…


APRS iGate KE4ZNU-10: Southern Coverage

A pleasant Friday morning ride with several stops:

KE4ZNU-9 - APRS Reception - 2016-09-09

KE4ZNU-9 – APRS Reception – 2016-09-09

KE4ZNU-10 handled the spots near Red Oaks Mill, along parts of Vassar Rd that aren’t hidden by that bluff, and along Rt 376 north of the airport.

The KB2ZE-4 iGate in the upper left corner caught most of the spots; it has a much better antenna in a much better location than the piddly mobile antenna in our attic.

Several of the spots along the southern edge of the trip went through the K2PUT-15 digipeater high atop Mt. Ninham near Carmel, with coverage of the entire NY-NJ-CT area.

The APRS-IS database filters out packets received by multiple iGates, so there’s only one entry per spot.

All in all, KE4ZNU-10 covers the southern part of our usual biking range pretty much the way I wanted.


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 …