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.

Category: Machine Shop

Mechanical widgetry

  • LinuxCNC 2.7 vs. Logitech Joggy Thing

    The old Atom running LinuxCNC for the Sherline finally stopped booting, so I popped the Optiplex 760 off the stack and did a live-USB trial run. The latency / jitter worked out around 25 µs, slightly worse than before, but still Good Enough, and the StepConf utility coerced the motors into working OK.

    What didn’t work was the old Eagle-to-HAL code defining the Logitch Gamepad as a Joggy Thing to allow smooth joystick jog control. Well, stuff changes over the course of eight years, but, in this case, the fix turned out to be a one-liner: the probe_parport module isn’t needed nowadays.

    With that out of the way, it runs fine:

    LinuxCNC - Sherline Mill - Logitech Gamepad
    LinuxCNC – Sherline Mill – Logitech Gamepad

    The INI and HAL files defining the Sherline configuration as a GitHub Gist:

    # HAL config file automatically generated by Eagle-CAD ULP:
    # [/mnt/bulkdata/Project Files/eagle/ulp/hal-write-2.5.ulp]
    # (C) Martin Schoeneck.de 2008
    # Charalampos Alexopoulos 2011
    # Mods Ed Nisley KE4ZNU 2010 2013
    # Path [/mnt/bulkdata/Project Files/eagle/projects/LinuxCNC for M2/]
    # ProjectName [LinuxCNC Sherline Configuration]
    # File name [/mnt/bulkdata/Project Files/eagle/projects/LinuxCNC for M2/LinuxCNC Sherline Configuration.hal]
    # Created [11:17:21 17-Feb-2013]
    ####################################################
    # Load realtime and userspace modules
    loadrt trivkins
    loadrt [EMCMOT]EMCMOT key=[EMCMOT]SHMEM_KEY num_joints=[TRAJ]AXES base_period_nsec=[EMCMOT]BASE_PERIOD servo_period_nsec=[EMCMOT]SERVO_PERIOD traj_period_nsec=[EMCMOT]SERVO_PERIOD
    # not needed in 2.7
    # loadrt probe_parport
    loadrt hal_parport cfg="[PARPORT]ADDRESS out"
    loadrt stepgen step_type=0,0,0,0
    loadrt pwmgen output_type=0
    loadusr -W hal_manualtoolchange
    loadusr -W hal_input -KA Dual
    loadrt logic count=1 personality=0x104
    loadrt constant count=13
    loadrt and2 count=17
    loadrt conv_float_s32 count=1
    loadrt flipflop count=4
    loadrt mux2 count=5
    loadrt mux4 count=1
    loadrt not count=8
    loadrt or2 count=14
    loadrt scale count=7
    loadrt timedelay count=1
    loadrt toggle count=1
    ####################################################
    # Hook functions into threads
    addf stepgen.make-pulses base-thread
    addf pwmgen.make-pulses base-thread
    addf parport.0.read base-thread
    addf parport.0.write base-thread
    addf parport.0.reset base-thread
    addf logic.0 base-thread
    addf motion-command-handler servo-thread
    addf motion-controller servo-thread
    addf stepgen.update-freq servo-thread
    addf stepgen.capture-position servo-thread
    addf pwmgen.update servo-thread
    addf constant.0 servo-thread
    addf constant.1 servo-thread
    addf constant.2 servo-thread
    addf constant.3 servo-thread
    addf constant.4 servo-thread
    addf constant.5 servo-thread
    addf constant.6 servo-thread
    addf constant.7 servo-thread
    addf constant.8 servo-thread
    addf constant.9 servo-thread
    addf constant.10 servo-thread
    addf constant.11 servo-thread
    addf constant.12 servo-thread
    addf and2.0 servo-thread
    addf and2.1 servo-thread
    addf and2.2 servo-thread
    addf and2.3 servo-thread
    addf and2.4 servo-thread
    addf and2.5 servo-thread
    addf and2.6 servo-thread
    addf and2.7 servo-thread
    addf and2.8 servo-thread
    addf and2.9 servo-thread
    addf and2.10 servo-thread
    addf and2.11 servo-thread
    addf and2.12 servo-thread
    addf and2.13 servo-thread
    addf and2.14 servo-thread
    addf and2.15 servo-thread
    addf and2.16 servo-thread
    addf conv-float-s32.0 servo-thread
    addf toggle.0 servo-thread
    addf flipflop.0 servo-thread
    addf flipflop.1 servo-thread
    addf flipflop.2 servo-thread
    addf flipflop.3 servo-thread
    addf timedelay.0 servo-thread
    addf or2.0 servo-thread
    addf or2.1 servo-thread
    addf or2.2 servo-thread
    addf or2.3 servo-thread
    addf or2.4 servo-thread
    addf or2.5 servo-thread
    addf or2.6 servo-thread
    addf or2.7 servo-thread
    addf or2.8 servo-thread
    addf or2.9 servo-thread
    addf or2.10 servo-thread
    addf or2.11 servo-thread
    addf or2.12 servo-thread
    addf or2.13 servo-thread
    addf not.0 servo-thread
    addf not.1 servo-thread
    addf not.2 servo-thread
    addf not.3 servo-thread
    addf not.4 servo-thread
    addf not.5 servo-thread
    addf not.6 servo-thread
    addf not.7 servo-thread
    addf scale.0 servo-thread
    addf scale.1 servo-thread
    addf scale.2 servo-thread
    addf scale.3 servo-thread
    addf scale.4 servo-thread
    addf scale.5 servo-thread
    addf scale.6 servo-thread
    addf mux2.0 servo-thread
    addf mux4.0 servo-thread
    addf mux2.1 servo-thread
    addf mux2.2 servo-thread
    addf mux2.3 servo-thread
    addf mux2.4 servo-thread
    ####################################################
    # Set parameters
    setp parport.0.reset-time [PARPORT]RESET_TIME
    setp stepgen.0.maxaccel [AXIS_0]STEPGEN_MAXACCEL
    setp stepgen.0.maxvel [AXIS_0]MAX_VELOCITY
    setp stepgen.0.dirhold [PARPORT]DIRHOLD
    setp stepgen.0.dirsetup [PARPORT]DIRSETUP
    setp stepgen.0.steplen [PARPORT]STEPLEN
    setp stepgen.0.stepspace [PARPORT]STEPSPACE
    setp stepgen.0.position-scale [AXIS_0]SCALE
    setp parport.0.pin-03-out-reset FALSE
    setp parport.0.pin-05-out-reset FALSE
    setp parport.0.pin-07-out-reset FALSE
    setp parport.0.pin-09-out-reset FALSE
    setp parport.0.pin-17-out-reset FALSE
    setp stepgen.1.maxaccel [AXIS_1]STEPGEN_MAXACCEL
    setp stepgen.1.maxvel [AXIS_1]MAX_VELOCITY
    setp stepgen.1.dirhold [PARPORT]DIRHOLD
    setp stepgen.1.dirsetup [PARPORT]DIRSETUP
    setp stepgen.1.steplen [PARPORT]STEPLEN
    setp stepgen.1.stepspace [PARPORT]STEPSPACE
    setp stepgen.1.position-scale [AXIS_1]SCALE
    setp stepgen.2.maxaccel [AXIS_2]STEPGEN_MAXACCEL
    setp stepgen.2.maxvel [AXIS_2]MAX_VELOCITY
    setp stepgen.2.dirhold [PARPORT]DIRHOLD
    setp stepgen.2.dirsetup [PARPORT]DIRSETUP
    setp stepgen.2.steplen [PARPORT]STEPLEN
    setp stepgen.2.stepspace [PARPORT]STEPSPACE
    setp stepgen.2.position-scale [AXIS_2]SCALE
    setp stepgen.3.maxaccel [AXIS_3]STEPGEN_MAXACCEL
    setp stepgen.3.maxvel [AXIS_3]MAX_VELOCITY
    setp stepgen.3.dirhold [PARPORT]DIRHOLD
    setp stepgen.3.dirsetup [PARPORT]DIRSETUP
    setp stepgen.3.steplen [PARPORT]STEPLEN
    setp stepgen.3.stepspace [PARPORT]STEPSPACE
    setp stepgen.3.position-scale [AXIS_3]SCALE
    setp parport.0.pin-04-out-invert TRUE
    setp parport.0.pin-06-out-invert TRUE
    ####################################################
    # Set constants
    setp constant.0.value 0.1
    setp constant.1.value 20
    setp constant.2.value [TRAJ]MAX_LINEAR_VELOCITY
    setp constant.3.value [TRAJ]MAX_ANGULAR_VELOCITY
    setp constant.4.value 60
    setp constant.5.value 0.50
    setp constant.6.value 1.00
    setp constant.7.value 0.10
    setp constant.8.value 0.10
    setp constant.9.value 0.0
    setp constant.10.value -1.0
    setp constant.11.value 0.020
    setp constant.12.value 0.000
    ####################################################
    # Connect Modules with nets
    net a-amp-enable logic.0.in-03 axis.3.amp-enable-out stepgen.3.enable
    net a-analog halui.jog.3.analog mux2.4.out
    net a-button-minus or2.0.in0 input.0.btn-joystick and2.7.in0
    net a-button-plus or2.0.in1 input.0.btn-thumb2 and2.8.in0
    net a-buttons-active or2.0.out or2.1.in0 or2.11.in1
    net a-direction parport.0.pin-08-out stepgen.3.dir
    net a-disable not.7.out and2.13.in1
    net a-enable or2.11.in0 flipflop.3.out not.7.in mux2.4.sel
    net a-jog input.0.abs-z-position mux2.4.in1
    net a-knob-active or2.9.out not.2.in and2.15.in1
    net a-knob-inactive not.2.out and2.14.in1
    net a-select and2.16.in0 and2.15.out
    net a-set flipflop.3.set and2.16.out
    net a-step parport.0.pin-09-out stepgen.3.step
    net all-amps-enabled logic.0.and parport.0.pin-17-out
    net angular_motion or2.11.out mux2.0.sel
    net any-buttons-active mux4.0.sel0 or2.12.out
    net axis-disabled-value constant.9.out mux2.1.in0 mux2.2.in0 mux2.3.in0 mux2.4.in0
    net az-buttons-active or2.1.out or2.12.in1 or2.13.in0
    net az-reset flipflop.2.reset and2.14.out flipflop.3.reset
    net button-crawl scale.4.out mux4.0.in3
    net button-fast scale.2.out mux4.0.in1 scale.4.in
    net estop-a and2.0.in0 input.0.btn-top2
    net estop-b and2.0.in1 input.0.btn-base
    net estop-out parport.0.pin-01-out iocontrol.0.emc-enable-in iocontrol.0.user-enable-out
    net homeswitches parport.0.pin-10-in-not axis.0.home-sw-in axis.1.home-sw-in axis.2.home-sw-in axis.3.home-sw-in
    net jog-crawl toggle.0.out mux4.0.sel1
    net jog-speed halui.jog-speed mux4.0.out
    net knob-crawl mux4.0.in2 scale.3.out
    net knob-fast mux4.0.in0 scale.1.out scale.3.in
    net manual-mode halui.mode.manual input.0.btn-base3
    net n_9 axis.0.motor-pos-cmd stepgen.0.position-cmd
    net n_11 axis.0.motor-pos-fb stepgen.0.position-fb
    net n_13 and2.0.out halui.estop.activate
    net n_14 or2.3.in0 input.0.btn-base5
    net n_15 or2.3.in1 input.0.btn-base6
    net n_16 toggle.0.in or2.3.out
    net n_17 conv-float-s32.0.out input.0.abs-x-flat input.0.abs-y-flat input.0.abs-z-flat input.0.abs-rz-flat
    net n_18 constant.1.out conv-float-s32.0.in
    net n_19 constant.4.out scale.0.gain
    net n_20 constant.5.out scale.1.gain
    net n_21 constant.6.out scale.2.gain
    net n_22 constant.7.out scale.3.gain
    net n_23 scale.4.gain constant.8.out
    net n_24 constant.0.out halui.jog-deadband
    net n_25 constant.2.out mux2.0.in0
    net n_26 mux2.0.in1 constant.3.out
    net n_34 axis.1.motor-pos-cmd stepgen.1.position-cmd
    net n_36 axis.1.motor-pos-fb stepgen.1.position-fb
    net n_42 or2.7.in0 input.0.abs-x-is-pos
    net n_43 or2.7.in1 input.0.abs-x-is-neg
    net n_44 or2.8.in0 input.0.abs-y-is-pos
    net n_45 or2.8.in1 input.0.abs-y-is-neg
    net n_46 or2.9.in0 input.0.abs-z-is-pos
    net n_47 or2.9.in1 input.0.abs-z-is-neg
    net n_48 or2.10.in0 input.0.abs-rz-is-pos
    net n_49 or2.10.in1 input.0.abs-rz-is-neg
    net n_51 constant.10.out scale.5.gain scale.6.gain
    net n_54 constant.11.out timedelay.0.on-delay
    net n_55 constant.12.out timedelay.0.off-delay
    net n_56 timedelay.0.out and2.1.in1 and2.2.in1 and2.4.in1 and2.3.in1 and2.5.in1 and2.6.in1 and2.8.in1 and2.7.in1
    net n_57 and2.1.out halui.jog.0.minus
    net n_58 and2.2.out halui.jog.0.plus
    net n_59 and2.3.out halui.jog.1.minus
    net n_60 halui.jog.1.plus and2.4.out
    net n_61 and2.5.out halui.jog.2.minus
    net n_62 and2.6.out halui.jog.2.plus
    net n_63 and2.7.out halui.jog.3.minus
    net n_64 and2.8.out halui.jog.3.plus
    net n_67 axis.2.motor-pos-cmd stepgen.2.position-cmd
    net n_69 axis.2.motor-pos-fb stepgen.2.position-fb
    net n_77 axis.3.motor-pos-cmd stepgen.3.position-cmd
    net n_79 axis.3.motor-pos-fb stepgen.3.position-fb
    net probe-in parport.0.pin-15-in-not motion.probe-input
    net program-resume halui.program.resume input.0.btn-base4
    net reset-estop input.0.btn-base2 halui.estop.reset
    net tool-change iocontrol.0.tool-change hal_manualtoolchange.change
    net tool-changed hal_manualtoolchange.changed iocontrol.0.tool-changed
    net tool-number iocontrol.0.tool-prep-number hal_manualtoolchange.number
    net tool-prepare-loopback iocontrol.0.tool-prepare iocontrol.0.tool-prepared
    net vel-per-minute scale.0.out scale.1.in scale.2.in
    net vel-per-second mux2.0.out scale.0.in
    net x-amp-enable logic.0.in-00 axis.0.amp-enable-out stepgen.0.enable
    net x-analog mux2.1.out halui.jog.0.analog
    net x-buttons-active or2.5.in0 or2.4.out
    net x-direction parport.0.pin-02-out stepgen.0.dir
    net x-disable not.4.out and2.12.in1
    net x-enable not.4.in flipflop.0.out mux2.1.sel
    net x-hat-minus or2.4.in1 input.0.abs-hat0x-is-neg and2.1.in0
    net x-hat-plus or2.4.in0 input.0.abs-hat0x-is-pos and2.2.in0
    net x-jog input.0.abs-x-position mux2.1.in1
    net x-knob-active or2.7.out not.0.in and2.9.in0
    net x-knob-inactive not.0.out and2.10.in0 and2.11.in0
    net x-set and2.9.out flipflop.0.set
    net x-step parport.0.pin-03-out stepgen.0.step
    net xy-buttons-active or2.5.out or2.12.in0 or2.13.in1
    net xy-reset flipflop.0.reset and2.10.out flipflop.1.reset
    net xyza-buttons-active or2.13.out timedelay.0.in
    net y-amp-enable logic.0.in-01 axis.1.amp-enable-out stepgen.1.enable
    net y-analog halui.jog.1.analog mux2.2.out
    net y-buttons-active or2.6.out or2.5.in1
    net y-direction parport.0.pin-04-out stepgen.1.dir
    net y-disable not.5.out and2.9.in1
    net y-enable flipflop.1.out not.5.in mux2.2.sel
    net y-hat-minus or2.6.in1 input.0.abs-hat0y-is-neg and2.4.in0
    net y-hat-plus or2.6.in0 input.0.abs-hat0y-is-pos and2.3.in0
    net y-jog input.0.abs-y-position scale.5.in
    net y-jog-reversed mux2.2.in1 scale.5.out
    net y-knob-active not.1.in or2.8.out and2.11.in1
    net y-knob-inactive not.1.out and2.10.in1
    net y-select and2.12.in0 and2.11.out
    net y-set flipflop.1.set and2.12.out
    net y-step parport.0.pin-05-out stepgen.1.step
    net z-amp-enable logic.0.in-02 axis.2.amp-enable-out stepgen.2.enable
    net z-analog mux2.3.out halui.jog.2.analog
    net z-button-minus or2.2.in0 input.0.btn-thumb and2.5.in0
    net z-button-plus or2.2.in1 input.0.btn-top and2.6.in0
    net z-buttons-active or2.2.out or2.1.in1
    net z-direction parport.0.pin-06-out stepgen.2.dir
    net z-disable not.6.out and2.16.in1
    net z-enable not.6.in flipflop.2.out mux2.3.sel
    net z-jog input.0.abs-rz-position scale.6.in
    net z-jog-reversed scale.6.out mux2.3.in1
    net z-knob-active not.3.in or2.10.out and2.13.in0
    net z-knob-inactive not.3.out and2.15.in0 and2.14.in0
    net z-set and2.13.out flipflop.2.set
    net z-step parport.0.pin-07-out stepgen.2.step
    view raw Sherline.hal hosted with ❤ by GitHub
    # 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/linuxcnc/configs/Sherline-XYZA/Sherline.gif
    INTRO_TIME = 3
    PROGRAM_PREFIX = /mnt/bulkdata/
    #PROGRAM_PREFIX = /home/ed/linuxcnc/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
    [PARPORT]
    ADDRESS = 0x378
    RESET_TIME = 10000
    STEPLEN = 25000
    STEPSPACE = 25000
    DIRSETUP = 50000
    DIRHOLD = 50000
    [HAL]
    HALUI = halui
    HALFILE = Sherline.hal
    HALFILE = custom.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 = 1
    HOME_SEARCH_VEL = 0.3
    HOME_LATCH_VEL = 0.03
    HOME_FINAL_VEL = 0.4
    HOME_OFFSET = 9.1
    HOME = 5.25
    [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.00
    MAX_LIMIT = 5.10
    BACKLASH = 0.003
    HOME_IS_SHARED = 1
    HOME_SEQUENCE = 2
    HOME_SEARCH_VEL = 0.3
    HOME_LATCH_VEL = 0.03
    HOME_FINAL_VEL = 0.4
    HOME_OFFSET = 5.1
    HOME = 4.5
    [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.680
    BACKLASH = 0.005
    HOME_IS_SHARED = 1
    HOME_SEQUENCE = 0
    HOME_SEARCH_VEL = 0.150
    HOME_LATCH_VEL = 0.015
    HOME_FINAL_VEL = 0.33
    HOME_OFFSET = 6.680
    HOME = 6.500
    [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
    view raw Sherline.ini hosted with ❤ by GitHub

  • Kindle Fire Picture Frame: Side Block

    A steel frame that Came With The House™ emerged from a hidden corner and, instants before tossing it in the recycle heap, I realized it had excellent upcycling potential:

    Kindle Fire Picture Frame - Test Run
    Kindle Fire Picture Frame – Test Run

    Stipulated: I need better pictures for not-so-techie audiences.

    Anyhow, my long-disused Kindle Fire fits perfectly into the welded-on clips, with just enough room for a right-angle USB cable, and Photo Frame Slideshow Premium does exactly what’s necessary to show pictures from internal storage with no network connection.

    All I needed was a small block holding the Kindle against the far side of the frame:

    Kindle Frame - side blocks
    Kindle Frame – side blocks

    A strip of double-stick carpet tape holds the block onto the frame. To extract the Kindle, should the need arise, slide it upward to clear the bottom clips, rotate it rearward, and out it comes.

    Getting a good block required three tries, because the basement has cooled off enough to trigger Marlin’s Thermal Runaway protection for the M2’s platform heater. A test fit after the first failure showed the long leg was 1 mm too wide and, after the second failure, I reduced the fan threshold to 15 s and the minimum layer time to 5 s, producing the third block without incident.

    The platform heater runs at 40 V and I considered bumping it to 43 V for a 15% power boost, but it has no trouble keeping up when the fan isn’t blowing chilly basement air across its surface.

    The OpenSCAD source code, such as it is, doesn’t deserve its own GitHub Gist:

    // Block to hold Kindle in a picture frame mount
    // Ed Nisley - KE4ZNU
    // November 2018
    
    Protrusion = 0.1;
    
    difference() {
    
      cube([18,44,10]);
      translate([-Protrusion,-Protrusion,-Protrusion])
        cube([18-4 + Protrusion,44-10 + Protrusion,10 + 2*Protrusion]);
    
    }
    
  • HP 6201B Power Supply Meter Switch Rehabilitation

    The meter range switch on Squidwrench’s HP 6201B bench power supply became erratic enough to get me to tear it apart:

    HP 6201B Power Supply - meter switch nut
    HP 6201B Power Supply – meter switch nut

    For future reference, apply a 9/16 inch deep socket after loosening two teeny setscrews in the knob.

    The date codes suggest a mid-70s assembly, but the design dates back to the 60s with no plug-in anything:

    HP 6201B Power Supply - meter switch in panel
    HP 6201B Power Supply – meter switch in panel

    Rather than unsolder eight switch leads, I wrangled it into a visible location:

    HP 6201B Power Supply - meter switch rear
    HP 6201B Power Supply – meter switch rear

    The knob and shaft sit on a separate metal bracket held in the white plastic ring with a pair of expanded prongs. Squashing the prongs together released the bracket, so I could see both sides of the switch wafer:

    HP 6201B Power Supply - meter switch front
    HP 6201B Power Supply – meter switch front

    Note the copious markings which would, in the event of an actual finger fumble, give me a better chance of reassembling the spilled guts. Turned out not to be necessary, but it’s good to be prepared!

    The actual repair consisted of easing a drop of DeoxIT Red into each side, spinning the central switch wafer / contacts a few dozen times, then reassembling in reverse order. Re-bending the prongs turned out to be the most difficult part, eventually requiring the designated Prydriver, and ended well enough.

    A quick test with a 100 Ω power resistor shows the supply was working fine and the switch produced the expected results without glitches or twitches:

    HP 6201B Power Supply - test load
    HP 6201B Power Supply – test load

    You just can’t beat the performance of old lab equipment!

  • Bird Feeder Unbending

    At some point in its history, the left rail holding the wood perch on our industrial-strength “squirrel proof” seed feeder took a hit, most likely from being dropped:

    Squirrel on bird feeder
    Squirrel on bird feeder

    I finally got a Round Tuit and un-bent the poor thing:

    Bird feeder - rail un-bending
    Bird feeder – rail un-bending

    Because the bend happened at the base of the vertical strut holding the shutter, I clamped a Genuine Vise-Grip sheet metal pliers along the straight section. The Craftsman knock-off Vise-Grip then applied torque at the bend, rather than just making things worse, and some two-axis tweakage lined up the rail pretty well.

    With the bend taken care of, I clamped the rail in the bench vise with some scrap wood around the strut:

    Bird feeder - warped rail
    Bird feeder – warped rail

    A percussive adjustment jam session flattened the top flange, leaving both sections as flat as they’re gonna get.

    While I was at it, I turned a pair of stepped aluminum washers for the new wood rod:

    Bird feeder - parting off washer
    Bird feeder – parting off washer

    Which looked about like you’d expect, including a little chatter from the cut off tool:

    Bird feeder - perch hardware
    Bird feeder – perch hardware

    Yeah, I drilled the wood rod on the lathe, too; I loves me some simple lathe action.

    Reassemble in reverse order and it’s all good:

    Bird feeder - perch installed
    Bird feeder – perch installed

    We’re supposed to bleach the feeder every week to kill off the bacteria causing House Finch Eye Disease and, while I can’t promise a weekly schedule, we’ll (try to) reduce the amount of crud on the feeder this year.

    If you’ve got a feeder, sign up for Project Feederwatch and do some citizen science!

  • MPCNC: Guilloche Engraving First Light

    A diamond point drag engraving bit in the MPCNC scratched a suitable Guilloché pattern into a scrap hard drive platter much much better than I had any reason to expect:

    MPCNC - Guilloche 835242896 - HD plattter - 0.1mm
    MPCNC – Guilloche 835242896 – HD plattter – 0.1mm

    That’s with a 0.1 mm cut depth, sidelit with an LED flashlight.

    Feeding those nine digits into the Guilloché pattern generator script should get you the same pattern; set the paper size to 109 mm and use Pen=0 to suppress the legend.

    The same pattern at 0.3 mm cut depth looks about the same:

    MPCNC - Guilloche 835242896 - HD plattter - 0.3mm
    MPCNC – Guilloche 835242896 – HD plattter – 0.3mm

    It’s slightly more prominent in real life, but not by enough to make a big difference. I should try a graduated series of tests, of course, which will require harvesting a few more platters from dead drives.

    Either side will look great under a 21HB5A tube, although the disks are fingerprint and dust magnets beyond compare.

  • SRAM X.9 Grip Shift Guts

    The guts of the failed SRAM X.9 rear shifter from my Tour Easy:

    SRAM X.9 grip shifter - innards
    SRAM X.9 grip shifter – innards

    The identical rear shifter on Mary’s bike also seems to be wearing out, as it glides between two of her favorite click stops a bit too easily. You can see the spring peeking out to the right, beyond the white tube, and the notches forming the clicks.

    AFAICT, the raised section between the notches is wearing down; there’s no repair for that sort of thing. I took this one apart to see what’s inside: now we know!

    We’ve agreed to not replace the shifter until the situation gets worse. An X.0 shifter should arrive shortly; it appears identical except for deeper scallops around the grip.

  • MPCNC: Diamond Drag Engraver vs. Acrylic

    Drawn at Z=-0.1 mm on scrap acrylic with the diamond engraver in the modified collet holder:

    MPCNC - Diamond point - acrylic 0.1mm
    MPCNC – Diamond point – acrylic 0.1mm

    The badly rounded corner comes from a Z touch off in facepalm mode; the poor diamond must have been trying to dig a 2 mm trench through the acrylic.

    Then again at Z=-0.5 mm:

    MPCNC - Diamond point - acrylic 0.5mm
    MPCNC – Diamond point – acrylic 0.5mm

    At half a millimeter, the holder applies well over 100 g of downforce. There’s no way to know how much lateral force the tip applies to the holder, but it’s obvious the parallel beams on the MPCNC drag knife adapter lack lateral stability:

    MPCNC knife adapter mods - OpenSCAD model
    MPCNC knife adapter mods – OpenSCAD model

    Bending beams still seem much better than a linear bearing, though.