Lab599 TX-500 QRP radio kit and friends

Ammo can, two solar panels with a cloth pouch stacked on top, and a carabiner holding assorted items together on a wood table.
HF QRP radio kit, solar charging kit, antenna hanging kit

Howdy all! This is a new post about my portable QRP radio kit and it supporting kits based around my Lab599 TX-500. Its a fairly self-contained kit but doesn’t have a couple key elements included in the actual box. It doesn’t have any equipment to hang the included trail friendly end-fed half wave dipole or battery charging equipment. I’ll include those elements in this post as well, but they don’t live in the HF radio kit itself. This will be a long post so strap in!

The QRP radio kit

Let’s start with how the HF radio kit is built out. It’s based around a small ammo can I got at a discount store. I wanted to have a fairly self-contained kit that was water resistant and durable and I also wanted the ability to charge and use the battery with the ammo can lid closed to protect against water and dust and ingress. This is by no means waterproof but I wanted to make sure it was at least splash and rain resistant since I do a lot of operating in the Pacific Northwest region of the US which is notorious for its rainy weather.

DC barrel jack with wire hanging off and a DC barrel connector with screw terminals on a wood table.
DC barrel connectors
DC barrel jack connected to a AC to DC charger on a wood table.
Testing charger and connector fit

The kit’s battery is a 4.5Ah Bioenno LiFePO4 pack. In order to make sure I can leave that battery in the kit I had to devise a way to connect it to an external charger through the can. After calling the folks at Bioenno I was able to determine the barrel connectors included on their batteries are 5.2 x 2.1mm connectors. The panel mount water resistant connectors I used have 18 gauge wire that supports a max of 10A at 12V DC. I was also able to track down a pack of screw-on terminal barrel connectors as well to connect the battery inside the ammo can. This setup also allows the battery can stay inside the case while the radio is being operated which is good for water and dust resistance. I recommend testing your connections before you drill for both polarity and appropriate voltage levels. In my case they worked fine so I proceeded…

Inside view of an ammo can with barrel connector jack mounted on the front and the DC barrel connector connected to the wire coming from the jack. The barrel connector end's wires are hot glued to the barrel connector. The ammo can is sitting on a wood table and some wires and connectors are sitting on the table in the background.
DC panel mount connector installed in case and insulated screw terminal connector installed

The first consideration in installing the connector is making sure the connector doesn’t interfere with the mechanism on the case that opens/closes it. After that you have to worry about the connector and wire on the inside of the case interfering with items in the case when it’s packed. I decided to place the connector in such a way that the radio laying on its side against the wall of the case would rest against the installed connector. Using a simple metal drill bit I was able to make a hole big enough for the panel mount connector just below the latch mechanism. I then removed any metal burs from the drilled hole and any turnings from the inside of the can to prevent rust, scratching, and short circuits. After installing the panel mount jack and the rubber water/dust cap I just screwed the positive and negative wires into the barrel connector that will hook up to the battery. To ensure no small metal parts caused a short I used hot glue to insulate and strengthen the connection points on the screw terminal barrel connector.

Interior view of an ammo can with a Bioenno battery mounted inside on a wooden table. There are also some wires and connectors sitting on the table in the background.
4.5Ah battery installed in the corner of the ammo can
Interior view of an ammo can with a battery affixed inside and connected to DC barrel connector. A powerpole connector is visible in someone's hand. A wooden table with various cables and connectors is visible in the background.
Battery connected to external DC barrel connector

The next step is adding the battery to the ammo can. I wanted the battery to be semi-permanently mounted in the box so I opted to use 2 x 4″ Velcro strips to secure the battery to two surfaces in the box. the link for those strips is to Amazon but similar strips are available at many stores and websites. The optimum position for the battery seemed to be in a corner where I could install Velcro strips on two of the faces of the corner making it removable without drilling more hols in the can or dealing with metal and glue. Fit testing your equipment is also important when deciding where the battery will be installed. I did that by attaching the loop side of the 2 x 4″ Velcro strips I cut to size to the battery but not removing the plastic that would go on the hook side of the Velcro intended for the inside of the can. Once I was satisfied with the location of the battery and my ability to pack the kit I removed the plastic backing from the hook side of the Velcro and stuck the battery in against the back and corner of the can. I was then able to connect the pass through electrical connection and make sure everything worked properly including polarization of the battery connection. Failing to test the polarity could result in damage to equipment or even potential issues that would compromise the battery. It should also be noted that the radio’s rubber feet make the fit against the battery very tight.

Ammo can and its lid as well as several cables and devices are laid out on a wooden table.
Kit contents + Bioenno 2A AC-DC charger

