Ed Nisley's Blog: Shop notes, electronics, firmware, machinery, 3D printing, laser cuttery, and curiosities. Contents: 100% human thinking, 0% AI slop.
The display started up fine, became encrypted during the next few hours, and remained garbled as the track information changed. This is almost certainly a bad SPI transfer trashing the OLED module’s control registers.
Dropping the clock to the absolute minimum of 0.5 MHz didn’t help, either:
serial = spi(device=0,port=0,bus_speed_hz=500000)
device = sh1106(serial)
This particular display woke up blank after loading the new code, then worked OK after another reset. The other streamers lit up as expected on the first try, so the slower SPI isn’t making the situation instantly worse.
Running the clock at 1 MHz definitely reduced the failure rate, which suggests it’s a glitchy thing.
Good embedded systems practice suggests resetting the entire display from scratch every now and again, but my streamer code has no concept of elapsed time. Opening that particular can o’ worms would almost certainly result in an on-screen clock and I do not want to go there.
I suppose I must get a new oscilloscope with SPI bus decoding to verify all the SPI setup and hold times …
The neighborhood raccoons made off with our steel-cage suet feeder, leaving a dangling chain, several puzzled woodpeckers, and a potential gap in Mary’s FeederWatch data. A quick Thingiverse search turned up a likely candidate and a few hours of 3D printing produced a replacement:
3D printed suet feeder
The cheerful party colors just sort of happened after I realized orange wasn’t the new steel.
I bandsawed the top plate from an acrylic sheet, rather than devote several hours to printing a simple disk with two slots. Said slots came from a bit of freehand work with the drill press, a step drill bit, and a nasty carbide milling bur(r).
The loops holding the chains won’t last for long, as hairy and red-bellied woodpeckers land with thump.
It hangs from the stub of a former ski pole, loosely secured to the bracket holding the former feeder, and extending another two feet over the abyss beyond the patio. I doubt the raccoons will remain daunted for long, but maybe they’ll catch a heart attack when it collapses.
The skirt is scant at 0.20 mm, the boxes are 0.15 mm short at 2.85 mm, and the walls are 0.03 mm too thin. Some Z offset adjustment seems in order, as the first few layers (on the left) came out grossly squished:
Calibration box – 2.85 – detail
However, the box heights came out sufficiently uniform to show the platform alignment remains just fine.
Putting it there replaces all the mechanical putzing and adjusting cute little screws / bolts / nuts / spacers / suchlike with a simple offset in the startup G-Code:
G28 Z-2.15 ; home Z to platform switch, with measured offset
So I changed the startup G-Code in Slic3r to use G28 Z-2.30, sliced a single box in the middle of the platform, printed it, and … it came out exactly the same height: 2.85 mm.
Huh.
To make a very long story short, it turns out Marlin 1.1 ignores the numeric parameter in G28. When I updated the firmware to that version, I had changed the Configuration.h file to include the homing offsets:
So, with the same offset burned into the firmware, it looked like the startup G-Code was Doing The Right Thing. I never deleted the offset from the startup G-Code and, at some point, Marlin stopped supporting the numeric parameter.
Huh.
However, the X and Y homing offsets must be hardcoded, because I want the XY origin in the middle of the platform to match my original OpenSCAD part designs. Everybody else prefers the XY origin in the front-left corner. FWIW, in Marlin 1.1-RC5 (two years old by now), the #define BED_CENTER_AT_0_0 constant appears only in that line and nowhere else in the source code. Maybe it was a change in progress back then?
Anyhow, rather than hardcode the Z offset again, I set it to 0.00:
Recompile and reload the firmware, then change the startup G-Code to use G28 Z without the offset.
Doing so means I can measure and adjust the actual Z offset with M206, then store the value in EEPROM with M500:
M206 Z-2.25
M500
I went a little short at -2.25, for reasons I cannot explain now.
Measuring the offset goes like this:
Zero the offset: M206 Z0
Move the extruder off to the right: G0 X135
Home Z: G28 Z
Get some air under the nozzle: G0 Z4.0
Measure the actual clearance, perhaps using your taper gauge, at (let’s say) 1.7 mm
Set (1.7 – 4.0) as the offset: M206 Z-2.3
Print a box and adjust the offset accordingly
Using my actual measurement, not the for-instance example, I resliced the box, printed it, and it came out at 2.94 mm, just slightly short, so I re-tweaked the offset to Z-3.28 and re-stored it.
Embiggening the wall thickness turned out to be a matter of updating the filament diameter. I measured the start of the current spool of orange PETG at 1.75 mm, the same as the previous natural PETG spool, but the current section is 1.70 mm. Plugging that into Slic3r, reslicing, and reprinting produced a dead-on square: 3.00 mm tall with 1.20 mm walls:
Calibration Square series
The skirt now comes out at 0.25 mm, the way it should, too. The difference between the original 0.20 mm skirt and 0.25 mm suggests the squashed center thread (of the three in the skirt around the first set of five boxes) forced the two adjacent threads to become a bit taller, for lack of somewhere for the excess plastic to go on one side of each thread, and the nozzle rode higher than you’d (well, I’d) expect from the bare numbers.
The picture is missing a few squares in the middle, because I couldn’t believe changing the G28 Z-2.15 offset had no effect. It was easier to believe I’d inadvertently loaded the wrong file than the software / firmware was doing something wrong.
However, during the course of the adventure, I established M851 does exactly nothing in this context, perhaps because it applies to some different type of homing / probing / mesh leveling / whatever. You can set the Z offset with several other G-Code and M-Code commands, but the documentation isn’t always forthcoming about how the various methods interact and different firmware uses identical codes for completely different functions, so proceed with Exceedingly Great Caution.
In any event, it’s much easier and faster to adjust the printer & slicing parameters by measuring test boxes than by puzzling over actual prints, so …
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
All of the (surviving) battery packs produce 9.0 to 9.2 V, a bit hotter than the pair of fully charged lithium cells the radio expects to see, but the first two radios lasted for six years under that abuse.
This one failed after a few hours. It’s a new radio, but I’m willing to assume I killed the thing and will just eat the cost.
I have no theories about what’s going on, but I must tweak my APRS interface to work with a Baofeng radio I have on the shelf.
From now on, though, both radios will run from their stock battery packs.
Emboldened by Erik’s suggestion to file the end of a smashed Sakura pen, I filed a notch around the metal snout, snapped it off, and pulled on the tip:
Sakura pen – extended nib
Come to find out the end of the snout is compressed around the nib and holds it in place. I don’t know how long the fiber cylinder might be, but it slides right out of the pen body.
So I squished the snout just a little, snipped off the metal tip, filed the fiber cylinder’s end to a point, and … it sorta-kinda works, but it’ll never again be a very good pen.
Quite some time ago, Vedran described a silicone boot he put over the nozzle. Rather than building a mold and casting the RTV, I threw caution to the winds, ignored any acetic acid corrosion issues, and troweled a layer of RTV on the nozzle:
M2 – nozzle silicone – applied
That’s JB Weld Hi-Temp Red Silicone, rated up to 550 °F = 290 °C continuous operation, so it should be Just Fine at PETG’s usual 250 °C.
I slipped the rebuilt thermistor into its hole, slipped the hot end back into the M2’s extruder, raised it a bit higher than it was before, fired up the M2, and …
Home the X axis
Set X offset: G28 X-100
Move it off to the right: G0 X130
Home the Z axis
Set Z offset: G28 Z-2.15
The Y axis is pretty near the middle, so it’s all good
Move the nozzle to the middle: G0 X0
Move the platform to Z=0: G0 Z0
N.B.: I have the XY=0 origin in the middle of the platform, so don’t do like I do and expect it to work if you put the origin elsewhere.
Then loosen the hot end clamp, slide the hot end down until the nozzle touches the platform, tighten the clamp, and the tip of the nozzle should be pretty close to where it started out:
M2 – nozzle silicone – Z 0.0 set
The microswitch in the background senses the top of the platform, eliminating all the putzing around everybody else does to get a consistent Z offset. I verified the switch trip point by sliding my trusty Starrett No. 270 Taper Gage under the lever until it tripped at 2.1 mm; about as close to 2.15 mm as one might hope for.
The PETG hairs I described in the original post were conspicuous by their absence. It’s too early to tell if the silicone coating is a complete cure, but at least it’s not causing any obvious problems.
The skirt around those parts came out close enough to its nominal 0.25 mm layer thickness:
M2 – nozzle alignment – skirt thickness
I must print some calibration squares to verify the platform alignment and the overall height.
Just for completeness, here’s looking up at the new nozzle, snug inside its fuzzy fiberglas insulating wrap, with a PETG strand drooling from its orifice:
M2 – nozzle silicone – bottom view
I really should order a couple of thermistors, a cartridge heater, and maybe a nozzle …
The MAXTEMP error killing the M2 while printing the bar clamp mounts (probably) came from a short in the thermistor pellet that lowered the thermistor resistance and raised the calculated temperature. I manually heated the extruder and, although the temperature stabilized at 250 °C, the history plot showed irregular downward jogs from increasing resistance. Whenever this constellation of symptoms appears on the M2 forums, I always recommend ordering another thermistor or two, so …
Start by turning a 1/8 inch OD brass tube down to 3.00 mm, parting off a suitable length, facing the ends:
M2 – thermistor brass tube turning
Countersink the ends just for pretty.
The tube should be a slip fit in the hot end:
M2 – hot end thermistor – turned brass tube
While I had the hot end on the bench, I scuffed the nozzle to remove (most of) the baked-on crud:
M2 – nozzle silicone – cleaned nozzle
The plan is to seal the thermistor bead inside the tube with JB Weld epoxy, which I’ve verified (!) to work at extrusion temperatures, depending on the epoxy to insulate the wiring and immobilize all the pieces.
Harvest the original wire harness from the defunct thermistor, solder to the bead, lay out guide lines:
M2 – thermistor – assembly 1 layout
Slobber epoxy over everytyhing, fill the tube, insert bead into tube, stabilize with tape:
M2 – thermistor – assembly 1 curing
Verify connectivity through the thermistor and isolation from the brass tube, then return upstairs to warm up thaw out while the epoxy cures.
At this point, the observant reader should be thinking “Uh, Ed, that bead looked a tad large. Are you absolutely sure … ?”
Halfway up the basement stairs I realized I’d meticulously entombed a 10 kΩ thermistor, not the 100 kΩ thermistor used in the M2’s hot end. You can easily verify the resistance, as I did, with a quick web search; I have hella-good SEO for some specific topics.
Back to the lab …
Fortunately, JB Weld has a pot life over an hour, so extract the wrong bead, unsolder, install the right thermistor using snippets of insulation harvested from the original wiring, realign components:
M2 – thermistor – assembly 2 layout
Reapply epoxy:
M2 – thermistor – assembly 2
Re-verify resistances, return upstairs, fast-forward through the night, have another good idea …