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.

Steel Shelving Foot Pads

All of the plastic pads vanished from the legs of a steel shelf unit somewhere along the way:

Steel Shelving Foot Pads - post shape
Steel Shelving Foot Pads – post shape

Some solid modeling produced a suitable replacement shape:

Steel Shelving Foot Pads - no pegs - solid model
Steel Shelving Foot Pads – no pegs – solid model

A few prototypes (with a broken OEM version at lower left) matched the model to reality:

Steel Shelving Foot Pads - test pieces
Steel Shelving Foot Pads – test pieces

They’re natural & black TPU, because the job requirements include being tough and bendy:

Steel Shelving Foot Pads - installed
Steel Shelving Foot Pads – installed

Each one takes about half an hour to ooze from the Makergear M2, so after verifying the prototype’s fit, printing four at a time makes sense:

Steel Shelving Foot Pads - slicer
Steel Shelving Foot Pads – slicer

The OpenSCAD code includes the pegs in the original and the first chunky TPU version:

Steel Shelving Foot Pads - with pegs - solid model
Steel Shelving Foot Pads – with pegs – solid model

It turns out they don’t have any obvious benefit in a TPU pad, so they’re disabled in the code.

Now those legs sit firmly on the floor and the post tops aren’t nearly so threatening.

The OpenSCAD source code as a GitHub Gist:

// Steel Shelf Foot Pads
// Ed Nisley – KE4ZNU
// 2026-04-18
include <BOSL2/std.scad>
/* [Hidden] */
Protrusion = 0.01;
NumSides = 4*9;
$fn=NumSides;
Clearance = 1.0/2;
WallThick = 1.0 + Clearance;
BaseThick = 2.0;
PadOAH = BaseThick + 11.0;
RollID = 6.4;
RollOD = 7.4 + Clearance;
RollOffset = 29.5;
LegThick = 0.5 + 2*Clearance;
Pins = [
[-(RollOD/2), (RollOffset + RollOD/2),0],
[(RollOffset + RollOD/2), -(RollOD/2),0],
];
//—–
// Build things
union() {
difference() {
union() {
for (pin = Pins)
translate(pin)
cyl(PadOAH,d=RollOD + 2*WallThick,anchor=BOTTOM);
translate([-(WallThick + LegThick),-(WallThick + LegThick),0])
cuboid([2*WallThick + LegThick,WallThick + LegThick + Pins[0].y,PadOAH],
anchor=BOTTOM+LEFT+FRONT);
translate([-(WallThick + LegThick),-(WallThick + LegThick),0])
cuboid([WallThick + LegThick + Pins[1].x,2*WallThick + LegThick,PadOAH],
anchor=BOTTOM+LEFT+FRONT);
cyl(PadOAH,r=(WallThick + LegThick),anchor=BOTTOM);
}
up(BaseThick)
cyl(PadOAH,r=LegThick,anchor=BOTTOM);
up(BaseThick)
for (pin = Pins)
translate(pin)
cyl(PadOAH,d=RollOD,anchor=BOTTOM);
up(BaseThick) {
translate(Pins[0])
cuboid([RollOD/2,RollOD/2,PadOAH],anchor=BOTTOM+LEFT+BACK);
translate(Pins[1])
cuboid([RollOD/2,RollOD/2,PadOAH],anchor=BOTTOM+RIGHT+FRONT);
}
up(BaseThick) {
fwd(LegThick)
cuboid([LegThick,Pins[0].y + LegThick,PadOAH],anchor=BOTTOM+RIGHT+FRONT);
left(LegThick)
cuboid([Pins[1].x + LegThick,LegThick,PadOAH],anchor=BOTTOM+LEFT+BACK);
}
}
if (false)
for (pin = Pins)
translate(pin) {
cyl(PadOAH,d=RollID/2,anchor=BOTTOM);
for (a = [0,90])
zrot(a)
cuboid([1.0,RollID – 2*Clearance,PadOAH],anchor=BOTTOM);
}
}

Comments

Spam comments get trashed, so don’t bother. Comment moderation may cause a delay.