bellows_front = 40.6; bellows_back = 100; bellows_length = 90; fit_gap = .5; module cam_front(){ difference(){ rotate([90,0,0])linear_extrude(height=10)polygon(points=[[0,0],[-10,25],[-10,35],[0,60],[60,60],[70,35],[70,25],[60,0]]); translate([30,20,30])rotate([90,0,0])cylinder(h=40,r=10); translate([(60-(bellows_front+fit_gap))/2,-5,(60-(bellows_front+fit_gap))/2])cube([bellows_front+fit_gap,6,bellows_front+fit_gap]); translate([60,-5,30])rotate([0,90,0])cylinder(h=11,r=2); translate([-11,-5,30])rotate([0,90,0])cylinder(h=11,r=2); translate([48,0,30])rotate([90,0,0])cylinder(h=10,r=2); } } module lens_base_p1(){ difference(){ union(){ translate([30,-5,30])rotate([90,0,0])cylinder(h=5.3,r=9.75 , $fn=100); translate([30,-5,30])rotate([90,0,0])cylinder(h=7.5,r=9.5 , $fn=100); } translate([30,-5,30])rotate([90,0,0])cylinder(h=7.5,r=8); } } module lens_base_p2(){ difference(){ translate([30,-25.5,30])rotate([90,0,0])cylinder(h=8,r=18 ,$fn=100); translate([30,-27.5,30])rotate([90,0,0])cylinder(h=8,r=16); translate([30,-12.5,30])rotate([90,0,0])cylinder(h=15,r=15); } } module lens_base(){ difference(){ union(){ //translate([30,-5,30])rotate([90,0,0])cylinder(h=7.5,r=9.75 , $fn=100); translate([30,-10.5,30])rotate([90,0,0])cylinder(h=2,r=20 ,$fn=100); translate([30,-10.5,30])rotate([90,0,0])cylinder(h=15,r=15, $fn=100); translate([30,-25.5,30])rotate([90,0,0])cylinder(h=2,r=14.75, $fn=100); //translate([30,-25.5,30])rotate([90,0,0])cylinder(h=8,r=18 ,$fn=100); hull(){ translate([30,-10.5,30])rotate([90,0,0])cylinder(h=10,r=15, $fn=100); translate([50,-10,25])rotate([90,0,0])cube([10,10,10]); } } union(){ translate([30,-5,30])rotate([90,0,0])cylinder(h=7.5,r=9.75); translate([30,-12.5,30])rotate([90,0,0])cylinder(h=15.5,r=13); //translate([30,-27.5,30])rotate([90,0,0])cylinder(h=8,r=16); translate([55,-15,20])rotate([0,0,0])cylinder(h=8,r=2); translate([44,-10,26])rotate([90,0,0])cube([14,8,8]); } } //lens_base_p1(); //lens_base_p2(); } module pi_cam(){ difference(){ translate([15,-5,15])cube([30,4,30]); union(){ translate([25,-6,25])cube([10,5,10]); translate([25,-4,25])cube([10,3,19.5]); translate([17.5,-1,20.5])cube([25,1,24]); translate([35,-3,38])cube([4,2,4]); translate([19.5,0,30])rotate([90,0,0])cylinder(h=5,r=.75,$fn=100); translate([19.5,0,42.5])rotate([90,0,0])cylinder(h=5,r=.75,$fn=100); translate([40.5,0,30])rotate([90,0,0])cylinder(h=5,r=.75,$fn=100); translate([40.5,0,42.5])rotate([90,0,0])cylinder(h=5,r=.75,$fn=100); } } } module cam_back(){ difference(){ translate([-3, 0 ,-3])cube([bellows_back+16,20,bellows_back+16]); translate([5, 0 ,5])cube([bellows_back+fit_gap,5,bellows_back+fit_gap]); translate([7, 5 ,7])cube([bellows_back-4,20,bellows_back-4]); translate([0, 7 ,0])cube([bellows_back+10,20,bellows_back+10]); translate([28, 7 ,-3])cube([14,20,16]); } } module cam_base(){ difference(){ translate([-3, 0 ,0])cube([bellows_back+16,bellows_back+16,8]); #translate([25, 29.25 ,3])rotate([0,0,0])linear_extrude(height=10)polygon(points=[[0,0],[-10,25],[-10,35],[0,60],[60,60],[70,35],[70,25],[60,0]]); #translate([27.5, 31.75 ,0])resize([0,55,0], auto=true) rotate([0,0,0])linear_extrude(height=10)polygon(points=[[0,0],[-10,25],[-10,35],[0,60],[60,60],[70,35],[70,25],[60,0]]); //translate([25, 90 ,13])rotate([90,0,0])cam_front(); //translate([((bellows_back+10)-(bellows_back-20))/2 , ((bellows_back+20)-(bellows_back-30))/2 ,0])cube([bellows_back-20,bellows_back-30,8]); } } module cam_arm(){ difference(){ union(){ translate([0,0,80])rotate([0,90,0])cylinder(h=2,r=5,$fn=100); hull(){ translate([0,-5,20])cube([2,10,60]); translate([0,0,0])rotate([0,90,0])cylinder(h=2,r=3,$fn=100); } } translate([-1,0,0])rotate([0,90,0])cylinder(h=4,r=.75,$fn=100); hull(){ translate([-1,0,80])rotate([0,90,0])cylinder(h=4,r=2,$fn=100); translate([-1,0,20])rotate([0,90,0])cylinder(h=4,r=2,$fn=100); } } } module l_bracket(){ difference(){ union(){ translate([0,0,0])cube([2,25,10]); translate([0,0,0])cube([10,25,2]); } translate([-1,5,7])rotate([0,90,0])cylinder(h=4,r=.75,$fn=100); translate([-1,20,7])rotate([0,90,0])cylinder(h=4,r=.75,$fn=100); translate([8,5,0])rotate([0,0,0])cylinder(h=4,r=1,$fn=100); translate([8,20,0])rotate([0,0,0])cylinder(h=4,r=1,$fn=100); } } module thumb_screw(){ union(){ cylinder(h=10,r=1.75,$fn=100); translate([0,0,10])cylinder(h=1,r=7,$fn=100); translate([0,0,11])cylinder(h=4,r=10,$fn=100); } } module washer(){ difference(){ cylinder(h=2,r=7,$fn=100); cylinder(h=2,r=2,$fn=100); } } module cam(){ cam_front(); pi_cam(); lens_base(); lens_base_p1(); lens_base_p2(); translate([30-(bellows_back+10)/2, bellows_length ,30-(bellows_back+10)/2])cam_back(); translate([30-(bellows_back+10)/2, -20 ,27-(bellows_back+10)/2])cam_base(); translate([70.5, -0 ,40-(bellows_back+10)/2])rotate([6,0,0])cam_arm(); translate([75.5, -15 ,40-(bellows_back+10)/2])rotate([-12.5,0,0])cam_arm(); translate([-12.5, -0 ,40-(bellows_back+10)/2])rotate([6,0,0])cam_arm(); translate([-17.5, -15 ,40-(bellows_back+10)/2])rotate([-12.5,0,0])cam_arm(); translate([-15, -20 ,33-(bellows_back+10)/2])l_bracket(); translate([75, 5 ,33-(bellows_back+10)/2])rotate([0,0,180])l_bracket(); translate([68.5, -5 ,30])rotate([0,90,0])thumb_screw(); translate([-8, -5 ,30])rotate([0,-90,0])thumb_screw(); translate([75, -5 ,30])rotate([0,-90,0])washer(); translate([-13, -5 ,30])rotate([0,-90,0])washer(); } cam();