The bathroom drain rod slipped out of the pop-up stopper, giving me the opportunity to see how well it’s surviving:

After not quite two years, it’s not obviously rotting away.
Life is good …
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.
Making the world a better place, one piece at a time
The bathroom drain rod slipped out of the pop-up stopper, giving me the opportunity to see how well it’s surviving:

After not quite two years, it’s not obviously rotting away.
Life is good …
The CNC 3018-Pro doesn’t absolutely need home switches, but (in principle) they let you install a workholding fixture at a known position, home the axes, pick a preset coordinate system for the fixture, and not have to touch off the axes before making parts.
Having used Makerbot-style endstop switch PCBs for the MPCNC, this was straightforward:

The X and Z axis switches simply press against the appropriate moving parts:

The little tab stuck on the tool clamp provides a bit of clearance around the upper part of the X axis assembly.
The Y axis switch needed a slightly tapered tab to extend the bearing holder:

It’s made from a random scrap of clear plastic, hand-filed to suit, and stuck on the bearing to trigger the switch in exactly the right spot.
You can find elaborate switch mounts on Thingiverse, but I’ve become a big fan of genuine 3M outdoor-rated foam tape for this sort of thing: aggressive stickiness, no deterioration, possible-but-not-easy removal.
The switches need +5 V power, so add a small hack to the CAMTool V3.3 control board to let the connectors plug right in:

The solid models borrow their central depression around the switch terminals from the MPCNC blocks:

The OpenSCAD source code as a GitHub Gist:
| // 3018-Pro Mount for Makerbot Endstop PCB | |
| // Ed Nisley KE4ZNU – 2019-07 | |
| /* [Build Options] */ | |
| Layout = "Show"; // [Build, Show] | |
| /* [Hidden] */ | |
| ThreadThick = 0.25; // [0.20, 0.25] | |
| ThreadWidth = 0.40; // [0.40] | |
| function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit); | |
| Protrusion = 0.01; // [0.01, 0.1] | |
| HoleWindage = 0.2; | |
| ID = 0; | |
| OD = 1; | |
| LENGTH = 2; | |
| //- Shapes | |
| // Basic PCB with hole for switch pins | |
| // origin at switch actuator corner, as seen looking at component side | |
| SwitchClear = [15.0,5.0,2.0]; // clearance around switch pins | |
| SwitchOffset = [12.5,9.0,0.0]; // center of switch pins from actuator corner | |
| PCB = [26.0,16.4,2*SwitchClear.z]; // switch PCB beyond connector, pin height | |
| XBlock = [PCB.x,PCB.y,5.0]; | |
| module XMount() { | |
| difference() { | |
| cube(XBlock,center=false); | |
| translate(SwitchOffset + [0,0,XBlock.z – SwitchClear.z/2]) | |
| cube(SwitchClear + [0,0,Protrusion],center=true); | |
| } | |
| } | |
| YBlock = [PCB.x + 10.0,PCB.y,20.0]; | |
| module YMount() { | |
| difference() { | |
| translate([-10.0,0,0]) | |
| cube(YBlock,center=false); | |
| translate([0,-Protrusion,10.0]) | |
| cube(YBlock + [0,2*Protrusion,0],center=false); | |
| translate(SwitchOffset + [0,0,10.0 – SwitchClear.z/2]) | |
| cube(SwitchClear + [0,0,Protrusion],center=true); | |
| } | |
| } | |
| ZBlock = [PCB.x,PCB.y,6.0]; | |
| ZPin = [20.0,10.0,5.5]; | |
| module ZMount() { | |
| difference() { | |
| cube(ZBlock,center=false); | |
| translate(SwitchOffset + [0,0,ZBlock.z – SwitchClear.z/2]) | |
| cube(SwitchClear + [0,0,Protrusion],center=true); | |
| } | |
| translate([0,-ZBlock.y,0]) | |
| difference() { | |
| cube(ZPin,center=false); | |
| translate([ZPin.x/2,-Protrusion,4.0]) | |
| cube(ZPin + [0,2*Protrusion,0],center=false); | |
| } | |
| } | |
| //- Build things | |
| if (Layout == "Show") { | |
| translate([0,YBlock.y,0]) | |
| XMount(); | |
| translate([0,-YBlock.y/2]) | |
| YMount(); | |
| translate([0,-(ZBlock.y + YBlock.y)]) | |
| ZMount(); | |
| } |
The dimension doodles:

The Protonteer board I used on the MPCNC required a few additional pins for power to Makerbot-style home switches, so it’s no surprise the CAMTool V3.3 board on the CNC 3018-Pro gantry mill requires a similar hack:

The white jumper plugs into the single +5 V pin in the row and is soldered to a straight wire running along the entire row of header pins. I pushed the black plastic strip to the bottom, soldered the wire along the pins atop it, then clipped off the pins so they’re about the right height when flush against the PCB.
Use a two-row socket to hold the new row in alignment with the existing header:

Slobber on some epoxy and let it cure:

And then It Just Works™:

Well, after you install the switches and tell GRBL to use them …
Reminder: If you intend to put limit switches on both ends of the axis travel, you must clip the NC lead from both MBI switches. One switch per axis will work the way you expect and that’s how I’m using them here.
If you regard your new CNC 3018-Pro Router kit as a box of parts which could, with some adjustments and additional parts, become a small CNC router, you’re on the right track.
In my case, the aluminum extrusions arrived somewhat squashed inside their well-padded foam shipping carton, which leads me to believe the factory responsible for tapping the bolt holes in the ends must be a fairly nasty place. In any event, the hammerhead T-nuts for the gantry struts simply didn’t fit into some sections of the slots, although they worked fine elsewhere.
So, file a smidge off the rounded sides of a few nuts:

