Jolly Jeepers Rally 2011

This past weekend, Taylor and I participated in our third “Back to Basics” rally with the Jolly Jeepers club. Unfortunately, Oregon didn’t seem to get the memo about it being the middle of July, because it rained on us the entire time. This made the trails muddy and the camping a little more challenging, but it certainly didn’t stop us from taking a bunch of jeeps into the woods. It did cut down on the amount of picture-taking and video-recording we did, just because it’s hard to do that in the rain.

This year was relatively uneventful compared to the events of the previous one, which is a good thing. There was a little more winching involved due to the wet weather, but that didn’t stop Paul from bringing his matching Jeep trailer:

 

 

Click here to see a playlist of the rest of the video that we captured. I continue to be disappointed by how tame the video makes the trails look. The hill at the end was so steep that you’d be on your hands and knees trying to walk up it.

 

Posted in Miscellaneous Tagged

Field Day 2011

This past weekend was the annual ARRL Field Day event. It’s a contest of sorts where US hams attempt to contact as many other stations as possible in a 24 hour window. It encourages people to get out of their usual home stations, set up portable gear or staff an emergency station, and operate from a different spot with different equipment. I have long wanted to “do it for real” by venturing far out into the woods and setting up a station away from civilization and its “easy power” and RFI.

 

This year, four of us (Dawn, JD, Taylor, and myself) headed out to a pre-scoped spot in the Tillamook State Forest. The picturesque hilltop site we chose was at about 1600′ elevation and had just enough of a flat clearing for two sleeping tents, a food tent, and a radio tent. We arrived Friday afternoon at about 1630 and began our setup procedures. The contest didn’t start until 1100 Saturday morning, so we had a leisurely evening with pork link sausage and baked beans for dinner.

 

A quick 80 meter dipole setup that evening enabled some email contacts over Winlink, through the Pendleton RMS station. We were about 40 miles from the nearest cell phone coverage, and almost ten miles from the nearest civilization (a campground with running water and power). We brought four 100AHr lead acid batteries as our only power source for the weekend.

Saturday morning, we had eggs, bacon, and hash browns for breakfast before beginning the rest of the station setup. We planned to use all Buddipole gear and proceeded to set up 20 meter and 40 meter vertical antennas. We changed the 40 meter antenna to a 15 meter vertical at about noon, which served us very well until that evening. As originally planned, we ran the radios off of Buddipole A123 batteries, charging them in cycles from our lead acid batteries.

 

We each had a laptop with an Ad-Hoc WiFi network between us, running the FDLog software with a few of my own changes to the code. These were powered using DC adapters from the main batteries. We were able to last the entire time on just two of the large batteries, with no-load voltages sitting around 12.2V at the end of operations on Sunday.

Saturday night, we had spaghetti with Taylor’s home-made turkey sauce and garlic bread done on the camp fire. JD and I continued to operate until just after midnight when we had made 100 contacts. Just before that, we caught the 2305 pass of the International Space Station, which was easily visible to the naked eye until it passed far enough east to be eclipsed by the earth.

Sunday morning, we had pancakes and sausage for breakfast and made a couple dozen more contacts before beginning to break camp. In total, we made 122 contacts with 26 different states, including several from British Columbia to the north. Our farthest contact west was Hawaii and Florida to the east.

We all had a blast camping and operating in this heavenly spot and are already making plans for next year. My favorite picture of all was taken Saturday morning when we woke to an amazing blanket of fog down in the valley, probably 900 feet below us:

 

I recorded a video of JD giving a walkthrough of the entire camp, including our antennas. Unfortunately, it was Sunday morning and we had taken out one of the radios in the operating tent just prior to breaking down, but otherwise this is a nice video tour of what we had going:

 

Posted in Radio

A super key for people with real keyboards

How exactly did Microsoft get their logo on a key anyway?

In the Windows world, this is known as the “windows key” or the “win key”.  In Linux, it’s often mapped as the super key.  The new Unity environment (which I still have mixed feelings about) makes heavy use of the super key for window switching and other shortcuts.  Since I use a Model M keyboard from the mid 1980’s on both of my main workstations, I don’t have a windows super key.  Like it or not, Unity will be the default environment in 11.04, so I figure I better at least give it an honest try before I dismiss it.

