My daughter has been reluctant to admit that the 3D printer is cool, but she finally made a request. She wanted a basket to clip onto her bed, to keep stuff in. To really understand this you need to know a bit about the bed. It's an
Ikea Kura reversible bed with canopy. She has it in the loft configuration (at left) with a canopy like the one shown at right, but blue and a bit larger. The canopy is supported with what are effectively tent poles that slot into brackets that clip onto the bed railing.
Mana wanted a basket that would clip on in the same way as the canopy supports. The first step was to recreate the bracket. I did this by measuring out the dimensions of the bracket, drawing it out on graph paper, and then entering polygon coordinates into OpenSCAD. I did the rounded edges using sines and cosines at 10 degree intervals. With the basic clip shape defined, I could extrude into the 3rd dimension to make the clip. A quick test-print verified that it worked as well as the original. Then it was an easy matter to add a male hook onto the bracket that I could use to attach the basket to the bracket.
Here's the code :
railHeight = 42;
lipHeight = 15;
thickness = 5;
railWidth = 42;
depth = 25;
RailClip(railWidth,railHeight,lipHeight,thickness,depth);
// Add hook
translate([10,-5,0])
cube([20,3,depth]);
translate([30,-5,0])
cube([3,5,depth]);
where RailClip is a module that just extrudes the polygon as described above. I parameterized it so that it would work with arbitrarily-sized railings.
The basket was also pretty easy:
pi = 3.141592;
angle = 30; // Select in part based on overhang your printer can handle.
h = 100; // Height of basket cylinder wall
rad = 50; // Radius of basket
npts = 40; // Number of bands around the circle
bandWidth = 2; // Width of individual bands
// Calculate twist for linear extrusion based on overhang angle and cylinder height
twistangle = 180*tan(angle)*h/rad/pi;
// Cylindrical wall
for(i = [0:npts-1])
{
linear_extrude(height = h, convexity = 10, twist = twistangle, slices = 100, scale = 1.0)
translate([rad*cos(i/npts*360),rad*sin(i/npts*360)])
rotate([0,0,i/npts*360])
square([bandWidth,bandWidth],center=true);
linear_extrude(height = h, convexity = 10, twist = -twistangle, slices = 100, scale = 1.0)
translate([rad*cos(i/npts*360),rad*sin(i/npts*360)])
rotate([0,0,i/npts*360])
square([bandWidth,bandWidth],center=true);
}
// Bottom rail
translate([0,0,-2])
difference()
{
cylinder(h=2,r=rad+1,$fn=100);
cylinder(h=2,r=rad-1,$fn=100);
}
// Top rail
translate([0,0,h])
difference()
{
cylinder(h=2,r=rad+1,$fn=100);
cylinder(h=2,r=rad-1,$fn=100);
}
// Female part of clip
translate([0,-rad-2,89.5])
difference()
{
cube([27,10.9,25],center=true);
translate([0,-2,-1.5])
cube([24.7,3.5,22],center=true);
}
I kept the bottom separate as I wanted to print the thing upside-down to avoid the need for support material. I considered doing something fancy to fasten the two pieces together, but ended up just making the bottom a disk that I super-glued onto the basket wall.
Finally, I uploaded the whole thing to Thingiverse. It's now
Thing #442097. I saw that someone else had been thinking along similar lines and already created a
hanger for the same bed.
Fun!