$fn=100; dia = 155; height = 200; bubble_ring_space = 30; funnel_opening_dia = 20; funnel_opening_clearance = 0.3; axis_dia = 2.5; min_wall_thickness = 2; outer_dia = dia+2*min_wall_thickness; mount_width=30; mount_length=90; mount_thick=3; mount_holedia=2.5; mount_spacing=105/2; // at least half diameter of pulley plus clearance module tank() { difference() { union() { translate([0,1,4]) difference() { rotate([90,0,0]) cylinder(d=outer_dia, h=20); translate([-(dia/2+10),-29,-(dia/2+5)]) cube([dia+20,30,dia/2+1]); translate([0,-2,0]) rotate([90,0,0]) cylinder(d=dia, h=20-4); difference() { translate([0,1,0]) rotate([90,0,0]) cylinder(r=dia/2, h=20-4); translate([-(dia/2+1),-2,dia/2-bubble_ring_space-7]) cube([dia+2,200,200]); } } difference() { intersection() { cylinder(d=outer_dia, h=height); translate([0,height,4]) rotate([90,0,0]) cylinder(d=outer_dia, h=200); } translate([-(outer_dia/2+1),-1,dia/2-bubble_ring_space]) rotate([-3,0,0]) cube([dia+2,200,200]); // make the tank hollow translate([0,-1,0]) difference() { intersection() { cylinder(r=dia/2, h=height); translate([0,height,0]) rotate([90,0,0]) cylinder(d=outer_dia, h=200); } translate([-(outer_dia/2),-1,]) cube([outer_dia,200,1.5]); translate([-(dia/2+1),-1,dia/2-bubble_ring_space-3]) rotate([-3,0,0]) cube([dia,200,15]); } } // close the upper part of the tank towards the bubble wheel intersection() { translate([0,height,0]) rotate([90,0,0]) cylinder(r=outer_dia/2, h=200); translate([-dia/2,0,0]) cube([dia, 1.5, 15]); } // supports, which also serve to reduce sloshing effects difference() { intersection() { for (i = [ 10 : 10 : dia*1-10]) { translate([-(dia*1)/2+i+2, 0,0]) cube([0.8, dia/2, dia/2-funnel_opening_dia-10]); } cylinder(r=dia/2, h=height); } translate([-(dia/2+1),-2,dia/2-bubble_ring_space]) rotate([-3,0,0]) cube([dia+2,200,200]); translate([-dia/2,dia/5,0]) rotate([0,90,0]) cylinder(r=5, h=dia); } } // now the fluid opening translate([0,dia/3,0]) sphere(r=funnel_opening_dia/2); // now the holes for the axis translate([0,7,5]) rotate([90,0,0]) cylinder(d=axis_dia, h=30); } // now the mount, taking care that it leaves enough space for the gear translate([-mount_length/2, +2-20-mount_width,5+mount_spacing]) difference() { union() { cube([mount_length, mount_width, mount_thick]); translate([0,mount_width/2,-mount_width/2]) cube([mount_length, mount_width/2, mount_width/2]); } for (i = [ 1 : 4 ]) { translate([mount_length/5*i,mount_width/2-2,-1]) cylinder(d=mount_holedia, h=mount_thick+2); } translate([-1,mount_width/2,-mount_width/2]) rotate([0,90,0]) cylinder(h=mount_length+2, r=mount_width/2); } } tank(); // bevel // Cut for illustration purposes //difference() { // tank(); // translate([-100,-100,-50]) // rotate([-20,10,0]) // cube([200,200,100]); //} // cap translate([dia,0,0]) { cylinder(d=funnel_opening_dia-funnel_opening_clearance, h=3.5); cylinder(d=funnel_opening_dia+10, h=1); }