I set off to figure out how to properly map something else as the super key.  Since I map my control key where the $DEITY intended it to be (i.e. Sun Type 3), the key actually labeled “control” (where most PC users know it to be) is available for this function.  Mapping the super key there would even leave it spatially close to where it is located on 104 key keyboards.

The following in ~/.Xmodmap does what I’m looking for:

! Clear the current control, caps lock, and super bindings
clear control
clear lock
clear mod4
! Make left control be Super_L
keycode 37 = Super_L
add mod4 = Super_L
! Make caps lock be Control_L, and add Control_R back in
keycode 66 = Control_L
add control = Control_L Control_R

Make sure to disable any Gnome layout options (like the Caps/Control swap) before you do this, as it handles the making the incorrectly-labeled caps lock key function as control.  I thought that xinit or Gnome would automatically read this file, but it seemed like that wasn’t happening, so I added the following command to my session:

xmodmap ~/.Xmodmap

If you want to just try it out without making it permanent, you can run the above command at a terminal and make it stick only for the current session.  With this change, I can now use the left control key as super for all the nifty shortcuts.

I do like Unity’s similarity to the NeXTSTEP/WindowMaker environment that I used for many years, but I worry about what it means for regular users who are used to poking around in an Applications (or Start) menu to explore the system and find the tools that they need.  Linux applications aren’t always named according to what they do (Banshee, Vinagre, Firefox, Thunderbird, etc) which makes the search interface not necessarily very appropriate.  I hope that Canonical is not making a fatal mistake with this move, but only time will tell.

Posted in Linux

A custom APRS tracker with a real screen

For those that don’t know, amateur radio operators have had something called the Automatic Packet Reporting System for quite a while now.  Most associate it with vehicular tracking, but it does a lot of other neat stuff like weather, telemetry, and message transfer. Many hams put a device called a “tracker” in their vehicle that periodically reports their position (which comes from an attatched GPS) on the air, which is picked up by other stations as well as internet gateways. That is what makes sites like aprs.fi so useful. For more information on APRS, see the inventor’s site as well as the APRSWiki.

There are typically two “classes” of tracker. The first is a simple transmit-only device, such as the TinyTrack3. The sole purpose is to transmit your position periodically, so that other people can see where you are.  If you want to be able to actually see where other stations are (without going to an internet site) you can use something like the Kenwood TM-D710, which is a radio with a TNC built-in, capable of displaying information on the screen. It looks something like this:

 

While it’s a ton of information if you have no other option, it can sometimes leave a lot to be desired. You can take it a little further and attach a serial GPS, which the radio will load with waypoints of the stations it receives. That’s helpful for seeing where the other stations are, but the display can get cluttered quickly with every station the radio hears over a modest period of time. Other devices like the HamHUD provide a little more powerful interface external to the radio itself, if you prefer.

Recently, I came up with a couple of things I’d like to see in a tracker, to make it more functional and more…let’s say “modern”. Some of the requirements are:

  1. A real display (with colors and graphics)
  2. Telemetry capabilities (specifically car voltage and temperature)
  3. Expandable to do other things, such as control various systems in the vehicle, perhaps at the request of an APRS command message 

I decided to try to build something that met the above requirements for my Jeep. I settled on using a BeagleBoard xM for the core system, which is a 1GHz ARM development board with 512MB of RAM that runs Linux. It’s basically a cell phone on a development board, without the cell radio. I housed it in a DogHouse so that I had a way to mount it in the vehicle. For a display, I found a 3.5″ LCD composite video display on eBay for under $40. This is what it looks like mounted to the windshield next to my larger GPS screen:

APRS Tracker Display

I wrote a very simple display app using GTK that runs full-screen all the time to give a pretty nice display. While GTK and X11 are pretty overkill for something embedded like this, the machine is more than powerful enough to run it and it gives niceties like anti-aliased font rendering for free. It also runs on my desktop just as easily as on the device itself, which is nice for development.

