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.

Tag: Improvements

Making the world a better place, one piece at a time

  • Recycled Heatsink: Hole Plugs

    I actually did get around to plugging the holes directly under the power resistors on those heatsinks, even though we all know it makes absolutely no difference whatsoever.

    Heatsink hole plugs
    Heatsink hole plugs

    Start with some 5/16-inch aluminum rod, face and center-drill one end, turn down about two inches to a scant 0.200 inch diameter, saw off a stub on the end.

    Grab the stub in the 3-jaw Sherline chuck clamped to the mill table and slice off 0.240 inch slugs using a teeny slitting saw and manual CNC.

    No pix of the setup, for reasons that made sense at the time, but that project gives you the general idea.

    Repeat three times to get 3 x 6 = 18 slugs, plus a few spares.

    Clean out the heatsink holes, clamp a bar (covered with tape) on the flat side, butter up the holes & slugs with JB Weld epoxy, squish ’em in place, scrape off the excess epoxy after a few hours.

    Actually, this was a thinly veiled excuse to get my shop assistant some Quality Shop Time on the lathe and CNC mill. Wouldn’t you do the same?

  • Atom D520: Config Files for Smoother Sherline Stepping

    The dual-core-ness of the D520, as set up there, allows a distinct improvement in the EMC2 BASE_PERIOD setting, which is exactly why I undertook this adventure.

    The 100 µs period I used on the Dell Dimension 4550 ensured the occasional long-latency burps wouldn’t cause much trouble… and they didn’t. The setup used the HAL step generator’s ability to supply a single pulse within one base period, so the maximum stepping rate was 1/100 µs = 10 k steps / second.

    However, that also determines the granularity of speed changes, so the controller can only drive the motors at multiples of the basic 100 µs without interpolating. For example, the four fastest step rates are:

    • 1/100 µs = 10 k step/sec
    • 1/200 µs =5 k step/sec
    • 1/300 µs = 3.3 k step/sec
    • 1/400 µs = 2.5 k step/sec

    The motors have 200 major steps / revolution and run in quarter-step mode: 800 microsteps / revolution. The axes have 20 turn-per-inch leadscrews, thus requiring 16 k step pulses per inch of travel.

    That means the corresponding traverse speeds are (step/sec) / (step/inch):

    • 10 k step/sec -> 0.625 in/sec = 37 in/min
    • 5 k step/sec -> 0.313 in/sec = 18.75 in/min
    • 3.3 k step/sec -> 0.206 in/sec = 12.37 in/min
    • 2.5 k step/sec -> 0.156 in/sec = 9.37 in/min

    Those are fairly large jumps between the speeds, which means the motor acceleration when the step rate changes is fairly high. HAL interpolates by bunching groups of pulses, but higher resolution is better.

    The Atom CPU has latencies under 10 µs, with no large burps that I’ve seen so far, so I set the BASE_PERIOD to 50 µs. However, that required changing the HAL step generator to produce a pulse during two successive periods (one high, one low) to keep the pulses wide enough for the motor controller. That means the highest step rate is still 10 k steps/sec and the top speed is still 37 inch/min.

    However, HAL can now adjust the period in smaller increments with lower acceleration between the jumps. The four fastest rates are now:

    • 1/100 µs = 10 k step/sec -> 0.625 in/sec = 37 in/min
    • 1/150 µs =6.7 k step/sec -> 0.417 in/sec = 25 in/min
    • 1/200 µs = 5 k step/sec -> 0.313 in/sec = 18.75 in/min
    • 1/250 µs = 4 k step/sec -> 0.250 in/sec = 15 in/min

    A stock Sherline CNC milling machine is rated for 22 inch/min (0.37 inch/sec) rapid motion on all three axes. That means the maximum step rate is

    • (0.37 inch/sec) * (16 k step/in) = 5.9 kHz

    Quite some years ago, I rebuilt my Sherline controller box to reduce its electrical and acoustic noise, then did a clean-room reimplementation of the firmware in the PIC microcontrollers. After the dust settled, my firmware could handle 8 k steps / sec, which works out to 0.5 in/sec = 30 in/min.

    That turns out to be slightly more aggressive than the whole lashup can tolerate; I can hear the motors take occasional hits as they miss the odd step at 30 inch/min.

    So I set the overall MAX_LINEAR_VELOCITY = 0.400 inch/sec = 24 inch/min, which is also the MAX_VELOCITY for both X and Y. The Z axis, as always, is happier with a bit slower top speed: 0.333 inch/sec = 20 inch/min. The maximum step rate is 0.4 x 16 k = 6.4 kHz, comfortably under the controller’s upper limit.

    The MAX_ACCELERATION for X and Y = 5.0 in/sec2, with Z at 3.0. STEPGEN_MAXACCEL for each axis is twice that; I have each axis set for a few mils of backlash compensation.

    With all that in mind, the changed configuration files look like this, with the others remaining as described there.

    Sherline.hal, with the new stepgen pulse specs

    # Generated by stepconf at Sat Aug 23 12:10:22 2008
    # If you make changes to this file, they will be
    # overwritten when you run stepconf again
    loadrt trivkins
    loadrt [EMCMOT]EMCMOT base_period_nsec=[EMCMOT]BASE_PERIOD servo_period_nsec=[EMCMOT]SERVO_PERIOD traj_period_nsec=[EMCMOT]SERVO_PERIOD key=[EMCMOT]SHMEM_KEY num_joints=[TRAJ]AXES
    loadrt probe_parport
    loadrt hal_parport cfg="0x378 out"
    setp parport.0.reset-time 60000
    loadrt stepgen step_type=0,0,0,0
    loadrt pwmgen output_type=0
    
    addf parport.0.read base-thread
    addf stepgen.make-pulses base-thread
    addf pwmgen.make-pulses base-thread
    addf parport.0.write base-thread
    addf parport.0.reset base-thread
    
    addf stepgen.capture-position servo-thread
    addf motion-command-handler servo-thread
    addf motion-controller servo-thread
    addf stepgen.update-freq servo-thread
    addf pwmgen.update servo-thread
    
    net spindle-cmd <= motion.spindle-speed-out => pwmgen.0.value
    net spindle-enable <= motion.spindle-on => pwmgen.0.enable
    net spindle-pwm <= pwmgen.0.pwm
    setp pwmgen.0.pwm-freq 100.0
    setp pwmgen.0.scale 1166.66666667
    setp pwmgen.0.offset 0.114285714286
    setp pwmgen.0.dither-pwm true
    net spindle-cw <= motion.spindle-forward
    
    net estop-out => parport.0.pin-01-out
    net xdir => parport.0.pin-02-out
    net xstep => parport.0.pin-03-out
    setp parport.0.pin-03-out-reset 0
    setp parport.0.pin-04-out-invert 1
    net ydir => parport.0.pin-04-out
    net ystep => parport.0.pin-05-out
    setp parport.0.pin-05-out-reset 0
    setp parport.0.pin-06-out-invert 1
    net zdir => parport.0.pin-06-out
    net zstep => parport.0.pin-07-out
    setp parport.0.pin-07-out-reset 0
    net adir => parport.0.pin-08-out
    net astep => parport.0.pin-09-out
    setp parport.0.pin-09-out-reset 0
    net spindle-cw => parport.0.pin-14-out
    net spindle-pwm => parport.0.pin-16-out
    net xenable => parport.0.pin-17-out
    
    setp stepgen.0.position-scale [AXIS_0]SCALE
    setp stepgen.0.steplen 1
    setp stepgen.0.stepspace 1
    setp stepgen.0.dirhold 60000
    setp stepgen.0.dirsetup 60000
    setp stepgen.0.maxaccel [AXIS_0]STEPGEN_MAXACCEL
    net xpos-cmd axis.0.motor-pos-cmd => stepgen.0.position-cmd
    net xpos-fb stepgen.0.position-fb => axis.0.motor-pos-fb
    net xstep <= stepgen.0.step
    net xdir <= stepgen.0.dir
    net xenable axis.0.amp-enable-out => stepgen.0.enable
    
    setp stepgen.1.position-scale [AXIS_1]SCALE
    setp stepgen.1.steplen 1
    setp stepgen.1.stepspace 1
    setp stepgen.1.dirhold 60000
    setp stepgen.1.dirsetup 60000
    setp stepgen.1.maxaccel [AXIS_1]STEPGEN_MAXACCEL
    net ypos-cmd axis.1.motor-pos-cmd => stepgen.1.position-cmd
    net ypos-fb stepgen.1.position-fb => axis.1.motor-pos-fb
    net ystep <= stepgen.1.step
    net ydir <= stepgen.1.dir
    net yenable axis.1.amp-enable-out => stepgen.1.enable
    
    setp stepgen.2.position-scale [AXIS_2]SCALE
    setp stepgen.2.steplen 1
    setp stepgen.2.stepspace 1
    setp stepgen.2.dirhold 60000
    setp stepgen.2.dirsetup 60000
    setp stepgen.2.maxaccel [AXIS_2]STEPGEN_MAXACCEL
    net zpos-cmd axis.2.motor-pos-cmd => stepgen.2.position-cmd
    net zpos-fb stepgen.2.position-fb => axis.2.motor-pos-fb
    net zstep <= stepgen.2.step
    net zdir <= stepgen.2.dir
    net zenable axis.2.amp-enable-out => stepgen.2.enable
    
    setp stepgen.3.position-scale [AXIS_3]SCALE
    setp stepgen.3.steplen 1
    setp stepgen.3.stepspace 1
    setp stepgen.3.dirhold 60000
    setp stepgen.3.dirsetup 60000
    setp stepgen.3.maxaccel [AXIS_3]STEPGEN_MAXACCEL
    net apos-cmd axis.3.motor-pos-cmd => stepgen.3.position-cmd
    net apos-fb stepgen.3.position-fb => axis.3.motor-pos-fb
    net astep <= stepgen.3.step
    net adir <= stepgen.3.dir
    net aenable axis.3.amp-enable-out => stepgen.3.enable
    
    net estop-out <= iocontrol.0.user-enable-out
    net estop-out => iocontrol.0.emc-enable-in
    
    loadusr -W hal_manualtoolchange
    net tool-change iocontrol.0.tool-change => hal_manualtoolchange.change
    net tool-changed iocontrol.0.tool-changed <= hal_manualtoolchange.changed
    net tool-number iocontrol.0.tool-prep-number => hal_manualtoolchange.number
    net tool-prepare-loopback iocontrol.0.tool-prepare => iocontrol.0.tool-prepared
    

    Sherline.ini, with new periods, speeds, and accelerations

    # Ed Nisley - KE4ZNU
    # Just do not run stepconf ever again...
    
    [EMC]
    MACHINE = Sherline-XYZA
    DEBUG = 0
    RS274NGC_STARTUP_CODE = G21 G40 G49 G54 G80 G90 G92.1 G94 G97 G98
    
    [DISPLAY]
    DISPLAY = axis
    EDITOR = gedit
    GEOMETRY = AXYZ
    POSITION_OFFSET = RELATIVE
    POSITION_FEEDBACK = ACTUAL
    MAX_FEED_OVERRIDE = 3.0
    INTRO_GRAPHIC = /home/ed/emc2/configs/Sherline-XYZA/Sherline.gif
    INTRO_TIME = 3
    #PROGRAM_PREFIX = /mnt/bulkdata/
    PROGRAM_PREFIX = ~/emc2/nc_files
    #INCREMENTS = .1in .05in .01in .005in .001in .0005in .0001in
    INCREMENTS = 10 mm, 1 mm, 0.1 mm, 90 deg, 45 deg, 10 deg
    
    [FILTER]
    PROGRAM_EXTENSION = .py Python Script
    py = python
    
    [TASK]
    TASK = milltask
    CYCLE_TIME = 0.010
    
    [RS274NGC]
    PARAMETER_FILE = emc.var
    
    [EMCMOT]
    EMCMOT = motmod
    SHMEM_KEY = 111
    COMM_TIMEOUT = 1.0
    COMM_WAIT = 0.010
    BASE_PERIOD = 50000
    SERVO_PERIOD = 1000000
    
    [HAL]
    HALUI=halui
    HALFILE = Sherline.hal
    HALFILE = custom.hal
    HALFILE = Logitech_Gamepad.hal
    POSTGUI_HALFILE = custom_postgui.hal
    
    [TRAJ]
    AXES = 4
    COORDINATES = X Y Z A
    MAX_ANGULAR_VELOCITY = 45.00
    DEFAULT_ANGULAR_VELOCITY = 36.0
    LINEAR_UNITS = inch
    ANGULAR_UNITS = degree
    CYCLE_TIME = 0.010
    DEFAULT_VELOCITY = 0.400
    MAX_LINEAR_VELOCITY = 0.400
    POSITION_FILE =	lastposition.txt
    NO_FORCE_HOMING = 1
    
    [EMCIO]
    EMCIO = io
    CYCLE_TIME = 0.100
    TOOL_TABLE = Sherline.tbl
    TOOL_CHANGE_AT_G30 = 1
    
    [AXIS_0]
    TYPE = LINEAR
    MAX_VELOCITY = 0.400
    MAX_ACCELERATION = 5.0
    STEPGEN_MAXACCEL = 10.0
    SCALE = 16000.0
    FERROR = 0.05
    MIN_FERROR = 0.01
    MIN_LIMIT = -1.0
    MAX_LIMIT = 9.5
    BACKLASH = 0.003
    HOME_IS_SHARED = 1
    HOME_SEQUENCE = 2
    HOME_SEARCH_VEL = 0.3
    HOME_LATCH_VEL = 0.016
    HOME_FINAL_VEL = 0.4
    HOME_OFFSET = 9.1
    HOME = 4.5
    
    [AXIS_1]
    TYPE = LINEAR
    MAX_VELOCITY = 0.400
    MAX_ACCELERATION = 5.0
    STEPGEN_MAXACCEL = 10.0
    SCALE = 16000.0
    FERROR = 0.05
    MIN_FERROR = 0.01
    MIN_LIMIT = -0.5
    MAX_LIMIT = 4.90
    BACKLASH = 0.003
    HOME_IS_SHARED = 1
    HOME_SEQUENCE = 1
    HOME_SEARCH_VEL = -0.3
    HOME_LATCH_VEL = -0.016
    HOME_FINAL_VEL = 0.4
    HOME_OFFSET = 0.0
    HOME = 4.0
    
    [AXIS_2]
    TYPE = LINEAR
    MAX_VELOCITY = 0.333
    MAX_ACCELERATION = 3.0
    STEPGEN_MAXACCEL = 6.0
    SCALE = 16000.0
    FERROR = 0.05
    MIN_FERROR = 0.01
    MIN_LIMIT = 0.0
    MAX_LIMIT = 6.930
    BACKLASH = 0.005
    HOME_IS_SHARED = 1
    HOME_SEQUENCE = 0
    HOME_SEARCH_VEL = 0.200
    HOME_LATCH_VEL = 0.016
    HOME_FINAL_VEL = 0.3
    HOME_OFFSET = 6.93
    HOME = 6.5
    
    [AXIS_3]
    TYPE = ANGULAR
    ###WRAPPED_ROTARY = 1
    MAX_VELOCITY = 40.0
    MAX_ACCELERATION = 250.0
    STEPGEN_MAXACCEL = 275.0
    SCALE = 160.0
    FERROR = 1
    MIN_FERROR = .25
    MIN_LIMIT = -999999999.9
    MAX_LIMIT =  999999999.9
    HOME_SEARCH_VEL = 0
    HOME_LATCH_VEL = 0
    HOME = 0.0
    

     

     

  • Simple Air Flow Straightener for Simple Fans

    I want to measure the air flow from some fans, which means I need an air flow straightener to smooth out the wind enough to make the numbers less error-prone. You can, of course, buy cute little straighteners that bolt onto the outlet side of the fan, but what’s the fun in that?

    Air flow straightener - overview
    Air flow straightener – overview

    The general idea is to pass the air through a set of thinwall tubes to damp out the turbulence. A downstream gap between the fan outlet and the passages eliminates / reduces the dead spot caused by the fan rotor. About 1 diameter downstream of the tubes, the air flow becomes reasonably uniform and a few more diameters produces the familiar parabolic velocity profile found in HVAC ducts.

    A few minutes with a bandsaw extracted a 2-diameter-long tube from a 4-inch diameter heavy cardboard mailing tube. A pull saw and a miter box converted some surplus cigar tubes (which I got a long time ago for just such an occasion; I’m not a cigar smoker!) into 3-diameter lengths. Lay as many cigar tubes into the mailing tube as will fit, jam in one more, and they’ll remain in place with sufficient tenacity for my purposes. I suppose, if you were fussy, you could dribble in some adhesive.

    I pushed the cigar tubes to the middle of the mailing tube, mostly because that seemed sensible. As nearly as I can tell, this is one of those things where it’s easy to get a reasonable result (as witness the variety of straighteners used by overclockers) and nearly impossible to get a truly trustworthy quantitative setup (as witness the bizarre vanes used in real wind tunnels by actual engineers). An overclocker discussion lives there.

    Air straightener - cigar tubes
    Air straightener – cigar tubes

    A quartet of board spacers screwed into 90-mm (92-mm, whatever) fan fit neatly around the mailing tube’s OD, where I simply hot-melt-glued them into place.

    Air flow straightener - fan mount
    Air flow straightener – fan mount

    A cardboard gasket seals off the gaps between the fan and the tube.

    Fan gasket in place
    Fan gasket in place

    The gasket looks like this; the next time I will print this picture and cut it out, rather than repeating some fussy layout and getting it wrong twice. Scissors around the outside, a hollow punch for the four screw holes, and a razor knife for the interior. I considered a CNC project, but …

    Air flow straightener gasket
    Air flow straightener gasket

    And then it Just Worked.

    The “before” flow, measured about 1 diameter downstream of the bare fan standing in mid-air, ranged from 0.8 to 1.4 m/s, with the expected completely dead zone in the center. The “after” flow, 1 diameter downstream of the tube, was 0.9 to 1.1 m/s across the entire width, with no decrease in the middle.

    The cross-section area is 12.5 in2 and the flow is maybe 40 in/sec, so the fan is pushing 17.5 ft3/min. More or less, kinda-sorta; it’s a quiet CPU case fan from an ancient Dell PC. I have a box of 60 cfm fans arriving shortly, so we’ll see how they stack up.

    The anemometer is a La Crosse EA-3010U, which may be the wrong hammer for the job, but it doesn’t require me to dope out a hot-wire anemometer just to get a few numbers…

  • Improved Tool Length Probe Switch: Repeatability

    After doing a repeatability test immediately after screwing the new switch to the tooling plate, I let everything sit overnight and ran the test again. In between, I’d done a few small moves, but didn’t change any of the mechanical positions.

    The positions look like this:

    Trial	Z-axis mm	Delta mm
    1	26.303561	0.000000
    2	26.305558	0.001997
    3	26.304226	0.000665
    4	26.304226	0.000665
    5	26.303561	0.000000
    6	26.305558	0.001997
    7	26.305558	0.001997
    8	26.303561	0.000000
    9	26.303561	0.000000
    10	26.304226	0.000665
    11	26.304892	0.001331
    
    	Maximum	0.001997
    	Minimum	0.000000
    	Range	0.001997
    

    The initial position is 0.07 mm, about 3 mils, higher than before, which may well be due to the limited amount of fiddling I’d done in between.

    The corresponding picture shows that the values are well and truly quantized to far fewer positions than the number of digits would lead you to believe:

    Probe Repeatability 2
    Probe Repeatability 2

    The total range is 0.002 mm = 78 microinch, so the steps are on the order of 666 nm: separated by just about exactly one wavelength of the red He emission line.

    What’s of interest is that the regression line is perfectly flat, which means the switch has pretty much stabilized. I have absolutely no reason to believe it’s repeatable to anywhere near that accuracy, particularly from day to day, but the switch is normally used to set tool lengths relative to a specific tool that’s touched off against the work surface at the start of what passes for a machining job around here.

    It’s good enough!

  • Improved Tool Length Probe Switch

    This relay-like object appeared while shoveling off the Electronics Workbench. Most likely, it started life in the white-goods world, where recurring cost is everything:

    Original relay
    Original relay

    Now, doesn’t that look just like a tool length probe? It’s certainly less hideous than the one that’s been working fine on my Sherline mill, ever since I figured out how to make tool length probing work.

    Here’s what caught my eye:

    • Plenty of switch overtravel
    • Nice metal bracket with screws
    • All the vital pieces in one convenient assembly!

    Some brute force removed the spring and actuator, a few shots with a chisel broke the adhesive holding the coil in place, and this collection of parts emerged relatively unscathed:

    Disassembled relay parts
    Disassembled relay parts

    Another shot with a pin punch removed the post from the frame. I intended to un-bend the L-shaped feature that held the post, enlarge the hole, and screw it to the mill. Alas, they formed the angle by notching the steel and it cracked when I un-bent it. No great loss.

    The two bumps on the frame held the (now defunct) restoring spring. I simply filed those off while cleaning up the broken edges.

    Drill a 10-32 clearance hole, solder a cable with a 3.5 mm stereo plug to the switch, add a plastic cable clamp, screw it to the end of the tooling plate, and it’s all good. That’s the butt end of a broken 2 mm end mill poking down from the spindle…

    New tool length probe in action
    New tool length probe in action

    Does it work any better than the previous kludge?

    A G-Code routine that displays the Z-axis coordinate where the switch trips looks like this:

    (Tool length probing test)
    
    (--------------------)
    ( Initialize first tool length at probe switch)
    (    Assumes G59.3 is still in machine units, returns in G54)
    ( ** Must set these constants to match G20 / G21 condition!)
    
    #<_Probe_Speed> =        400            (set for something sensible in mm or inch)
    #<_Probe_Retract> =        1            (ditto)
    
    O<Probe_Tool> SUB
    
    G49                     (clear tool length compensation)
    G30                     (move above probe switch)
    G59.3                   (coord system 9)
    
    G38.2 Z0 F#<_Probe_Speed>           (trip switch on the way down)
    G0 Z[#5063 + #<_Probe_Retract>]     (back off the switch)
    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                     (coord system 0)
    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
    
    (--------------------)
    ( Set up length)
    
    G21                     ( metric units)
    
    (msg,Verify G30.1 above tool change switch, hit Resume)
    M0
    (msg,Verify blunt tool installed, hit Resume)
    M0
    
    O<Probe_Init> CALL
    
    (debug,Initial Z trip = #<_ToolRefZ>)
    
    O100 REPEAT [10]
    
    O<Probe_Tool> CALL
    #<DeltaZ> = [#<_ToolZ> - #<_ToolRefZ>]
    (debug,Z trip=#<_ToolZ> DeltaZ=#<_DeltaZ>)
    
    O100 ENDREPEAT
    
    M2
    

    Which produced these results:

    Trial	Z-axis mm	Delta mm
    1	26.376973	-0.000000
    2	26.376307	-0.000666
    3	26.374976	-0.001997
    4	26.376307	-0.000666
    5	26.375641	-0.001332
    6	26.374310	-0.002663
    7	26.374976	-0.001997
    8	26.373645	-0.003328
    9	26.373645	-0.003328
    10	26.372979	-0.003994
    11	26.372979	-0.003994
    
             Maximum	-0.000000
             Minimum	-0.003994
             Range  	 0.003994
    

    Notice that the results have six figures after the decimal point, but they’re really less precise: you’ll find four pairs of duplicates, which seems highly unlikely. I think the values are quantized to about 25 µ-inch and displayed as whatever the metric equivalent might be.

    The corresponding plot looks like this:

    Probe Repeatability
    Probe Repeatability

    The trend line is highly suspect, but the slope shows that the trip point gets lower by one wavelength of violet light (393 microns) per trip. The total difference is a whopping 0.004 mm during the test, call it 160 millionth of an inch.

    Both of those are better, by roughly a factor of two, than the previous probe switch.

    Bottom line: That’s OK for the sort of machining I do… ship it!

  • Needle-nose Tweezers: Matching the Jaws

    While excavating the top of my workbench and putting things away, I managed to drop my favorite needle-nose tweezers… which, of course, landed point-down on the concrete floor:

    Mismatched tweezer jaw
    Mismatched tweezer jaw

    Well, that gave me an excuse to match up the jaws. If you take a close look at most of your tweezers, they’ll have jaws that don’t quite come together evenly, so you’re trying to grab things with a single point instead of between two flat surfaces.

    A brief session with coarse and medium diamond files produced this pleasing result (with a mm scale for size):

    Matching tweezer jaws
    Matching tweezer jaws

    Much better!

    Another trick that works well: grab a piece of fine sandpaper in the tweezers, scrub sideways, and repeat for the other jaw. That’ll flatten out the jaws, make them reasonably parallel, and put the scratches in the direction that helps the most when you’re pulling something. Works best if the jaws are already pretty well aligned.

  • Ending an Antenna Rattle

    This Comet HT-224 antenna fits on my Kenwood TH-F6A radio, but the connector fitting is just slightly too long / short / something: it moves just a little bit, even with the nut firmly tightened.

    This isn’t a real fix, but it pretty much eliminates the rattle: a rubber O-ring between the nut and the antenna…

    Antenna connector and O-ring
    Antenna connector and O-ring

    The ring lasts for a few years, then cracks and falls off. My O-ring stash has what could possibly be a lifetime supply.

    Antenna with O-ring in place
    Antenna with O-ring in place

    There’s a wrap of tape around the label, just for neatness.