Ed Nisley's Blog: Shop notes, electronics, firmware, machinery, 3D printing, laser cuttery, and curiosities. Contents: 100% human thinking, 0% AI slop.
So I picked up a cheap digital scale at Harbor Freight because it can count parts based on weight. After all the dust settled, it was on sale for about $8, which tells you just about all you need to know, and the “5 Year Warranty” looked generous on the box:
Harbor Freight 1 kg Scale
Alas, the fine print taketh away (clicky for more dots):
Warranty
Ah, well, all this stuff is disposable anyway, right? Nobody’d ever try to fix it…
The instructions for the Count function omit a step. In order to invoke the Count function, do this dance:
Turn it on
Count exactly 10 pieces on the scale, wait for stabilization
Press-and-hold PCS until the display shows 10
Release PCS
Press PCS briefly; the pcs annunciator turns on (they omitted that)
The display will still show 10, which is the number of pieces
Now you can weigh stuff and read off their counts
The scale resolution is 0.1 gram, so SMD resistors just aren’t going to count properly at all. It’s best if you add the entire group at one time, rather than trickle parts into the pan.
Well, it turns out that the DVD drive I stuffed into that case really does require a whole bunch of current. I tried playing a DVD and got erratic results, including weird keyboard (!) failures. Finally, I hitched a bench supply to the coaxial power jack on the case and caught it in the act:
Laptop DVD – current display
That jack normally connects to the power-only USB cable, which implies an upper limit of 100 mA. A bit of poking around inside shows that the coaxial power jack simply parallels the USB jack’s VCC line, so there’s no fancy negotiation or current sharing going on.
When the keyboard went nuts it was sharing an unpowered USB hub with this thing, which means that the overcurrent dragged down the hub’s supply. I was permuting all the choices to see if the failures suggested anything; eventually it did.
A bit of rummaging in the Basement Laboratory Warehouse Wing uncovered a 5.0 V 3.7 A wall wart switching power supply that is grossly in excess of the drive’s 1.5 A rating. Amazingly, it even had the correct coaxial power plug on the end of the cable, which never happens.
Alas, because the external supply back-powers the USB data cable, it lights up the Q150’s power button when the PC is turned off. I think I can insert an isolation diode into the USB power trace to isolate it from the jack, somewhat along the lines of that hack. However, that seems to require removing the USB connector to uncover a very well protected top trace. For now, I’ll just unplug the drive.
That tag should ensure any TSA agent will sideline me for an enhanced inspection sufficient to reset breakfast to last Tuesday. Or I get to ride in the cockpit. Maybe both.
Aitch is one of the very few people in the world who can use a business trip to the Atacama Desert as a cover story for his real activities, about which I know absolutely nothing because I’m Still Alive™. The fact that he returns with a camera full of gorgeous pix merely demonstrates the cover team’s finesse. The NSA schwag came from another trip. So he says, anyway.
Oh, that tag originally hung from the drawstring of a very nice black velveteen pouch containing an NSA-logo sippy cup along with the matching coaster. All made in China, of course: if irony were energy, we could saw off the entire Middle East and be done with it…
Scaling the cubes to about 15 mm on a side puts a 6×6 array neatly on the build plate. Takes nigh onto four hours to print all 36 of them at 30 mm/s print and 100 mm/s move… a bit over 6 minutes each.
The print quality is Good Enough. The bottom surface of the front cubes faces forward and reflects the scale markings:
A pair of fritillary butterflies have been enjoying the butterfly bush at the living room window. The first one has a slightly tattered wing:
Fritillary butterfly – dorsal
The camera can’t do justice to the silver patches on the bottom of the rear wing. They’re not reflective like a sheet of silver, but they shine like metal in the light:
When confronted with a zombie horde, though, nothing exceeds like excess:
Finned CO2 Cartridge Array
In real life, they’re 12 gram CO2 capsules, of the type used in tire inflators and air pistols. I knew I’d find something to do with the box of empties I’d been accumulating: they became (somewhat threatening) tchotchkes. This was inspired by that thing, although that STL file doesn’t render into anything and, as with many interesting Thingiverse things, there’s no source code.
These fins were an exercise in thin-wall printing: the outer square is one thread thick, the diagonal struts are two threads, and the ring around the nozzle has just a touch of fill inside, with a one-thread-thick base below the cartridge nozzle:
Fin Array on build platform
The solid model looks about like you’d expect:
Fin Assembly- solid model
The teeny little quarter-cylinders in the corners encourage Skeinforge to do the right thing: build each quadrant in one pass, leaving the corners unfinished. The diagonals must be exactly two threads wide to make that possible: each strut thread connects to the corresponding single-thread outer edge.
It turns out that my box has several different types of CO2 cartridges and the nozzle ends are all different. To get it right, there’s a template for matching the curves:
Cartridge nozzle template
That end of the cartridge consists of a cylinder for the body, a sphere mated to a tangential conic section, another conic fillet, and then the cylindrical nozzle. Basically, you twiddle with the parameters until the template comes pretty close to fitting, then fire off a few trial fins until it comes out right.
CO2 Capsule Nozzle – solid model detail
They were a big hit at the Long Island Linux Users Group meeting…
The OpenSCAD source code:
// CO2 capsule tail fins
// Ed Nisley KE4ZNU - Oct 2011
Layout = "Show"; // Show Build FinBlock Cartridge Fit
include
//-------
//- Extrusion parameters must match reality!
// Print with +0 shells and 3 solid layers
ThreadThick = 0.33;
ThreadWidth = 2.0 * ThreadThick;
HoleWindage = 0.2;
Protrusion = 0.1; // make holes end cleanly
function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);
//-------
// Capsule dimensions
BodyDia = 18.70;
BodyRad = BodyDia/2;
BodyLength = 53.0; // between hemispherical endcap centers
BodyBaseLength = 21; // tip to endcap center
TipDia = 7.40;
TipRad = TipDia/2;
TipLength = IntegerMultiple(4.0,ThreadThick);
FilletLength = 5.0; // fillet between tip and cone
FilletTop = TipLength + FilletLength;
FilletBaseDia = 8.60;
FilletBaseRad= FilletBaseDia/2;
FilletTopDia = 9.5;
FilletTopRad = FilletTopDia/2;
ConeTop = 16.0; // tip to tangent with endcap
ConeLength = ConeTop - FilletTop;
echo(str("Cone Length: ",ConeLength));
IntersectZ = ConeTop; // coordinates of intersect tangent
IntersectX = sqrt(pow(BodyRad,2) - pow(BodyBaseLength - ConeTop,2));
echo(str("IntersectZ: ",IntersectZ));
echo(str("IntersectX: ",IntersectX," dia: ",2*IntersectX));
//-------
// Fin dimensions
FinThick = 1*ThreadWidth; // outer square
StrutThick = 2*FinThick; // diagonal struts
FinSquare = 24.0;
FinTaperLength = sqrt(2)*FinSquare/2 - sqrt(2)*FinThick - ThreadWidth;
FinBaseLength = 2*TipLength;
//-------
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);
}
module ShowPegGrid(Space = 10.0,Size = 1.0) {
Range = floor(50 / Space);
for (x=[-Range:Range])
for (y=[-Range:Range])
translate([x*Space,y*Space,Size/2])
%cube(Size,center=true);
}
//-------
// CO2 cartridge outline
module Cartridge() {
$fn = 48;
union() {
translate([0,0,BodyBaseLength]) {
cylinder(r=BodyDia/2,h=BodyLength);
translate([0,0,BodyLength])
sphere(r=BodyRad);
}
intersection() {
translate([0,0,BodyBaseLength])
sphere(r=BodyRad);
union() {
translate([0,0,(TipLength + FilletLength+ConeLength)])
cylinder(r=BodyRad,h=(BodyBaseLength - ConeLength));
translate([0,0,(TipLength + FilletLength)])
cylinder(r1=FilletTopRad,r2=IntersectX,h=(ConeLength + Protrusion));
translate([0,0,TipLength])
cylinder(r1=FilletBaseRad,r2=FilletTopRad,h=(FilletLength + Protrusion));
}
}
translate([0,0,FilletTop])
cylinder(r1=FilletTopRad,r2=IntersectX,h=ConeLength);
translate([0,0,TipLength])
cylinder(r1=FilletBaseRad,r2=FilletTopRad,h=(FilletLength + Protrusion));
translate([0,0,-Protrusion])
PolyCyl(TipDia,(TipLength + 2*Protrusion));
}
}
//-------
// Diagonal fin strut
module FinStrut() {
rotate([90,0,45])
translate([0,0,-StrutThick/2])
linear_extrude(height=StrutThick)
polygon(points=[
[0,0],
[FinTaperLength,0],
[FinTaperLength,FinBaseLength],
[0,(FinBaseLength + FinTaperLength)]
]);
}
//-------
// Fin outline
module FinBlock() {
union() {
translate([0,0,FinBaseLength/2])
difference() {
cube([FinSquare,FinSquare,FinBaseLength],center=true);
difference() {
cube([(FinSquare - 2*FinThick),
(FinSquare - 2*FinThick),
(FinBaseLength + 2*Protrusion)],center=true);
for (Index = [0:3])
rotate(Index*90)
translate([(FinSquare/2 - FinThick),(FinSquare/2 - FinThick),0])
cylinder(r=StrutThick,h=(FinBaseLength + 2*Protrusion),center=true,$fn=16);
}
}
for (Index = [0:3])
rotate(Index*90)
FinStrut();
cylinder(r=IntegerMultiple((FilletBaseRad + StrutThick),ThreadWidth),h=TipLength);
}
}
//-------
// Fins
module FinAssembly() {
difference() {
FinBlock();
translate([0,0,ThreadThick]) // add one layer to close base cylinder
Cartridge();
}
}
module FinFit() {
translate([0,0.75*BodyBaseLength,2*ThreadThick])
rotate([90,0,0])
difference() {
translate([-FinSquare/2,-2*ThreadThick,0])
cube([IntegerMultiple(FinSquare,ThreadWidth),
4*ThreadThick,
1.5*BodyBaseLength]);
translate([0,0,5*ThreadWidth])
Cartridge();
}
}
//-------
// Build it!
ShowPegGrid();
if (Layout == "FinBlock")
FinBlock();
if (Layout == "Cartridge")
Cartridge();
if (Layout == "Show") {
FinAssembly();
color(LG) Cartridge();
}
if (Layout == "Fit")
FinFit();
if (Layout == "Build")
FinAssembly();
I cable-tied the mic/earphone cable on Mary’s bike helmet to a rib on the fancy air vents near the back end, hoping that would reduce the inevitable flexing. Alas, it didn’t work out that way and the cable lasted only two seasons. This cut-away view shows the pulverized shield braid inside the jacket:
Fatigue-failed helmet cable
The symptoms were totally baffling: the mic worked perfectly, but the earphones cut out for at most a few syllables. Of course, I can’t wear her helmet and it only failed occasionally while riding. I barked up several wrong trees, until it got so bad that I could make it fail in the garage while listening to the local NWS weather radio station.
I spliced in a new USB male-A connector and (re-)discovered that the braid seems to be aluminum, rather than tinned copper. In any event, the wire is completely unsolderable; I crimped the braid from the new connector to a clean section of the old braid. The braid serves only as an electrostatic shield, as it’s not connected to anything on the helmet end. That should suffice until I rebuild the headsets this winter.