Ed Nisley's Blog: Shop notes, electronics, firmware, machinery, 3D printing, laser cuttery, and curiosities. Contents: 100% human thinking, 0% AI slop.
Reattaching the plate to the PCB with only three screws allows marking the hole position on the PCB, which is much easier than pretending to derive the position from first principles:
Atreus keyboard – LED marking
Despite appearances, I traced the hole with a mechanical pencil: black graphite turns shiny silvery gray against matte black soldermask. Also, the PCB trace is off-center, not the hole.
Overlay the neighborhood with Kapton tape to protect the PCB from what comes next:
Snip a WS2812 RGB LED from a strip, stick it in place with eyeballometric alignment over the target, and wire it up:
After replacing the nozzle and the filament drive body on the M2, I figured I might as well throw all the balls in the air and switch to PrusaSlicer for all my slicing needs. It’s built from the Slic3r project, gaining features used by Prusa’s printers / filaments and a considerably improved UI, with a full-time paid staff working on it:
You have been warned: consider this as a serving suggestion, not a finished product.
Because everything I design looks more-or-less like a bracket, I absolutely don’t care about surface finish, and I’m content to use only a few colors of PETG from a single supplier, a single Slic3r configuration has sufficed for nearly everything I print. A few manual tweaks for specific models, perhaps to change the number of perimeters or the infill percentage, handle the remaining cases.
With all that in mind, here’s the current result of File → Export → Export Config as a GitHub Gist:
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# generated by PrusaSlicer 2.2.0+linux-x64 on 2021-01-01 at 13:33:03 UTC
avoid_crossing_perimeters = 0
bed_custom_model =
bed_custom_texture =
bed_shape = -100x-125,100x-125,100×125,-100×125
bed_temperature = 90
before_layer_gcode =
between_objects_gcode =
bottom_fill_pattern = hilbertcurve
bottom_solid_layers = 3
bottom_solid_min_thickness = 0
bridge_acceleration = 0
bridge_angle = 0
bridge_fan_speed = 100
bridge_flow_ratio = 1
bridge_speed = 50
brim_width = 0
clip_multipart_objects = 1
colorprint_heights =
complete_objects = 0
cooling = 1
cooling_tube_length = 5
cooling_tube_retraction = 91.5
default_acceleration = 0
default_filament_profile = ""
default_print_profile =
deretract_speed = 0
disable_fan_first_layers = 6
dont_support_bridges = 1
draft_shield = 0
duplicate_distance = 6
elefant_foot_compensation = 0
end_filament_gcode = "; Filament-specific end gcode \n;END gcode for filament\n"
end_gcode = ;– PrusaSlicer End G-Code for M2 starts –\n; Ed Nisley KE4NZU – 15 November 2013\nG1 Z160 F2000 ; lower bed\nG1 X135 Y100 F30000 ; nozzle to right, bed front\nM104 S0 ; drop extruder temperature\nM140 S0 ; drop bed temperature\nM106 S0 ; bed fan off\nM84 ; disable motors\n;– PrusaSlicer End G-Code ends –\n\n
start_gcode = ;– PrusaSlicer Start G-Code for M2 starts –\n; Ed Nisley KE4NZU\n; Makergear V4 hot end\n; Origin at platform center, set by MANUAL_X_HOME_POS compiled constants\n; Z-min switch at platform, must move nozzle to X=135 to clear\nG90 ; absolute coordinates\nG21 ; millimeters\nM83 ; relative extrusion distance\nM104 S[first_layer_temperature] ; start extruder heating\nM140 S[first_layer_bed_temperature] ; start bed heating\nM17 ; enable steppers\nG4 P500 ; … wait for power up\nG92 Z0 ; set Z to zero, wherever it might be now\nG0 Z10 F1000 ; move platform downward to clear nozzle; may crash at bottom\nG28 Y ; home Y to clear plate, offset from compiled constant\nG28 X ; home X, offset from M206 X, offset from compiled constant\nG0 X135 Y0 F15000 ; move off platform to right side, center Y\nG28 Z ; home Z to platform switch, offset from M206 Z measured\nG0 Z2.0 F1000 ; get air under switch\nG0 Y-126 F10000 ; set up for priming, zig around corner\nG0 X0 ; center X\nG0 Y-124.5 ; just over platform edge\nG0 Z0 F500 ; exactly at platform\nM190 S[first_layer_bed_temperature] ; wait for bed to finish heating\nM109 S[first_layer_temperature] ; set extruder temperature and wait\nG1 E20 F300 ; prime to get pressure, generate blob on edge\nG0 Y-123 F5000 ; shear off blob\nG0 X15 F15000 ; jerk away from blob, move over surface\nG4 P500 ; pause to attach\nG1 X45 F500 ; slowly smear snot to clear nozzle\nG1 Z1.0 F2000 ; clear bed for travel\n;– PrusaSlicer Start G-Code ends –\n
My alleged improvement to the upper bearing ring in our American Standard Elite kitchen faucet didn’t survive nearly as well as I hoped and began leaking through the o-ring seals after the usual year. The 0.4 mm polypropylene shim ring apparently stuck to the nylon bearing ring, wore down to a 0.1 mm thick ribbon against the base, then let the o-ring wear out as usual.
The black gunk around the top of the upper seal area has the consistency of hard plastic paint, although it’s most likely rubber particles from the o-ring burnished against the bronze base by the sliding PP shim ring:
American Standard Elite faucet – base
Remember Nisley’s First Rule of Plumbing: Never look inside your water supply pipes.
As before, the o-rings wear on their inner diameters, indicating that they turn with the spout around the base.
For lack of anything smarter, I removed as much of the debris as feasible, installed new seals, reassembled the faucet in reverse order, and ordered another set of parts.
If I hadn’t done such a great job of reinforcing the underside of the sink deck around the mounting rings, to the extent I’m not sure another faucet base else would fit, I’d be far less reluctant to start over.
You can’t make up results like this for a techie kind of blog:
Blog Top Post Summary – 2020-12-31
Given my demographic cohort, bedbugs suddenly seemed downright friendly.
Overall, this blog had 109 k visitors and 204 k page views. The ratio of 1.8 pages / visitor has been roughly constant for the last few years, so I assume most folks find one more interesting post before wandering off.
My take from the increasing volume of ads WordPress shovels at those of you who (foolishly) aren’t using an ad blocker continues to fall:
Blog Ad Summary – 2020-12-31
The CPM graph scale seems deliberately scrunched, but the value now ticks along at 25¢ / thousand impressions, adding up to perhaps $250 over the full year. Obviously, I’m not in this for the money.
The ratio of five ads per page view remains more or less constant. Because Google continues to neuter Chrome’s ad blocking ability, I highly recommend using Firefox with uBlock Origin.
WordPress gives me no control over which ads they serve, nor where they put ads on the page. By paying WordPress about $50 / year I could turn off all their ads and convert the blog into a dead loss. I’m nearing their 3 GB limit for media files on a “free” blog, so the calculation may change late next year.
Having a customizable keyboard like the KeyboardIO Atreus means one must customize it. As it turns out, I wanted to use some features of the underlying QMKKaleidoscope firmware that aren’t exposed by Chrysalis, KeyboardIO’s otherwise competent keymap configuration utility, so what you see below runs on hard mode.
Start by installing QMK, compiling the default Atreus layout, and flashing the keyboard just to confirm all the steps work:
Atreus keyboard – overview
With all that working, add (or create) two lines to the rules.mk file in the keymap directory you’re tweaking:
Enabling Auto-Shift lets you generate shifted characters (like Z) by briefly holding down the unshifted key (like z). This requires unlearning an entire lifetime of touch typing practice, but is definitely worthwhile; if a thumb still reaches for the shift key, there’s no harm done. There are, of course, a myriad options, all of which I left unchanged.
Complex passwords suffer, as you must blind-type carefully while tapping each key rapidly.
Enabling Tap Dance lets a key generate one character when tapped and another when double-tapped; you can go crazy with more taps. An enum{} in the keymap.c file generates indexes for the keys and an array holds the action definitions:
Red Oaks Mill Intersection – close pass – approach – 2020-12-24
Most drivers seem content to wait behind us until we get into the huge intersection where there’s plenty of room (comparatively speaking) to pass, but not this one:
Red Oaks Mill Intersection – close pass – waiting – 2020-12-24
I warned Mary (one the reasons we have radios on our bikes) about the mirror just behind her shoulder and she verified the minimal clearance:
Red Oaks Mill Intersection – close pass – arms length – 2020-12-24
Prudence dictated we wait until he was clear before moving:
Red Oaks Mill Intersection – close pass – rolling – 2020-12-24
Of course, the signal timing doesn’t let us get all the way through the intersection under the best of conditions, but we make an impressive enough parade to keep oncoming cars from moving before we’re out of their way.
The wire comes off the roll in dead-soft condition, so I can straighten (and slightly harden) it by simply rolling each wire with eight fingertips across the battered cutting board. The slightly wavy wire shows its as-cut condition and the three straight ones are ready for their masks.
Although nearly pure aluminum wire doesn’t work-harden quickly, half a year of mask duty definitely takes its toll. This sample came from my biking mask after the edges wore out:
Armature wire – work-hardened
We initially thought using two wires would provide a better fit, but more metal just made adjusting the nose seal more difficult after each washing. The wire has work-hardened enough to make the sharper bends pretty much permanent; they can be further bent, but no longer roll out under finger pressure.
Although we’re not yet at the point where we must reuse wires, I took this as an opportunity to improve my annealing hand: heat the wire almost to its melting point, hold it there for a few seconds, then let it cool slowly. The usual technique involves covering the aluminum with something like hand soap or permanent marker ink, heat until the soap / marker burns away, then let it air-cool. Unlike steel, there’s no need for quenching or tempering.
Blue Sharpie worked surprisingly well with a propane torch:
Armature wire – annealed straightened
As far as I can tell after a few attempts, the pigment vanishes just below the annealing temperature and requires another pass to reach the right temperature. Sweep the flame steadily, don’t pause, and don’t hold the wire over anything melt-able.
Those wires (I cut the doubled wire apart) aren’t quite as soft as the original stock, but they rolled straight and are certainly good enough for our simple needs; they’re back in the Basement Laboratory Warehouse for future (re)use.