+/* OpenSCAD Joint Connectors v1.0 by MakerBlock */
+/* Published on October 31, 2012 */
+/* www.thingiverse.com/thing:33426 */
+/* Creative Commons - Attribution */
+
+// Settings
+ facets = 32;
+ tolerance = 0.3;
+ rotation_degrees = 20;
+
+joint_examples_with_descriptions_in_comments();
+
+module joint_examples_with_descriptions_in_comments()
+ {
+ // Hypothetical build platform
+ % cube([100,100,0.1], center=true);
+ // A single end male connector, on its side
+ translate([0,0,0]) joint_male(male_joint_width=3, male_joint_thickness=3, male_joint_height=10, side=true);
+ // A single end male connector, upright
+ translate([-8,0,0]) joint_male(male_joint_width=3, male_joint_thickness=3, male_joint_height=10, side=false);
+ // A dual end male connector
+ translate([-16,0,0])
+ {
+ for (i=[0,1]) mirror([0,i,0])
+ translate([0,-10/2,0]) joint_male(male_joint_width=3, male_joint_thickness=3, male_joint_height=10, side=true);
+ }
+ // A female connector, with 0 degrees range of movement
+ translate([8,0,10/2])
+ {
+ difference()
+ {
+ cube([6,6,10], center=true);
+ translate([0,0,2]) joint_male_negative(male_joint_width=3, male_joint_thickness=3, male_joint_height=10);
+ }
+ }
+ // A female connector, with 180 degrees range of movement
+ translate([16,0,10/2])
+ {
+ difference()
+ {
+ cube([6,6,10], center=true);
+ translate([0,0,2])
+ joint_male_negative(male_joint_width=3, male_joint_thickness=3, forward_rom=90, backward_rom=90, male_joint_height=10);
+ }
+ }
+ // A female connector, with a range of movement of 30 degrees forward and 90 degrees backward, and a clearance edge of 3mm
+ translate([24,0,10/2])
+ {
+ difference()
+ {
+ cube([6,6,10], center=true);
+ translate([0,0,2])
+ joint_male_negative(male_joint_width=3, male_joint_thickness=3, forward_rom=30,
+ backward_rom=90, clearance_edge=3, male_joint_height=10);
+ }
+ }
+ }
+
+module joint_male(male_joint_width=4, male_joint_thickness=4, male_joint_height=8, fn=facets, side=false)
+ {
+ if (side==false)
+ { joint_male_vertical(male_joint_width, male_joint_thickness, male_joint_height, fn=facets); }
+ else if (side==true)
+ { joint_male_horizontal(male_joint_width, male_joint_thickness, male_joint_height, fn=facets); }
+ }
+
+module joint_female();
+ {
+
+ }
+
+module joint_male_negative(male_joint_width=4, male_joint_thickness=5, male_joint_height=8,
+ forward_rom=0, backward_rom=0, clearance_edge=0, fn=facets)
+ {
+ // Spherical axis/hinge bit
+ for (i=[0,1]) mirror([i,0,0])
+ translate([(male_joint_width/2-male_joint_thickness/8+tolerance), 0, 0]) rotate([0,90,0])
+ sphere(r=male_joint_thickness/4+tolerance, $fn=fn/2);
+ // Rotated cutout
+ rotate([0,-90,0]) difference()
+ {
+ linear_extrude(height=male_joint_width+tolerance*2+clearance_edge*2, center=true)
+ {
+ // Forward rotation
+ hull()
+ {
+ circle(r=male_joint_thickness/2+tolerance, $fn=fn);
+ for(i=[0:-forward_rom/rotation_degrees]) rotate([0,0,i*rotation_degrees])
+ translate([male_joint_height+(male_joint_thickness/2+tolerance)*2,0,0])
+ { square((male_joint_thickness/2+tolerance)*2, center=true); }
+ }
+ // Backward rotation
+ mirror([0,1,0]) hull()
+ {
+ circle(r=male_joint_thickness/2+tolerance, $fn=fn);
+ for(j=[0:-backward_rom/rotation_degrees]) rotate([0,0,j*rotation_degrees])
+ translate([male_joint_height+(male_joint_thickness/2+tolerance)*2,0,0])
+ { square((male_joint_thickness/2+tolerance)*2, center=true); }
+ }
+ }
+ for(i=[0,1]) mirror([0,0,i])
+ translate([0,0,male_joint_width/2+tolerance])
+ cylinder(r=male_joint_thickness, h=male_joint_width+tolerance*2, $fn=fn, center=false);
+ }
+ }
+
+module joint_male_vertical(male_joint_width=4, male_joint_thickness=5, male_joint_height=8, fn=facets)
+ {
+ difference()
+ {
+ joint_male_solid(male_joint_width, male_joint_thickness, male_joint_height, fn);
+ joint_male_cutout(male_joint_width, male_joint_thickness, male_joint_height, fn);
+ }
+ }
+
+module joint_male_horizontal(male_joint_width=4, male_joint_thickness=5, male_joint_height=8, fn=facets)
+ {
+ translate([0,male_joint_height/2,male_joint_thickness/2]) rotate([90,0,0])
+ joint_male_vertical(male_joint_width, male_joint_thickness, male_joint_height, fn);
+ }
+
+module joint_male_solid(male_joint_width=4, male_joint_thickness=5, male_joint_height=8, fn=facets)
+ {
+ difference()
+ {
+ union()
+ {
+ // Main joint
+ translate([0,0,(male_joint_height-male_joint_thickness/2)/2])
+ cube([male_joint_width, male_joint_thickness, male_joint_height-male_joint_thickness/2], center=true);
+ // Rounded edge of joint
+ translate([0,0,male_joint_height-male_joint_thickness/2]) rotate([0,90,0])
+ cylinder(r=male_joint_thickness/2, h=male_joint_width, center=true,$fn=fn);
+ // Sphere/buds, on either side
+ for (i=[0,1])
+ {
+ mirror([i,0,0]) translate([(male_joint_width/2-male_joint_thickness/8+tolerance), 0, male_joint_height-male_joint_thickness/2])
+ sphere(r=male_joint_thickness/4, $fn=fn/2);
+ }
+ }
+ // In some circumstances, the rounded edge can protrude below the build surface, this cuts that off
+ if (male_joint_thickness>male_joint_height)
+ {
+ translate([0,0,-male_joint_height*1.1/2])
+ cube([male_joint_width+male_joint_thickness/2, male_joint_thickness+1, male_joint_height*1.1], center=true);
+ }
+ }
+ }
+
+module joint_male_cutout(male_joint_width=4, male_joint_thickness=5, male_joint_height=8, fn=facets)
+ {
+ // Middle cutout - this is important so that the part will flex as it is inserted. We need to consider several uses
+
+ // Thin, but wide male connector
+ if (male_joint_height > male_joint_width*1.5 && male_joint_width > male_joint_thickness*1.5)
+ {
+ translate([0,0,male_joint_height*3/2-male_joint_width])
+ cube([male_joint_width/3, male_joint_thickness+1, male_joint_height], center=true);
+ }
+ // Thick, but narrow male connector
+ else if (male_joint_height-male_joint_thickness > male_joint_width && male_joint_width < male_joint_thickness)
+ {
+ translate([0,0,male_joint_height*3/2-male_joint_thickness])
+ cube([male_joint_width/4, male_joint_thickness+1, male_joint_height], center=true);
+ }
+ // Square footprint male connector
+ else if (male_joint_height-male_joint_thickness > male_joint_width && male_joint_width == male_joint_thickness)
+ {
+ translate([0,0,male_joint_height*3/2-male_joint_thickness*1.25])
+ cube([male_joint_width/4, male_joint_thickness+1, male_joint_height], center=true);
+ }
+ // Cases where the connector is really short
+ else
+ {
+ translate([0,0,male_joint_height/2+male_joint_height*0.25])
+ cube([male_joint_width/4, male_joint_thickness+1, male_joint_height], center=true);
+ }
+
+ }