Here’s the contents of the kit. Left to right, top to bottom.

  • Ammo can body with battery and pass through DC cable installed.
  • Plastic bag to hold small adapters and connectors.
  • Ammo can lid
  • Bioenno 2A AC to DC charger for LiFePO4 batteries
  • Lab599 TX-500 speaker mic and Raspberry Pi 4 dedicated to the kit
  • West Mountain Radio PWRnode (4-way Anderson power pole connector in a right-hand-red configuration)
  • Lab599 TX-500 power connector w/Anderson powerpole connector installed in right hand red configuration
  • 2x Powerwerx USBbuddies (12v to 5v USB power converter)
  • 2x 25′ RG-174U cables w/BNC ends (multiple segments of shorter cable allow me to make the shortest connection possible for a given deployment)
  • 15′ RG-174U cable w/BNC ends
  • DIY REM/DATA GX12-7 connector for the TX-500 with a 1/8″ TRRS end connected to a Millso TRRS USB sound card
  • TX-500 USB CAT cable (stock cable that comes w/radio)
  • Par EndFedz trail-friendly EFT-10/20/40m antenna on winder w/BNC connector. This has some red paracord loops attached at each end of the antenna for easier connection to support lines and for visibility.
  • Powerwerx USBbuddy w/spliced-on USB-C connector for the dedicated Raspberry Pi 4. The splice minimizes cable length for less voltage drop and excess cable.
  • TX-500 radio w/3D printed GX-12 series connector dust caps caps installed
  • 2x DIY 5.2 x 2.1mm barrel connector to Anderson Powerpole adapter cables
  • 2x 6″ USB A to MicroUSB cables to connect devices for charging
  • 2x 6″ USB A to USB C cables to connect devices for charging
  • TX-500 morse code (CW) key connection cable (GX12-2 to 1/8″ TS)
  • W2ENY headset adapter wired for a dynamic mic. (The included adapter with the TX-500 was defective from the start in such a way that I’d have to significantly shorten the cable, and I also wanted to use a different PTT button and my existing Heil headset with a dynamic mic element)
  • 2x BNC barrel connectors to connect feed line segments together
  • 1/4″ to 1/8″ TS adapter for PTT switches
  • 1/8″ to 1/8″ TRS to TS adapter for ear buds connected to the speaker mic
  • 90 degree male to female PL-239/SO-239 connector (convenience)
  • BNC to PL-230/SO-239 male adapter (for connecting to most of my other antennas)
  • DIY 1/8″ TS PTT button made from spare parts I had lying around

Putting the kit together layer-by-layer is pretty easy. The below photos illustrate how the kit is packed in 3 layers – bottom to top.

Equipment packed into an ammo can.
The first layer at the bottom of the kit – battery, radio, Raspberry Pi, RPi USB C power converter, adpater/connector bag, radio power cable, Powerpole to barrel connector adapters, TX-500 data and CAT cable.
Equipment packed into an ammo can.
The middle layer of the packed kit – 2x USB buddies, all coiled feed line
Equipment packed into an ammo can.
The top layer of the packed kit – Speaker mic and its cable coiled around the trail-friendly antenna

Solar power kit

Now that we’ve covered the kit contents let’s talk field charging with solar power! The solar charging system I typically bring with this radio uses one or two 20W Goal Zero Nomad 20 folding solar panels. Those attach to a Buddipole PowerMini charge controller and power meter. Much of this solar charging kit is composed of cables, but it’s designed to be used with a number of my radios, batteries, portable lights, and USB device chargers.

Two small folded solar panels, one facing up, and the other facing down and a cloth pouch sitting on a wooden table.
Two solar panels and the charger kit

Depending on the deployment I may bring one or both solar panels with the charger kit, or sometimes I’ll just bring the charger kit for power metering to understand how much I’ve drawn my batteries down and at what rate I’m using power. You can check the Buddipole PowerMini’s product page to learn more about it and ways it can be used. In some cases with good sunlight a single 20W panel can provide around 1A (typical max power I’ve gotten from the panels), but in overcast conditions I might use both panels to get 1A peak power. It also might be a good idea to bring both panels to charge at about 2A. It’s especially nice if I expect to charge a phone/tablet and run a radio with a Raspberry Pi if I’m using data modes.

In the above photo you can see the two Goal Zero Nomand 20 solar panels. One of them is staged to show the top view of the panel and the other the bottom view. Each panel has a kick stand to hold itself up at various angles on the ground, cable with an 8mm plug, a USB charging port, and holes in the corners of the panel to suspend them. The Nomad 20s fold open to reveal three solar cells.

An opened cloth pouch open revealing devices and cables secured to the inside with paracord and elastic bands.
Charger kit opened
An empty cloth pouch, a velcro-backed sleeve, various cables and devices laid out on a wooden table.
Disassembled charger kit

The solar charger kit consists of a Condor MOLLE compatible pouch that has a detachable main pocket which allows you to install and remove the pocket without disconnecting the MOLLE part from the webbing, and also has a loop for easily suspending hanging the kit from something. The kit contains the following items:

  • Condor MOLLE compatible pouch w/ paracord loops to hold and suspend the Buddipole PowerMini
  • Condor MOLLE compatible pouch attachment platform. This comes as a single unit with the pouch listed above.
  • West Mountain Radio PWRNode (4-way Anderson Powerpole connector)
  • DIY MC-4 to Anderson Powerpole connector (for a 100W solar panel not pictured here)
  • BuddiPole PowerMini
  • DIY 2.5″ Anderson Powerpole jumper cable w/10 GA wire (rated for 30A @ 12V DC)
  • DIY 6″ Anderson Powerpole jumper cable w/10 GA wire (rated for 30A @ 12V DC)
  • DIY 4″ Anderson Powerpole to Goal Zero male 8mm connector pigtail.
  • DIY 4″ dual Goal Zero female 8mm plug to Anderson Powerpole pigtail. This allows the two Goal Zero solar panels to be used simultaneously.
  • DIY 3′ Female Goal Zero 8mm to Anderson Powerpole cable.

You’ll probably notice there are a lot of seemingly redundant connectors and pigtails in this kit. There’s a reason I carry so many adapters around, and that is to make sure I can run as little cable as possible to achieve connections between system components. Being able to use shorter cables help limit voltage drop, but having the option to use a longer cable to connect the solar panels might mean I can stay in the shade and keep my solar panels in the sun. The short Anderson Powerpole jumpers included in the kit can help me connect to the battery or connect a PWRNode to the PowerMini. The Anderson Powerpole connectors on the side of the PowerMini don’t allow you to connect the PWRNode directly to it, and even if they did you’d lose two of the four connections on the PowerMini side of the PWRNode. In most cases this kit powers the entire radio doing phone and data, a phone and tablet, etc. Most of the time the equipment barely uses the battery while operating during the day and I have a full battery to use at night for the radio and lights.