The actual APRS tracking code is a separate module that speaks to the display over a socket.  This means that I can run the APRS bit on the embedded board and the display on my laptop if I’m trying to debug something specific. I used the libfap library for parsing the actual APRS packets, but I think I will end up using something else in the long run. All the other code is mine, including the packet generation, beaconing logic, etc. I implemented intelligent (i.e. speed and turn-sensitive) beaconing logic, although I’m hesitant to call it SmartBeaconing exactly.

APRS tracker transmitting 

External to the BeagleBoard itself, I’m using a simple microcontroller that reads a voltage divider to report the vehicle voltage, and an LM34 sensor for temperature. I plan to add a lot more telemetry sensors to that unit over time, but for now it gives me what I want.

APRS tracker receiving 

Down the road, I plan to see about adding some of these features: 

  1. TIGER maps for displaying the actual positions of received stations. I have code for this already and the maps could be stored on a USB stick for pennies.
  2. Audio alerts for received packets and proximity alarms. The device has stereo audio in and out.
  3. Auto-shutdown of the radio and the tracker if the vehicle voltage drops below a certain point.
  4. APRS messaging
  5. On-board configuration. Right now, there is no way to give input to the device so configuration is done via text file
For many of the above, I need an input device. Right now, the plan is to try a tiny (cellphone-sized) bluetooth keyboard, which will allow configuration, text input, as well as triggering beacons and displaying more information.
 
For a more comprehensive view of how it operates and behaves in real life, see below for a video of me out and about with it today:

 

 

Posted in Radio Tagged

ACPI Events on a Toughbook CF-29

I have a Panasonic Toughbook CF-29 that I use for situations where I don’t want to take my regular office-ish notebook.  I am planning to take and use it at the 2011 Eagle Cap Extreme event for digital communications.  I run Ubuntu on it (10.10 currently) which works mostly out of the box without any trouble.  However, a couple of the ACPI events don’t work; specifically the suspend and hibernate buttons.  I ran acpid in debug mode and it appears that the event IDs are different on the toughbook from what they are on most other manufacturers.

If you look in /etc/acpi/events, you’ll see that there are several per-manufacturer configuration files for catching their uniquely-identified events and plumbing them to the correct scripts.  By copying and modifying two of these, I was able to get my buttons to work.

From a terminal (or Alt+F2 Run prompt), type

gksudo gedit /etc/acpi/events/tb-sleep

and paste the following in the resulting blank editor window:

event=pcc HKEY 00000080 00000007
action=/etc/acpi/sleepbtn.sh

Save and close and then run

gksudo gedit /etc/acpi/events/tb-hibernate

and paste the following:

event=pcc HKEY 00000080 0000000a
action=/etc/acpi/hibernate.sh

Then, either reboot your machine or run sudo service acpid restart to make the changes active.  When you press your (Fn+) suspend or hibernate keys, the system should now react accordingly.

Posted in Linux Tagged

A better way to process binary data in Python

One of my side-projects is CHIRP, which is an application for programming the memory contents of various radios.  Like other projects I’ve done where I want to cater to (or at least, not exclude) people running Windows, it’s written in Python.  Not only is Python my newfangled language of choice for high-level geekiness, but it’s also a language that provides me a substantial amount of platform isolation and I’m comfortable deploying applications based on it to Windows.  I really have no desire to learn how to write “real” Windows applications, so if it weren’t as easy as it is, I wouldn’t do it.

Python is really great for a lot of things, but processing binary data is not what I would consider one of them.  CHIRP needs to download a binary image of a radio over a serial line and twiddle bits before uploading it again.  Since the radios are embedded microprocessors with limited storage, lots of bit packing is performed to be as efficient as possible, which results in a lot of bit whacking on my part to pack and unpack the information I need.  So far, this has been done by combining things like the struct module with the bitwise operators available in Python.  That means that the code looks like this:

tsval = (ord(mmap[POS_TSTEP]) >> 4) & 0x0F
fval = 'x00' + mmap[POS_FREQ_STARTSmilie: :POS_FREQ_END]
freq = ((struct.unpack(">i", fval)[0] * mult) / 1000.0)
val = struct.unpack("B", mmap[POS_DUPX])[0] & 0xC0
if val == 0xC0:
  duplex = "+"
