/*
* Copyleft 2011, 2012 Sergio García-Cuevas González
*
* This work is licensed under the Creative Commons
* Attribution-ShareAlike 3.0 Unported License.
* To view a copy of this license, visit
* http://creativecommons.org/licenses/by-sa/3.0/
* or send a letter to Creative Commons,
* 444 Castro Street, Suite 900, Mountain View,
* California, 94041, USA.
*/
/*
* Skate spinner
*
* A skate spinner is a device that is used by figure skaters
* for training spins off-ice. It consists of a flat platform
* with a curved surface (the rocker) below.
*
* To use the spinner, put it on the floor, step on the platform
* and just spin while maintaining your balance. If you have
* never used a spinner, start slowly and remember that you
* can fall down if you are not careful.
*
* The platform should be roughly the size of a foot. The rocker
* is around 1000 mm for typical skate spinners.
*
* A skate spinner is too big for many amateur-level manufacturing
* machines, but it can be cut (use difference()) into small pieces
* that can be glued or welded together.
*/
/* Platform dimensions:
* The platform is divided into three longitudinal segments,
* each one of a specific length. Both the back and front segments
* are of constant width, whereas the width of the middle segment
* is a linear interpolation between the front width and the back
* width. */
back_length = 100;
middle_length = 80;
front_length = 80;
front_width = 100;
back_width = 70;
platform_thickness = 15;
chamfer = 15;
/* Rocker dimensions:
* The rocker is cut from a sphere whose radius is around
* 1000 mm for typical skate spinners.
* typical figure skate. A nice value for the width is something
* comparable to the platform width. */
rocker_radius = 900;
rocker_width = 70;
/* The higher the value of $fn, the smoother the curved surfaces,
* but the higher the memory requirements and the processing time
* for rendering the object. A value of 400 gives a very nice
* surface, but memory requirements can reach a few GB! */
$fn = 400;
/* A note for choosing the dimensions and building:
*
* Due to the limited stiffness of some materials, it is necessary
* to choose the dimensions of the spinner properly. The spinner
* will bend under weight and it might end squashed on the floor,
* the otherwise curved rocker completely plane. You can use the
* following equation borrowed from elementary beam theory to estimate
* your dimensions:
*
* k < 1 / R,
*
* where:
*
* R = rocker_radius (remember that it is defined in mm);
* k = bending curvature = M / (E I);
* E = Young's modulus (about 2,3 GPa for ABS);
* M = bending moment = W l / 4;
* W = weight (in the order of 1000 N);
* l = back_length + middle_length + front_length (remember: mm);
* I = area moment of inertia = (1 / 12) (b h^3 - (b - 2 t) (h - 2 t)^3);
* b = width = minimum of back_width and front_width (remember: mm);
* h = maximum section height = H + l^2 / (8 R);
* H = platform_thickness (remember that it is defined in mm);
* t = wall thickness of your build (it will depend on how you slice
* the model; with H = 15 mm, l = 260 mm, b = 700 mm and R = 900 mm
* and ABS material, t = 4 mm has proven to be a good choice).
*
* After bending, the radius of curvature of the rocker grows (thus
* approaching the infinite radius of a planar surface) to roughly
* the following value:
*
* 1 / (1 / R - k),
*
* so keep a good margin between k and 1 / R.
*
* Apart from the stiffness criterion, you need to keep the material
* from breaking. With this simple model, the maximum stress will be
* found at the highest point of the middle section and it will be
*
* M h / (2 I).
*
* Keep this well below the tensile strength of the material (which
* is roughly 35 MPa in the case of ABS). Actually, there will be
* important stress concentrations at other points (where the section
* width starts changing, for example) which are not covered by this
* simple physical model. Also, if you build the pieces vertically
* (i.e. stacking layers along the lengthwise direction), then the
* actual strength will be the cohesive strength between layers, which
* can be quite lower than the tensile strength of the material, and
* there will be certain risk of sudden delaminations. With ABS,
* smoothing the surfaces by rubbing with a solvent like acetone
* helps aleviate this weakness and the material can be solvent-welded
* (with a solution of ABS and acetone or butanone) to give quite
* bonds that have a strength that is comparable to that of the
* bulk material.
*
* If the spinner is too big for your machine, you can divide it in
* several pieces. ABS pieces can be solvent-welded together with
* a solution of ABS and acetone or ABS and butanone. Provided that
* you apply some pressure (press the pieces together with your
* hands) for several seconds and then let the bonding dry for 24 hours,
* you will get a quite strong bond. The excess material from the
* welding can be sanded easily. */
/* Module for building the actual object. */
module spinner (back_length,
middle_length,
front_length,
front_width,
back_width,
platform_thickness,
chamfer,
rocker_radius,
rocker_width)
{
length = back_length + middle_length + front_length;
rocker_center_height = rocker_radius * sqrt (1 - (length / rocker_radius / 2) * (length / rocker_radius / 2));
union ()
{
/* Platform */
linear_extrude (height = platform_thickness, center = false)
{
polygon (points = [[0, back_width / 2 - chamfer],
[chamfer, back_width / 2],
[back_length, back_width / 2],
[back_length + middle_length, front_width / 2],
[length - chamfer, front_width / 2],
[length, front_width / 2 - chamfer],
[length, -front_width / 2 + chamfer],
[length - chamfer, -front_width / 2],
[back_length + middle_length, -front_width / 2],
[back_length, -back_width / 2],
[chamfer, -back_width / 2],
[0, -back_width / 2 + chamfer]]);
}
/* Rocker */
difference ()
{
translate (v = [length / 2, 0, 0])
{
difference ()
{
translate (v = [0, 0, rocker_center_height])
{
sphere (r = rocker_radius);
}
translate (v = [-rocker_radius, -rocker_radius, 0])
{
cube (size = [2 * rocker_radius, 2 * rocker_radius, 2 * rocker_radius]);
}
translate (v = [-rocker_radius, -rocker_radius, -rocker_radius])
{
cube (size = [2 * rocker_radius, rocker_radius - rocker_width / 2, 2 * rocker_radius]);
}
translate (v = [-rocker_radius, rocker_width / 2, -rocker_radius])
{
cube (size = [2 * rocker_radius, rocker_radius - rocker_width / 2, 2 * rocker_radius]);
}
}
}
difference ()
{
translate (v = [length / 2, 0, 0])
{
cube (size = [2 * rocker_radius, 2 * rocker_radius, 2 * rocker_radius], center = true);
}
linear_extrude (height = 2 * rocker_radius, center = true)
{
polygon (points = [[0, back_width / 2 - chamfer],
[chamfer, back_width / 2],
[back_length, back_width / 2],
[back_length + middle_length, front_width / 2],
[length - chamfer, front_width / 2],
[length, front_width / 2 - chamfer],
[length, -front_width / 2 + chamfer],
[length - chamfer, -front_width / 2],
[back_length + middle_length, -front_width / 2],
[back_length, -back_width / 2],
[chamfer, -back_width / 2],
[0, -back_width / 2 + chamfer]]);
}
}
}
}
}
spinner (back_length,
middle_length,
front_length,
front_width,
back_width,
platform_thickness,
chamfer,
rocker_radius,
rocker_width);