Antenna hanging kit

Two hanks of paracord, a throwing weight, and tent stakes mounted to a carabiner sitting on a wooden table.
Antenna hanging kit

Last but not least we have the antenna hanging kit. It’s great to have a radio and a way to power it, but if you can’t get your antenna where it needs to be it’s all for nothing. This part of the kit rounds off the portable radio station. It’s designed to work with a number of wire antennas I have – a Par EndFedz 6m antenna, the Chameleon EMCOMM III Portable, and the Par EndFedz EFT-10/20/40 trail friendly antenna that lives in the HF radio kit. In the case of the trail friendly antenna we require two points of suspension for horizontal dipole operation – the end of the wire antenna and the transformer component. Being in Oregon and setting up my radio station in the region quite a bit I frequently rely on trees as antenna supports, and thus also pack an arborist’s weight as part of my equipment to assist in hanging the line. It adds a lot of weight but is definitely worth it. Using rocks and other tree branches works but definitely comes with snagging risks and the possibility your line will come off of the wight you’re using to get the line up… especially when it comes to rocks. I carry 4 aluminum tent stakes with paracord loops and quick links for attaching line. Those are bound during transport by a piece of paracord I tied together to make the clanking of the tent stakes go away and to keep them from flopping everywhere. There are four aluminum tent stakes in the kit because I might want to anchor my Chameleon EMCOMM III in 3 or 4 spots depending on antenna configuration. I have two 75′ high visibility paracord hanks wound around Chameleon wire winders that can support two ends of antennas that are in a horizontal dipole configuration. Each hank of paracord has a quick link attached for connecting to the ends of an antenna or suspension point, and the arborist’s weight for deployment. I can leave one of the paracord hanks behind if I want to set an antenna up in a configuration that only requires one suspension point like an inverted V. I added a small loop of paracord to the Chameleon wire winders in one of the corner holes to take the weight of the assembly off of the elastic band that wraps the paracord when the hank is being stored or transported. The locking carabiner is used to hold everything together, clip the kit onto something like a backpack, or hang it from a pocket during setup. The specific carabiner I’m using is probably overkill but I had it laying around so I used it. There’s also another loop of paracord attached to the carabiner which acts as a more comfortable carrying handle and for storage by hanging from a door knob.

Antenna hanging equipment laid out on a wooden table.
The antenna hanger kit broken down to (most) of its individual components

