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.

Tag: Improvements

Making the world a better place, one piece at a time

  • Whirlpool Refrigerator Fan Noise: Cartridge Bearings?

    The endcaps of that fan motor have a crimped-in-place aluminum disk capturing a felt washer that held oil and a circular spring that presses the spherical bronze bearing in place:

    Fan motor endcap - interior
    Fan motor endcap – interior

    Pulling all that out reveals the bearing (tilted on its side to show the spherical outer shape):

    Fan motor endcap - parts
    Fan motor endcap – parts

    The shaft is a scant 3/16 inch in diameter, about 0.181 instead of 0.1875 inch. I have some 3/16 inch ID cartridge bearings in the heap that are a sloppy fit on the shaft, but nothing that a wrap of 2 or 3 mil shimstock and a dab of green Loctite wouldn’t cure.

    A bit of doodling suggests two of these bearing holders should fit in the endcaps, stand over the spherical bearing mounts, capture the ball bearing OD, keep dust out of the balls, and perhaps have enough compliance to let the bearings self-adjust to the right fit:

    Fan Bearing Holder
    Fan Bearing Holder

    The fan tries to pull the rotor out of the frame, although I think the bearings & Loctite can handle that much axial load. I must try this out on the bench and see how long it takes for the Freezer Dog to return…

    It needs a trial print and some sizing adjustment, plus maybe an allowance for end play, but it’s close.

    The OpenSCAD source code:

    // Refrigerator Fan Bearing Support
    // Ed Nisley KE4ZNU - May 2012
    
    // Layouts
    
    Layout = "Show";			// Show Fit Build
    
    Gap = 5.0;					// between parts in Show mode
    
    BuildOffset = 5.0;			// offset between parts on build plate
    
    //- Extrusion parameters must match reality!
    //  Print with +1 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
    
    CapID = 32.0;				// bearing endcap
    CapHeight = 7.0;			//  ... below aluminum cap recess
    
    SupportOD = 10.3;			// spherical bearing support
    SupportHeight = 3.0;
    
    BearingOD = 12.7;			// ball bearing race
    BearingID = 4.68;			//  ... shaft dia
    BearingThick = 4.0;
    
    Ribs = 8;					// number of support ribs
    RibLength = 2.0;			// length beyond cylinder
    RibWidth = 4*ThreadWidth;
    
    LidOD = CapID/2;			// bearing retainer lid
    LidThick = 2*ThreadThick;
    
    //----------------------
    // 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);
    
    }
    
    //-------------------
    // Objects
    
    module Retainer() {
      color("Green")
      difference() {
    	PolyCyl(LidOD,LidThick);
    	translate([0,0,-Protrusion])
    	  PolyCyl(BearingID,(LidThick + 2*Protrusion),8);
      }
    }
    
    module Holder() {
    
      color("Chocolate")
      difference() {
    
    	union() {
    	  cylinder(r=(CapID - 2*RibLength)/2,h=(CapHeight + LidThick));
    	  for (Index = [0:Ribs-1]) {
    		rotate(Index*360/Ribs)
    		  translate([0,-RibWidth/2,0])
    			cube([CapID/2,RibWidth,CapHeight],center=false);
    	  }
    	}
    
    	translate([0,0,-Protrusion])
    	  PolyCyl(SupportOD,(CapHeight + 2*Protrusion));		// clear old support
    
    	translate([0,0,SupportHeight])
    	  PolyCyl(BearingOD,CapHeight);						// bearing pocket
    
    	translate([0,0,(SupportHeight + BearingThick)])
    	  PolyCyl(LidOD,CapHeight);							// bearing retainer
    
      }
    }
    
    //-------------------
    // Build things...
    
    ShowPegGrid();
    
    if (Layout == "Show") {
      Holder();
      translate([0,0,(CapHeight + Gap)])
    	Retainer();
    }
    
    if (Layout == "Fit") {
      Holder();
      translate([0,0,CapHeight])
    	Retainer();
    }
    
    if (Layout == "Build") {
      translate([(CapID/2 + BuildOffset),0,0])
    	Holder();
      translate([-(LidOD/2 + BuildOffset),0,0])
    	Retainer();
    
    }
    
    

    Well, it’s a thought…

  • Kindle Fire Configuration

    Amazon obviously designed the Kindle Fire as an extension of their on-line store: they stripped everything out of Android that could possibly get in the way of buying stuff. Some functions seems obviously necessary, though, so here’s a short list of what I’ve added so far (in addition to the button protector and speaker seals, that is), with all the links collected for reference.

    First and foremost, set a Lock Screen Password. Yes, that means that you must type the password every time the Fire lights up, which is a major nuisance. Remember that the Fire connects directly to your Amazon One-Click account and the browser has the rest of your userids & passwords on tap, so losing it could be a very, very expensive oversight.

    I like 24 hour clocks, but there’s no clock configuration. Dropping a buck on 24 Hours solves that problem.

    My old Zire 71 reminded me of my few appointments & things-to-do, but the Fire lacks the whole Android calendar infrastructure. The Calengoo app syncs with my (previously unused) Google Calendar & Contacts, which means that they now know my social network (such as it is) and what I’m up to. So it goes…

    The system volume control exposes only the Media Volume sound channel. Calengoo produces reminders through the Notification sound channel and, under certain perverse conditions that took me about two days to encounter, can mute that channel and leave it muted forever more. The only way to get audible reminders again is by installing a separate mixer app and resetting the levels: Volume Manager Free.

    Hint: to get dependable audible reminders when the Fire is asleep (which is most of the time), you must enable Pop-up Reminders and disable Pop-up windows, because the dialog box occasionally kills the sound. With that configuration, you’ll get a note in the status bar along the top of the display for each reminder. Set the reminder repeat interval to at least a minute to have enough time for password typing…

    The main reason I got a Fire was to carry all my datasheets & manuals in my pocket, hence the need for color and a backlit screen. Although the Fire can handle PDFs without an app, the native interface leaves quite a bit to be desired. Dropping a few bucks on ezPDF Reader solves most of those problems. Choosing a single file from a collection of several hundred, using a selection browser that ignores the overlaid subdirectory structure, remains challenging.

    File Expert helps a bit by presenting subdirectories and their contents. I think that might be the only way to find a specific PDF.

    Engineering bears need an RPN calculator, of which NeoCal Lite seems to be the best of the bunch.

    Passwords go in KeePassDroid, although it has a clunky clipboard interface to other apps. Of course, any Android app can root the Fire and steal my sensitive bits; that seems to not bother anybody else, so why should I worry? The advantage of using a unique password for each website seems to outweigh the disadvantage of having a single password controlling all of them.

    Turn off the browser’s helpful “remember passwords” function, though…

    Although I’m now using Dropbox to back up the KeePassDroid database file, that whole interface seems overly awkward and I’d rather have encryption applied to every Dropbox file.

    Putting the KeePassDroid database file in the Dropbox folder requires a bit of intervention, as KeePassDroid provides no way to specify the database location. You must find the Dropbox folder using File Expert, slow-click the database file, then drill down through File Expert’s menus in order to specify that KeePassDroid should open the file. After that, KeePassDroid will remember its location. For future reference, it’s at:

    /mnt/sdcard/Android/data/com.dropbox.android/files/scratch/keepass.kdb

    The alert reader may wonder why a Kindle Fire, with a conspicuously missing SD Card slot, has an sdcard subdirectory structure hanging from /mnt: that’s just the way it is. I suppose that’s baked into the Android filesystem; hooray for hardware independence and futureproofing.

    The built-in Silk browser runs slower (certainly, no faster) with Accelerate Page Loading turned on, so there seems no compelling reason to sluice my web content through Amazon’s servers. Not that turning it off improves privacy, of course.

    The Maxthon Mobile Web Browser works reasonably well. The highly regarded Dolphin HD browser isn’t available from the Amazon App Store and sideloading apps from Google Play seems unreasonably difficult. The Firefox Aurora browser isn’t quite ready for prime time, but is the only browser to cover its password database with a master password.

    For the occasional times when I need a stopwatch or timer, the aptly named Stopwatch and Timer app should suffice. It has a breathtakingly awkward UI compared to the Zire app, showing that re-invented wheels sometimes sport square corners…

    ColorNote supports both checklists and text notes for my simple needs.

    Sketch-n-Draw ably demonstrates the Fire’s huge latency between touch-pad input and LCD output; it’s impossible to actually draw anything meaningful. FWIW, the ancient Zire had no trouble doing that, adding Yet Another data point to the curve of software demanding more than the hardware can provide.

    The WordPress blogging app is pretty much useless in comparison with their full web interface, not to mention that typing text on the Fire’s one-finger (or, for those with smaller hands, two thumbs) keyboard is agony, not to mention that the Fire lacks a camera, a microphone, and USB host support. It’s a media consumption device, not a media production device; I knew that when I bought it.

    Although it’s awkward, a conductive-tip Acase stylus helps during extended screen-poking sessions. I have my doubts about the rubbery tip’s durability, though.

    All in all, the Fire seems serviceable…

  • Kindle Fire Speaker Covers

    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
    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
    Kindle Fire speaker

    I slapped a strip of 3M Micropore tape over the openings as a stop-gap fix:

    Kindle Fire speaker - taped
    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
    Kindle Fire speaker – trimmed tape

    The advantage of Micropore tape is that it won’t completely block the already feeble sound from the speakers.

  • Ubuntu 12.04: GRUB2 Tweaks

    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.

  • Ubuntu 12.04: NFS Mounts vs. Upstart

    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 documented Pachinko 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 other folks 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:

    XB-70A Cockpit
    XB-70A Cockpit

    Back then, transistors were countable resources…

    [Update: The previous picture link, now broken, was to http://www.nasaimages.org/luna/servlet/detail/nasaNAS~2~2~2995~104520. The revised link points to a description on archive.org, with versions of the picture available for download.]

  • Kai and Yen: T2 Bicycle Trailer

    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
    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
    Kai and Yen – ready to roll

    They make our bicycling adventures fade to pale gray… which is OK with us!

  • Whirlpool Refrigerator Fan Noise: Final Fix

    Well, that fix didn’t take long to fail; they sure don’t make ’em like they used to:

    OEM Replacement fan in freezer
    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
    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
    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
    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.