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.

Day: February 24, 2013

  • Printing Scale Model Concrete Blocks

    For reasons that undoubtedly make sense to him, my buddy Aitch is moving to coastal NC. Seeing as how we lived in Raleigh for half a decade, I figure he needs some hints on how to blend in…

    Toy cars up on blocks
    Toy cars up on blocks

    The solid model looks about the way you’d expect:

    Concrete block - solid model
    Concrete block – solid model

    The webs are slightly thinner than in real life, but it looks OK to me. The web came out slightly over 3 thread widths = 1.5 mm, to ensure they get a bit of fill rather than being two distinct threads. I originally tried making the web exactly 3 threads wide, which produced tiny dots of fill on the sides and corners. They printed with 0.20 infill; they’d print faster with 1.00 infill or all-solid layers.

    You’ll want to create a pile o’ blocks at once, of course, although this array took about two hours:

    Concrete blocks - build platform
    Concrete blocks – build platform

    The OpenSCAD source code:

    // Scale model concrete block
    // Ed Nisley KE4ZNU February 2013
    
    // Extrusion parameters must match reality!
    // Print with +0 shells and 3 solid layers
    
    ThreadThick = 0.25;
    ThreadWidth = 2.0 * ThreadThick;
    
    function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);
    
    Protrusion = 0.1;           // make holes end cleanly
    
    //----------------------
    // Dimensions
    
    Scale = (1/25) * (3*ThreadWidth);
    
    BlockWidth = Scale * 190;
    BlockLength = Scale * 390;
    BlockHeight = BlockWidth;
    
    WebWidth = Scale * 30;
    
    CoreSize = [(BlockWidth - 2*WebWidth),(BlockLength - 4*WebWidth)/2,BlockHeight];
    
    CornerRadius = WebWidth/2;
    
    //----------------------
    // Useful routines
    
    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
    
    module Core(Size,Radius) {
        translate([0,0,(Size[2] - Protrusion)/2])
            minkowski() {
                cube([(Size[0] - 2*Radius),(Size[1] - 2*Radius),Size[2]],center=true);
                cylinder(r=Radius,h=Protrusion,$fn=8);
            }
    }
    
    //----------------------
    // Build it!
    
    ShowPegGrid();
    
    difference() {
        translate([0,0,BlockHeight/2])
            cube([BlockWidth,BlockLength,BlockHeight],center=true);
        for (i = [-1,1])
            translate([0,i*(CoreSize[1] + WebWidth)/2,0])
               Core(CoreSize,CornerRadius);
        for (i = [-1,1])
            translate([0,i*3*(CoreSize[1] + WebWidth)/2,0])
               Core(CoreSize,CornerRadius);
    }