Ed Nisley's Blog: Shop notes, electronics, firmware, machinery, 3D printing, laser cuttery, and curiosities. Contents: 100% human thinking, 0% AI slop.
Tag: Improvements
Making the world a better place, one piece at a time
My Kindle Fire is a typically featureless black slab with one button, two small speakers, and no fasteners. After a few days in my pocket, the upper-left corner began collecting dust on the inside face of the cover glass:
Kindle Fire – internal dust
That’s not terrible, but it does look ugly and lowers the contrast a bit in that corner. As nearly as I can tell, the speaker grilles provide the only way for that dust to get in, although this was a refurb unit and perhaps the seal around the rim is broken.
In any event, the speaker grilles look like this:
Kindle Fire speaker
I slapped a strip of 3M Micropore tape over the openings as a stop-gap fix:
Kindle Fire speaker – taped
After a few days, the dust wasn’t getting any worse, so I ran a scalpel blade around the speaker opening and sank the tape atop the grille:
Kindle Fire speaker – trimmed tape
The advantage of Micropore tape is that it won’t completely block the already feeble sound from the speakers.
The default Grub2 video mode for Ubuntu 12.04 is 640×480, which looks rather overwhelming on a 24 inch monitor that can do 1920×1600. I’m also a fan of Old Skool scrolling text, because when something goes wrong it’s handy to get an actual hint in real time.
Thus, some Grub tweakage was in order:
GRUB_DEFAULT=saved
GRUB_SAVEDEFAULT=true
#GRUB_HIDDEN_TIMEOUT=0
GRUB_HIDDEN_TIMEOUT_QUIET=true
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
#GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""
... snippage ...
# Uncomment to disable graphical terminal (grub-pc only)
#GRUB_TERMINAL=console
# The resolution used on graphical terminal
# note that you can use only modes which your graphic card supports via VBE
# you can see them in real GRUB with the command `vbeinfo'
#GRUB_GFXMODE=640x480
#GRUB_GFXMODE=1600x1200
GRUB_GFXMODE=1280x1024
AFAICT, it’s impossible to:
Page(*) the output of the Grub vbeinfo command. A blind stab at 1600×1200 turned out to be too small and painfully slow at scrolling in graphics mode.
Boot a text-mode console in anything other than 80 characters x 24 rows, so un-commenting the GRUB_TERMINAL line isn’t helpful.
This being Grub2, you must do this special dance (anybody remember when one of Grub’s advantages over Lilo was that it didn’t require a special dance?) to make it work:
sudo nano /etc/default/grub
... make changes & save ...
sudo update-grub
sudo reboot ; exit
That’s from an SSH session across the room, of course…
Incidentally, shutting off the graphic drivel immediately revealed that those NFS mounts weren’t happening because statd wasn’t running. Knowing that immediately would have saved some diagnostic time, yes, it would.
(*) The Official Grub2 doc suggests set pager=1, but there’s no way to discover that using help set at the Grub2 command line. Now we both know and maybe we’ll remember it for the next time.
Back in the old days, the Unix startup sequence was rigidly fixed. For a variety of reasons, that’s no longer the case; Ubuntu (and, presumably, other distros) now use upstart, which turns the startup sequence into a lightly documentedPachinko machine. This parallel processing presumably works great for most of Ubuntu’s use cases and falls flat on its face for me: I’m apparently the only person who expects NFS mounts to be in place before signing in.
Well, maybe otherfolks expect that, but the entire startup mechanism is apparently broken as designed.
The only solution seems to be stalling the user sign-on screen by jamming the display manager until the NFS client hauls itself to its feet. This takes up to a minute, for reasons I do not understand, but it’s better to let it run to completion rather than signing on and expecting one’s files to be in the right places. Email clients, in particular, have difficulty coping with missing files.
The fix involves adding a line to /etc/init/lightdm.conf, as mentioned there (albeit with incorrect syntax):
start on ((filesystem
and runlevel [!06]
and started dbus
and (drm-device-added card0 PRIMARY_DEVICE_FOR_DISPLAY=1
or stopped udev-fallback-graphics)
and mounted MOUNTPOINT=/mnt/bulkdata)
or runlevel PREVLEVEL=S)
I tried to check for another filesystem that should also be mounted, but, as I understand neither the syntax nor the semantics of the language, what you see is what finally worked. As it turns out, upstart's syntax error messages aren’t particularly helpful; a single line (helpfully relating, perhaps, that the parser expected a token on line 16) appears on VT 7, but if you don’t know to switch from VT 1, you’ll never get even that minimal assistance. No, such errors don’t appear in the /var/log/upstart/* logs.
For unknown reasons, waiting for the remote-filesystems event didn’t delay the startup at all. Evidently, mountall emits that event almost immediately, long before the NFS mounts happen. Perhaps the event occurs even when the mount fails, contrary to what the doc suggests?
Most of the debugging occurred through an ssh session across the room. Edit the file, try a new version, reboot, watch for the filesystems to come up, watch for the sign-in screen to appear. Or not, as the case may be.
Grumpy though I may seem, the great thing about Open Source / Free Software is that when it breaks, you have access to all the pieces and can actually fix the problem. That makes up for nearly everything, I’d say.
No, I didn’t update any of those bug reports or start another one. It’s obvious this isn’t getting any attention, so what’s the point? If you’re also having the problem, you’ll eventually wind up here…
FWIW, I knew the NFS mounts weren’t working because I always set the screen background to an image on the file server: no mount = no picture = fix-the-problem-now. This image seemed appropriate:
Kai and Yen stayed with us over the weekend; they’re about 18 months into a two-year trip around the world. Kai was pulling an interesting single-wheel T2 trailer. Unlike my BOB Yak, the rear wheel has what looks like an active torsion-spring suspension:
T2 trailer suspension
They’re taking the northern route across the US and Canada on their way back to Taiwan:
Kai and Yen – ready to roll
They make our bicycling adventures fade to pale gray… which is OK with us!
Well, that fix didn’t take long to fail; they sure don’t make ’em like they used to:
OEM Replacement fan in freezer
The “new” fan’s bearing failure sounded more like an owl than a dog, but it was certainly not what we wanted to hear in the middle of the night. A replacement fan costs on the order of $60, which seems like an absurdly high number for what’s basically a clock motor, a plastic fan blade, and some stamped steel.
After mulling the situation for a bit, I concluded that the refrigerator has reached that age where stuffing more money into it doesn’t make much sense: the compressor will drop dead in fairly short order. It’s time for a gonzo fix that also slightly reduces the clutter in the Basement Laboratory Warehouse: stick a PC case fan and wall wart into the freezer, ignore their temperature ratings, and see what happens.
A polycarbonate sheet, a band saw, some step drills, a big hole saw, and an hour of Quality Shop Time produced a perfectly serviceable space transformer to mate the fan to the airflow director:
PC case fan in air flow director
The plate surrounds the squishy foam washers from the OEM motor mount, with the fan on its own rubbery posts: there won’t be any vibration transmitted to the plastic air flow director! The obligatory Kapton tape on the right holds a closed-cell foam wrap around the wires to prevent rattling; I’d done much the same when I tore the thing apart after the first OEM fan failure.
The air flow is toward you out of the screen: the fan draws air from the refrigerator compartment through the evaporator coils, then directly into a square duct that leads back to the refrigerator. Whatever doesn’t make it into the duct flows into the freezer compartment through the row of vents at the top of the picture.
I assume some serious modeling went into choosing the OEM fan blade configuration and spacing so as to optimize the distribution. I hope just moving some air in roughly the right direction will suffice; I have no way to measure any interesting numbers, so this is entirely cut-and-try.
The PC case fan expects 12 VDC, which comes from a standard wall wart conspicuously labeled “For Indoor Use Only”. Well, this is certainly indoor, even if it’s not quite what they expected. The wart plugs into a cobbled-together extension cord receptacle with male 1/4 inch quick-disconnect tabs that match the female QD connectors on the OEM wiring harness that originally plugged into the fan:
PC case fan with adapted wall wart
All that fits into the space behind the rear panel, with the wart wrapped in a sheet of closed-cell foam to prevent rattling and provide a bit of protection:
PC case fan installed in freezer
The rear panel covers the mess, exposing only the row of vent holes along the top. The air flow is upward through the evaporator coil and fins, through the fan, and back to the two compartments.
One question remains: will the fan continue to start below 0 °F (-20 °C)?
Given the ball bearings in the fan, it ought to remain quiet, but I’ve thought that before. Now, however, I have a generous supply of case fans and wall warts that plug into the mechanical and power adapters, so I can replace fans for a long time.
I finally broke down and bought a Kindle Fire last week, with the intent of having my accumulation of datasheets and manuals where I need them when I need them, and it works reasonably well. One ergonomic blunder: the power button stands just slightly proud of the edge:
Kindle Fire Power Button
That’s exactly where my little finger rests when I’m supporting the slab in my left hand. Past experience has also shown that any opening will admit dust that eventually accumulates behind the screen, so a small protector seemed in order:
Kindle Power Button Protector – solid model
Printed with zero added shells and 1.0 infill produced a solid block of plastic that required very little cleanup:
Kindle power button protector – as built
The zittage serves to improve the fit: the protector should require a bit of fingernail persuasion to remove.
It took two tries to get the Micro-B USB connector slab offset from the centerline just right, but eventually everything lined up correctly:
Kindle power button protector – in place
My pudgy finger squeezes into that opening just enough to turn the thing on and off, but pressing on the green plastic bar has no effect. There’s not enough plastic to allow chamfering the edge in the solid model, but a bit of riffler file action worked wonders on those sharp edges.
The OpenSCAD source code:
// Kindle Fire Power Button Protector
// Ed Nisley KE4ZNU April 2012
include </home/ed/Thing-O-Matic/lib/MCAD/boxes.scad>
//- Extrusion parameters must match reality!
// Print with +0 shells and 3 solid layers
ThreadThick = 0.25;
ThreadWidth = 2.0 * ThreadThick;
HoleWindage = 0.2;
function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);
Protrusion = 0.1; // make holes end cleanly
//----------------------
//- Dimensions
PlugDia = 3.5; // audio jack
PlugLength = 5.0;
PlugOffset = -10;
USBThick = 1.0; // Micro-B USB jack
USBWidth = 6.8;
USBLength = 4.0;
USBOffset = -0.25;
ButtonDia = 5.2; // power button
ButtonOffset = 10.0;
PlateWidth = 7.5;
PlateLength = 30.0;
PlateThick = 1.0;
PlateRadius = 2.0;
//----------------------
// 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);
}
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);
}
//-------------------
// Component parts
//-------------------
// Build things...
ShowPegGrid();
union() {
translate([PlugOffset,0,0])
cylinder(r=PlugDia/2,h=(PlugLength + PlateThick),$fn=8);
translate([0,USBOffset,(PlateThick + USBLength)/2])
cube([USBWidth,USBThick,(PlateThick + USBLength)],center=true);
difference() {
translate([0,0,PlateThick/2])
roundedBox([PlateLength,PlateWidth,PlateThick],PlateRadius,true,$fn=4*4);
translate([ButtonOffset,0,-Protrusion])
rotate(360/(2*8))
PolyCyl(ButtonDia,(PlateThick + 2*Protrusion));
}
}
I’ve always liked flip-top toothpaste tube caps, which Colgate tubes have and Crest tubes don’t. I’m sure there’s a reason why they use different threads; perhaps there’s a standard for toothpaste tube threads that encompasses both?
Anyhow, after years of pondering this dilemma, I jammed a Colgate cap and the top of a Crest tube onto a length of 5/16″ drill rod and eased some epoxy into the joint:
Colgate-Crest adapter – gluing
It turns out that the minor diameter of the Colgate cap is just slightly smaller than the major diameter of the Crest tube, so they don’t quite slide together. The epoxy makes for a perfect, zero-clearance fit that’s so tight you must crunch the tube to unscrew it:
Colgate-Crest adapter – thread form
For what it’s worth, that buttress thread form provides a leakproof seal in the original tube.
I have no idea whether this will actually work, because the closet has a three-pack of Colgate that should last for quite a while. Yes, we tend to buy whatever toothpaste seems cheapest on a per unit basis when we’re restocking the closet…