The Smell of Molten Projects in the Morning

Ed Nisley's Blog: Shop notes, electronics, firmware, machinery, 3D printing, laser cuttery, and curiosities. Contents: 100% human thinking, 0% AI slop.

Author: Ed

  • HT GPS + Audio: PCB Layout

    The circuit board is 30-mil, double-sided, half-ounce (I think) copper on glass-fiber stock, direct-etched by rubbing ferric chloride solution onto it with a sponge.

    Used the CNC Sherline to drill the holes; the G-Code is now tailored for my Sherline mill and tool-length probe station.

    The copper layers as a 600 dpi PNG file:

    Top and Bottom Copper
    Top and Bottom Copper

    The top copper image (on the left) is reversed so it comes out correctly when you’re doing toner-transfer etching.

    I didn’t bother with a silkscreen, because I don’t have a soldermask and there’s no room for text around the parts anyway.

    The four vias at the corners mark the edge of the board. Trim it with tinsnips (or a shear if you have one), then introduce it to Mr Belt Sander until the edges pass directly through the middle of those via holes. Round the corners a bit so they fit into the case recess atop the mounting shoulder.

    Put Z-wires in the small round vias (the ones that don’t have any other traces) to connect the top and bottom ground planes.

    Put Z-wires in the other round vias to connect a top-side signal to the corresponding bottom-side trace.

    There are three jumper wires across the bottom; with only two layers I don’t get all bothered about embedding the last few. Those vias are square.

    I don’t have any way to do plated-through holes, so solder the wires to both sides of any vias with traces on both planes. I admit I missed two of them on the TT3 ribbon cable.

    The big empty space around the positive power terminal prevents the ring-lug connector from shorting to the ground plane. Now that I think of it, there’s no need for an empty space on the bottom copper, but it doesn’t do any harm.

  • HT GPS + Audio: Schematic

    This board drives the helmet mic & earbud, combines the TinyTrak3+ AFSK audio with the mic audio, and interfaces with the radio’s mic & speaker jacks.

    GPS + Audio circuit board
    GPS + Audio circuit board

    The schematic (click for more dots):

    GPS + Voice HT Interface schematic
    GPS + Voice HT Interface schematic

    The ICOM IC-Z1A provides a 3.5 V power supply (on the ring terminal of the mic jack) that normally drives an electret mic. I use it to turn on a MOSFET relay that powers all the circuitry directly from the external battery pack. The relay has about 1 Ω of resistance, so there’s not much voltage drop. Note that the radio’s power does not go through the relay: it connects directly to the external battery.

    An earlier version used an optocoupler to drive a 2N2907 PNP transistor for power switching. That worked fine and might actually be better; I think the MOSFET relay needs slightly more drive current than the HT’s 3.5 V supply can provide. More on that later if the problems continue.

    The TinyTrak3 includes a 5 V regulator that I wired through the normally unused pin 9 of the DB-9 connector (no connector, just a ribbon cable). It powers the  PTT button, analog switch, and the PTT optocoupler.

    The MAX4467 handles the electret mic, with power from a separate 5 V shunt regulator built around an LM336. That keeps much of the TT3’s digital noise out of the audio. You can use a MAX4468 if the voltage gain required for your electret mic capsule is greater than Av=5; the ’67 is unity-gain stable.

    A MAX4544 analog switch (basically, a low-power MOSFET relay) selects either voice or AFSK data. I originally tried adding the two with an op-amp, but there’s just too much noise from the TT3. The external PTT selects audio data; the rest of the time the radio gets the TT3.

    The HT’s mic input is galvanically isolated from the rest of the circuit board. That eliminates ground loops, circulating RF, and all manner of hassle. Bulky, awkward, expensive, and highly worthwhile.

    An optocoupler isolates the TT3 PTT-out signal from the HT’s audio input, while switching the 33 kΩ resistor that activates the HT PTT. R18 bypasses any leakage current from the TT3’s driver transistor around the coupler’s LED; the PTT current to the HT is so small that the leakage on a hot day can tease it.

    A small 1:1 audio transformer couples the voice + data into the HT’s mic input jack. The 1 μF caps are certainly overkill, but they’re small and work well.

    The HT’s external speaker goes into a simple L attenuator that reduces the volume. The HT expects an 8 Ω speaker, but most of the earbuds these days are 30 Ω and way loud; the volume control doesn’t have much resolution when there’s only two or three clicks between inaudible and ouch.

    All the external inputs have a 100 pF bypass cap and a 100 Ω series resistor to cut down on RF and tamp down static discharges. Might be overkill, but the previous units withstood years of abuse with that sort of circuitry and I’ll stand by it.

    Required tweakage for your HT’s preferences:

    • R9: MAX4467 gain gets the electret capsule output up to whatever your HT expects.
    • R15/R16: Earbud attenuator cuts the HT’s speaker output down to something reasonable for your ear
    • R14: PTT resistor must suit your radio
    • R19: TT3 output may be too hot for your HT audio, even with R6 on the TT3 turned way down.

    All the wires go to top-layer solder pads, rather than physical connectors. I didn’t have any “front panel” space for connectors, anyway, so that’s as good as it gets.

    I’ll eventually gather all the files into one lump and put ’em up here.

  • HT GPS + Audio: Hardware Overview

    The project has two circuit boards:

    • a modified TinyTrak3 kit for GPS-to-AFSK
    • a custom PCB for everything else

    The boards fit in the two halves of the enclosure, which is held together by four 7/8-inch 2-56 machine screws. The blind holes in the lower (right) half are tapped for the screws. The clearance holes in the upper (left) half are a bit too close to the interior; if the setup isn’t perfect, they break through.

    The right half slides into the HT’s battery pack grooves. The two tin plates match up with the HT’s power input contact springs.

    Interface - top and bottom surfaces
    Interface – top and bottom surfaces

    The oval mark around the four LEDs is actually a 1 mm deep recess in the cover; the LEDs are the tallest things on the board and I sort of ran out of room. The GPS connector is essentially flush against the back of the HT, so the board can’t get any lower. Even though the case halves are milled from a hulking 3/4-inch plastic plate, the top surface is only 1 mm thick above the LEDs, so the board can’t get any higher.

    The interior view:

    Interface box - interior
    Interface box – interior

    The DB-9 serial connector mounting screws hold the TinyTrak3 board in place. The GPS receiver and PC serial port (used for configuration) plug into that connector.

    The four external cables connected to the circuit board:

    • power from external battery pack
    • helmet mic + earbud
    • PTT switch
    • HT speaker + mic + mic power

    A closeup of the audio PCB in its natural habitat:

    GPS + Audio circuit board
    GPS + Audio circuit board

    The two nuts on the right fit on 4-40 brass screws that I converted into studs under those tin battery pack strips, about which more later. The nuts hold the circuit board in place atop a shoulder around the interior of the compartment.

    The OEM battery packs have nice tabs that engage the HT’s clever pushbutton latching mechanism. I spent a lot of time staring at them: they’re easy to do in an injection mold and impossible to machine at my skill level. So I punted: two strips of tape hold the enclosure in place on the HT. Works fine.

  • GPS + Audio Interface for ICOM Z-1A HT

    You’ve seen bits & pieces of this in the previous weeks and months: now it’s up and running!

    Admittedly, this is brassboard hardware; I must now build three final versions for our bikes incorporating all the tweaks & adjustments. But it’s time to write this stuff down so I can find it again … and perhaps you can use some chunks, too.

    ICOM IC-Z1A with GPS+Audio Interface
    ICOM IC-Z1A with GPS+Audio Interface

    What it does:

    Why we need it:

    • voice intercom for our family rides: we talk without shouting at each other
    • safety communication for public service events supported by the local amateur radio club
    • GPS-based APRS position reporting for those events
    • trip monitoring on our long solo rides
    • it’s a neat tech hack with lots of Quality Shop Time

    Major sub-projects (some already partially written up):

    I don’t have an instruction manual to go along with this, nor is there a parts kit available. You’ll certainly want to modify everything for your own purposes; the circuit board and case certainly won’t fit whatever HT you’re using!

    Over the next several days, I’ll be describing & documenting the tricky parts… in no particular order, because I’m not going to sort my notes & photos ahead of time.

  • Wedgie-Free Undies

    Wedgie-free undies
    Wedgie-free undies

    They seem to be referring to an auto-wedgie, not the dreaded atomic wedgie.

    The weird part? This was in the ladies’ section. We were picking up socks for our own young lady…

  • Water Bottle Spring Cap Repair

    One of our nice aluminum water bottles hit the floor and, of course, the tiny little hinge shattered. It’s some wonderful engineering plastic, but just look at the leverage you can apply to those few millimeters of material. This is the sort of repair that can’t possibly be economically justified, but it pisses me right off when something that should be rugged turns out to be this fragile.

    The 2 mm steel hinge pin snapped the molded plastic center post of the hinge off the cap; we found the larger fragment, but the smaller one may lurk under the refrigerator for quite some time. Nothing bonds to this plastic and, if the post broke in the first place, adhesive isn’t going to help.

    Broken hinge
    Broken hinge

    Some doodling showed that a replacement hinge post should be machineable. The general idea was to square up the remaining chunk of the post, then attach a replacement hinge pivot with a screw. The post is almost exactly 1/4-inch thick, call it 6.2 mm, which means the right-angle feature under the pivot ought to keep the whole affair from twisting.

    Water Bottle Hinge
    Water Bottle Hinge

    I planned to leave the left side unmachined and cut it to fit by hand, but then figured, eh, just make it happen. I also expected to leave the area around the screw a lot thicker, with a neat counterbore around the head.

    This being a bash-to-fit, file-to-hide kind of project, I wrote a snippet of G-Code (at the bottom of the post) to chew out the part from a sheet of Lexan, then did the perpendicular hole & countersinking with manual CNC.

    No pix of that; I was working in a white-hot fury. Basically, I double-sticky-taped a slab of Lexan to a sacrificial sheet, clamped it to the tooling plate, and had at it with a 2 mm end mill. Cutting a 6.4 mm sheet with a 2 mm end mill is a bit iffy, as the flutes are just barely that long; the mill was armpit-deep in swarf and I was dribbling water into the cut to keep it cool.

    By the time I stopped for a picture, the situation looked like this.

    Replacement hinge part
    Replacement hinge part

    For what it’s worth, that’s the second part. I had to lower the screw head below the top of the half-round feature on the left end in order to clear the cap. That’s what CNC is really good for in my shop: make another one, just like the other one, only different exactly like that.

    I drilled a #50 (2-56 tap) hole in the cap pretty much by eye, using laser targeting to touch off.

    Laser aligning to hinge stub
    Laser aligning to hinge stub

    The hole wound up minutely too far inboard, but some filing cleaned up the stub edge and it was all good. I started the tap in the mill, held loosely in the chuck and turning it with my fingers, then finished up on the bench.

    The screw hole goes all the way through the cap. I filed the screw down so the end sits flush at the bottom of the cap, where the silicone rubber gasket should seal firmly against it.

    Here’s what the hinge looks like with all the bits assembled. The spring bears on the screw head, which makes the cap open with more snap than before. I put a little counterbore under the screw head, even after lowering it, to reduce the spring tension.

    Rebuilt hinge
    Rebuilt hinge

    The cap has a spring-loaded latch that never worked very well in the first place and this repair didn’t improve it. As nearly as I can tell, the molded ledge on the cap has a rounded edge that the latch simply cannot engage. This is beyond even my level of interest; Mary was accustomed to using the wire snap to hold the cap closed and that practice will continue.

    Works well enough for us and I got some Quality Shop Time on a rainy afternoon.

    The G-Code uses a slightly modified & simplified version of the tool length probe routines. I’m not convinced that using the G59.3 coordinate system is the right way to go, but everything else seems worse.

    
    (Water bottle hinge repair)
    (Ed Nisley - KE4ZNU - June 2010)
    (Rough-cut 1/4-inch plate with clamp at +Y)
    (Sacrificial plate below, double-stick tape to secure)
    (Tool change @ G30 position above length probe)
    
    (-- Global dimensions & locations)
    
    #<_Stock_Thick> =        6.5                    (overall thickness)
    
    #<_Traverse_Z> =        1.0
    #<_Safe_Z> =            30.0                (clamp clearance)
    
    (-- Section controls)
    
    #<_Do_Outline> =    1
    #<_Do_Drill> =        1
    
    (-------------------)
    (-- Initialize new tool length at probe switch)
    (    Assumes G59.3 is still in machine units, returns in G54)
    
    #<_Probe_Speed> =        250            (set for something sensible in mm or inch)
    #<_Probe_Retract> =        1            (ditto)
    
    O<Probe_Tool> SUB
    
    G49                    (clear tool length compensation)
    G30                    (to probe switch)
    G59.3                (coord system 9)
    
    G38.2 Z0 F#<_Probe_Speed>        (trip switch on the way down)
    
    G91
    G0 Z#<_Probe_Retract>            (back off the switch)
    G90
    
    G38.2 Z0 F[#<_Probe_Speed> / 10]    (trip switch slowly)
    
    #<_ToolZ> = #5063                    (save new tool length)
    
    G43.1 Z[#<_ToolZ> - #<_ToolRefZ>]    (set new length)
    
    G54
    G30                    (return to safe level)
    
    O<Probe_Tool> ENDSUB
    
    (-------------------)
    (-- Initialize first tool length at probe switch)
    
    O<Probe_Init> SUB
    
    #<_ToolRefZ> = 0.0        (set up for first call)
    
    O<Probe_Tool> CALL
    
    #<_ToolRefZ> = #5063    (save trip point)
    
    G43.1 Z0                (tool entered at Z=0, so set it there)
    
    O<Probe_Init> ENDSUB
    
    (-------------------)
    
    (-- Get started ...)
    
    G40 G49 G54 G80 G90 G92.1 G94 G97 G98        (reset many things)
    
    M5
    
    (msg,Verify clamp to +Y, stock taped down)
    M0
    
    (msg,Verify X=0 at left edge, Y=0 on finished centerline)
    M0
    
    (msg,Verify tool touched off at Z=0 on surface)
    M0
    
    O<Probe_Init> CALL
    
    T0 M6                            (ensure first tool change pauses)
    
    (-- Drill the hinge pin hole)
    
    #<Pin_X> =                7.0
    #<Pin_Y> =                0.0
    
    #<Drill_Dia> =            2.06    (Drill diameter)
    #<Drill_Num> =            46        (Drill number)
    #<Tool_Num> =            146        (Tool number)
    #<Drill_Radius> =        [#<Drill_Dia> / 2]
    #<Drill_RPM> =            3000
    #<Drill_Feed> =         [#<Drill_Dia> * 100]
    
    #<Drill_Depth> =        [#<_Stock_Thick> + 2 * #<Drill_Dia>]
    
    O<Doing_Drill> IF [#<_Do_Drill>]
    
    (debug,Insert Num #<Drill_Num> drill)
    T#<Tool_Num> M6
    
    O<Probe_Tool> CALL
    
    (debug,Set spindle to #<Drill_RPM>)
    M0
    
    F#<Drill_Feed>
    
    G0 Z#<_Traverse_Z>
    
    G83 X#<Pin_X> Y#<Pin_Y> Z[0 - #<Drill_Depth>] R#<_Traverse_Z> Q[2 * #<Drill_Dia>]
    
    O<Doing_Drill> ENDIF
    
    (-- Mill outline)
    
    #<Hinge_Radius> =        3.75                        (half-width of hinge body)
    #<Cutout_Base> =        2.75
    
    #<Cutout_Screw> =        1.50
    #<Cutout_Screw_Y> =        [#<Hinge_Radius> - #<Cutout_Screw>]
    #<Cutout_Screw_A> =        ASIN [#<Cutout_Screw_Y> / #<Hinge_Radius>]
    #<Cutout_Screw_X> =        [#<Hinge_Radius> * COS [#<Cutout_Screw_A>]]
    
    #<Passes> =                3
    
    #<Mill_Dia> =            1.98            (end mill diameter)
    #<Tool_Num> =            20
    #<Mill_Radius> =        [#<Mill_Dia> / 2]
    #<Mill_RPM> =            3000
    #<Mill_Feed> =            100
    
    #<Entry_XL> =            [0 - #<Mill_Dia>]
    #<Entry_YL> =            [0 - 2 * #<Hinge_Radius>]
    
    O<Doing_Outline> IF [#<_Do_Outline>]
    
    (debug,Insert #<Mill_Dia> mm end mill)
    T#<Tool_Num> M6
    
    O<Probe_Tool> CALL
    
    (debug,Set spindle to #<Mill_RPM>)
    M0
    
    F#<Mill_Feed>
    
    G0 X0 Y[0 - 2 * #<Hinge_Radius>]    (get to comp entry point)
    G0 Z#<_Traverse_Z>
    
    G42.1 D#<Mill_Dia>                                    (cutter comp right)
    G1 X#<Pin_X> Y[0 - #<Hinge_Radius>]
    
    #<Step_Z> = [#<_Stock_Thick> / #<Passes>]
    #<Current_Z> = [0 - #<Step_Z>]
    
    O<Outline_Passes> REPEAT [#<Passes>]
    
    G2 J[0 - #<Hinge_Radius>] Z#<Current_Z>                (ramp down to cutting level)
    
    G3 Y#<Hinge_Radius> J#<Hinge_Radius>
    G3 X[#<Pin_X> - #<Cutout_Screw_X>] Y#<Cutout_Screw_Y> J[0 - #<Hinge_Radius>]
    G1 X0
    G1 Y[0 - [#<Hinge_Radius> - #<Cutout_Base>]]
    G1 X#<Pin_X>
    G1 Y[0 - #<Hinge_Radius>]
    
    #<Current_Z> = [#<Current_Z> - #<Step_Z>]
    
    O<Outline_Passes> ENDREPEAT
    
    G0 Z#<_Safe_Z>
    
    G40
    
    O<Doing_Outline> ENDIF
    
    G30                    (back to tool change position)
    
    (msg,Done!)
    
    M2
    
  • Epson R380 Printer: Resetting the Waste Ink Counters

    So a few days after topping off the continuous ink tanks on my Epson R380 printer, we had a series of thunderstorms that prompted me to turn everything off. Upon turning the printer back on, its fancy LCD panel showed a message along the lines of

    Service is required. Contact Epson Customer Service.

    Oddly, it continued to print perfectly with no further complaints. The error message appeared only at power-on, then politely went away when I pressed the OK button.

    Well, that puppy is long out of warranty, even if I wasn’t using a continuous ink system, soooo… what to do? The printer produces absolutely no diagnostic codes other than that error message.

    A bit of searching gave me the Maintenance Manual for that family of printers. That message isn’t among the ones listed.

    Further searching suggests that at least one of the two waste ink pads / tanks is nearly full and that ignoring the problem will cause the printer to shut itself down, lest it dribble ink. The listed messages warn that the printer is approaching the “end of its service life”, which isn’t the message I saw, but it’s close enough.

    The Maintenance Manual suggests that it’ll be cheaper and better to simply buy a new printer, as replacing the waste ink tanks may cost more than the printer is worth. The website points out that providing a customer-replaceable tank would drive up the cost of the printer, because most customers would buy a new printer before filling the tank.

    In order to get to the waste ink tank, you must remove:

    • Paper Support
    • Printer Cover
    • Front Cover
    • Right Housing
    • Left Housing
    • USB Housing
    • Upper Housing
    • Panel Unit
    • EMI Frame

    I can see why it might take a trained tech a few hours to get all that done… and then reassemble in reverse order.

    The Epson website has a link to a program that will reset the waste ink counters for one of the tanks. Downloaded & ran it on the Token Windows Laptop; it tells me there’s no problem.

    Hmmm

    So I ordered an external waste ink tank from the usual eBay supplier. The hardware is grossly overpriced ($20 delivered) for what it is (large tube with sealed endcaps, some tubing & barb fittings, a syringe), but the deal includes links to programs that will reset the counters. I found several of those programs by myself, so it’s not as if you must actually spend money to reset the printer’s counters. I figured this was in the nature of a learning experience.

    Turns out that the programs are provided by parties having, shall we say, long-term interests that may not coincide with mine. To wit, I’d be batshit crazy to run those programs on a PC I cared about.

    [Update: Something like that.]

    The various program files all passed a ClamAV virus scan, but that doesn’t mean anything these days.

    So, during the next hour:

    • Boot System Rescue CD on my oldest Token Windows Laptop
    • Run partimage to back up the Windows partition to another partition
    • Disconnect from the house LAN
    • Reboot in Windows, which evidently hasn’t seen the light of day in about a year
    • Stifle bleating requests for updates
    • Copy the programs from a USB stick, install as needed
    • Reset one of the ink counters (more on this below)
    • Reboot in SRC
    • Restore the partition from the backup

    All that is straightforward and I’ve written about it earlier. Search the blog for more info using the obvious keywords.

    I attempted to restore the drive’s Master Boot Record from the partition backup file, but partimage complained that the drive size in the backed-up MBR did not match the existing drive size, which suggests something tinkered with the drive’s MBR between the backup and the restore.

    Hmmm….

    You might want to do a bit of reading on Boot Sector Viruses at this point. I have no other evidence to suggest that’s what’s going on, other than to remind you that programs need not do only what they say they’ll do.

    Given all that, I figured this was a great time to update the Token Windows Laptop to Xubuntu 10.04, which installed Grub2 in the MBR and wiped away anything placed therein. The box is heavily multi-booted: Dell Diags, XP, Puppy, and now Xubuntu 10.04.

    Without naming names or providing links:

    • The Russian program seems to not include the R380, but it does include others in that family. I elected to not reset the counters using that program.
    • The Chinese program seems to be a bootleg copy of the Official Epson Adjustment Program, although it’s rife with misspellings and grammatical errors. I told it to reset the “Main Pad” counter and give me a dump of the EEPROM.

    The Main Pad had 16008 counts of the maximum 16200, while the Platen Pad had only 3019 of 54513. Those names do not correspond to anything in the Maintenance Manual, but I suspect the Main Pad is the Waste Ink Tray at the head-cleaning station and the Platen Pad is the Waste Ink Pad running across the printer to catch the overspray from borderless prints.

    Resetting the Main Pad counter to zero cleared the error message; the printer is perfectly happy now. I’ll install the external waste ink tank when I clear the workbench after building the next GPS interface for our HTs.

    The program reported 9922 pages printed. Figuring 7 bottles of ink at 250 ml each, that’s 0.18 ml per page. That’s a slight overestimate because the ≈50 ml tanks were just topped off, but it’s close enough. I’m guessing head cleaning consumed much of that ink, as the printer does plenty of that, and the number of pages seems close to half the number of counts.

    Perhaps it performs a cleaning when more than X minutes has elapsed since the previous print job? That would account for the high number of cleanings; most print jobs are a few pages, at most.

    En passant, I found some totally unofficial ink cartridge capacity numbers:

    • Standard T078x: 7 ml @ $13 = $1857 / liter
    • Large T077x: 11 ml @ $20 = $1818 / liter

    [Update: corrected typo from ml to liter]

    Ain’t that impressive? I love the savings they give you with higher-capacity cartridges …