see bottom for more license info */
/* spin thing that erin likes */
-$fn = 50;
+$fn = 500;
weight = "penny";
// weight = "608zz";
+bearing = "608zz";
wall_thickness = 2;
_608zz_radius = 22;
penny_radius = 19.05 / 2;
penny_thickness = 1.52;
weight_radius = (weight == "penny") ? penny_radius : _608zz_radius;
+bearing_radius = (bearing == "608zz") ? _608zz_radius : 1/0;
arms = 3;
-module spin(weight_radius, arms, wall_thickness) {
- _608zz_holder_radius = _608zz_radius + wall_thickness;
- circle(_608zz_holder_radius);
+module spin(weight_radius,
+ arms,
+ wall_thickness,
+ bearing_radius) {
+ bearing_holder_radius = bearing_radius + wall_thickness;
weight_holder_radius = weight_radius + wall_thickness;
+
+ circle(bearing_holder_radius);
+
+ /*
+ * imagine a right triangle with one point at the origin, at the
+ * center of the spinning bearing holder, one point in the middle of
+ * the weight holder, and one point at the center of a circle tangent
+ * to the first two, called the joiner circle.
+ * the radius of the joiner circle is the arithmetic average of the
+ * weight holder and bearing holder.
+ */
+ joiner_radius = (bearing_holder_radius + weight_holder_radius) / 2;
+ /* a: goes between the center of the weight holder and the center of
+ the joiner circle. */
+ a = joiner_radius + weight_holder_radius;
+ /* b: length of the base, which goes along the x-axis between
+ the origin and the center of the weight holder. */
+ b = weight_holder_radius + bearing_holder_radius;
+ /* c: goes between origin and joiner circle. */
+ c = bearing_holder_radius + joiner_radius;
+
+ /* A: angle at the origin, between the base and hypotenuse.
+ it is calculated using law of cosines, given the lengths of
+ all 3 sides of the triangle. */
+ A = acos((pow(b, 2) + pow(c, 2) - pow(a, 2)) / (2 * b * c));
+ /* find the center of the joiner circle */
+ joiner_x = cos(A) * c;
+ joiner_y = sin(A) * c;
+
+ /* find the points where the circles meet */
+ bearing_joiner_point = [cos(A) * bearing_holder_radius,
+ sin(A) * bearing_holder_radius];
+ bearing_weight_point = [bearing_holder_radius, 0];
+ /* C: angle between x-axis and line-segment between center of weight
+ holder and center of joiner.
+ it is calculated using law of cosines, given the lengths of
+ all 3 sides of the triangle. */
+ C = acos((pow(a, 2) + pow(b, 2) - pow(c, 2)) / (2 * a * b));
+ weight_joiner_point = [b - cos(C) * weight_holder_radius,
+ sin(C) * weight_holder_radius];
for(arm = [0 : arms - 1]) {
rotate(arm * 360.0 / arms) {
- translate([weight_holder_radius + _608zz_holder_radius, 0]) {
+ difference() {
+ polygon([bearing_weight_point,
+ bearing_joiner_point,
+ weight_joiner_point]);
+ translate([joiner_x, joiner_y]) {
+ circle(joiner_radius); } }
+ mirror(v = [0, 1, 0]) {
+ difference() {
+ polygon([bearing_weight_point,
+ bearing_joiner_point,
+ weight_joiner_point]);
+ translate([joiner_x, joiner_y]) {
+ circle(joiner_radius); } } }
+ translate([weight_holder_radius + bearing_holder_radius, 0]) {
circle(weight_holder_radius); } } } }
/*