Which let them slide into place and rotate properly despite the bent channel:

The assembly instructions used a word I’d never encountered before:

Turns out ubiety is exactly correct, but … raise your hand if you’ve ever heard it in polite conversation. Thought so.
I’ve not noticed any harm from rounding off the position to 46 mm; just position both struts the same distance from the rear crossbar and it’s all good.
The struts behind the CAMTool CNC-V3.3 electronics board were also squashed, prompting a bit more filing:

The CAMTool board is basically an Arduino-class microcontroller preloaded with GRBL 1.1f and surrounded with spindle / stepper driver circuits.
As with the MPCNC, I’ll dribble G-Code into it from a Raspberry Pi. Alas, the struts behind the CAMTool board are on 75 mm centers, but the Pi cases on hand have feet on 72-ish mm centers. Pay no attention to the surroundings, just drill the holes in the right spots:

Add more T-nuts and short button head screws, with rubber pads between the case and the struts:

It’s coming together!
Since the PiHole runs all the time, it now hosts an FTP server to stash snapshots from the cameras onto a 64 GB USB stick. I installed ProFTPD, which Just Worked with a few configuration tweaks:
UseIPv6 off
ServerName "PiHole"
DefaultRoot /mnt/cameras
RequireValidShell off
The cameras use the BusyBox ftpput command to stash their images (with the hostname prepended), which requires a few changes to motion.conf in the cameras:
ftp_snapshot=true
ftp_host="192.168.1.2"
ftp_port=21
ftp_username=$(/bin/hostname)
ftp_password="make up your own"
ftp_stills_dir=$(/bin/hostname)
The last line uses a separate directory for each camera, although they quickly ran into the FAT32 limit of 64 K files per directory; reformatting the USB stick with an ext3 filesystem solved that problem.
Fortunately, nothing much ever happens around here …

My high hopes for the UHMW bushing supporting the impeller lasted the better part of a day, because direct contact between the impeller and the motor bearing produced an absurdly loud and slowly pulsating rumble:

My hope that the UHMW would wear into a quieter configuration lasted a week …
Back in the Basement Shop, some free-air tinkering showed the impeller produced enough suction to pull itself downward along the shaft and jam itself firmly against the motor frame. My initial thought of putting a lock ring around the shaft to support the impeller turned out to be absolutely right.
So, make a small ring:

With a 4-40 setscrew in its side, perched atop the impeller for scale:

It just barely fits between the impeller and the motor frame:

This reduced the noise, but the hole in the impeller has worn enough to let it rotate on the shaft and the rumble continued unabated. The correct way to fix this evidently requires a mount clamped to both the shaft and the impeller.
Fast-forward a day …
A careful look at the impeller shows seven radial ribs, probably to reduce the likelihood of harmonic vibrations. After a bit of dithering, I decided not to worry about an off-balance layout, so the screws sit on a 9 mm radius at ±102.9° = 2 × 360°/7 from a screw directly across from the setscrew in another slice from the 1 inch aluminum rod:

Centered on the disk and using LinuxCNC’s polar notation, the hole positions are:
G0 @9.0 ^-90
G0 @9.0 ^[-90+102.9]
G0 @9.0 ^[-90-102.9]
As usual, I jogged the drill downward while slobbering cutting fluid. I loves me some good manual CNC action.
Put the mount on a 1/4 inch tube, stick it into the impeller, and transfer-punch the screw holes:

Apparently, some years ago I’d cut three screws to just about exactly the correct length:

I knew I kept them around for some good reason!
The 9 mm radius just barely fits the screw heads between the ribs:

Some Dremel cutoff wheel action extended the motor shaft flat to let the setscrew rest on the bottom end:

Then it all fit together:

The fan now emits a constant whoosh, rather than a pulsating rumble, minus all the annoying overtones. It could be quieter, but it never was, so we can declare victory and move on.
Dropping fifty bucks on a replacement fan + impeller unit would might also solve the problem, but it just seems wrong to throw all that hardware in the trash.
And, despite making two passes at the problem before coming up with a workable solution, I think that’s the only way (for me, anyhow) to get from “not working” to “good as it ever was”, given that I didn’t quite understand the whole problem or believe the solution at the start.
But it should be painfully obvious why I don’t do Repair Cafe gigs …
The Baofeng UV-5R radios on our bikes seem absurdly sensitive to intermodulation interference, particularly on rides across the Walkway Over the Hudson, which has a glorious view of the repeaters and paging transmitters atop Illinois Mountain:

A better view of the assortment on the right:

And on the left:

Not shown: the Sheriff’s Office transmitter behind us on the left and the Vassar Brothers Hospital / MidHudson pagers on either side at eye level. There’s plenty of RFI boresighted on the Walkway.
Anyhow, none of the Baofeng squelch settings had any effect, which turned out to be a known problem. The default range VHF covered a whopping 6 dB and the UHF wasn’t much better at 18 dB, both at very low RF power levels.
We use the radios in simplex mode, generally within line of sight, so I changed the Service Settings to get really aggressive squelch:

I have no way to calibrate the new signal levels, but I’d previously cranked the squelch up to 9 (it doesn’t go any higher) and, left unchanged, the new level makes all the previous interference Go Away™. Another ride over the Walkway with the squelch set to 4 also passed in blissful silence.
If the BF-F9 levels mean anything on a UV-5R, that’s about -100 dBm, 20 dB over the previous -120 dBm at squelch = 9.
The new squelch levels may be too tight for any other use, which doesn’t matter for these radios. As of now, our rides are quiet.
[Update: Setting the squelch to 5 may be necessary for the Walkway, as we both heard a few squawks and bleeps while riding eastbound on a Monday afternoon. ]