elif val == 0x80:
  duplex = "-"
else:
  duplex = ""

It’s really quite ugly, and the bigger issue is that all the code above requires similar but opposite code to poke new values back into the locations.  This often resulted in code that would extract the values properly, but not insert them back correctly.  Further, common tasks were often done differently in different radio drivers that were written at different times.  An example of such a task is extracting an index into an array of values that was, say, three bits in the middle of a byte (or worse, six bits across two different bytes).  Another one is packing and unpacking BCD frequency values of various widths and endian orientations.  In summary, the major problems with this sort of approach are:

  1. Really ugly, hard-to-read, and hard-to-maintain code
  2. Different code paths for getting and setting a particular bitfield
  3. Multiple different styles and algorithms for getting at commonly-formatted, but differently-arranged bitfields
  4. Stability and correctness issues stemming from all of the above

Recently, I was reading some code by Dean AE7Q that was able to read and write ICOM ICF files.  His code is written in C++, so it has the benefit of using structs to map fields in a given buffer.  However, what really shook me, was the use of bitfield definitions.  Now, it’s not like I don’t write C all day long, and interact with bitfield definitions on a regular basis, I just handn’t even considered how much easier they would make the process.  I decided that there had to be a way I could do something similar in Python to make my life easier.

What I decided to do was write a parser for a simple meta language that looks like C.  It needed to support the following elements:

  1. Structures
  2. Arrays
  3. Bitfield definitions

Additionally, it would be very helpful if it had the following properties:

  1. A native data type for BCD-encoded bytes (many radios store integer values in BCD)
  2. 24-bit integers (Several radios use a three-byte integer to represent a frequency)
  3. A few compiler-directives to help seek within a large data stream to a position before mapping
  4. A pythonic mechanism to read and write the defined fields in the data stream after parsing

What I came up with was a module called bitwise.  It uses the PyPEG, which is somewhat like lex for C-based compiler writers.  The grammar is extremely simple and easy to understand, and the parser/compiler/whatever isn’t too bad either (although it could use quite a bit more cleanup).  The result is a simple, single-call interface that turns a binary data stream into a very usable object tree.  See the following example code:

# Defines a format for parsing some binary data
defn = """
  struct {
    u8 foo;
    u8 highbit:1,
       sixbits:6,
       lowbit:1;
       char string[3];
       bbcd fourdigits[2];
  } mystruct[1];"""
# Some binary data for us to parse
data = "x7Fx81abcx12x34"
tree = parse(defn, data)
print "Foo: %i" % tree.mystruct.foo
print "Highbit: %i" % tree.mystruct.highbit
print "Sixbits: %i" % tree.mystruct.sixbits
print "Lowbit: %i" % tree.mystruct.lowbit
print "String: %s" % tree.mystruct.string
print "Fourdigits: %i" % tree.mystruct.fourdigits

Which prints the following:

Foo: 127
Highbit: 1
Sixbits: 0
Lowbit: 1
String: abc
Fourdigits: 1234

If I wanted to change the sixbits field from all zeros to the value 13 and the string to “xyz”, all I have to do is:

tree.mystruct.sixbits = 13
tree.mystruct.string = "xyz"

I think that’s a clear win in terms of improved syntax and maintainability.  For images where the memory regions I care about are not contiguous from the beginning (which is all of them), the #seek and #seekto directives allow me to apply the definitions that follow to a specific location in the data

Aside from the obvious syntactic and mental health gains, here are a few “lines of code” metrics from before and after converting several drivers to use my “bitwise” module:

 Driver Lines before
Lines after
Change
 IC-2820 704 336 53% smaller
 ID-880 600 360 40% smaller
 VX-8R 375 139 63% smaller

