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.

The New Hotness

  • Tek Circuit Computer: Sawed Hairline Fixture

    This is a fixture to hold a cursor for an Homage Tektronix Circuit Computer while a tiny circular saw blade cuts a narrow flat-bottomed trench:

    Tek CC - sawed cursor - Sherline setup
    Tek CC – sawed cursor – Sherline setup

    Each of the 123 blocks is held to the Sherline tooling plate with a 10-32 SHCS in a little aluminum pin, with another threaded pin for the screw holding the fixture on the side. The minimal top clearance provided some of the motivation behind making those pins in the first place; there’s no room for the usual threaded stud sticking out of the block with a handful of washers under the nut.

    The fixture has locating slots (scribbled with black Sharpie) to touch off the spindle axis and the saw blade at the XZ origin at the pivot hole center. Touching off the saw blade on the cursor surface sets Y=0, although only a few teeth will go ting, so the saw must be spinning.

    I cut the first slot under manual control to a depth of 0.3 mm on a scrap cursor with a grotty engraved hairline:

    Tek CC - first sawed cursor - detail
    Tek CC – first sawed cursor – detail

    It looks better than I expected with some red lacquer crayon scribbled into it:

    Tek CC - first sawed cursor - vs scribed
    Tek CC – first sawed cursor – vs scribed

    A few variations of speed and depth seem inconclusive, although they look more consistent and much smoother than the diamond-drag engraved line with red fill:

    Tek CC - sawed cursor test - magnified
    Tek CC – sawed cursor test – magnified

    The saw produces a ramp at the entry and exit which I don’t like at all, but the cut is, overall, an improvement on the diamond point.

    The OpenSCAD source code as a GitHub Gist:

    // Sawing fixtures for Tek Circuit Computer cursor hairline
    // Ed Nisley KE4ZNU Jan 2021
    // Rotated 90° and screwed to 123 blocks for sawing
    Layout = "Show"; // [Show, Build, Cursor]
    Gap = 4.0;
    /* [Hidden] */
    ThreadThick = 0.25;
    ThreadWidth = 0.40;
    HoleWindage = 0.2;
    Protrusion = 0.1; // make holes end cleanly
    inch = 25.4;
    function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);
    module PolyCyl(Dia,Height,ForceSides=0) { // based on nophead's polyholes
    Sides = (ForceSides != 0) ? ForceSides : (ceil(Dia) + 2);
    FixDia = Dia / cos(180/Sides);
    cylinder(d=(FixDia + HoleWindage),h=Height,$fn=Sides);
    }
    //———————-
    // Dimensions
    CursorHubOD = 1.0*inch; // must match SVG hub OD
    CursorThick = 0.71; // including protective layers
    HairlineMin = 48.4188; // extent of hairline
    HairlineMax = 97.4250;
    HairlineDepth = 0.20;
    PocketDepth = 0.75*CursorThick; // half above surface for taping
    PocketClear = 0.25; // E-Z insertion clearance
    TableOC = [1.16*inch,1.16*inch]; // Sherline tooling plate grid
    BlockOC = [(9/16)*inch,(9/16)*inch]; // 123 block hole grid
    BlockOffset = [(3/8)*inch,(3/8)*inch]; // .. block edge to hole center
    ScrewClear = 5.0; // … screw clearance
    CursorOffset = [2*BlockOC.x,0,0]; // hub center relative to leftmost screw
    FixtureGrid = [5*TableOC.x,0,0]; // size in Table grid units
    Screws = [ // relative to leftmost screw
    [0,0,0], // on table grid
    CursorOffset, // on block grid
    [FixtureGrid.x,0,0] // on table grid
    ];
    echo(str("Screw centers: ",Screws));
    CornerRad = 10.0; // corner radius
    Fixture = [2*CornerRad + FixtureGrid.x,2*CornerRad + CursorHubOD,5.0];
    echo(str("Fixture plate: ",Fixture));
    //———————-
    // Import SVG of cursor outline
    // Requires our CursorHubOD to match actual cut outline
    // Hub center at origin
    module CursorSVG(t=CursorThick,ofs=0.0) {
    hr = CursorHubOD/2;
    translate([-hr,-hr,0])
    linear_extrude(height=t,convexity=3)
    offset(r=ofs)
    import(
    file="/mnt/bulkdata/Project Files/Tektronix Circuit Computer/Firmware/TekCC-Cursor-Mark.svg",
    center=false);
    }
    //———————-
    // Show-n-Tell cursor
    module Cursor() {
    difference() {
    CursorSVG(CursorThick,0.0);
    translate([0,0,-Protrusion])
    rotate(180/6)
    PolyCyl(ScrewClear,CursorThick + 2*Protrusion,6);
    }
    }
    //———————-
    // Sawing fixture for cursor hairline
    // Plate center at origin
    module Fixture() {
    difference() {
    hull() // basic plate shape
    for (i=[-1,1], j=[-1,1])
    translate([i*(Fixture.x/2 – CornerRad),j*(Fixture.y/2 – CornerRad),0])
    cylinder(r=CornerRad,h=Fixture.z,$fn=24);
    translate([0,0,Fixture.z – ThreadThick/2 + Protrusion/2]) // will be Z=0 index
    cube([2*Fixture.x,ThreadWidth,ThreadThick + Protrusion],center=true);
    translate(-FixtureGrid/2) {
    translate(CursorOffset + [0,0,Fixture.z – 2*PocketDepth])
    difference() {
    CursorSVG(2*PocketDepth + Protrusion,PocketClear);
    CursorSVG(PocketDepth + Protrusion,-PocketClear);
    }
    translate([CursorOffset.x,0,Fixture.z – ThreadThick/2 + Protrusion/2]) // will be front X=0 index
    cube([ThreadWidth,2*Fixture.y,ThreadThick + Protrusion],center=true);
    translate([CursorOffset.x,Fixture.y/2 – ThreadThick/2 + Protrusion/2,0]) // will be top X=0 index
    cube([ThreadWidth,ThreadThick + Protrusion,2*Fixture.z],center=true);
    translate([CursorOffset.x + HairlineMin,0,Fixture.z – ThreadThick/2 + Protrusion/2]) // hairline min
    cube([ThreadWidth,2*Fixture.y,ThreadThick + Protrusion],center=true);
    translate([CursorOffset.x + HairlineMax,0,Fixture.z – ThreadThick/2 + Protrusion/2]) // hairline min
    cube([ThreadWidth,2*Fixture.y,ThreadThick + Protrusion],center=true);
    /*
    # translate(CursorOffset + [0,0,Fixture.z – 2*ThreadThick]) { // alignment pips
    for (x=[-20.0,130.0], y=[-30.0,0.0,30.0])
    translate([x,y,0])
    cylinder(d=4*ThreadWidth,h=1,$fn=6);
    # for (x=[-30.0,130.0,150.0])
    translate([x,0,0])
    cylinder(d=4*ThreadWidth,h=1,$fn=6);
    */
    for (pt=Screws)
    translate(pt + [0,0,-Protrusion])
    rotate(180/6)
    PolyCyl(ScrewClear,Fixture.z + 2*Protrusion,6);
    }
    }
    }
    //———————-
    // Build it
    if (Layout == "Cursor") {
    Cursor();
    }
    if (Layout == "Show") {
    rotate([0*90,0,0]) {
    Fixture();
    color("Green",0.3)
    translate(-FixtureGrid/2 + CursorOffset + [0,0,Fixture.z + Gap])
    Cursor();
    }
    }
    if (Layout == "Build"){
    // rotate(90)
    Fixture();
    }