I've got a Kenwood TM-D710A ham radio transceiver. This handy device is a portable 50W dual-band (2m and 70cm) radio, with a built-in packet radio TNC and some native APRS features. What it does not have (unlike the new TM-D710GA model) is a built-in GPS receiver.
This is a problem that can be fixed with a surprisingly small parts budget, provided you're up for some fine-pitch soldering. Details after the break.
The TM-D710A supports an external GPS receiver sending NMEA sentences using a three-wire serial interface signalling at RS232 levels, at any one of your choice of common port speeds. Up to this point, I had been using a Garmin Nuvi 350 with the Argent Data Systems interface cable. This worked great, but my (long-since-discontinued) GPS was having some age-related problem with battery, hardware buttons and screen. Besides which, using an external GPS plus interface and power cables for same made my installation less tidy than I liked.
I could have used the Green Light Labs GPS-710 (a plug-and-play external GPS box which sits between the control head and RF deck to get power). Heck, I could just sell the TM-D710A and buy a new TM-D710GA. But that's no fun, and costs money.
There are a number of cheap, well-performing GPS modules on the market that are small enough to fit completely inside the control head. Why not install one of those instead?
IMPORTANT: The GP-20U7 uses 3.3V power and signal levels ONLY. Hooking it up to 5V or anything greater will probably kill it instantly.
Obligatory Warning You'll Ignore
The TM-D710A is not a cheap radio, and it should go without saying that poking about the control head circuit board with a soldering pencil will comprehensively void any vestige of pity or humor the authorized service center dude or dudette will have for your plight, to say nothing of any actual warranty you might have remaining. If you're not confident in your equipment or abilities, please stop before you break your expensive toy.
Also note that from an electrical standpoint, this is a total hack that just happens to coincidentally work on my particular radio. I'm driving the output pin of the RS-232 adapter with the GPS TX pin; with the series resistor, the impedance seems to be high enough to work and not fry anything. I'm driving (what I think is) a 5V serial input with a 3.3V signal; it works reliably for me, for now. I've run it for a number of hours and nothing seems to get too hot, but I haven't done any real thermal analysis. My radio seems to "hear" OK after the mod, but I don't have the lab equipment to test it for real, and if it's not expressed in figures, it's opinion.
If you're still on board after reading all that, and if you have surface-mount technique that rises at least to the level of "really average", you should be fine. No disclaimer, you assume all responsibility, etc.
Once I had the GPS receiver module in hand, the first thing I did was to test it on the workbench using a Dangerous Prototypes Bus Pirate. (For those of you unfamiliar with the Bus Pirate, it is a USB device that speaks serial / I2C / SPI / JTAG / what have you; it's a sovereign remedy for a wide range of "talk to my widget" problems, and one of the best bargains in the world of test equipment.) If you don't have a Bus Pirate, you could accomplish the same thing with a regulated power supply and either a USB-to-3V3 serial dongle, or a plain old serial port and a level shifter.
First, I put the Bus Pirate into UART mode:
Bus Pirate v3b Firmware v5.10 (r559) Bootloader v4.4 DEVID:0x0447 REVID:0x3046 (24FJ64GA002 B8) http://dangerousprototypes.com HiZ>m 1. HiZ 2. 1-WIRE 3. UART 4. I2C 5. SPI 6. 2WIRE 7. 3WIRE 8. LCD 9. DIO x. exit(without change) (1)>3 Set serial port speed: (bps) 1. 300 2. 1200 3. 2400 4. 4800 5. 9600 6. 19200 7. 38400 8. 57600 9. 115200 10. BRG raw value (1)>5 Data bits and parity: 1. 8, NONE *default 2. 8, EVEN 3. 8, ODD 4. 9, NONE (1)>1 Stop bits: 1. 1 *default 2. 2 (1)>1 Receive polarity: 1. Idle 1 *default 2. Idle 0 (1)>1 Select output type: 1. Open drain (H=Hi-Z, L=GND) 2. Normal (H=3.3V, L=GND)
Then, I used the 'v' command to show which test leads were assigned to what function:
UART>v Pinstates: 1.(BR) 2.(RD) 3.(OR) 4.(YW) 5.(GN) 6.(BL) 7.(PU) 8.(GR) 9.(WT) 0.(Blk) GND 3.3V 5.0V ADC VPU AUX - TxD - RxD P P P I I I I I I I GND 0.00V 0.00V 0.00V 0.00V L L H L H
Note that different versions of the Bus Pirate -- or even the same version sold by different vendors -- can have different lead assignments. Verify your own hookup; do not blindly duplicate mine. Based on the above output, I wired it up as follows:
- Bus Pirate GND (brown wire) to GPS GND (black wire)
- Bus Pirate 3V3 (red wire) to GPS Vcc (red wire)
- Bus Pirate UART RxD (black wire) to GPS TX (white wire)
Then, I ran macro (2) (live raw UART monitor) and... nothing. Oh. The Bus Pirate power supply defaults to a safe (off) state. Maybe it'll work better if I turn the power on.
UART>W Power supplies ON UART>v Pinstates: 1.(BR) 2.(RD) 3.(OR) 4.(YW) 5.(GN) 6.(BL) 7.(PU) 8.(GR) 9.(WT) 0.(Blk) GND 3.3V 5.0V ADC VPU AUX - TxD - RxD P P P I I I I I I I GND 3.28V 4.90V 0.00V 0.00V L L H L H
That's better! Look, data:
UART>(2) Raw UART input Any key to exit $GPRMC,233526.00,A,29[redacted],N,095[redacted],W,0.182,,080117,,,D*62 $GPVTG,,T,,M,0.182,N,0.338,K,D*25 $GPGGA,233526.00,29[redacted],N,095[redacted],W,2,10,0.81,30.1,M,-24.3,M,,0000*5E $GPGSA,A,3,16,23,03,26,22,14,31,07,27,09,,,1.47,0.81,1.23*04 $GPGSV,4,1,15,03,47,224,19,04,30,040,20,07,12,273,19,08,09,173,*7B $GPGSV,4,2,15,09,21,316,23,14,15,120,18,16,74,056,34,22,38,205,28*79 $GPGSV,4,3,15,23,60,331,33,26,43,042,23,27,27,138,22,31,13,066,22*72 $GPGSV,4,4,15,46,56,185,30,48,37,237,,51,53,203,*4E $GPGLL,29[redacted],N,095[redacted],W,233526.00,A,D*7F
What I learned from this test was:
- The GPS module works.
- It draws about 40ma.
- It defaults to NMEA output at 9600 baud, with about 1Hz updates.
- It is able to acquire a fix even inside my house, and even if I cover the antenna with stuff (like a thin textbook) that attenuates the signal.
- The time-to-first-fix after power-on seems to be about 30s at most.
I had a GPS module that would fit in the control head and that output data in the correct format. But there were still a couple problems to be solved:
- Where could I get +3.3VDC power?
- How could I make the TM-D710A understand serial signals where mark is 0V and space is 3.3V?
Fortunately, the schematic for the TM-D710A isn't hard to find online. (I'm not certain about the copyright status, so I won't host it or link it here. A quick Google search will get you what you need.)
The external GPS jack is connected in a fairly obvious way to an Analog Devices ADM101E RS232 transceiver (PDF datasheet):
My theory was that I should be able to connect the GPS output to R47, on the side away from IC23 pin 5, and get data to the microcontroller in the TM-D710A control head. But where was that physically on the board? It turns out to be pretty easy to see:
I didn't find any 3.3VDC power source from which I felt comfortable pulling 40ma. However, there's a handy 5VDC pin right there on IC23 pin 10 (and one side of C43). I could always use a regulator. But first, let's see if I'm right about the data.
Before I really committed to anything, I needed to make sure that feeding a 3.3V serial signal in at R47 (opposite IC23 pin 5) would actually work. First, I made sure the control head was set up to accept GPS data at 9600 baud:
- Menu 602: BAUD RATE = 9600 bps
- Menu 602: INPUT = GPS
- Menu 602: OUTPUT = OFF
(Yes, I do know the difference between baud and bps. That's just how Kenwood wrote their menus.)
Next, I powered off everything and disassembled the control head. The only tricky part here is removing the round nuts that hold the three control knobs in place on the front of the housing. I didn't have the correct tool for that (nor am I even sure what that tool is called). However, with some care and a pair of needle-nose pliers, I was able to get things apart.
Because the point where I needed to make a connection was on the opposite side of the board from the display, I elected to solder a wire in place. (There's no reasonable way I could hold a probe in place blindly while looking at the display to see if the test was working.) While the leads and traces on the TM-D710A control head board aren't super-tiny, they're not particularly big either. (The pins on IC23 are 0.5mm center-to-center.) Big clunky wire would make this harder than it needed to be. I used the 30AWG stranded silicone-insulated wire from Adafruit. I love that stuff: It's skinny (0.8mm OD), slinky, supple, easy to strip and easy to solder.
Then, I connected the GPS module to a bench supply set to 3.3VDC (and current-limited to 100mA, just in case). I connected the GPS and bench supply ground to the TM-D710A ground with a spring-clip jumper. (There are lots of easily accessible grounds. I used the plated-through mounting hole in the corner of the board. Finally, I connected the GPS TX pin to the test lead.
Success! The "GPS" indicator on the control head started blinking, and I had a good position and time on the "POS" page.
The next problem was how to get from the 5VDC supply on the control head board to the 3.3VDC needed by the GPS module. In response to my support question about "Can I run the GP-20U7 off a 5V supply?", Chris F. at Sparkfun said "no" (which answer I'd kind of expected), but suggested using a voltage regulator in a TO-92 package.
(Editorial aside: I bought a $16 part from Sparkfun, asked a technical question by email and got a response which was timely, correct, addressed the question I'd actually asked, and offered additional useful information. I'm impressed, and will be buying more stuff from them. I've made much bigger purchases from bigger vendors from whom I've subsequently received far worse support.)
Unfortunately, neither my parts bin nor Sparkfun had such a regulator. I ordered some STMicroelectronics L78L33ACZ units (PDF datasheet) from another vendor.
Once they arrived, it was time for another bench test. I used my bench supply (again current-limited to 100mA) to feed 5V to the regulator by itself. The multimeter showed a nice stead 3.3V output. Next, I connected GPS module to the regulator output. It stayed at 3.3V, pulling about the expected 40mA. Using the Bus Pirate, I verified the GPS was sending out the expected NMEA data stream. It was working fine.
Next, I connected the regulator to the GPS receiver with soldered connections, and bundled everything up in heat-shrink (polyolefin) tubing and Kapton tape so nothing could possibly short in the field. Another test to verify I wired it up right; all is well.
This was actually the easy part. My test wire from earlier was still attached to the data input line; I just left it in place and connected the other end to the GPS receiver TX pin. Then, I had to get 5V (from the side of C43 connected to IC23 pin 10) and ground from anywhere handy (I used the side of L23 closest to IC23).
After that, it was just a matter of carefully figuring out where the receiver would be physically fit without creating interference, risking a short, causing thermal problems or physically pushing on anything delicate.
After putting it back together, it worked but it seemed to take way too long sometimes to acquire a fix. After some experimentation, I found out that the black plastic insulating sheet in the control head seemed to be radiopaque at GPS frequencies (1575.42 MHz and/or 1227.60 MHz). Leaving it out solved the problem.