To me, that’s fairly significant, especially given that the code to enable this change is only 721 lines on it’s own.  By the way, all of these numbers include comments and a block of (unchanged) license text at the top, so the actual change of functional lines is even more significant.  In all, before the change CHIRP had almost 6,000 lines of bit-twiddling driver code.  I’ve only converted a few of them so far, but if these initial gains continue to apply, that could cut the total driver codebase by 50%, which is a really good thing. The other aspect of it, which is harder to convey with numbers, is the fact that I know that the driver code is more robust now.  Since I don’t own all the radios that CHIRP supports, being able to make small maintenance tweaks to the code without having to brute-force test the driver against the real device is extremely helpful.  Now that the code is much more symmetric, I think such maintenance tasks will be much smoother in the future.

Posted in Codemonkeying Tagged ,

Q89 Compressor Modification

One of the first things you need when you start into off-roading is a good compressor.  This is because you air down your tires each time before you go, and have to air them back up before you drive home.  A while back, I got a dual-cylinder compressor called the “Q89”.  It’s made in China, of course, and is actually rebadged by several other companies like Smittybuilt.  When I got it, it had a cheesy coiled air hose with an even more cheesy schrader valve chuck on it.  The stock hose would leak if you didn’t hold it perfectly straight, the integrated gauge was useless, and the chuck didn’t really fit into my wheels with their recessed valves.

Last summer, I replaced the hose by getting an appropriately-sized barbed fitting, which had a 1/4″ NPT fitting which I mated with a standard quick-fit adapter.  This allowed me to use a normal air hose and normal accessories from that point on.  The problem with that setup was that it still included the use of the funky (read: flimsy) large diameter air hose exiting the cylinders.  This was so flimsy that it would kink and cut off the air supply really easily when pulling against it to reach a distant tire.  The other problem was that standard air fittings (like a tire chuck) expect to only allow air flow when necessary and not all the time.  This meant that while moving from one tire to the next, the compressor would lug down trying to pressurize the hose, which it’s not designed to do.  Thus, while moving from tire to tire I either had to turn off the compressor or hold my thumb on the valve core part of the tire chuck to allow the pressure to escape.

After getting fairly frustrated with this on my last trip, I decided to get a little more intimate with the thing and fix it for good.  The first thing I did was order a 90-120PSI cut-off switch that is normally closed, and breaks the circuit when the pressure climbs past a certain level.  This needs to be fit into the air line and the electrical feed for the pump.  It’s only rated at 5A, but the inline circuit breaker box actually has a relay already.  I wired it to that relay along with the switch so that it would cut the pump off properly.

If you take off the top housing that runs between the two cylinders, you can see that the output port is actually just a 1/8″ NPT female port of a manifold joining the two cylinders, the same as the cutoff switch.  I got a matching long nipple from the local auto parts store, as well as a tee and the adapters necessary to mate with my 1/4″ NPT female quick fit.

Now, you can turn the pump on normally with no hose attached and the pump will quickly turn off.  When you attach a hose, it will run again to pressurize the hose and then stop.  As you fill your tire, it cycles with you, turning off when the air flow stops.  It’s a much more useful tool now, and I might even add a tank at some point to help it cycle even less and give me the opportunity to power some pneumatic tools.

pump

Posted in Hardware

A DNSBL and Greylisting Hybrid Approach

I have long been a critic of greylisting as a method of reducing spam.  I recently broke down and implemented it on my servers after a couple of back-to-back blacklisting issues.  The problem with DNSBL blacklists is that even the “big boys” get their relays listed which causes mail to bounce for some period of time while they resolve the issue.  Recently, someone for which I host mail was getting frustrated as my server continued to turn away msn.com and google.com due to their presence on a couple of blacklists.  That’s just silly and really hard to explain to someone in a way that doesn’t make it sound like your fault.

So, I nixed the blacklists and moved to using postgrey for greylisting.  This process, which is well-documented elsewhere, relies on some required behaviors of the SMTP protocol to turn away spammers that don’t fully implement the protocol.  It automatically refuses mail from new and unknown servers in a soft way, asking them to “try again later”.  If they do, then their mail is accepted.  Most spammers won’t retry, they just move on to the next person.  It works very well, but it introduces a delay to the delivery of valid email.  Even if you only require that they try again immediately, or after a short period like five minutes, there is no way of communicating that to them.  As a result, many servers will wait an hour or even a day before retrying.  That really destroys the usefulness of instantaneous email and I hate it.

