So I drill two holes in the dust caps of those teensy Sandisk drives and added a cheerful red string:

That this should not be necessary goes without saying…
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.
So I drill two holes in the dust caps of those teensy Sandisk drives and added a cheerful red string:

That this should not be necessary goes without saying…
The springs balancing the dishwasher door started twanging again, which I now know is the diagnostic sign that an asphalt sound deadening sheet has slipped off the tub. A sheet on the right side almost perpetrated a clean escape, but the flap drooping over the spring gave it away:

Another sheet on the left side was inching away, but hadn’t quite gotten over the fence:

They’re pretty much a rigid solid at room temperature:

It puts one in mind of the pitch drop experiments now running in various labs. In this case, we now know it takes about four years for an asphalt sheet to slide completely off the tub; those two sheets were definitely in place when I buttoned it up after the previous one broke free.
I applied a heat gun to soften the sheets, then smoothed them around the tub again. This time I applied long strips of Gorilla Tape from one side to the other, rather than short strips of ordinary duct tape along the edges, and maybe this fix will outlast either the dishwasher or our tenure here, whichever comes first…
OK, I couldn’t resist. Tweaking a few lines of code wrapped a knurl around emmitt’s Gear Bearing for enhanced griptivity:

That image has desaturated red to suppress the camera’s red burnout. It looks better in the realm of pure math:

Reducing the tolerance parameter to 0.4 produced a surprisingly rigid, yet freely turning, bearing that required no cleanup: it popped off the plate ready to roll!
The heavy lifting in the OpenSCAD source code remains emmitt’s work. I replaced the outer cylinder with a knurl and simplified his monogram to stand out better amid the diamonds. This is the affected section:
... snippage ...
translate([0,0,T/2]){
difference(){
// cylinder(r=D/2,h=T,center=true,$fn=100);
render(convexity=10)
translate([0,0,-T/2])
knurl(k_cyl_hg=T,
k_cyl_od=D,
knurl_wd=5.0,
knurl_hg=5.0,
knurl_dp=0.5,
e_smooth=5.0/2);
herringbone(nr,pitch,P,DR,-tol,helix_angle,T+0.2);
// difference(){
translate([0,-(D/2+4.5),0])rotate([90,0,0])monogram(h=10);
// cylinder(r=D/2-0.25,h=T+2,center=true,$fn=100);
// }
}
rotate([0,0,(np+1)*180/ns+phi*(ns+np)*2/ns])
difference(){
mirror([0,1,0])
herringbone(ns,pitch,P,DR,tol,helix_angle,T);
cylinder(r=w/sqrt(3),h=T+1,center=true,$fn=6);
}
for(i=[1:m])rotate([0,0,i*360/m+phi])translate([pitchD/2*(ns+np)/nr,0,0])
rotate([0,0,i*ns/m*360/np-phi*(ns+np)/np-phi])
render(convexity=10)
herringbone(np,pitch,P,DR,tol,helix_angle,T);
}
I also added a few render(convexity=n) operations to improve the preview, but that’s just cosmetic.
Santa delivered a pair of helmets that will require mirror mounts and a mic boom before the spring riding season kicks in. The visor has tabs that snap into sockets on each side of the helmet:

It occurred to me that I could make an interposer between the helmet and the visor that could anchor the mic boom, with a tab for the helmet and a socket of some sort for the visor. While that’s still on the to-do list, the tab looks like this:

Those are 1 mm cubes on 10 mm centers, so this is a teeny little thing.
I don’t have a good idea for the corresponding socket, because those little grippers seem much too small for 3D printing, but now I have some tabs to play with:

