3D Printed peristaltic pump - infrawiki/infrawiki GitHub Wiki

Summary

right The pump prints as a single piece – no assembly required! – with captive rollers and no rotary bearing/wear surfaces. The only extra part needed is a length of surgical tubing to thread through the mechanism. This initial print is a proof-of-concept and is driven by a standard 1/4″(?) hex nut driver or Allen key: for a real application, you’d want to add a mount for an electric motor or similar. right

OpenSCAD

3D Printed peristaltic pump

// Planetary peristaltic pump (customizable) // by Drmn4ea (drmn4ea at google's mail) // // Released under the Creative Commons - Attribution - Share Alike license (http://creativecommons.org/licenses/by-sa/3.0/) // // Adapted from Emmett Lalish's Planetary Gear Bearing at http://www.thingiverse.com/thing:53451

// -------- Printer-related settings ------------

// Clearance to generate between non-connected parts. If the gears print 'stuck together' or are difficult to separate, try increasing this value. If there is excessive play between them, try lowering it. (default: 0.15mm) tol=0.15;

// Allowed overhang for overhang removal; between 0 and 0.999 (0 = none, 0.5 = 45 degrees, 1 = infinite) allowed_overhang = 0.75;

// -------- Details of the tubing used in the pump, in mm ------------

// Outer diameter of your tubing in mm tubing_od = 4.7625;

// Wall thickness of your tubing tubing_wall_thickness = 0.79375; // Amount the tubing should be compressed by the rollers, as a proportion of total thickness (0 = no squish, 1.0 = complete squish) tubing_squish_ratio = 0.5;

// -------- Part geometry settings ------------

// Approximate outer diameter of ring in mm D=51.7;

// Thickness i.e. height in mm T=15;

// Number of planet gears number_of_planets=3;

// Number of teeth on planet gears number_of_teeth_on_planets=7;

// Number of teeth on sun gear (approximate) approximate_number_of_teeth_on_sun=9;

// pressure angle P=45;//[30:60]

// number of teeth to twist across nTwist=1;

// width of hexagonal hole w=6.7;

DR=0.5*1;// maximum depth ratio of teeth

// ----------------End of customizable values -----------------

m=round(number_of_planets); np=round(number_of_teeth_on_planets); ns1=approximate_number_of_teeth_on_sun; k1=round(2/m*(ns1+np)); k= k1*m%2!=0 ? k1+1 : k1; ns=k*m/2-np; echo(ns); nr=ns+2*np; pitchD=0.9*D/(1+min(PI/(2*nr*tan(P)),PI*DR/nr)); pitch=pitchD*PI/nr; echo(pitch); helix_angle=atan(2*nTwist*pitch/T); echo(helix_angle);

phi=$t*360/m;

// compute some parameters related to the tubing tubing_squished_width = tubing_od * (PI/2); tubing_depth_clearance = 2*(tubing_wall_thickness*(1-tubing_squish_ratio));

// temporary variables for computing the outer radius of the outer ring gear teeth // used to make the clearance for the peristaltic squeezer feature on the planets outerring_pitch_radius = nr*pitch/(2*PI); outerring_depth=pitch/(2*tan(P)); outerring_outer_radius = tol<0 ? outerring_pitch_radius+outerring_depth/2-tol : outerring_pitch_radius+outerring_depth/2;

// temporary variables for computing the outer radius of the planet gear teeth // used to make the peristaltic squeezer feature on the planets planet_pitch_radius = np*pitch/(2*PI); planet_depth=pitch/(2*tan(P)); planet_outer_radius = tol<0 ? planet_pitch_radius+planet_depth/2-tol : planet_pitch_radius+planet_depth/2;

// temporary variables for computing the inside & outside radius of the sun gear teeth // used to make clearance for planet squeezers sun_pitch_radius = ns*pitch/(2*PI); sun_base_radius = sun_pitch_radius*cos(P); echo(sun_base_radius); sun_depth=pitch/(2*tan(P)); sun_outer_radius = tol<0 ? sun_pitch_radius+sun_depth/2-tol : sun_pitch_radius+sun_depth/2; sun_root_radius1 = sun_pitch_radius-sun_depth/2-tol/2; sun_root_radius = (tol<0 && sun_root_radius1<sun_base_radius) ="" (pitch_angle="1," min_radius="number_of_teeth_on_planets," circular_pitch="pitch," pressure_angle="P," depth_ratio="DR," clearance="tol);&#10;//}&#10;&#10;translate([0,0,T/2])&#10;{&#10; //" entered... cylinder(r="D/2" tubing_depth_clearance,h="100);&#10; exitholes(outerring_outer_radius-tubing_od/4,tubing_od," len="100);&#10; union()&#10; {&#10; //" double... herringbone(nr,pitch,P,DR,-2*tol,helix_angle,T+0.2); cylinder(r="100);&#10; //" diameter. translate([0,]) { cylinder(r1="outerring_outer_radius+tubing_depth_clearance," r2="100);&#10; }&#10; }&#10; &#10; }&#10;&#10;&#10;&#10; //" outerring_depth)/tan(allowed_overhang*90),center="100);&#10; }&#10; }&#10; }&#10;&#10;&#10;&#10; //" hole cylinder(r="6);&#10; //" surface difference() { cylinder(r="100);&#10; }&#10; }&#10;&#10; //" trim. //h="abs((sun_min_radius-tol)-sun_outer_radius)*(1-allowed_overhang)&#10; //" h="sun_min_radius-tol," gears