Recently I came across a page by a colleague of mine, Dave Hansen.  He suggested a hybrid approach to the problem, using the best of both systems.  He suggested that you first look up the remote server in a DNSBL.  If they’re not listed, then you accept their mail; if they are, you greylist them and introduce the delay.  This means that most mail (from unlisted servers) flows immediately as expected, and mail from incorrectly-listed machines will get the greylist delay.  He has a hacked up version of greylist.pl to do this.

In searching for a permanent way to do this, I came across postfwd, the postfix firewall daemon.  It allows you to delegate a lot of your policy out to another daemon (like you do with postgrey itself), but with far more control over how those rules are implemented.  What I came up with is a script that implements the hybrid approach, but with a few extra features.  The remote server is checked against seven blacklists.  If it is in two or more of them, then mail is rejected outright, assuming that you wouldn’t be erroneously listed on two at the same time.  If it’s listed on one of them, then the server is greylisted (actually delegated back to postgrey itself, which works very well).  If it’s not listed at all, then the mail is accepted and everyone is happy.  My postfwd config looks like this:

    &&DNSBLS {
             rbl=zen.spamhaus.org ;    \
             rbl=bl.spamcop.net ;      \
             rbl=dnsbl.sorbs.net ;     \
             rbl=ix.dnsbl.manitu.net ; \
             rhsbl=rddn.dnsbl.net.au ; \
             rhsbl=rhsbl.ahbl.org ;    \
             rhsbl=rhsbl.sorbs.net ;   \
    };

# DNSBL checks - lookup
id=RBL_QUERY  ;  &&DNSBLS ;  rhsblcount=all ; rblcount=all ;   \     
    action=set(HIT_dnsbls=$$rhsblcount,HIT_dnsbls+=$$rblcount,DSBL_text=$$dnsbltext)

# DNSBL checks - evaluation
id=RBL_TOOMANY  ;  HIT_dnsbls>=2 ;
    action=554 5.7.1 blocked using $$DSBL_count dnsbls, INFO: [$$DSBL_text]

# Greylist
id=GREYLIST ;  action=ask(127.0.0.1:10041)  ;  HIT_dnsbls>=1

So far, it seems to be working very well and doing exactly what I wanted.  I just configure postfix to use postfwd as an external policy server after all my normal checks have been satisfied.  I may up the count of blacklists that cause mail to be rejected outright to three or more, just to be safe, but I’ll have to see how many false positives I get over the next week or so.

Posted in Miscellaneous Tagged , ,

Jolly Jeepers Rally 2010

This past Saturday, Taylor and I participated in our second Jolly Jeepers “Back to Basics” Rally event.  Unfortunately, we had firm commitments to other things on Friday and Sunday, so we didn’t camp or do both days.  This has become one of our favorite activities and something we look forward to the entire year.  I’ve only been home a couple of days and I’m already thinking forward to the next one.

Last year I ran the whole thing stock, with lots of skid-plate scrapes to prove it.  This year I had the lift, the tires, and a winch making it a little easier and a lot more fun.  Another big contributor to the “fun factor” was the fact that we reunited with a couple of friends from last year: Ron and Carm.  They brought two of their friends (Nick and Nick) as well, which was great.

We left camp at 7:30 Saturday morning and had a full day of fun.  The first interesting event happened when one of the guys in the group bent his drag link while trying to muscle around a tricky turn.  This resulted in his two front wheels not pointing the same direction, making it nearly impossible to roll out.  The guys on the trail ended up straightening it out a little using his winch:

After all that flexing, the bar was really far too soft to do anything for his steering, but it was straight at least.  A couple of people on the trail had a bright idea of using the handle from a hi-lift jack to sleeve the drag link.  This worked perfectly and the guy ended up staying with the group the rest of the day instead of heading back to camp.

The most notable event of the day, however, was Ron’s “axle ordeal”.  The group was making its way up a spot called “the rocky uphill”.  Another group delayed us moving through here quite a bit because of a very difficult spot up at the top.  Several stock Jeeps had made it through, but only just barely.  Ron made it all the way to the top without much trouble, but then got high-centered before the really bad part.  As the group of spotters helped him move through, something bad happened.  In the below video, note the part where Carlos asks the other spotters if the rear passenger tire is spinning:

