Ed Nisley's Blog: Shop notes, electronics, firmware, machinery, 3D printing, laser cuttery, and curiosities. Contents: 100% human thinking, 0% AI slop.
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 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:
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.
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
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
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…
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
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
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!
This Peltier cooler just emerged from a pile o’ stuff on the Electronics Workbench, so I combined it with a scrap CPU heatsink (using plain old water as “thermal grease”) and fired it up to get some quick numbers for future reference.
Peltier cooler test lashup
It draws 3 A (the bench supply’s current limit) at 5 V. The cold side got down to 19 °F with the hot side at 75 °F: ΔT = 56 °F.
That’s with zero thermal load, other than whatever arrives from plain old air and those two plastic clamps. It looks like a nice one, so it’s maybe 10% efficient and could pump a watt, barely enough to cool a simple circuit.
Freezes a drop of water just fine, though.
The I-V curve is nearly bar-straight over the first five volts: call it 620 mΩ. The thing would draw 7.5 A at 12 V, call it 90 W, and could pump maybe a whopping 9 W from the cold side.
Actually getting good numbers would require some serious work that I’m not up for. In particular, everything has a serious temperature coefficient, so nothing would be the way it looks. I have doubts about the efficiency guesstimate; I’d like to actually measure that sometime.
But it confirms my opinion of Peltier coolers between hundred-watt CPUs and water-cooled heatsinks: pure delusion.
So I swapped in the snow tires and did the fall oil change a few days ago. Everything went smoothly, although the oil filter, as usual, blooshed oil over the front of the engine and, despite my padding the area with rags, onto the exhaust plumbing.
Digression: I don’t understand why the Toyota engineers felt they had to tuck the oil filter below the exhaust header, behind the front downpipe, and over the flexible coupling to the forward cat converter, with the mounting tube pointed upward. It might have something to do with their rotating the entire engine rearward to get a lower hoodline. It seems to me that angling the filter so it can’t drain and must dump its contents atop the exhaust system isn’t Good Design; I’ve been muttering about it for the last decade.
Anyway, the new filter screwed on easily, its seal ring (seemed to) seat against the block, and one final turn snugged it up just fine. The last fraction of that turn felt gritty, as though part the shell kissed the block, but I attributed that to the fact I was using a different filter style.
I added the usual 5 quarts of oil, wiped up the spills, cleaned off the exhaust pipes, declared victory, called it a day, and put away the tools. Later that evening, I checked for leaks, found nothing, and we drove to a meeting about 12 miles away. As you might expect, the van smelled strongly of hot oil: you cannot wipe all the oil off those pipes.
Oil trails on driveway
The next morning, Mary drove to an all-day class about 15 miles away and, about noon, I rolled out my bike to go grocery shopping… only to discover what you see in the picture (minus the sawdust patch) on the driveway.
This is what we call in the trade A Very Bad Sign.
There are three oil tracks:
Right-front track = outbound to evening trip
Rightmost heavy track = return
Leftmost track = outbound to morning trip
Now, the fact that there’s no huge oil slick means the drain plug is in place and properly sealed. The oil evidently leaks out only under pressure, so the filter isn’t sealed against the block. This can be due to a number of causes, the most common of which is leaving the rubber ring from the old filter stuck to the block. I checked the old filter, which was still in the trash: the seal was still in place, so that wasn’t contributing to the problem.
Regardless, the car was bleeding to death. I called Mary and she reported a dry dipstick.
So I loaded a 5-quart jug of oil into the right pannier, dumped all the tools that might possibly come in handy into the left pannier, topped both off with many rags, stopped at an auto parts store along the way for a new filter, and rode those 15 miles at a pretty good clip. When I got to the parking lot, it was easy to find the van: simply follow its trail. The van sat atop a disturbingly large slick, evidently caused by oil draining off every local minimum inside the engine compartment and under the forward half of the chassis.
The filter was still firmly screwed in place, but when I got it off and compared it with the new filter, they were different: the offending filter was slightly larger in diameter and the threaded hole was noticeable larger. Although it threaded on, the threads weren’t properly engaged, the larger diameter shell did hit the engine block, and it most certainly wasn’t sealed properly.
I installed the new filter, poured in 3 quarts to the get the oil level midway into the dipstick’s OK range, wiped off some of the oil that coated essentially every part of the engine compartment, and we drove home trailing a cloud of hot oil fumes.
As it turned out, the old filter was the same brand as the one that didn’t seal, but with different numbers and a different prefix: the correct filter is a 3614, the wrong one was 3593. Of course, the boxes and illustrations are identical, with slightly different contents. I’m sure they’re adjacent on the shelf and migrate into each other’s slot. It’s worth noting that the filter I bought while on the way to fix the problem was a different brand sporting a part number totally unrelated to 3614.
The butt end of the van was covered with oil, as though the droplets blew out under the chassis and got sucked up against the rear surface; the window was a mess. I sprayed on stout detergent and wiped it clean, but I think we must treat the poor thing to an all-over car wash with the special undercarriage scrub option.
No harm done, as nearly as I can tell, although it’s an exceedingly good thing we weren’t driving off to the grandparents!
This is a stick in the ground for the current config files I’m using with EMC 2.4.5. Even the automagically generated files may have some tweakage, which is why I’m putting them here…
[Update: this is for a Dell Dimension 4550 with a latency around 10 µs, occasional glitches to 20 µs, and a very rare burp to 80 µs. Worked fine, but those rare burps were disturbing.]
# Include your customized HAL commands here
# This file will not be overwritten when you run stepconf again
#--------------
# Get buttons and joysticks from Logitech Dual Action gamepad
loadusr -W hal_input -KA Dual
#--------------
# Home switches are all in parallel, active low
net homeswitches <= parport.0.pin-10-in-not
net homeswitches => axis.0.home-sw-in
net homeswitches => axis.1.home-sw-in
net homeswitches => axis.2.home-sw-in
#--------------
# Probe input is active low
net probe-in <== parport.0.pin-15-in-not
net probe-in ==> motion.probe-input
custom_postgui.hal
#-- empty
Logitech_Gamepad.hal
# HAL config file automatically generated by Eagle-CAD ULP:
# [/mnt/bulkdata/Project Files/eagle/ulp/hal-write-array.ulp]
# (C) Martin Schoeneck.de 2008
# Mods Ed Nisley 2010
# Path [/mnt/bulkdata/Project Files/eagle/projects/EMC2 HAL Configuration/]
# ProjectName [Logitech Gamepad]
# File name [/mnt/bulkdata/Project Files/eagle/projects/EMC2 HAL Configuration/Logitech_Gamepad.hal]
# Created [11:51:27 10-Nov-2010]
####################################################
# Load realtime and userspace modules
loadrt constant count=16
loadrt and2 count=17
loadrt flipflop count=4
loadrt mux2 count=5
loadrt mux4 count=1
loadrt not count=8
loadrt or2 count=10
loadrt scale count=7
loadrt timedelay count=1
loadrt toggle count=1
loadrt wcomp count=6
####################################################
# Hook functions into threads
addf toggle.0 servo-thread
addf wcomp.1 servo-thread
addf wcomp.2 servo-thread
addf wcomp.3 servo-thread
addf and2.0 servo-thread
addf and2.4 servo-thread
addf and2.3 servo-thread
addf and2.2 servo-thread
addf and2.1 servo-thread
addf constant.6 servo-thread
addf constant.5 servo-thread
addf constant.4 servo-thread
addf constant.3 servo-thread
addf constant.2 servo-thread
addf constant.1 servo-thread
addf constant.0 servo-thread
addf constant.7 servo-thread
addf constant.8 servo-thread
addf scale.1 servo-thread
addf scale.2 servo-thread
addf scale.3 servo-thread
addf mux4.0 servo-thread
addf mux2.0 servo-thread
addf scale.4 servo-thread
addf scale.0 servo-thread
addf wcomp.5 servo-thread
addf wcomp.4 servo-thread
addf wcomp.0 servo-thread
addf flipflop.1 servo-thread
addf flipflop.0 servo-thread
addf and2.5 servo-thread
addf and2.6 servo-thread
addf and2.7 servo-thread
addf and2.8 servo-thread
addf flipflop.2 servo-thread
addf flipflop.3 servo-thread
addf or2.4 servo-thread
addf or2.8 servo-thread
addf or2.7 servo-thread
addf or2.6 servo-thread
addf or2.5 servo-thread
addf or2.3 servo-thread
addf or2.2 servo-thread
addf or2.1 servo-thread
addf or2.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 not.0 servo-thread
addf constant.9 servo-thread
addf mux2.1 servo-thread
addf mux2.2 servo-thread
addf mux2.3 servo-thread
addf mux2.4 servo-thread
addf constant.10 servo-thread
addf constant.11 servo-thread
addf scale.5 servo-thread
addf scale.6 servo-thread
addf constant.12 servo-thread
addf constant.13 servo-thread
addf timedelay.0 servo-thread
addf constant.14 servo-thread
addf constant.15 servo-thread
addf and2.16 servo-thread
addf and2.15 servo-thread
addf and2.14 servo-thread
addf and2.13 servo-thread
addf and2.12 servo-thread
addf and2.11 servo-thread
addf and2.10 servo-thread
addf and2.9 servo-thread
addf or2.9 servo-thread
####################################################
# Set parameters
####################################################
# Set constants
setp constant.0.value +0.02
setp constant.1.value -0.02
setp constant.2.value 60
setp constant.3.value 1.00
setp constant.4.value 0.10
setp constant.5.value 0.50
setp constant.6.value 0.10
setp constant.7.value +0.5
setp constant.8.value -0.5
setp constant.9.value 0.0
setp constant.10.value [TRAJ]MAX_LINEAR_VELOCITY
setp constant.11.value [TRAJ]MAX_ANGULAR_VELOCITY
setp constant.12.value -1.0
setp constant.13.value 0.1
setp constant.14.value 0.020
setp constant.15.value 0.000
####################################################
# Connect Modules with nets
net a-button-minus input.0.btn-trigger or2.2.in0 and2.15.in0
net a-button-plus input.0.btn-thumb2 or2.2.in1 and2.16.in0
net a-buttons-active or2.2.out or2.3.in0 or2.4.in1
net a-disable not.7.out and2.5.in1
net a-enable or2.4.in0 flipflop.3.out not.7.in mux2.4.sel
net a-jog wcomp.2.in input.0.abs-z-position mux2.4.in1
net a-knob-active not.2.out and2.7.in1
net a-knob-inactive wcomp.2.out not.2.in and2.6.in1
net a-select and2.8.in0 and2.7.out
net a-set flipflop.3.set and2.8.out
net angular_motion or2.4.out mux2.0.sel
net any-buttons-active mux4.0.sel0 or2.8.out
net az-buttons-active or2.3.out or2.8.in1 or2.9.in0
net az-reset flipflop.2.reset and2.6.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 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 n_1 constant.10.out mux2.0.in0
net n_2 and2.0.in0 input.0.btn-top2
net n_3 and2.0.in1 input.0.btn-base
net n_4 and2.0.out halui.abort
net n_5 halui.mode.manual input.0.btn-base3
net n_6 wcomp.0.max wcomp.1.max wcomp.2.max wcomp.3.max constant.0.out
net n_7 halui.program.resume input.0.btn-base4
net n_8 wcomp.0.min wcomp.1.min wcomp.2.min wcomp.3.min constant.1.out
net n_9 mux2.0.in1 constant.11.out
net n_10 constant.12.out scale.5.gain scale.6.gain
net n_11 input.0.btn-base5 or2.0.in0
net n_12 input.0.btn-base6 or2.0.in1
net n_13 constant.9.out mux2.1.in0 mux2.2.in0 mux2.3.in0 mux2.4.in0
net n_14 mux2.1.out halui.jog.0.analog
net n_15 toggle.0.in or2.0.out
net n_16 constant.2.out scale.0.gain
net n_17 constant.5.out scale.1.gain
net n_18 constant.3.out scale.2.gain
net n_19 constant.4.out scale.3.gain
net n_20 scale.4.gain constant.6.out
net n_21 halui.jog.1.analog mux2.2.out
net n_22 mux2.2.in1 scale.5.out
net n_23 scale.6.out mux2.3.in1
net n_24 constant.13.out halui.jog-deadband
net n_25 wcomp.4.max constant.7.out wcomp.5.max
net n_26 constant.8.out wcomp.4.min wcomp.5.min
net n_27 mux2.3.out halui.jog.2.analog
net n_28 halui.jog.3.analog mux2.4.out
net n_29 timedelay.0.out and2.9.in1 and2.10.in1 and2.12.in1 and2.11.in1 and2.13.in1 and2.14.in1 and2.16.in1 and2.15.in1
net n_30 and2.9.out halui.jog.0.minus
net n_31 or2.9.out timedelay.0.in
net n_32 constant.14.out timedelay.0.on-delay
net n_33 constant.15.out timedelay.0.off-delay
net n_34 and2.10.out halui.jog.0.plus
net n_35 and2.11.out halui.jog.1.minus
net n_36 halui.jog.1.plus and2.12.out
net n_37 and2.13.out halui.jog.2.minus
net n_38 and2.14.out halui.jog.2.plus
net n_39 and2.15.out halui.jog.3.minus
net n_40 and2.16.out halui.jog.3.plus
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-buttons-active or2.7.in0 or2.5.out
net x-disable not.4.out and2.4.in1
net x-enable not.4.in flipflop.0.out mux2.1.sel
net x-hat-jog wcomp.4.in input.0.abs-hat0x-position
net x-hat-minus wcomp.4.under or2.5.in1 and2.9.in0
net x-hat-plus or2.5.in0 wcomp.4.over and2.10.in0
net x-jog wcomp.0.in input.0.abs-x-position mux2.1.in1
net x-knob-active not.0.out and2.1.in0
net x-knob-inactive wcomp.0.out not.0.in and2.2.in0 and2.3.in0
net x-set and2.1.out flipflop.0.set
net xy-buttons-active or2.7.out or2.8.in0 or2.9.in1
net xy-reset flipflop.0.reset and2.2.out flipflop.1.reset
net y-buttons-active or2.6.out or2.7.in1
net y-disable not.5.out and2.1.in1
net y-enable flipflop.1.out not.5.in mux2.2.sel
net y-hat-jog input.0.abs-hat0y-position wcomp.5.in
net y-hat-minus wcomp.5.under or2.6.in1 and2.12.in0
net y-hat-plus or2.6.in0 wcomp.5.over and2.11.in0
net y-jog wcomp.1.in input.0.abs-y-position scale.5.in
net y-knob-active not.1.out and2.3.in1
net y-knob-inactive not.1.in wcomp.1.out and2.2.in1
net y-select and2.4.in0 and2.3.out
net y-set flipflop.1.set and2.4.out
net z-button-minus input.0.btn-thumb or2.1.in0 and2.13.in0
net z-button-plus or2.1.in1 input.0.btn-top and2.14.in0
net z-buttons-active or2.1.out or2.3.in1
net z-disable not.6.out and2.8.in1
net z-enable not.6.in flipflop.2.out mux2.3.sel
net z-jog wcomp.3.in input.0.abs-rz-position scale.6.in
net z-knob-active not.3.out and2.5.in0
net z-knob-inactive not.3.in wcomp.3.out and2.7.in0 and2.6.in0
net z-set and2.5.out flipflop.2.set
Sherline.hal
# 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=0xecd8
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 1
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 1
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 1
net adir => parport.0.pin-08-out
net astep => parport.0.pin-09-out
setp parport.0.pin-09-out-reset 1
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 0
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 0
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 0
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 0
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
My shop assistant bears most of the hair in the household, so it seemed entirely appropriate that she clear the clog from the shower drain. She says she’s going to take a picture of the hairball and show her friends what her parents make her do…
I pointed out that plumbers are ecstatic when they get a call for this sort of problem and will charge maybe 150 bucks to make the clog Go Away. When she’s writing the check, she can make whatever choice she wants.
For now, this is how it gets done; the snake hangs on the garage wall.
While shoveling things off the workbench, I encountered a old wooden ruler with brass-colored metal edges, one of which had popped out of its groove. No wonder: the poor thing was bent into an arc the hard way. I have no idea how that happened, honest.
Distorted ruler edge
Anyhow, I figured I could fix it with the same technique I apply to straighten copper wire: grab one end in the bench vise, the other in a Vise-Grip, and whack the pliers with a hammer to stretch the wire a percent or two. So I did that and failed completely: the metal strip is actually copper / brass plating on steel.
But it was straight enough to tuck back into the groove, where friction seems to be holding it in place, and all is well.
(If I’d found it before I put a dot of epoxy into the sunglasses hinge, I’d have dabbed some dots along the groove and secured it in place forever. No such luck… the workbench is really buried this time.)