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

  • Rolling Bed Stop

    The upstairs Sewing Room came with a couch-like bed incorporating a roll-out trundle bed. It doesn’t get a lot of use, but it lacks wheel locks and tends to scoot away unless you get into it rather more carefully than seems reasonable.

    So I made a pair of stops to capture the wheels:

    Rolling Bed Stops - installed
    Rolling Bed Stops – installed

    The solid model shows they’re just plastic blocks minus a model of the roller wheel:

    Rolling Bed Stops - solid model - show view
    Rolling Bed Stops – solid model – show view

    I like the wood-grain effect of the doubly curved recess on printed plastic layers, even if nobody will ever see it:

    Rolling Bed Stops - PrusaSlicer
    Rolling Bed Stops – PrusaSlicer

    The OpenSCAD code also exports a projection of the block as an SVG file to laser-cut the cork pad.

    Roll the trundle bed into position, push the stops against the wheels, lift and pull forward an inch, let it down, and the wheels snap into those recesses.

    These are considerably fancier than some of the other wheel stops / feet around the house, if only because I got to use the Chord Equation to solve for the radius of the circle parallel to the axle for a snug socket.

    The OpenSCAD source code as a GitHub Gist:

    // Rolling Bed roller stops
    // Ed Nisley – KE4ZNU
    // 2025-06-16
    include <BOSL2/std.scad>
    Layout = "Show"; // [Show,Build,Roller,Plan]
    /* [Hidden] */
    HoleWindage = 0.2;
    Protrusion = 0.1;
    ID = 0;
    OD = 1;
    LENGTH = 2;
    WallThick = 10.0; // default width for things
    BaseThick = 3.0; // bottom thickness
    RollerOA = [47.2,49.8,40.0]; // min & max dia, length
    FrameClearance = 11.0; // max height under bed frame at roller
    PadOA = [RollerOA[LENGTH] + 2*WallThick,RollerOA[OD],FrameClearance – 1.0];
    //———-
    // Define Shapes
    module Roller() {
    m = (RollerOA[OD] – RollerOA[ID])/2;
    RollerR = (m^2 + (RollerOA[LENGTH]^2)/4) / (2*m);
    up(RollerOA[OD]/2)
    yrot(90)
    rotate_extrude($fa=1)
    intersection() {
    left(RollerR – RollerOA[OD]/2)
    circle(r=RollerR,$fa=1);
    rect([RollerOA[OD]/2,RollerOA[LENGTH] + 2.0],anchor=LEFT);
    }
    }
    module RollerStop() {
    difference() {
    cuboid(PadOA,anchor=BOTTOM,rounding=WallThick/2,except=BOTTOM);
    up(BaseThick)
    Roller();
    }
    }
    //———-
    // Build things
    if (Layout == "Plan") {
    projection(cut=true)
    RollerStop();
    }
    if (Layout == "Roller") {
    Roller();
    }
    if (Layout == "Show") {
    RollerStop();
    color("Green",0.5)
    up(BaseThick)
    Roller();
    }
    if (Layout == "Build") {
    RollerStop();
    }