Watching from behind, Nick and I were horrified to learn that Ron’s rear end wasn’t being powered.  The driveshaft was turning (a good sign), but no power was making it to the wheels.  There are several expensive parts between the driveshaft and the wheels, so we were worried.  It turns out that he just broke an axle rod.  I’m not sure how we didn’t get a picture at the top, but this is probably a 1″ steel bar that connects the wheel hub to the differential inside the housing.  When they pulled it out, I was amazed to see it just twisted and broke on the differential side.  It could have been a lot worse, and this is about the best possible outcome, given the circumstances.

While this was definitely the least expensive thing that could cause your rear end to behave like his, it definitely posed a challenge for the group getting him off the trail and back to camp.  The axle rod is all that keeps the wheel on the vehicle itself.  By the time Ron had been winched to the top, it was clear that his rear passenger wheel was further “out” than it should be, since the axle was no longer pinned inside.  The problem here is that it was another couple of miles of fire road driving before we could get to a point at which we could meet a flatbed trailer.

The trail fix was one that apparently many people had seen written up in 4-wheeling publications, but had never seen in person.  The group started to collect some thick branches and arrange them in a brace configuration around the rear passenger quarter of the vehicle.  One laid across his bumper and another underneath the vehicle provided a place to lay a branch across the wheel.  A roll of wrapping wire provided the structural support needed to hold it all together:

Justin did an amazing job of constructing this “field dressing”.  With this, we slowly escorted Ron out of the forest to a camping spot near one of the roads.  Russell had left earlier to head back to camp, get his truck and trailer, and come back to meet us there.  The brace held the entire way, leaving only a bit of a rubbed circle on the tire:

At the campsite, we got the jeep up on the trailer and headed for camp:

Only one more interesting thing happened that day.  The truck pulling the trailer with the Jeep ran out of gas on the way back to camp!  Given the events of the day, it seemed only fitting.  Carlos ran back to camp and grabbed a couple of fuel cans.  This allowed Russell to refuel the tow vehicle and make it back to the campsite.

At that point, we had to head down to Newport in preparation for our activities the next day.  We would have liked to stay for the dinner and prize drawings, but the timing just didn’t work out.  Hopefully Ron will get his axle fixed without too much trouble or expense so that he can come back next year and bring the Nicks with him!

Here are links to all the pictures we took (never enough, as usual) as well as all the video.

Posted in News Tagged

Kenwood TK-380 Self-Programming Modification

I recently purchased a Kenwood TK-380 UHF handheld radio on eBay.  This is a commercial UHF FM transceiver used by public safety organizations.  It will do 4W output, narrow or wide band transmission, and conventional or trunking operation.

This radio is Part-90 accepted, which means it can only be programmed via computer.  Unlike commercial ham radios, regular radios are not allowed to provide the user with a means to set an arbitrary frequency from the front panel.  This radio has that functionality, but it is disabled by default.  By removing a surface-mount resistor jumper inside the radio, you can re-enable it.

Start by removing the battery and antenna, and then remove the two screws at the bottom of the battery compartment.  This will allow you to separate the casing from the radio body, which should look something like this:

 

 

Next, remove the rubber gasket and speaker assembly by peeling it off the body and disconnecting the speaker wires:

 

 

Next, remove the top logic board with the display and the button pads.  It is not necessary to disconnect the ribbon cables going to the board below.

 

 

Next, remove the bottom board’s screws and flip the board over.  Note the resistor marked R144:

 

 

Remove this resistor.  This can be done by desoldering it with a fine tipped soldering pencil or by force using tweezers to crush and remove it:

 

 

When you’re done, reassemble the radio, taking care to realign the rubber button caps in the front panel.  Next, you must use the software to enable the self-programming mode in the radio.  Once you do, you can hold down the button below the PTT button while turning the radio on to enter “SELF-PROG” mode.  Navigating with the buttons on the radio is rather self-explanatory after that.  Full-size images are located in the gallery.

Posted in Hardware, Radio Tagged