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.

Month: February 2010

  • Farberware Blender Switch Repair

    I use a blender to mix up the pancake batter every few days. Over the last week or so, the rotary switch Pulse position wasn’t returning to Off all by itself. After having replaced the impeller bearings, I couldn’t just ditch the mumble thing without at least trying to fix it…

    A search for replacement parts reveals that Farberware kitchen appliances are disposable crap: they’re so cheap nobody stocks repair parts. IIRC, this blender was maybe ten or twenty bucks after rebate, which gets you through the shipping charge for the repair part. I would love to believe that paying more for kitchen appliances actually bought better quality.

    Switch wire connections
    Switch wire connections

    As you’d expect, the four silicone rubber feet pop off to reveal machine screws that hold the plastic base to the metal body. This picture shows the wire connections to the switch:

    • L = brown
    • 1 = orange
    • 2 = no connection
    • 3 = red

    I couldn’t pull the switch knob off the shaft, so I dismantled enough of the motor mount to ease it to one side, apply a right-angle screwdriver to the switch body screws, and loosen the switch. That gave me enough room to jam a screwdriver between the switch and the mounting bracket to pry the knob off. It’s a plastic-on-plastic friction fit.

    After the fact, it turns out that two screws behind the knob secure the mounting bracket to the bezel. Remove those screws, the bracket comes off, and it’s trivially easy to remove the switch screws.

    The wires attach through those horrible spring-loaded push-and-pray connections: jam the wires in, pull back, and it’s supposed to be a gas-tight joint forever. I don’t believe a word of it. Remove the wires by poking a small screwdriver into the opening and forcing the brass tab away from the wire. Yuch!

    Opening switch with slitting saw
    Opening switch with slitting saw

    The switch body parts are, of course, bonded firmly together: no user serviceable parts inside. I deployed a slitting saw on the Sherline mill, grabbed the switch in the vise, and sliced 2.5 mm deep along the line between the two body parts.

    The switch is some sort of engineering plastic, so I ran the saw at about 2000 rpm, cut at 100 mm/min, and dribbled water on the blade to keep it cool. You can see the grayish-brown residue under the switch.

    The thing came apart easily enough after that…

    Switch Guts
    Switch Guts

    These pics show the switch components. Note how the spring fits in the body and the four cunningly folded brass strips that simultaneously attach the wires, make the switch contacts, and spring-load the rotary detents.

    I took the liberty of bending the strips to restore the clamping force on the wires; poking the tabs with a screwdriver tends to bend them a bit.

    So it goes.

    There wasn’t anything obviously wrong inside, but after a bit of puzzling, I discovered the problem residing in the coil spring that returns the switch to Off

    Cracked spring
    Cracked spring

    The spring wire is 1 mm diameter. A bit of rummaging in Small Spring Box Number Two disgorged a bag of spring-clip thingies with the proper wire size and just about the right coil diameter, too.

    The right way to make a spring is to start with straight music wire, anneal it, make a mandrel, bend up a spring, then heat-treat the spring to make it just the right hardness and toughness for the job.

    Spring iterations
    Spring iterations

    I deployed my wire-bending pliers, made a few trial runs (well, OK, they weren’t trial runs when I started…), and got close enough by the third attempt (lower right).

    Yup, cold-bending spring steel. It is to shudder, huh?

    I bent the wire just off straight and worked my way around the coil about 0.5 mm per bend to produce a rather lumpy coil spring. This is definitely the wrong way to go, because the wire’s much too hard for that treatment: it wants to stay straight and doesn’t like those right-angle bends to form the end tabs. I think this will work well enough for long enough, though.

    The spring’s chirality turns out to be important; the coil wants to tighten around the shaft when the knob’s in the Pulse position. The spring-clip thing has two ends; only one produces the correct result, which is perfectly obvious in retrospect.

    Spring on switch rotor
    Spring on switch rotor

    The spring fits on the rotor like this, but with a whole lot more preload tension than you’d expect. The end result was a somewhat smaller coil diameter than I started with; I shrank the coil, re-bent a new tab on one end, chopped off about 4 mm of wire, and it was all good.

    I also backed off the ramp on the notches that engage the brass contacts in the Pulse position so the switch wasn’t so prone to hang up. That was what motivated me to fix the thing: one morning I manged to leave the switch in Pulse because it didn’t quite snap back to Off, took the lid off the bowl, and the blender started up again. Fortunately, the batter is too thick to jump out of the bowl, but it was a near thing.

    Here are the four switch positions and their contacts, in order from Pulse (most counterclockwise) to Speed 2 (most clockwise). You could, I suppose, conjure up a replacement switch if you puzzled out the connections; all the rotor tabs are connected together.

    Switch contacts - Pulse
    Switch contacts – Pulse
    Switch contacts - Off
    Switch contacts – Off

    Notice that, although switch contact 2 is unused, it is connected when the switch is in the Off position.

    Switch contacts - Speed 1
    Switch contacts – Speed 1
    Switch contacts - Speed 2
    Switch contacts – Speed 2

    The back of the switch body takes pressure on the switch knob, as well as engaging the end of the rotor to hold it in the middle of the body. I wasn’t comfortable just gluing the body together again, because I suspect none of my adhesives will actually bond to the plastic.

    So I chopped off a length of aluminum U-channel, poked two holes it in, shortened a pair of salvaged screws, and made a clamp for the switch body’s back. The body has three locating pins, so the two parts aren’t shifting with respect to each other, and the clamp holds the back firmly in position.

    Repaired switch with back clamp
    Repaired switch with back clamp

    Reassembly is in reverse order, paying a bit of attention to securing the wires in those crappy push-and-pray contacts and keeping everything away from the cooling fan as the bottom snaps into place.

    Done!

    The economics of this sort of repair make absolutely no sense at all, but I hate throwing stuff away just because some cheap part failed. In this case, I’d be happy to replace the switch… let me know where you can find one with the requisite contacts and spring arrangement!

  • WWVB Synch Reliability

    I have the WWVB clock set to synch after receiving four consecutive valid time frames, which is pretty restrictive. The question is: can it still synch every night?

    Here’s six days with the antenna sitting 3 cm above the receiver board, in front of our living room window, aimed more-or-less broadside to Colorado. We’re in the Eastern Time Zone, which is currently UTC-5, so our midnight corresponds to UTC 0500.

    Set: 10 015 05:14:59.9 Loc=12 Age=0     LY=0 LS=0 DST=0 Chg=0 UT1=1 Mon=1 DOM=15
    Set: 10 015 05:25:59.9 Loc=12 Age=0     LY=0 LS=0 DST=0 Chg=0 UT1=1 Mon=1 DOM=15
    Set: 10 015 05:28:59.9 Loc=12 Age=0     LY=0 LS=0 DST=0 Chg=0 UT1=1 Mon=1 DOM=15
    Set: 10 015 06:15:59.9 Loc= 1 Age=0     LY=0 LS=0 DST=0 Chg=0 UT1=1 Mon=1 DOM=15
    Set: 10 015 07:05:59.9 Loc= 2 Age=0     LY=0 LS=0 DST=0 Chg=0 UT1=1 Mon=1 DOM=15
    Set: 10 015 11:30:59.9 Loc= 6 Age=0     LY=0 LS=0 DST=0 Chg=0 UT1=1 Mon=1 DOM=15
    Set: 10 015 13:41:59.9 Loc= 8 Age=0     LY=0 LS=0 DST=0 Chg=0 UT1=1 Mon=1 DOM=15
    Set: 10 015 13:44:59.9 Loc= 8 Age=0     LY=0 LS=0 DST=0 Chg=0 UT1=1 Mon=1 DOM=15
    Set: 10 015 15:22:59.9 Loc=10 Age=0     LY=0 LS=0 DST=0 Chg=0 UT1=1 Mon=1 DOM=15
    Set: 10 015 15:29:59.9 Loc=10 Age=0     LY=0 LS=0 DST=0 Chg=0 UT1=1 Mon=1 DOM=15
    Set: 10 016 07:49:59.9 Loc= 2 Age=0     LY=0 LS=0 DST=0 Chg=0 UT1=1 Mon=1 DOM=16
    Set: 10 016 09:46:59.9 Loc= 4 Age=0     LY=0 LS=0 DST=0 Chg=0 UT1=1 Mon=1 DOM=16
    Set: 10 016 14:06:59.9 Loc= 9 Age=0     LY=0 LS=0 DST=0 Chg=0 UT1=1 Mon=1 DOM=16
    Set: 10 017 04:54:59.9 Loc=11 Age=0     LY=0 LS=0 DST=0 Chg=0 UT1=1 Mon=1 DOM=17
    Set: 10 017 05:15:59.9 Loc=12 Age=0     LY=0 LS=0 DST=0 Chg=0 UT1=1 Mon=1 DOM=17
    Set: 10 017 05:20:59.9 Loc=12 Age=0     LY=0 LS=0 DST=0 Chg=0 UT1=1 Mon=1 DOM=17
    Set: 10 017 09:42:59.9 Loc= 4 Age=0     LY=0 LS=0 DST=0 Chg=0 UT1=1 Mon=1 DOM=17
    Set: 10 017 10:04:59.9 Loc= 5 Age=0     LY=0 LS=0 DST=0 Chg=0 UT1=1 Mon=1 DOM=17
    Set: 10 017 10:37:59.9 Loc= 5 Age=0     LY=0 LS=0 DST=0 Chg=0 UT1=1 Mon=1 DOM=17
    Set: 10 017 10:42:59.9 Loc= 5 Age=0     LY=0 LS=0 DST=0 Chg=0 UT1=1 Mon=1 DOM=17
    Set: 10 017 10:45:59.9 Loc= 5 Age=0     LY=0 LS=0 DST=0 Chg=0 UT1=1 Mon=1 DOM=17
    Set: 10 017 11:38:59.9 Loc= 6 Age=0     LY=0 LS=0 DST=0 Chg=0 UT1=1 Mon=1 DOM=17
    Set: 10 017 11:56:59.9 Loc= 6 Age=0     LY=0 LS=0 DST=0 Chg=0 UT1=1 Mon=1 DOM=17
    Set: 10 017 20:44:59.9 Loc= 3 Age=0     LY=0 LS=0 DST=0 Chg=0 UT1=1 Mon=1 DOM=17
    Set: 10 018 01:26:59.9 Loc= 8 Age=0     LY=0 LS=0 DST=0 Chg=0 UT1=1 Mon=1 DOM=18
    Set: 10 018 03:49:59.9 Loc=10 Age=0     LY=0 LS=0 DST=0 Chg=0 UT1=1 Mon=1 DOM=18
    Set: 10 018 08:30:59.9 Loc= 3 Age=0     LY=0 LS=0 DST=0 Chg=0 UT1=1 Mon=1 DOM=18
    Set: 10 018 09:47:59.9 Loc= 4 Age=0     LY=0 LS=0 DST=0 Chg=0 UT1=1 Mon=1 DOM=18
    Set: 10 018 11:11:59.9 Loc= 6 Age=0     LY=0 LS=0 DST=0 Chg=0 UT1=1 Mon=1 DOM=18
    Set: 10 018 11:34:59.9 Loc= 6 Age=0     LY=0 LS=0 DST=0 Chg=0 UT1=1 Mon=1 DOM=18
    Set: 10 018 12:10:59.9 Loc= 7 Age=0     LY=0 LS=0 DST=0 Chg=0 UT1=1 Mon=1 DOM=18
    Set: 10 018 12:13:59.9 Loc= 7 Age=0     LY=0 LS=0 DST=0 Chg=0 UT1=1 Mon=1 DOM=18
    Set: 10 018 16:10:59.9 Loc=11 Age=0     LY=0 LS=0 DST=0 Chg=0 UT1=1 Mon=1 DOM=18
    Set: 10 019 05:52:59.9 Loc=12 Age=0     LY=0 LS=0 DST=0 Chg=0 UT1=1 Mon=1 DOM=19
    Set: 10 019 05:55:59.9 Loc=12 Age=0     LY=0 LS=0 DST=0 Chg=0 UT1=1 Mon=1 DOM=19
    Set: 10 019 06:59:59.9 Loc= 1 Age=0     LY=0 LS=0 DST=0 Chg=0 UT1=1 Mon=1 DOM=19
    Set: 10 019 07:48:59.9 Loc= 2 Age=0     LY=0 LS=0 DST=0 Chg=0 UT1=1 Mon=1 DOM=19
    Set: 10 019 08:06:59.9 Loc= 3 Age=0     LY=0 LS=0 DST=0 Chg=0 UT1=1 Mon=1 DOM=19
    Set: 10 019 08:12:59.9 Loc= 3 Age=0     LY=0 LS=0 DST=0 Chg=0 UT1=1 Mon=1 DOM=19
    Set: 10 019 09:08:59.9 Loc= 4 Age=0     LY=0 LS=0 DST=0 Chg=0 UT1=1 Mon=1 DOM=19
    Set: 10 019 09:33:59.9 Loc= 4 Age=0     LY=0 LS=0 DST=0 Chg=0 UT1=1 Mon=1 DOM=19
    Set: 10 019 10:08:59.9 Loc= 5 Age=0     LY=0 LS=0 DST=0 Chg=0 UT1=1 Mon=1 DOM=19
    Set: 10 019 10:32:59.9 Loc= 5 Age=0     LY=0 LS=0 DST=0 Chg=0 UT1=1 Mon=1 DOM=19
    Set: 10 019 12:34:59.9 Loc= 7 Age=0     LY=0 LS=0 DST=0 Chg=0 UT1=1 Mon=1 DOM=19
    Set: 10 019 13:49:59.9 Loc= 8 Age=0     LY=0 LS=0 DST=0 Chg=0 UT1=1 Mon=1 DOM=19
    Set: 10 020 05:22:59.9 Loc=12 Age=0     LY=0 LS=0 DST=0 Chg=0 UT1=1 Mon=1 DOM=20
    Set: 10 020 05:37:59.9 Loc=12 Age=0     LY=0 LS=0 DST=0 Chg=0 UT1=1 Mon=1 DOM=20
    Set: 10 020 07:41:59.9 Loc= 2 Age=0     LY=0 LS=0 DST=0 Chg=0 UT1=1 Mon=1 DOM=20
    Set: 10 020 09:47:59.9 Loc= 4 Age=0     LY=0 LS=0 DST=0 Chg=0 UT1=1 Mon=1 DOM=20
    Set: 10 020 10:15:59.9 Loc= 5 Age=0     LY=0 LS=0 DST=0 Chg=0 UT1=1 Mon=1 DOM=20
    Set: 10 020 10:26:59.9 Loc= 5 Age=0     LY=0 LS=0 DST=0 Chg=0 UT1=1 Mon=1 DOM=20
    Set: 10 020 10:46:59.9 Loc= 5 Age=0     LY=0 LS=0 DST=0 Chg=0 UT1=1 Mon=1 DOM=20
    Set: 10 021 07:44:59.9 Loc= 2 Age=0     LY=0 LS=0 DST=0 Chg=0 UT1=1 Mon=1 DOM=21
    

    As you’d expect, WWVB synch is an overnight thing, with occasional synchs during the morning hours.

    Winter has the absolute best RF propagation, so demanding four good frames probably isn’t going to work during the summer…

  • Ceramic Resonator Frequency Compensation

    Although this isn’t a real long-term experiment, here’s a week of continuous WWVB clock operation, sitting by the window in our living room, with the circuit board open to ambient conditions.

    The firmware checks the local oscillator drift against the WWVB time signal if more than 3 hours (10800 seconds) has elapsed since the last synch, so you’re not seeing every WWVB synch event.

    Drift: TS   5281890 UTC 10015.113059 Elapsed 15900 Offset 0 Corr +0 ICR1 39841
    Drift: TS   5283109 UTC 10016.074959 Elapsed 55680 Offset 2 Corr +1 ICR1 39842
    Drift: TS   5283486 UTC 10016.140659 Elapsed 15600 Offset -1 Corr -2 ICR1 39840
    Drift: TS   5284662 UTC 10017.094259 Elapsed 15720 Offset 0 Corr +0 ICR1 39841
    Drift: TS   5285324 UTC 10017.204459 Elapsed 31680 Offset 1 Corr +1 ICR1 39842
    Drift: TS   5285606 UTC 10018.012659 Elapsed 16920 Offset 0 Corr +0 ICR1 39842
    Drift: TS   5286030 UTC 10018.083059 Elapsed 16860 Offset 0 Corr +0 ICR1 39842
    Drift: TS   5286490 UTC 10018.161059 Elapsed 14220 Offset 0 Corr +0 ICR1 39842
    Drift: TS   5287312 UTC 10019.055259 Elapsed 49320 Offset 0 Corr +0 ICR1 39842
    Drift: TS   5288722 UTC 10020.052259 Elapsed 55980 Offset 0 Corr +0 ICR1 39842
    Drift: TS   5290304 UTC 10021.074459 Elapsed 75480 Offset 0 Corr +0 ICR1 39842
    Drift: TS   5291588 UTC 10022.050859 Elapsed 77040 Offset 1 Corr +0 ICR1 39842
    

    The frequency offset is on the order of 1 in 75000 seconds: 13 parts per million or about 0.0013%.

    The last line shows that the clock went 21.4 hours between synchs while drifting less than two seconds. If the clock didn’t synch for an entire week, it’d be within 15 seconds of the correct time. That’s not wonderful for a clock, but it’s good enough for this application: the display shows just hours and minutes.

    Not bad for a cheap ceramic resonator on an Arduino Pro…

  • WWVB: 7 dB More Modulation!

    I read a whole stack of NIST doc on the WWVB transmitter & time code format last year, figuring out how to build a WWVB simulator and then the Totally Featureless Clock. The Circuit Cellar article on the simulator just appeared in print and a reader gave me a heads-up: the transmitter power now drops 17 dB during the low-power part of the PWM pulse.

    The relevant doc is there.

    How could I miss it? Well, all the doc is quite old and the change happened in 2006…

    Fairly obviously, the C-Max WWVB receiver I’m using doesn’t have the mojo to track the signal during the day, no matter how fancy the modulation. Those pulses, the low-power part of the signal, just aren’t present amid all the other noise!

    Also of interest: the WWVB transmitter has been running at half-power during the daylight hours since September 2009 while they do antenna maintenance. That’s supposed to be finished right about now, so the signal should be 3 dB better. I’ve got a nearly continuous record of the last month or so, which means a comparison will be in order after a few weeks.

    Search for WWVB to find the other posts I’ve done on this topic…

  • Recipe Inflation: Hershey’s Cocoa

    My mother’s pantry disgorged a can of Hershey’s Cocoa dating back to the mid-90s (if I’m interpreting the 94P date code correctly). Their Favorite Hot Cocoa recipe is straightforward:

    SINGLE SERVING: Combine 1 heaping teaspoon HERSHEY’S Cocoa, 2 heaping teaspoons sugar, and dash salt in mug, add 2 teaspoons milk and stir until smooth. Heat 1 cup milk: fill mug. Stir and serve.

    Browsing in the grocery store revealed that the current recipe has considerably more stiffness: two tablespoons of both cocoa and sugar.

    One tablespoon = 3 teaspoons. How they interpret “heaping” I don’t know, but it’s under a factor of two. Maybe cups are bigger these days, but surely not by a factor of four or five.

    Zowie!

    The Official Recipe from the Hershey’s website lists 2-3 teaspoons of cocoa and 2 tablespoons of sugar. I love this suggestion:

    VARIATIONS
    Rich and Adult: Increase cocoa to 2 tablespoons …

    Adult cocoa. Who’d’a thunk it?

  • Ubuntu 9.10 Partition Backup: ext4 vs partimage vs dd

    Ubuntu 9.10 uses ext4 filesystems by default and it’s usually a Good Thing to not mess with defaults early in the installation.

    That precept worked up to the point where I wanted to make a full-partition backup before doing something potentially catastrophic… at which point I discovered that the current version of System Rescue CD has a version of partimage that doesn’t know about ext4 filesystems. While FSArchiver looks promising, all I really wanted was a quick-and-simple backup and (possibly) restoration.

    So. Once again, dd to the rescue.

    This being a fresh installation, there’s not much other data to contend with. In fact, the installation uses under 3 GB, but it’s in a 32 GB partition. Wouldn’t It Would Be Nice If we could back up just the 10% of useful data and skip the rest?

    Reboot to System Rescue CD (hereinafter, SRC) and, while that’s happening, plug in a spare hard drive using a USB-to-SATA converter. That will be the “backup drive”.

    Mount the backup drive (which appeared as /dev/sdf1 and will be different for you) at /mnt/backup, which is conveniently provided by SRC:

    mount /dev/sdf1 /mnt/backup
    

    Mount the partition to be backed up (which is /dev/sda8 and will be different for you) at /mnt/custom, another existing mount point.

    mount /dev/sda8 /mnt/custom
    

    Zero out all the unused space by creating one honkin’ big file, then erase it leaving all those highly compressible zeros behind:

    dd bs=1M if=/dev/zero of=/mnt/custom/zero.bin
    sync
    rm /mnt/custom/zero.bin
    

    Unmount the partition, make the backup, and save the MBR while you’re at it:

    umount /mnt/custom
    dd bs=1M if=/dev/sda1 | gzip -c -3 > /mnt/backup/boxname-sda8-ext4-32GB.bin.gz
    dd bs=512 count=1 if=/dev/sda of=/mnt/backup/boxname-mbr.bin
    

    The bs=1M option sets a decent blocksize for the read operations, which gets dd trundling along at a pretty good clip by reducing the per-read overhead.

    The -c option tells gzip to pipe the output to stdout and not mess with the input file. The -3 says to not waste a lot of time trying to compress the data; much of the partition consists of raw binary executables, so there’s no point. The whole process will be limited by disk I/O speed, most likely.

    As it happened, the partition squeezed down into about 1.8 GB worth of gzipped backup file.

    Unmount the backup drive, reboot, and do risky things…

    As it turned out, I actually had to restore the partition.

    Once again, boot into SRC with the backup drive plugged in, mount the backup drive. Restoration is straightforward:

    gunzip -c /mnt/backup/boxname-sda8-ext4-32GB.bin.gz | dd bs=1M of=/dev/sda8
    

    Warning: if you bungle the target of that dd, you are so screwed.

    You’re both saving and restoring from a specific partition (/dev/sda8, in my case) within the drive, not the whole drive (which would be /dev/sda). Pay attention to what’s on the screen, check twice, and have a full-drive backup lurking in your fireproof safe…

  • Ubuntu Karmic 9.10 vs Separate X Sessions: Whack-a-mole!

    I’m in the process of figuring out which Ubuntu 9.10 desktop will work with my collection of hardware. That I got all this working successfully with Xubuntu 8.10 is most likely a testament to raw determination rather than good sense, but that’s water over the dam.

    The hardware:

    • Kensington Expert Mouse trackball (must use left-hand buttons)
    • Logitech Cordless Optical Trackman (must use right-hand buttons)
    • Wacom Graphire3 6×8 tablet (must swap side buttons)
    • Dell 2001FP 1600×1200 landscape display (left side)
    • Dell 2005FP 1680×1050 portrait display (right side)
    • nVidia GeForce 9400 GT dual-DVI card (using nVidia driver)
    • Dell Dimension 9150 deskside PC
    • Intel HDA Stac92 on-board sound (system sounds)
    • Ensoniq AudioPCI plug-in sound (unused right now)
    • Logitech USB audio headset (phone calls)

    General requirements:

    • Monitors must use separate X sessions, not Xinerama or TwinView
    • 2005FP must be rotated 1/4 turn CCW into portrait mode
    • *buntu preferred, due to large user base

    After some trial installations and moderate fiddling, some of which served as blog fodder:

    • Kubuntu doesn’t work, as KDE 4.x can’t handle separate X sessions
    • Xubuntu is OK, but tends to not have nearly the support of Ubuntu
    • Ubuntu comes heartbreakingly close to working

    Problems:

    • Rotating that monitor is a real problem
    • I don’t need RandR, but static rotation in xorg.conf causes other problems
    • The tablet wants to cover both screens, but that’s fixable
    • Trackball handedness requires careful FDI tweakage
    • Previous xorg.conf setup is not useful in the new world of FDI files
    • Most configuration documentation isn’t useful in that new world, either

    Installations on other household PCs  have gone reasonably well. Installation on my desktop box is in a spare partition, so I can return to What Worked without too much trouble.

    With all that in hand, here we go …