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.

Author: Ed

  • X10 TM751 RF Transciever: End of Life

    X10 control from the two HR12A remotes got much worse over the last few months and eventually failed completely, which meant I had to actually walk over to the lights and click the switches. Not to be tolerated, sez I, so I would walk to the bedroom and poke the appropriate buttons on the wired controller (long since obsolete) by the bed. That worked perfectly, which eventually convinced me to dismantle the TM 751 transceiver.

    It’s not good when soot plates the case:

    X10 TM751 - Smoked case
    X10 TM751 – Smoked case

    I like how they capacitively coupled RF from the antenna for complete line-voltage isolation.

    The PCB looked like it got rather hot over there on the left side:

    X10 TM751 - Overheated PCB
    X10 TM751 – Overheated PCB

    A Zener diode on the component side of the PCB looked a bit toasty, so I decided this gadget had passed its best-used-by-date and dropped it in the electronics recycling box (after harvesting the antenna, just in case).

    A new-in-box TM 751 from eBay arrived a few days ago and works just fine.

    Done!

     

  • Truth In Labeling: Bike Tube Division

    The lumpy surface of the Michelin Pro-Tek Max tubes now in the back tire of our bikes can’t be patched, which means (being that type of guy) I must carry along a spare tube in addition to a handful of CO2 cartridges. So, having cleaned out my tube stash, I ordered a pair from an Amazon supplier, not my usual bottom-dollar eBay suppliers, clearly described as fitting the Schwalbe Marathon Plus 700x35C tires.

    The Amazon listing and the box label agreed, but (being that type of guy) I just had to extract the tube to see what I got:

    Meetlocks tube size mismatch
    Meetlocks tube size mismatch

    Huh.

    According to the seller, who speaks and writes English far better than I can handle Mandarin (or whatever):

    Yes, you are right, you also didn’t bought wrong items for your tire. we marked the 700×28-32, just for our manufacture to difference from another big size from 700/35-45C, because if we marked the size 700×28-35C, sometimes , the worker will packing 700×35-45c into the packing, and let the tube can not used for the 700x35c customer..

    Huh.

    It turns out the tube has 35-38 embossed into the rubber, so it’s not obvious the tube would fit into the smaller  28-32 size tires as labeled. It all depends on what you trust: the mold, the tube’s stamp, the box label, or the advertising.

    Next time around, an event I hope (but do not expect) lies far in the future, I’ll spend a bit more for what will undoubtedly be the same tube from the same factory, but from a vendor buying enough QC to ensure the workers know what they’re packing. Having all the labels match would be a definite bonus.

  • Schwalbe Marathon vs. Glass Chips, Yet Again

    We biked to some errands on an unseasonably warm 4 January and, a few days later, I noticed the rear tire on Mary’s bike was flat. A bit of Quality Shop Time later:

    Brown Glass Chip
    Brown Glass Chip

    On the upside, I found it in the garage and fixed it in the basement.

    The chip emerged from one of two adjacent gashes in the middle of the tread, but hadn’t quite cut through the tire. A somewhat larger chip (that’s a 0.1 inch grid) in the other gash cut through the Schwalbe Marathon’s protective belt to puncture the tube, then fell out.

    The rear wheel of her bike now sports a Michelin Pro-Tek Max tube inside a Schwalbe Marathon Plus tire, as does mine. The wheel + tube + tire probably weighs as much as some entire carbon-fiber bikes, but it doesn’t matter.

    Searching for the obvious keywords will produce many other instances…

  • Unicode Keyboard Flameout and Workaround

    For unknown reasons, probably having to do with the unmitigated disaster of trying to get an SDRPlay radio working with GNU Radio (about which, more later), Unicode keyboard input stopped working. This is not to be tolerated, because engineering notation requires a lot of Greek letters.

    Unicode support seems to be baked into the lowest levels of the Linux operating system, although it’s not clear to me whether it’s in X, QT, GTK, or somewhere else. Googling the obvious keywords was unavailing; evidently this feature never ever fails or, more likely, very few people use it to any extent.

    Note that I already have the Compose key set up, but Compose sequences don’t include Greek letters.

    After considerable flailing, I added the Simple Greek keyboard layout and defined the (otherwised unused) Menu key as the keyboard layout switcher. That’s a pretty big hammer for a rather small problem; I devoutly hope Unicode mysteriously starts working again.

    For reference, the Greek keyboard layout looks like this:

    Greek keyboard layout
    Greek keyboard layout

    I’d have put Ω on the W key, rather than V, but that’s just because so many fonts do exactly that.

  • Kenmore 158 Foot Pedal: Fine Tuning

    After a week of use, Mary decided the single additional graphite disk in each stack produced a too-high initial speed when the sewing machine started up; this being a matter of how it feels injects some of trial-and-error into the repair.

    Shaving a graphite disk down from 0.8 to 0.4 mm seemed entirely too messy, so I snipped squares from 0.40 mm = 16 mil brass shim stock, nibbled the edges into a polygon, and filed the resulting vertexes to produce a (rough) circle:

    Kenmore 158 Foot Pedal - 0.40 mm brass shims
    Kenmore 158 Foot Pedal – 0.40 mm brass shims

    Each stack looks like this:

    • 1.5 mm graphite disk (double-thick)
    • 0.30 mm brass (original part)
    • 0.79 mm graphite disk
    • 0.40 brass (new part)
    • The rest of the stack

    Protip: dump those shards onto a strip of wide masking tape, fold gently until it’s all corners, and drop in the trash. Otherwise, you’ll pull those things out of your shoes and fingers for months…

    You can get cheaper nibbling tools nowadays; I’ve had mine for decades.

  • 60 kHz Preamp: Board Holder

    A cleaned up version of my trusty circuit board holder now keeps the 60 kHz preamp off what passes for a floor in the attic:

    Preamp in attic
    Preamp in attic

    The solid model became slightly taller than before, due to a serious tangle of wiring below the board, with a narrower flange that fits just as well in the benchtop gripper:

    Proto Board - 80x110
    Proto Board – 80×110

    Tidy brass inserts epoxied in the corners replace the previous raw screw holes in the plastic:

    Proto Board Holder - 4-40 inserts and screws
    Proto Board Holder – 4-40 inserts and screws

    The screws standing on their heads have washers epoxied in place, although that’s certainly not necessary; the dab of left-over epoxy called out for something. The screws got cut down to 7 mm after curing.

    The preamp attaches to a lumpy circle of loop antenna hung from the rafters and returns reasonable results:

    WWVB - morning - 2017-01-16
    WWVB – morning – 2017-01-16

    The OpenSCAD source code as a GitHub Gist:

    // Test support frame for proto boards
    // Ed Nisley KE4ZNU – Jan 2017
    ClampFlange = true;
    Channel = false;
    //- Extrusion parameters – must match reality!
    ThreadThick = 0.25;
    ThreadWidth = 0.40;
    function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);
    Protrusion = 0.1;
    HoleWindage = 0.2;
    //- Screw sizes
    inch = 25.4;
    Tap4_40 = 0.089 * inch;
    Clear4_40 = 0.110 * inch;
    Head4_40 = 0.211 * inch;
    Head4_40Thick = 0.065 * inch;
    Nut4_40Dia = 0.228 * inch;
    Nut4_40Thick = 0.086 * inch;
    Washer4_40OD = 0.270 * inch;
    Washer4_40ID = 0.123 * inch;
    ID = 0;
    OD = 1;
    LENGTH = 2;
    Insert = [3.9,4.6,5.8];
    //- PCB sizes
    PCBSize = [110.0,80.0,1.5];
    PCBShelf = 2.0;
    Clearance = 2*[ThreadWidth,ThreadWidth,0];
    WallThick = 5.0;
    FrameHeight = 10.0;
    ScrewOffset = 0.0 + Clear4_40/2;
    ScrewSites = [[-1,1],[-1,1]]; // -1/0/+1 = left/mid/right and bottom/mid/top
    OAHeight = FrameHeight + Clearance[2] + PCBSize[2];
    FlangeExtension = 3.0;
    FlangeThick = IntegerMultiple(2.0,ThreadThick);
    Flange = PCBSize
    + 2*[ScrewOffset,ScrewOffset,0]
    + 2*[Washer4_40OD,Washer4_40OD,0]
    + [2*FlangeExtension,2*FlangeExtension,(FlangeThick – PCBSize[2])]
    ;
    echo("Flange: ",Flange);
    NumSides = 4*5;
    WireChannel = [Flange[0],15.0,3.0 + PCBSize[2]];
    WireChannelOffset = [Flange[0]/2,25.0,(FrameHeight + PCBSize[2] – WireChannel[2]/2)];
    //- Adjust hole diameter to make the size come out right
    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);
    }
    //- Build it
    difference() {
    union() { // body block
    translate([0,0,OAHeight/2])
    cube(PCBSize + Clearance + [2*WallThick,2*WallThick,FrameHeight],center=true);
    for (x=[-1,1], y=[-1,1]) { // screw bosses
    translate([x*(PCBSize[0]/2 + ScrewOffset),
    y*(PCBSize[1]/2 + ScrewOffset),
    0])
    cylinder(r=Washer4_40OD,h=OAHeight,$fn=NumSides);
    }
    if (ClampFlange) // flange for work holder
    linear_extrude(height=Flange[2])
    hull()
    for (i=[-1,1], j=[-1,1]) {
    translate([i*(Flange[0]/2 – Washer4_40OD/2),j*(Flange[1]/2 – Washer4_40OD/2)])
    circle(d=Washer4_40OD,$fn=NumSides);
    }
    }
    for (x=[-1,1], y=[-1,1]) { // screw position indexes
    translate([x*(PCBSize[0]/2 + ScrewOffset),
    y*(PCBSize[1]/2 + ScrewOffset),
    -Protrusion])
    rotate(x*y*180/(2*6))
    PolyCyl(Clear4_40,(OAHeight + 2*Protrusion),6); // screw clearance holes
    translate([x*(PCBSize[0]/2 + ScrewOffset),
    y*(PCBSize[1]/2 + ScrewOffset),
    OAHeight – PCBSize[2] – Insert[LENGTH]])
    rotate(x*y*180/(2*6))
    PolyCyl(Insert[OD],Insert[LENGTH] + Protrusion,6); // inserts
    translate([x*(PCBSize[0]/2 + ScrewOffset),
    y*(PCBSize[1]/2 + ScrewOffset),
    OAHeight – PCBSize[2]])
    PolyCyl(1.2*Washer4_40OD,(PCBSize[2] + Protrusion),NumSides); // washers
    }
    translate([0,0,OAHeight/2]) // through hole below PCB
    cube(PCBSize – 2*[PCBShelf,PCBShelf,0] + [0,0,2*OAHeight],center=true);
    translate([0,0,(OAHeight – (PCBSize[2] + Clearance[2])/2 + Protrusion/2)]) // PCB pocket on top
    cube(PCBSize + Clearance + [0,0,Protrusion],center=true);
    if (Channel)
    translate(WireChannelOffset) // opening for wires from bottom side
    cube(WireChannel + [0,0,Protrusion],center=true);
    }
  • 60 kHz Preamp: First Pass

    Encouraged by the simulation, the 60 kHz preamp hardware sprawls over a phenolic proto board:

    60 kHz preamp board - fake antenna
    60 kHz preamp board – fake antenna

    The inductors and resistors hanging off the screw terminals produce more-or-less the same impedance  as the real loop antenna. The alligator clips connect a function generator to the secondary winding of a current transformer (used backwards), thus injecting a wee differential signal into the “antenna”.

    The clump of parts in the lower left knock the 24 VDC wall wart down to 20 V and produce a 10 V virtual ground in the middle:

    60 kHz Preamp - power supply - Kicad schematic
    60 kHz Preamp – power supply – Kicad schematic

    The LEDs give a cheerful indication that the power supplies have reported for duty, plus apply a minimum load to the LM317 while I was tinkering. The heatsink gets tolerably warm, so I should dial back or disconnect the LEDs to reduce the load.

    The preamp hardware matches the simulated layout, with a few extra bits tossed in:

    60 kHz Preamp - Kicad schematic
    60 kHz Preamp – Kicad schematic

    The weird values come from whatever 1% resistors and silver-mica caps emerged from the heap. The 27 V Zener diodes and 5 kΩ resistors may or may not protect the instrumentation amp inputs from lightning-induced transients.

    Because the HP8591 analyzer’s tracking generator starts at 100 kHz, I fed the DDS function generator into the preamp, manually stepped the frequency in 250 Hz increments, and had the analyzer show the maximum response of 19 separate sweeps:

    Preamp - max hold - 250 Hz steps
    Preamp – max hold – 250 Hz steps

    That was tedious and, no, it’s not a comb filter: the actual response skates across the peaks of all those bumps.

    The marker shows the preamp bandwidth is 2 kHz, roughly what the simulation predicts; the extremely tight span of that plot makes it look a lot flatter that the usual presentation.

    Tightening the span even more shows an unexpected effect:

    Preamp - 120 Hz modulation
    Preamp – 120 Hz modulation

    Those sidebands at ±120 Hz (probably) come from power-line magnetic fields into the “antenna”, because the magnetic field strength depends on the absolute value of the voltage. If they came from the signal generator, they’d be at ±60 Hz: the waveform amplitude depends directly on the voltage.