Wed, 12 Sep 2018 13:46:21 +0200
added syringe mount hole
// fluid 1-to-N-way rotation Valve // 1 Inlet, N Outlets // Variables: oring_outer = 8.0; oring_inner = 4.0; tube_dia = 3; hole_inner = 2; axis_dia = 5; // for color mixer we need 3 base colors + black + white + additional 1 waste and 1 clean water and one output = 8 connectors // cycle will be: // 1) select color 1-5, load syringe, select output, unload syringe, repeat for each other color // 2) select water, load syringe, select waste, unload syringe outlets = 8; // just fiddle around with the following variables: outlet_circle_dia = 22; base_dia = 30; // roundness faces fn = 10; // calculations: oring_dia = (oring_outer - oring_inner) / 2; outlet_angle = 360/outlets; base_height = 6; base_outer_dia = base_dia + 6; outer_thread_height = 10; outer_height = 15; thread_pitch = 2; inlay_height = outlet_circle_dia / 4 + hole_inner; // adjust this to make the center hole look nice according to whicj oring you use base_bottom_thickness = 9 - base_height - 0.001; // START PROGRAM use <../libs/Threading/Threading.scad> valve_lower(); /* translate([0,0,base_height]) valve_inlay(); rotate([180,0,0]) translate([0,0,-outer_height - 2]) valve_cap(); */ // MODULES module valve_inlay() union() { difference() { translate([0,0,0.0001]) cylinder(d=base_dia, h = inlay_height); // cut out the connector tube rotate([90,0,0]) translate([outlet_circle_dia/4,0,0]) rotate_extrude(convexity=10) translate([outlet_circle_dia/4, 0]) circle(d=hole_inner, $fn=fn); // cylinder(d=oring_inner, h=inlay_height / 2, $fn=fn); // translate([outlet_circle_dia/2,0]) // cylinder(d=oring_inner, h=inlay_height / 2, $fn=fn); } // hex drive rod translate([0,0,inlay_height]) cylinder(d=axis_dia, h=20, $fn=6); } module valve_cap() { cap_sides = 50; difference() { union() { translate([0,0,2]) Threading(D = base_outer_dia + 6, pitch = thread_pitch, d=base_outer_dia, windings = (outer_thread_height/thread_pitch), angle = 55, full = true, step = 50, $fn=cap_sides); cylinder(d=base_outer_dia + 6, h=2, $fn=cap_sides); } translate([0,0,-0.001]) cylinder(d=axis_dia + 2, h=2 + 0.002, $fn=fn); } } module valve_lower() difference() { union() { valve_base(); valve_casing(); // bottom translate([0,0,-base_bottom_thickness]) cylinder(d=base_outer_dia, h=base_bottom_thickness); } // cut out the OUTLET ring on the side for(i = [1:outlets]) { a = outlet_angle * i; rotate([90,0,a]) { translate([outlet_circle_dia/2 - hole_inner/2,tube_dia/2,0]) rotate([0,90,0]) cylinder(d=tube_dia, h=base_outer_dia, $fn=fn); } } // cut out the syringe hole (needs to be conical to fit) translate([0,0,-base_bottom_thickness - 0.001]) cylinder(d1 = 4.5, d2 = 4, h = 9, $fn=fn); // in my case the oring inner diameter corresponds to the syringe tip diameter (4 mm) - so I remove the inner unprintable walls of the center oring grove translate([0,0,base_height - oring_dia / 2]) cylinder(d=oring_inner + oring_dia, h = 2); } module valve_casing() { difference() { union() { translate([0,0,0.001]) cylinder(d=base_outer_dia, h=outer_height - outer_thread_height); translate([0,0,outer_height - outer_thread_height]) threading(pitch = thread_pitch, d=base_outer_dia, windings = (outer_thread_height/thread_pitch)-1, angle = 55, full = true, $fn=fn); } cylinder(d=base_dia, h = outer_height + 0.001); } } module valve_base() difference() { cylinder(d=base_dia, h=base_height); // inlet hole cylinder(d=hole_inner, h=base_height +0.001, $fn=fn); translate([0,0,base_height]) oring(); // cut Outlet holes and oring carves for(i = [1:outlets]) { a = outlet_angle * i; rotate([0,0,a]) { translate([outlet_circle_dia/2,0,base_height]) oring(); translate([outlet_circle_dia/2,0]) cylinder(d=hole_inner, h=base_height + 0.001, $fn=fn); } } } module oring() { rotate_extrude(convexity=10, $fn=fn) translate([oring_inner/2 + oring_dia / 2 , 0, 0]) circle(d=oring_dia, $fn=fn); }