The OpenSCAD source code puts the tab atop an oval base plate, but it’ll eventually stick out of the boom mount:
// Bell Helmet Visor Mount
// Ed Nisley KE4ZNU
// December 2013
// Layout options
Layout = "Build"; // Build Show
//-----
// Extrusion parameters must match reality!
ThreadThick = 0.20;
ThreadWidth = 0.4;
HoleWindage = 0.2;
//-- Handy stuff
function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);
Protrusion = 0.1; // make holes end cleanly
inch = 25.4;
//----------------------
// Dimensions
//----------------------
// Useful routines
module PolyCyl(Dia,Height,ForceSides=0) { // based on nophead's polyholes
Sides = (ForceSides != 0) ? ForceSides : (ceil(Dia) + 2);
FixDia = Dia / cos(180/Sides);
cylinder(r=(FixDia + HoleWindage)/2,
h=Height,
$fn=Sides);
}
//- Put peg grid on build surface
module ShowPegGrid(Space = 10.0,Size = 1.0) {
RangeX = floor(100 / Space);
RangeY = floor(125 / Space);
for (x=[-RangeX:RangeX])
for (y=[-RangeY:RangeY])
translate([x*Space,y*Space,Size/2])
%cube(Size,center=true);
}
//-------------------
// Shapes
TabBaseLength = 17.0;
TabTopLength = 15.5;
TabWidth = 4.00;
TabHeight = 5.5;
TabEmbed = 0.5;
TabTaperHeight = 3.70;
TabBaseHeight = TabHeight - TabTaperHeight;
LatchBar = 2.25; // square cross section
WebIndent = 1.60; // from outside edge of post
WebThick = TabWidth - 2*WebIndent;
LatchIndentTall = TabHeight - LatchBar;
PostLength = 5.00;
PostTaper = 1.25;
LatchIndentLength = TabBaseLength - 2*(PostLength + PostTaper);
module BellLatch() {
difference() {
intersection() {
translate([0,TabWidth/2,0]) rotate([90,0,0]) // side view
linear_extrude(height=TabWidth)
polygon(points=[
[-TabBaseLength/2,-TabEmbed],[-TabBaseLength/2,TabBaseHeight],[-TabTopLength/2,TabHeight],
[TabTopLength/2,TabHeight],[TabBaseLength/2,TabBaseHeight],[TabBaseLength/2,-TabEmbed]
]);
translate([0,0,-TabEmbed])
linear_extrude(height=(TabHeight + TabEmbed),convexity=3) // top view
polygon(points=[
[-TabBaseLength/2,-TabWidth/2],
[-TabBaseLength/2, TabWidth/2],
[-(TabBaseLength/2 - PostLength), TabWidth/2],
[-(TabBaseLength/2 - PostLength - PostTaper),LatchBar/2],
[ (TabBaseLength/2 - PostLength - PostTaper),LatchBar/2],
[ (TabBaseLength/2 - PostLength),TabWidth/2],
[ TabBaseLength/2, TabWidth/2],
[ TabBaseLength/2,-TabWidth/2],
[ (TabBaseLength/2 - PostLength),-TabWidth/2],
[ (TabBaseLength/2 - PostLength - PostTaper),-LatchBar/2],
[-(TabBaseLength/2 - PostLength - PostTaper),-LatchBar/2],
[-(TabBaseLength/2 - PostLength),-TabWidth/2]
]);
}
for (y=[-1,1])
translate([0,y*((TabWidth/2 + WebThick/2)),LatchIndentTall/2])
cube([LatchIndentLength,TabWidth,LatchIndentTall],center=true);
}
/* difference() {
translate([0,0,TabHeight/2])
cube([TabLength,TabWidth,TabHeight],center=true);
}
*/
}
//-------------------
// Build things...
ShowPegGrid();
if (Layout == "Show")
BellLatch();
if (Layout == "Build") {
translate([0,0,2.0])
BellLatch();
difference() {
resize([20.0,10.5,2.0])
cylinder(r=2,h=2,$fn=32);
for (x=[-1,1])
translate([x*(5/2 + TabBaseLength/2 + 0.5),0,5+0.6])
cube([5,25,10],center=true);
}
}
I should give up on the tech and write about, oh, kittens…

If I knew anything about the Raspberry Pi’s PWM, writing about it might displace that Arduino PWM post from the top spot…
And, once again, the fifth most popular post documents my struggle to remove a water heater anode rod. That says something, but I’m not sure what.
The Christmas post from 2011 featuring the snow-covered pine tree evidently comes up near the top of everybody’s image search; I wonder how many homebrew Christmas cards feature it?
Onward, into the new year…
This resembles the 32 GB Micro SD card checkout, with the exception that, for some unknown reason, the available space doesn’t match up with the actual space occupied by the file. It also turns out that rsync deletes the incomplete file, rather than leaving a stub, which makes perfect sense, but was still a bit disappointing after two hours.
I had two identical Sandisk Cruzer Fit Flash Drives, one of which appears here:

Those squares are an inch on a side, so it’s a bit larger than the Micro SD card. Adding a lanyard loop on the plastic cap or a string between cap and drive seems like a great idea, because that little thing is certain to get lost.
The snippets here represent a compendium of Things Done that happened over the course of two days; I didn’t save all the logs. The process started with the same 32 GB file of entropy I used for the Micro SD card:
df -B1 /mnt/part2 Filesystem 1B-blocks Used Available Use% Mounted on /dev/sdc1 31512350720 180424704 31331926016 1% /mnt/part2 ----------------------- time rsync --progress /mnt/part/Testdata/Testdata.bin /mnt/part2 Testdata.bin 31298191360 99% 14.18kB/s 0:39:38 rsync: writefd_unbuffered failed to write 4 bytes to socket [sender]: Broken pipe (32) rsync: write failed on "/mnt/part2/Testdata.bin": No space left on device (28) rsync error: error in file IO (code 11) at receiver.c(322) [receiver=3.0.9] rsync: connection unexpectedly closed (28 bytes received so far) [sender] rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] real 126m20.505s user 3m6.393s sys 2m17.492s ----------------------- time dd bs=8K count=20000000 if=/mnt/part/Testdata/Testdata.bin of=/mnt/part2/Test1.bin dd: writing ‘/mnt/part2/Test1.bin’: No space left on device 3820963+0 records in 3820962+0 records out 31301320704 bytes (31 GB) copied, 7455.97 s, 4.2 MB/s real 124m15.970s user 0m1.607s sys 1m17.546s ----------------------- truncate -s 31301320704 /mnt/part/Testdata/Testdata.bin ----------------------- ll /mnt/part/Testdata/Testdata.bin -rw-r--r-- 1 ed ed 31301320704 Dec 24 18:13 /mnt/part/Testdata/Testdata.bin ----------------------- time diff /mnt/part/Testdata/Testdata.bin /mnt/part3/Test1.bin real 26m37.081s user 0m4.400s sys 0m52.723s
Notice that the write speed runs around 4 MB/s, which is a lot slower than you might expect from a USB 2.0 device; as with a hard drive, the interface doesn’t limit the throughput! The read speed, on the other paw, trots along at about 20 MB/s.
One of these will go to Mary’s folks as an online daily backup device; their PC will soon run a version of the rsnapshot scripts that back up our basement file server. It’s not off-site backup and it’s not proof against catastrophic hardware failure, but it should be good enough.
Most of the things I design don’t have moving parts, so I printed emmitt’s Gear Bearing as a fondletoy:

Setting the clearance to 0.5 produced a free fit with absolutely no cleanup or run-in required; the center hole is a sliding fit for a 6 mm hex wrench.
I should do another one with knurling around the outside…
The picture has strongly desaturated reds, which reveals the top surface a bit more clearly.