for(i="[1:m])&#10; {&#10;&#10; rotate([0,0,i*360/m+phi])&#10; {&#10; &#10; translate([pitchD/2*(ns+np)/nr,0,0])&#10; {&#10; rotate([0,0,i*ns/m*360/np-phi*(ns+np)/np-phi])&#10; {&#10; union()&#10; {&#10; herringbone(np,pitch,P,DR,tol,helix_angle,T);&#10; //" itself cylinder(r="100);&#10;&#10; //"></sun_base_radius)>planets roller cylinders. // create the outline of a gear where the herringbone meets the cylinder; // make its angle match the twist at this point. // Then difference this flat gear from a slightly larger cylinder, extrude it with an // outward-growing angle, and cut the result from the cylinder. planet_overhangfix(np, pitch, P, DR, tol, helix_angle, T, tubing_squished_width, allowed_overhang);

}

}

} } } }

}

module planet_overhangfix( number_of_teeth=15, circular_pitch=10, pressure_angle=28, depth_ratio=1, clearance=0, helix_angle=0, gear_thickness=5, tubing_squished_width, allowed_overhang) {

height_from_bottom = (gear_thickness/2) - (tubing_squished_width/2); pitch_radius = number_of_teeth*circular_pitch/(2*PI); twist=tan(helix_angle)*height_from_bottom/pitch_radius*180/PI; // the total rotation angle at that point - should match that of the gear itself

translate([0,0,]) // relative to center height, where this is used { // FIXME: This calculation is most likely wrong... //rotate([0,]) rotate([0,]) { // want to extrude to a height proportional to the distance between the root of the gear teeth // and the outer edge of the cylinder linear_extrude(height=tubing_squished_width-clearance,twist=0,slices=6, scale=1+(1/(1-allowed_overhang))) { gear2D(number_of_teeth=number_of_teeth, circular_pitch=circular_pitch, pressure_angle=pressure_angle, depth_ratio=depth_ratio, clearance=clearance); } } } }

module exitholes(distance_apart, hole_diameter) { translate([distance_apart,]) { rotate([90,]) { cylinder(r=hole_diameter/2,h=len,center=true,$fn=100); } }

mirror([1,0,0]) { translate([distance_apart,]) { rotate([90,]) { cylinder(r=hole_diameter/2,h=len,center=true,$fn=100); } } } }

module rack( number_of_teeth=15, circular_pitch=10, pressure_angle=28, helix_angle=0, clearance=0, gear_thickness=5, flat=false){ addendum=circular_pitch/(4*tan(pressure_angle));

flat_extrude(h=gear_thickness,flat=flat)translate([0,-clearance*cos(pressure_angle)/2]) union(){ translate([0,-0.5-addendum])square([number_of_teeth*circular_pitch,1],center=true); for(i=[1:number_of_teeth]) translate([circular_pitch*(i-number_of_teeth/2-0.5),0]) polygon(points=-circular_pitch/2,-addendum],[circular_pitch/2,-addendum],[0,addendum); } }

//module monogram(h=1) //linear_extrude(height=h,center=true) //translate(-[3,2.5])union(){ // difference(){ // square([4,5]); // translate([1,1])square([2,3]); // } // square([6,1]); // translate([0,2])square([2,1]); //}

module herringbone( number_of_teeth=15, circular_pitch=10, pressure_angle=28, depth_ratio=1, clearance=0, helix_angle=0, gear_thickness=5){ union(){ //translate([0,0,10]) gear(number_of_teeth, circular_pitch, pressure_angle, depth_ratio, clearance, helix_angle, gear_thickness/2); mirror([0,0,1]) gear(number_of_teeth, circular_pitch, pressure_angle, depth_ratio, clearance, helix_angle, gear_thickness/2); }}

module gear ( number_of_teeth=15, circular_pitch=10, pressure_angle=28, depth_ratio=1, clearance=0, helix_angle=0, gear_thickness=5, flat=false){ pitch_radius = number_of_teeth*circular_pitch/(2*PI); twist=tan(helix_angle)*gear_thickness/pitch_radius*180/PI;

flat_extrude(h=gear_thickness,twist=twist,flat=flat) gear2D ( number_of_teeth, circular_pitch, pressure_angle, depth_ratio, clearance); }

module flat_extrude(h,twist,flat){ if(flat==false) linear_extrude(height=h,twist=twist,slices=twist/6, scale=1)child(0); else child(0); }

module gear2D ( number_of_teeth, circular_pitch, pressure_angle, depth_ratio, clearance){ pitch_radius = number_of_teeth*circular_pitch/(2*PI); base_radius = pitch_radius*cos(pressure_angle); depth=circular_pitch/(2*tan(pressure_angle)); outer_radius = clearance<0 ? pitch_radius+depth/2-clearance : pitch_radius+depth/2; root_radius1 = pitch_radius-depth/2-clearance/2; root_radius = (clearance<0 && root_radius1<base_radius) ="" (base_radius,root_radius);

intersection(){ rotate(90/number_of_teeth) circle($fn="max(root_radius,pitch_radius-depth_ratio*circular_pitch/2-clearance/2));&#10; for" ( pitch_angle, base_radius, min_radius, outer_radius, half_thick_angle){ index="[0,1,2,3,4,5];&#10;start_angle" outer_radius); angle="p);&#10; square(2*outer_radius);&#10;}}&#10;&#10;//" Functions //="&#10;&#10;//"></base_radius)>its center. //source: http://www.mathhelpforum.com/math-help/geometry/136011-circle-involute-solving-y-any-given-x.html

function involute_intersect_angle (base_radius, radius) = sqrt (pow (radius/base_radius, 2) - 1) * 180 / PI;

// Calculate the involute position for a given base radius and involute angle.

function involute (base_radius, involute_angle) = [ base_radius*(cos];

Category:OSAT 3D-Printable Designs

⚠️ **GitHub.com Fallback** ⚠️