Kit parts list below:

  • Notch 14oz arborist’s weight
  • Camp locking carabiner
  • Black paracord cut small into smaller pieces for use as a handle, 2x wire winder strain relief loops, and a keeper for the tent stakes (don’t ask me how I figured out how to tie that. I can’t really tell you how I did it except that I did a lot of experimentation.
  • 2x Chameleon wire winders
  • 6x threaded quick links (4 on stakes, 2 on the 75′ paracord)
  • 2x high visibility 75 ft paracord hanks w/ 3M high visibility strip included for working on the antenna suspension at night
Detailed view of tent stakes secured in a paracord sleeve.
Tent stake holder assembled

Note the paracord attachment point run through the quick links that make sure they don’t come out of the holder or make a bunch of noise. Both loops of black paracord go through the carabiner, but if you remove the attachment point with the quick links from the carabiner it’s easy to just pull the quick links off.

Chameleon wire winder with bright yellow paracord wrapped around it and secured to the wire winder by an elastic band. The paracord and wire winder are connected together with a quick link.
75′ high vis paracord wrapped around Chameleon wire winder and set up for transport

This is a more detailed view of one of the two paracord hanks. Both are set up the same way. The paracord is wrapped around the Chameleon wire winder and is held on the winder using the built-in elastic band which is wrapped around the paracord and secured with the pictured notches. The quick link is attached to the throw/attachment end of the paracord, and the quick link is also attached to the small black loop of paracord to take strain off of the elastic band during transport. This design uses the quick link, black paracord loop, and plastic wire winder plate to take the weight of the assembly when attached to the carabiner.

Connecting it all

While this isn’t necessarily directly related to the composition of the kits I described above I decided to diagram out how the station is wired up for my typical use and add this section after I wrote the original post. You’ll note that some components are only used in data operations, and some are only hooked up when needed. For example, I won’t need the light unless it’s dark, I won’t want to use the Raspberry Pi unless I’m doing data comms or using the documentation server. In addition I won’t have any of the USB buddies that I don’t need hooked up at any time because they draw power, and unless I want that power to go to something I just won’t use it. If I’m deploying at night and don’t expect to stick around until morning I won’t deploy the solar panels and add the hassle of managing those additional cables and connections. In any case, this is basically how it’s all wired up for my typical deployments. Sometimes I’ll use different components such as a 100W solar panel instead of the 20s, or add a travel router and a USB buddy to the data deployment depending on my situation and available power/battery.

Diagram showing interconnection of components with various colored lines.

Wrapping it up

So, this is the kits! I don’t always use the trail-friendly antenna with this radio, but it’s what I include in the kit by default. I also use a Samsung Galaxy tablet and sometimes a customized travel wireless router in conjunction with this kit when I do data mode work to interact with the Raspberry Pi 4 in this kit and / or one of the other ones I have set up, but that’s a whole other post.

Car camping for the weekend

So, we decided to go car camping this weekend and naturally I decided I’d bring my QRP rig and HT (handheld transceiver). The goal was to sleep in the back of our car and cook using a propane camp stove while not paying for a camping spot. I also wanted to see how well my QRP setup worked with fewer resources including charging and little space to store the setup and supporting equipment. For this I picked my Superantenna/Chameleon Mil Whip 2.0 kit and Lab599 TX-500 kit. Neither kit includes feed line. Keep that in mind while reading…

A burning camp stove sitting in the back of a vehicle with its hatch back open in the dark. The stove has a pot on one burner with an avacado and knife roll near it. A woman stands to the left with a head lamp helping prepare food.
Cooking after we arrived at our chosen spot.

On a Friday after work we packed the car and left. A couple hours later we made it to our spot on the Oregon coast with some decent moonlight between spurts of rain. We made dinner in a fairly heavy wind out of the back of the car. We could hear the relaxing sound of crashing waves against rocks that we could barely see. After having some dinner we set up the folding mattress in the car and settled in for the night.

Waves on the Pacific ocean are visible beyond a chainlink fence with wooden posts with a gray sky. A bird can be seen flying by and the inside of an out-of-focus and open car door is visible on the left side of the frame. The sky is gray and cloudy.
View waking up from the car

After waking up and getting ready we made some breakfast and coffee on a nearby park table. We had to wait till the rain stopped to make food but I was able to make some coffee in the rain without issue. I was half way through my coffee and food when I realized I didn’t pack any feed line! Fortunately we were close to a town that happened to have a store open that morning which had a box of left over parts labeled “CB Radio Parts”. There was a small RG-58 coax cable with PL-239 ends and thus my problem was solved! I purchased the cable and got underway for our hike.

A radio sitting on top of an ammo can attached by cable to a duplexer and, Raspberry Pi 4 in a case. A small travel router is also attached by power cable to the ammo can. A number of small bags and a backpack are visible in and partially in frame. The ground is a forest floor with branches, sticks, lichens, and leaves on the ground.
Radios set up with a duplexer for VHF and HF operation

We did a short hike and as we neared the end of the hike we found a small but well worn trail leading off the main path, so we took it in search of a spot where my partner could water color and I could set up and operate. Not too far down the offshoot trail we found a fairly open patch of moss with a fallen tree that I could use as a bench. I set up the Superantenna using the ground spike for simultaneous HF and 2m operation using the Superantenna MC2 and MP1C, topping the loading coils with my Chameleon Mil Whip 2.0 for increased SWR bandwidth over the titanium whip that comes with the Superantenna kit. Unfortunately the photo I took of the deployed antenna was corrupted by the time I got to uploading it. The UHF/VHF side of the Comet CF-706 duplexer was connected to my Yaesu FT3D so I could attempt contacts on the 2m calling frequency (146.520Mhz) and monitor/send 2m APRS packets.

I tuned the antenna using my NanoVNA for 20m and started working SSB phone. I attempted to respond to a number of calls and tried calling to no avail. After 40 minutes of trying between 5 and 8.5W I decided to switch to JS8Call. I have yet to make a phone contact on my Lab599 TX-500 on any band. I’m hoping I can just chalk this up to being run over by higher power stations. As I was setting my station up for digital comms I noticed something unexpected – the maidenhead coordinates in JS8Call hadn’t been updated automatically as js8cli would normally do, and I also noticed the time on the Pi varied by a minute from my cellphone. That’s highly unusual as the GPS unit typically corrects any RTC drift that might occur. The next step was to check my GPS unit’s LED through the vent holes in the case. It’s flashing one second on, and one off. For the specific Adafruit Ultimate GPS board I run that means the GPS hasn’t acquired a lock. I waited a few more minutes and found that it still hadn’t acquired a lock and decided to check the board for any broken or loose connections. Since the entire setup allows me to disassemble it without tools I did to inspect it. I found no loose connections or other apparent issues. It was time to reboot by fully removing power as had worked sometimes in the past. Still no luck following a full power down / power up sequence! I then leveraged my phone and tablet GPS units to get a position. My phone eventually got a location and grid square using the HamGPS application, but my phone had been on and tracking satellites for the entire hike. My Pi and tablet had been off. This is interesting because I had an OK view of the sky despite the very tall trees surrounding the patch. I hoped my GPS unit wasn’t damaged or malfunctioning and decided to manually set my JS8Call location from my phone, automatically acquire a timing offset from other stations in JS8Call and move on. I had a couple stations hear my heartbeats but couldn’t make contact with any operators directly. I also attempted to send an SMS message to a friend but alas no one was hearing my transmissions as the band seemed to have closed. Overall not the best luck, but it was time to head back to the trail head so we had daylight to drive out and make camp.

An open hatch back of a vehicle loaded with bags. There is a Raspberry Pi in a case and travel wireless router attached to a battery in a bag.
Hooking the Raspberry Pi and wireless access point up for testing after the hike
Successful test of the GPS from the car without the trees overhead

I decided to hook the gear up in the back of the car as my partner got the dog ready to head out in order to determine if my GPS unit was actually broken. I hooked everything up to the big battery that was in the trunk and after a minute or so the GPS lock LED flashed once every several seconds. This indicated a lock, so I fired the tablet up, logged into the Pi, and checked the reports with cgps, a test GPS client provided by the gpsd-clients package. They lined up with where we were. Even though I could see sky clearly through gaps in the canopy the GPS unit wasn’t able to acquire satellites in the time we spent in the clearing.

A soft-sided cooler, LED lantern, water bottle, beverage in a can, and a radio attached to an ammo can by a power cable and a duplexer sitting on top of a wooden park bench.
TX-500 set up for shortwave listening (SWL) and for 2m operation with my Yeasu FT3D

After arriving at camp and rigging the car for sleeping I set the radio up for shortwave listening and got my Yaesu FT3D connected to the duplexer after this photo was taken. It was a windy and chilly but great day. It was time for a beverage and some relaxing SWL and taking in the scenery before turning in for the night. I used the same setup as I did on the hike, except with a tripod for the antenna and no radials since I was receiving only. We were able to hear a number of stations, but settled on Radio Havana English (6.0MHz if I recall correctly) since they were playing music instead of the typical religious content with creepy-sounding voices you typically hear on US shortwave stations like WRMI in this part of the US.

An antenna is mounted on a tripod in the foreground. Directly behind it is a park bench with someone sitting on it and some radio equipment with a cooler. The background is a fenced-in green area and the Pacific ocean and steep rocks in the background.
View of the setup on the park bench

Lessons learned:
– Don’t forget your feed line. I got lucky enough that I could acquire some, but if this was a disaster or if I were on a hike/camping in a remote location I would have been unable to operate.
– Even though you can see a lot of sky in an area, it doesn’t mean your GPS can acquire satellites. Be prepared with some mechanism to acquire and set your location and time for something like JS8Call.
– When documenting something take a couple pictures in case one of them gets corrupted.

A successful-ish EMCOMM test deployment

Howdy everyone! I wanted to tell the tale of a short walk with a wagon in the rain followed by some radio tests. I decided I’d like to test moving to my staging area during a disaster response scenario. My goals were to test making contacts with my Yaesu FT3DR and do voice as well as Winlink with my Kenwood TM-V71 and portable Winlink setup. This will also be the first deployment of my Arrow OSJ 146/440 open stub dipole. This model has the split 2m element for easier transport.

Cloth-sided wagon containing various equipment and a backpack leaning against the side.
Wagon with the antenna, mast, and a couple folding chairs. Also pictured is my water resistant backpack with the radio gear and feedline.
Wing nuts installed on the antenna's pipe clamp.
Slightly modified Arrow OSJ 148/440. I replaced the stock hex nuts with 1/4″ 20 wing nuts to remove the requirement for a wrench to install the antenna in the field.

After arriving at my deployment site I removed the 1 5/8″ closet rod from the inside of the speaker stand. The long end of the closet rod stays inside the speaker stand tubing for easy transport. The stop for the closet rod is made from three eye screws that double as guy line connection points. The three eye screws are installed just above the top band of purple duct tape (reduces vibration and motion when the closet rod is installed in the end of the speaker stand).

J-pole mounted to a wooden closet rod resting against a speaker stand. The split 2m element is affixed for transport.
J-Pole with the second half of the 2m radiator threaded in place for transport.

The next step is to install the top portion of the open stub J-Pole.

J-pole mounted to a wooden closet rod resting against a speaker stand. The split 2m element is installed for transmission.
Open Stub J-pole atached to closet rod resting against the speaker stand with the 2m element fully assembled.

After the feedline is attached to the J-pole the closet rod with the antenna attached is installed in the speaker stand with the tape end of the closet rod in the top of the speaker stand. The closet rod is resting on the three eye screws that prevent it from slipping down inside the speaker stand tubing. The two telescoping sections of the speaker stand are fully extended and the locking pins are in place.

Fully extended speaker stand with closet rod and antenna attached. The wagon, my partner, and our dog are off to the side.
Antenna fully extended. Also present is my partner and our dog for moral support.
A picure of the feedline velcroed right above the tripod component of the speaker stand.
A velcro wire tie is used to anchor the feedline to the bottom of the antenna mast to prevent it from being pulled over from the top if someone trips on the cable.
Yaesu FT3DR connected to the feedline with the wagon and antenna stand in the background.
My Yaesu FT3DR attached to the feedline with a SMA to PL-259 pigtail.

I was able to make a couple contacts using the Yaesu HT at 5w and monitored APRS transmissions for a while. So far everything is good.

Hand holding microphone of Kenwood TM-V71. In the background the radio is in a dry bag and sitting on the wagon.
Kenwood TM-V71 connected to the feedline and battery in the backpack. It’s protected from rain by an Ortleib dry bag.

The Yaesu HT is stowed in its bag and the Kenwood mobile radio is connected to battery power and the feedline. It’s also protected from the rain by a 5L Ortleib dry bag. More contacts are made on 2m without issue. I was able to make contacts in Portland, OR, Aloa, OR, Washugal, WA, and Vancouver, WA at 5w. More good news!

Hand holding the Mobinlinkd TNC3 and Raspberry Pi Zero W connected to each other. Radio data connector is also set up.
Winlink host, TNC, and radio connected.

It was finally time to send and receive some e-mail! I connected the Winlink Raspbery Pi to the power supply and the Mobilinkd TNC3 to the data port on the TM-V71. I pulled my phone up, found the generated wireless network, joined it…. and nothing! It partially connects but doesn’t get an IP address. Strange, but no matter. I assigned a manual IP to my phone and tried to connect to the Pi via IP address. The connection still failed. I rebooted the Pi and tried again. The wifi network shows up, I join it, no DHCP IP address. Bummer! All my tests having either been complete or failed it was time to pack up and head home.

At home I boot the Pi and it joins the home wifi network with no issue. I SSH into the Pi and begin reviewing the configuration for Dnsmasq (DHCP/DNS server). Everything looks good and the configuration is valid. I then look at the autohotspot script. It has the default IP address that the script ships with set. Then the “aha!” moment strikes. As part of writing my Winlink host setup guide I re-ran the Autohotspot install script so I could make sure my documentation was right. The fix is now obvious: I just changed the IP address in the Autohotspot script, kicked the Winlink host off my wifi network and restarted it. I’m now able to connect, get an IP address, and connect to Winlink and the documentation server!

Lesson learned… always re-test your setup after you mess with it, and if you re-run a setup script you should verify that your setup runs properly afterward. Fortunately this was not a emergency deployment and was close to my QTH.

Other things I learned from today:

  • The wagon doesn’t negotiate steep curbs well without a bit of finesse.
  • The antenna mast should be lashed in place on the wagon during transport so it doesn’t move in the wagon.
  • The wing nuts on the J-pole can get over-tightened easily making it hard to dismantle the setup.
  • The allthread stub that connects the two parts of the 2m element on the J-pole can be unscrewed easily and lost when the element is being removed. I’ve dropped it 3 times in the first 48 hours of having the antenna. Some red or blue Loctite is probably a good idea to keep the end of the stub fixed in the removable portion of the 2m element. The red (permanent) Loctite will also keep moisture out of that joint.
  • Sometimes the telescoping tubes on the speaker stand stick.
  • I live in NW Oregon and figuring out a wind and rain shelter is probably a good idea.
  • The speaker stand is pretty stable and sturdy. It will probably work without guying in mild wind.

Raspberry Pi document server

When operating in a grid down or off-grid scenario it is often important to have access to information, maps, manuals, forms, frequency plans, emergency plans, etc. This guide seeks to explain how to install and populate the document server with info.

First, using either SSH or the terminal application on your Pi install git.

sudo apt-get install git

Next, read the documentation for document-server. This will tell you how to install it and its dependencies.

Once installed you can copy any required documents to the pi user’s Documents folder. I strongly recommend you use PDF and text formats, and images rather than word documents or other formats that require more specialized applications to open. When you load the page using the Raspberry Pi’s hostname or IP address via http://<IP or hostname>. You’ll be presented with your documents! They can now be opened from any device that has a web browser and can open the files you stored.

As extra credit I also create a zip file with all my documents so you can download all the documents at once if need be. This can be useful when you want a copy of all documents so you don’t need the Pi to be powered on in order to read information.

Optional Avahi configuration

In order to advertise services to devices that support MDNS you can add the following configuration to /etc/avahi/services/documents.service and then restart Avahi: sudo systemctl restart avahi-daemon

<?xml version="1.0" standalone='no'?><!--*-nxml-*-->
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<service-group>
  <name replace-wildcards="yes">%h Documents</name>
  <service>
    <type>_http._tcp</type>
    <port>80</port>
  </service>
</service-group>

Portable UHF/VHF Winlink host

Howdy! I had recently posted about some Raspberry Pi based systems that can be used in the shack or in the field and those posts received a lot of questions about how they were set up. This post is the first in a series that seeks to explain the design, operation, and setup of these hosts. Some of the work I did here was inspired by Julian, OH8STN’s general off grid/grid down operating philosophy and K1CHN’s blog posts.

A Raspberry Pi W Zero in a clear acrylic case connected to a Mobilinkd TNC3 with a MicroUSB OTG cable, host end connected to the Pi's USB OTG port.
Raspberry Pi Zero W connected to Moblinkd TNC3 using a MicroUSB OTG cable.

So, what are we talking about here?

  • A Raspberry Pi Zero W / Raspbian based Pat Winlink host.
  • Designed to work with packet on UHF/VHF radios.
  • Compatible with a wide range of radios.
  • Runs on USB or 12v and has typical 45A Anderson PowerPole connectors in a “right hand red” configuration when running on 12v. This matches my off grid power setup and the ARES + RACES standards.
  • Uses a Mobilinkd TNC3 to work with a variety of UHF/VHF radios and to offload signal processing to a TNC. That means we don’t need as much processing power on the compute node. Multiple adapter cables are sold on the Mobilinkd store and you can make your own.
  • Automatically sets up and tears down the AX.25 port and connection based on the status of the TNC’s USB connection.
  • Nice, tidy web interface that can be used by any device with wifi capabilities and a fairly modern browser to send and receive e-mail.

Parts list:

  • Raspberry Pi Zero W and power supply
  • MicroSD card
  • Optional Pi Zero W case
  • Mobilinkd TNC3
  • Appropriate cable, purchased or constructed to connect from the TRRS jack on the TNC3 to your UHF/VHF radio
  • MicroUSB OTG cable for the Pi to TNC3 connection.
  • Optional USBBuddy (12v to 5v USB down converter)
  • Optionally short USB A to MicroUSB cable to cut down on voltage drop.
  • UHF/VHF radio of choice. This setup has been tested with a Baofeng UV-5R, Yaesu FT-857D, Yaesu FT-3DR, Kenwood TM-D710G, and a Kenwood TM-V71 but should work with many others. The Mobilinkd TNC3 was designed to work with a broad range of radios.

Theory of operation:

Block diagram showing control flows between and connections between the operator, radio, devices, and between the TNC and Raspberry Pi. The diagram also depicts the control flows between the TNC, ax25.service, Linux AX.25 subsystem, and Pat Winlink. Flow charts depict AX.25 service flows and a wifi flow chart describing when the system decides to host its own wifi.
Block diagram showing various system components and their interactions. Flow charts for managing the AX.25 service and self-hosted wifi.

The Pi leverages a number of smaller subsystems to provide e-mail access.

  1. Scripts and applications that provide AX.25 setup and teardown as the TNC is connected or disconnected. These scripts leverage udev and systemd to detect state changes on the TNC. While you can use Bluetooth to maintain these connections it’s easier and more simple to control connections to the TNC using its USB connection status.
  2. A set of scripts, services, and utilities that automatically provide a functional wireless network in the event the Pi is unable to connect to a known network. This includes DNS and DHCP.
  3. Pat Winlink is run as a systemd service so the operator doesn’t have to worry about starting and stopping the service. It can run in the background whether or not the TNC is connected, but it can’t send or recieve e-mail without the TNC connected.
  4. Pat Winlink is accessed via a web interface. You need a phone, tablet, or computer that can connect to the wireless network generated by the Pi, or is on the same network as the Winlink server. This allows an operator to use Winlink.

Setup process

Start by installing Raspbian on your MicroSD card and getting your Raspberry Pi up and running. The steps here should work. Make sure you give your pi a hostname like “winlink” or whatever you’d like. If you configure dnsmasq this becomes important. Once your Pi is up and running with an Internet connection we can pre-install needed utilities and software so we don’t have to do it later. We’ll also make sure dnsmasq and hostapd don’t start automatically (more on this later). These commands can be done from the Raspberry Pi’s terminal application or from an SSH session if you’ve enabled it:

sudo apt-get update -y && sudo apt-get upgrade -y
sudo apt-get install libax25 libax25-dev ax25-apps ax25-tools dnsmasq hostapd git
sudo systemctl disable hostapd
sudo systemctl disable dnsmasq

Once we have all that installed we’ll install and configure Pat Winlink. Download the latest Pat Winlink release from GitHub. You’ll want to make sure you choose the armhf (Raspberry Pi) .deb file. Make sure you note the name of the file as it will be important when running the install command. When you’re ready to upgrade Pat Winlink in the future you can download the newest version of the .deb file from the same page. Assuming you’ve downloaded the file to the Downloads folder you can run the following command to install Pat Winlink, replacing “pat_0.10.0_linux_armhf.deb” with whatever file name you downloaded:

sudo dpkg -i ~/Downloads/pat_0.10.0_linux_armhf.deb
mkdir ~/.wl2k

After we configure our AX.25 settings we can come back to configuring Pat Winlink as we’ll need some values from that setup.

Next we’ll edit /etc/ax25/axports. This file configures our AX.25 ports that get used to build connections to packet Winlink gateways. Mine looks like this. You’ll of course want to replace my callsign with yours. The port we configure below will be called wl2k. This will be needed for the Winlink configuration in a number of spots.

# /etc/ax25/axports
#
# The format of this file is:
#
# name callsign speed paclen window description
#
wl2k K7JLX 9600 255 7 Winlink (9600)

In the next step we’ll create three files – a script that manages AX.25 port connections, a systemd service that manages the AX.25 port, and finally a udev rule that starts and stops that systemd service when the Mobilinkd TNC3 shows up as a USB serial device or is disconnected.

First, let’s install ax25-up, a script in the Winlink project that manages AX.25 connections. Our systemd unit depends on it. The commands in this step come from here, but are slightly modified to put the script in a different location on the Pi.

bin="/usr/sbin/ax25-up"
sudo curl -o $bin https://raw.githubusercontent.com/la5nta/pat/master/share/bin/axup
sudo chmod +x $bin

Next we’ll add the udev rules that work with systemd to start and stop the service. Add the following contents to /etc/udev/rules.d/99-hamradio.rules:

# Mobilinkd TNC3
ACTION=="add", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="5740", ATTRS{manufacturer}=="Mobilinkd LLC", SYMLINK+="ttyTNC", TAG+="systemd", ENV{SYSTEMD_WANTS}="ax25.service"
ACTION=="remove", SUBSYSTEM=="usb", ENV{PRODUCT}=="483/5740/200", TAG+="systemd"

We’ll now create our systemd unit file which should be: /usr/lib/systemd/system/ax25.service Note the ExecStart command where we use our wl2k port, and /dev/ttyTNC as created by our udev rules. That device is created in the event we attach another USB serial device to create a predictable name no matter what the proper udev name of the device is.

[Unit]
Description=AX.25 KISS interface
Before=network.target
Wants=network.target
BindsTo=dev-ttyTNC.device
After=dev-ttyTNC.device
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/sbin/ax25-up /dev/ttyTNC wl2k 9600
ExecStop=killall kissattach
KillMode=none
[Install]
WantedBy=multi-user.target

Configuring and setting Pat Winlink up as a service

First we’re going to put in a configuration for Pat Winlink. We’ll do that by editing ~/.wl2k/config.json. You’ll want to replace the values I have in my configuration with your own. I’m connecting to a station called W7LT-10 most of the time. You’ll also want to remove your password until you’ve set one. Follow these instructions for that process. Replace your callsign and grid square locator with your own. You may also want to add your own connect_alias entries. These can be various Winlink stations you want to “bookmark” for quick connection. I’ve added a number of them for use while I’m out camping. In that list you might have noticed the one beginning with “!W7LT-10”. Since I use that one most commonly I added an ! to the front of the name to keep it at the very top of the list when it’s alphabetized by the Pat Winlink application. The http_addr directive tells Pat Winlink to listen on any address on port 8080. This will be important when constructing the URL to access Pat Winlink with. You may also notice that I’ve configured this to listen on ax.25 and telnet. This allows the Pat Winlink application to listen in peer-to-peer mode for incoming connections. You don’t have to switch between peer-to-peer and CMS mode manually like you would using Winlink Express. You may want to assign a new telnet password if you want to keep the listen entry for telnet.

{
  "mycall": "K7JLX",
  "secure_login_password": "VerySecret",
  "http_addr": "0.0.0.0:8080",
  "listen": ["ax25", "telnet"],
  "locator": "CN85qm",
  "motd": ["K7JLX Pat Winlink stn"],
  "connect_aliases": {
    "!W7LT-10, 144.910MHz, PDX": "ax25:///W7LT-10?freq=144910",
    "K7HWY-11, 145.030MHz, La Pine, OR": "ax25:///K7HWY-11?freq=145030",
    "KB7EOC-10, 144.950, Tillamook, OR": "ax25:///KB7EOC-10?freq=144950",
    "KG7AV-10, 145.030MHz, Bend, OR": "ax25:///KG7AV-10?freq=145030",
    "W7EUG-10, 145.030MHz, Eugene, OR": "ax25:///W7EUG-10?freq=145030",
    "W7GC-11, 144.950, Hebo Lake, OR": "ax25:///W7GC-11?freq=144950",
    "WC7EOC-10, 144.980MHz, Hillboro, OR": "ax25:///WC7EOC-10?freq=144980",
    "WW7CH-10, 145.050MHz, Eatonville, WA": "ax25://WW7CH-10?freq=145050",
    "N7GWK-10, 145.630MHz, Centrailia, WA": "ax25://N7GWK-10?freq=145630",
    "N7DEM-10, 144.920MHz, Longview, WA": "ax25://N7DEM-10?freq=144920",
    "W7BO-10, 144.920MHz, Woodland, WA": "ax25://W7BO-10?freq=144920",
    "KA7CTT-10, 144.920MHz, Vancouver, WA": "ax25://KA7CTT-10?freq=144920",
    "W6TQF-10, 145.055MHz, Underwood, WA": "ax25://W6TQF-10?freq=145055",
    "N7YRC-10, 144.930MHz, Yakima, WA": "ax25://N7YRC-10?freq=144930"
  },
  "ax25": {
    "port": "wl2k"
  },
  "telnet": {
    "listen_addr": ":8774",
    "password": "AlsoVerySecret" 
  }
}

Now that we have a solid initial configuration let’s set Pat Winlink up as a service that starts automatically when the Pi boots. The first step is creating a new systemd unit at /lib/systemd/system/pat.service which will run as the standard pi user that ships with Raspbian. The contents of that systemd service are as follows:

[Unit]
Description=Pat Winlink HTTP server
After=ax25.service
[Service]
Type=simple
ExecStart=/usr/bin/pat http
User=pi
Group=pi
[Install]
WantedBy=default.target

Now we start and enable the service by running some commands in the terminal. The last command should show Pat up and running with a green “active” status. You can press “q” to quit the status display.

sudo systemctl enable pat
sudo systemctl start pat
sudo systemctl status pat

To test all the work we’ve done thus far reboot your Raspberry Pi using the GUI or by issuing the following command in the terminal:

sudo shutdown -r now

Once your Pi is back up and you’re logged back in as the pi user we’ll connect the Mobilinkd TNC3 to the Pi using the MicroUSB OTG cable. The host side connects to the Pi’s USB port, not the power port. After plugging the cable in press the connect button on the Mobilind TNC3. You’ll see a yellow flash on the TNC’s status LED. This momentary button press should trigger the ax.25 systemd service to start. We can check on that by running the following command:

sudo systemctl status ax25

If you see that the service is active and green you’re good to go on the base Winlink functionality. The only thing left to do is connect to it. Use your browser connect access Winlink with a URL derived from this template: http://<your winlink hostname or IP>:8080

If you want an automatic hotspot proceed to the next step.

Automatic hotspot

For this part of the guide just follow the steps that Raspberry Connect lists. You can modify their scripts to create IP addresses and wireless network names/passwords as needed. You can modify the /usr/bin/autohotspotN script and set the IP address there. In the createAdhocNetwork() function modify the ip a add line with the desired IP and subnet mask.

After the scripts scripts have been run and things have been configured you can optionally set up DNS records in dnsmasq. My configuration looks like this but yours will certainly vary. The static IP addresses and DNS records help Android devices or other systems that don’t work well with MDNS find your winlink service. You can use any network you want. The dhcp-host line for winlink.local is commented out because the host we’re running won’t get a DHCP address from itself. The additional entries help other Raspberry Pis or other devices get static IPs and allow them to be found by hosts. In this way we can make sure any devices that connect to your network that offer services show up. Make sure the ‘address’ line matches the hostname of your pi, and that the IP matches the one you set after the RaspberyConnect’s script run in the previous steps.

interface=wlan0
no-resolv
bind-interfaces
dhcp-range=192.168.255.20,192.168.255.250,4h
address=/ft857d.local/192.168.255.1
dhcp-host=dc:a6:32:11:11:11,192.168.255.1
address=/winlink.local/192.168.255.2
#dhcp-host=b8:27:eb:22:22:22,192.168.255.2
address=/tx500.local/192.168.255.3
dhcp-host=dc:a6:32:33:33:33,192.168.255.3

Multicast DNS (MDNS)

To help devices that support MDNS automatically discover the winlink service we can add a configuration file to Avahi. To do that create a file at /etc/avahi/services/winlink.service:

<?xml version="1.0" standalone='no'?>
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<service-group>
  <name replace-wildcards="yes">Winlink on %h</name>
  <service>
    <type>_http._tcp</type>
    <port>8080</port>
  </service>
</service-group>

Now restart Avahi using the following commands:

sudo systemctl restart avahi

At this point if your pi can’t reach a known wifi network it should start its own. Make sure you test it before you need it to work in a real-life situation.

As a bonus you can create a document server on the Pi to make sure you have information, forms, manuals, etc. when you need them in the field.

Updates to this blog entry:

4 Sep, 2021 – The Pat Winlink configuration section was updated to reflect changes I’ve made since the original draft of this entry.