Archive for November 2nd, 2012

Whirlpool Refrigerator: Replacement Freezer Shelf Bracket

Somehow, one of the brackets that supports the small shelf inside the freezer of our Whirlpool refrigerator went missing over the many intervening years and repairs; we never used that shelf and stashed it in a closet almost immediately after getting the refrigerator, so not having the bracket didn’t matter. We recently set up a chest freezer in the basement for all the garden veggies that used to fill all the space available and decided to (re-)install the shelf, which meant we needed a bracket.

It’s impossible to figure out exactly which “shelf stud” in that list would solve the problem, but one of the upper-left pair in that set seems to be about right. On the other paw, I don’t need all the other brackets and doodads and screws, sooo… I can probably make one.

Start with a few measurements, then doodle up the general idea:

Refrigerator Bracket - dimension doodle

Refrigerator Bracket – dimension doodlet’s time to conjure up a solid model:

A bit of OpenSCAD solid modeling:

Refrigerator Bracket Pin - solid model

Refrigerator Bracket Pin – solid model

The yellow bars support the ceiling of that big dovetail, which would otherwise sag badly. The OEM bracket has nicely rounded corners on the base and a bit of an overall radius at the end of the post; this was pretty close and easier to do.

Now it’s time to Fire the Thing-O-Matic…

I switched from blue to white filament during the print, because I figured I’d print another one after I got the sizes right, so it emerged with an attractive blue base:

Bracket on build platform

Bracket on build platform

A better view of the support structure:

Bracket - dovetail support structure

Bracket – dovetail support structure

Two of the bars snapped off cleanly, but the third required a bit of scraping:

Bracket - support scars

Bracket – support scars

Somewhat to my surprise, Prototype 001 slipped snugly over the matching dovetail on the freezer wall, with about the same firm fit as the OEM brackets:

Refrigerator bracket - installed

Refrigerator bracket – installed

And it works perfectly, apart from that attractive blue base that I suppose we’ll get used to after a while:

Refrigerator bracket - in use

Refrigerator bracket – in use

I have no idea whether ABS is freezer-rated. It seems strong enough and hasn’t broken yet, so we’ll declare victory and keep the source code on tap.

The whole project represents about an hour of hammering out OpenSCAD code for the solid model and another hour of printing, which means I’d be better off to just buy the parts kit and throw away the unused bits. Right?

I loves me my Thing-O-Matic…

The OpenSCAD source code:

// Shelf support bracket
// for Whirlpool freezer
// Ed Nisley KE4ZNU Octoboer 2012

//include </mnt/bulkdata/Project Files/Thing-O-Matic/MCAD/units.scad>
//include </mnt/bulkdata/Project Files/Thing-O-Matic/Useful Sizes.scad>

// Layout options

Layout = "Build";
 // Overall layout: Show Build
 // Printing plates: Build
 // Parts: Post Base Keystone Support

ShowGap = 10; // spacing between parts in Show layout

//- Extrusion parameters must match reality!
// Print with +1 shells and 3 solid layers

ThreadThick = 0.25;
ThreadWidth = 2.0 * ThreadThick;

HoleWindage = 0.2;

function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);

Protrusion = 0.1; // make holes end cleanly

// Dimensions

PostLength = 17.5;
PostWidth = 8.2;
PostHeight = 14.4;
PostOffset = 4.4;

PostTopWidth = 4.0;
PostTopHeight = 4.2;

BaseLength = 22.6;
BaseWidth = 20.8;
BaseThick = 5.0;

KeystoneOffset = 3.4;
KeyThick = IntegerMultiple(3.0,ThreadThick);
KeyBase = 2.5;
SlotOpening = 11.63;
// Useful routines

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,

module ShowPegGrid(Space = 10.0,Size = 1.0) {

 Range = floor(50 / Space);

 for (x=[-Range:Range])
 for (y=[-Range:Range])


// Component parts

//--- Post

module Post(h=PostLength) {

PostTopAngle = atan((PostWidth - PostTopWidth)/(2*PostTopHeight));
PostBottomRadius = PostWidth/2;

PostPolyTop = [PostTopWidth/2,0];
PostPolyBottom = [PostWidth/2,-PostTopHeight];

hull() {
 linear_extrude(height=h) {
 translate([0,-PostHeight + PostBottomRadius])

//--- Base block

module Base() {



//-- Keystone slot

module Keystone() {

Tx = SlotOpening/2 + KeyBase;

 [ Tx,KeyThick],
 [ SlotOpening/2,0],
 [ SlotOpening/2,-Protrusion],

//--- Support structure

module Support() {

SupportLength = BaseLength - 2*ThreadWidth;
SupportWidth = 2*ThreadWidth;
SupportHeight = KeyThick - Protrusion;

SupportPeriod = 7.0*ThreadWidth;

SupportBeams = 3; // must be odd -- choose to fit
SIndex = floor((SupportBeams - 1)/2);

for (i=[-SIndex:SIndex])
 translate([(i*SupportPeriod - SupportWidth/2),-(SupportLength + ThreadWidth),0])
 color("Yellow") cube([SupportWidth,SupportLength,SupportHeight]);

//--- The whole thing!

module Bracket(ShowSupp) {

 union() {
 difference() {
 translate([0,(BaseLength/2 - KeystoneOffset),0])
 translate([0,(BaseLength/2 - PostOffset),BaseThick - Protrusion])
 Post(h=(PostLength + Protrusion));

 if (ShowSupp)
 translate([0,(BaseLength/2 - KeystoneOffset),0])


// Build it!


if (Layout == "Show")

if (Layout == "Build")

if (Layout == "Post")

if (Layout == "Base")

if (Layout == "Keystone")

if (Layout == "Support") {
% Keystone();