committed by
Schoenberger, Philipp
No known key found for this signature in database
GPG Key ID: 77E9DF7A0452BF64
4 changed files with 299 additions and 251 deletions
@ -0,0 +1,31 @@ |
|||||
|
module aligned_cube(size, aligned=[1,1,0]) |
||||
|
{ |
||||
|
translate(-0.5*[size[0]*aligned[0], size[1]*aligned[1], size[2]*aligned[2]]) |
||||
|
cube(size); |
||||
|
} |
||||
|
|
||||
|
module rounded_cube(size, r, aligned=[1,1,0]) |
||||
|
{ |
||||
|
translate(-0.5*[size[0]*aligned[0] -2*r, size[1]*aligned[1] -2*r, size[2]*aligned[2] -2*r]) |
||||
|
minkowski() { |
||||
|
cube([size[0] - 2*r, size[1] - 2*r, size[2]- 2*r]); |
||||
|
sphere(r); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
module cylinder_flange_sphere($fn=32,r1=10, r2=15, h=5) |
||||
|
{ |
||||
|
diff=abs(r1-r2); |
||||
|
h_off= (r1 < r2 ) ? 0 : h/2; |
||||
|
|
||||
|
|
||||
|
difference() |
||||
|
{ |
||||
|
cylinder($fn=$fn, r=max(r2,r1),h=h); |
||||
|
scale([1,1,h/diff]) |
||||
|
rotate_extrude() |
||||
|
translate([diff+min(r2,r1),h_off]) |
||||
|
rotate([0,0,0]) |
||||
|
circle($fn=$fn,r=diff); |
||||
|
} |
||||
|
} |
@ -0,0 +1,13 @@ |
|||||
|
module triangle(o_len=5, a_len=5, depth=1) |
||||
|
{ |
||||
|
linear_extrude(height=depth) { |
||||
|
polygon(points=[[0,0],[a_len,0],[0,o_len]], paths=[[0,1,2]]); |
||||
|
} |
||||
|
} |
||||
|
module aligned_triangle(o_len=5, a_len=5, depth=1) |
||||
|
{ |
||||
|
linear_extrude(height=depth) { |
||||
|
translate([-o_len/2,-a_len/2,0]) |
||||
|
polygon(points=[[0,0],[a_len,0],[0,o_len]], paths=[[0,1,2]]); |
||||
|
} |
||||
|
} |
@ -0,0 +1,255 @@ |
|||||
|
$fn = 25; |
||||
|
with_props=0; |
||||
|
with_motor=0; |
||||
|
with_pcbs=1; |
||||
|
with_akku=0; |
||||
|
with_frame=1; |
||||
|
|
||||
|
name="Toolbox"; |
||||
|
version="v1"; |
||||
|
text_depth=0.75; |
||||
|
|
||||
|
|
||||
|
|
||||
|
motor_d = 8.465; |
||||
|
motor_r=motor_d/2; |
||||
|
motor_height = 20; |
||||
|
|
||||
|
motor_clamp_wall_thickness = 2.2; |
||||
|
motor_clamp_d= motor_d + 2*motor_clamp_wall_thickness; |
||||
|
motor_clamp_r= motor_clamp_d /2; |
||||
|
motor_clamp_cut = 3; |
||||
|
motor_clamp_extra_hight = 3; |
||||
|
motor_clamp_hight = motor_height + motor_clamp_extra_hight; |
||||
|
|
||||
|
usb_width=12; |
||||
|
usb_hight=8; |
||||
|
|
||||
|
motor_helper_disc = 40; |
||||
|
motor_helper_height = 0.2; |
||||
|
|
||||
|
motor_arm_width = 8; |
||||
|
motor_arm_height = 6; |
||||
|
motor_arm_length = 20; |
||||
|
|
||||
|
body_width = 40; |
||||
|
body_height = 12; |
||||
|
body_wall_thickness = 2; |
||||
|
body_bottom_flange = 5; |
||||
|
body_bottom_bridge = 3; |
||||
|
|
||||
|
triangle_cut_height = 10; |
||||
|
cable_cut_width = 3; |
||||
|
cable_cut_height = 3; |
||||
|
|
||||
|
akku_holder_hight = 9.1; |
||||
|
akku_holder_width =27; |
||||
|
motor_body_arm_dist = (body_width - motor_arm_width + 2) / sqrt(2); |
||||
|
eps=0.05; |
||||
|
|
||||
|
include <lib/aligned_cube.scad>; |
||||
|
include <lib/triangle.scad>; |
||||
|
|
||||
|
module triangle_cuts(h=4) { |
||||
|
triangle_width= body_width / 2; |
||||
|
h_tri=((body_width - body_bottom_flange - body_bottom_bridge)/2 - sqrt(2)* body_wall_thickness)* sqrt(2); |
||||
|
for(r=[0:90:359]) |
||||
|
{ |
||||
|
rotate([0,0,r]) |
||||
|
translate([0,body_width/2 -body_bottom_flange,0]) { |
||||
|
rotate([0,0,45]) |
||||
|
aligned_triangle(h_tri, h_tri, h); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
module pcb_flight_controller() { |
||||
|
flight_controller = [20, 28,2]; |
||||
|
cube(flight_controller); |
||||
|
} |
||||
|
|
||||
|
module pcb_rx_radio() { |
||||
|
rx_radio=[12,25,2]; |
||||
|
cube(rx_radio); |
||||
|
} |
||||
|
|
||||
|
module motor() { |
||||
|
prop_height=motor_height + 5; |
||||
|
color([0.8,0.2,0.2,0.5]) { |
||||
|
if (with_motor) { |
||||
|
translate([0, 0, motor_clamp_extra_hight]) |
||||
|
cylinder(d = motor_d, h = motor_height ); |
||||
|
translate([0, 0, motor_clamp_extra_hight]) |
||||
|
cylinder(d = 2, h = prop_height); |
||||
|
} |
||||
|
if (with_props) { |
||||
|
translate([0, 0, prop_height]) |
||||
|
cylinder(d = 66.5, h = 2); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
module motor_clamp() { |
||||
|
// motor / prop mockup |
||||
|
|
||||
|
difference() { |
||||
|
union () { |
||||
|
color("blue") |
||||
|
// motor stand |
||||
|
hull() { |
||||
|
cylinder(d = motor_d + motor_clamp_wall_thickness, h = motor_clamp_hight); |
||||
|
|
||||
|
translate([0, -(motor_d + motor_clamp_wall_thickness) / 2 - 2, 0]) |
||||
|
aligned_cube([motor_arm_width, eps, motor_arm_height]); |
||||
|
} |
||||
|
|
||||
|
// print support |
||||
|
color("green") |
||||
|
cylinder(d = motor_helper_disc, h = motor_helper_height); |
||||
|
} |
||||
|
|
||||
|
// cable hole |
||||
|
// motor hole |
||||
|
translate([0, 0, -eps]) |
||||
|
cylinder(d = motor_d, h = motor_height + 2 +eps); |
||||
|
// clamp cutout |
||||
|
translate([0, motor_r, -eps]) |
||||
|
aligned_cube([motor_clamp_cut, 2 * motor_clamp_wall_thickness, motor_clamp_hight+2*eps]); |
||||
|
// motor top hole |
||||
|
translate([0, 0, motor_clamp_hight - motor_clamp_wall_thickness+eps]) |
||||
|
cylinder(d = 6.5, h = motor_clamp_wall_thickness); |
||||
|
// angle motor top cut for better printing |
||||
|
translate([0, 0, motor_clamp_hight-1-eps]) |
||||
|
cylinder(d1=motor_d, d2=6.5, h=0.75); |
||||
|
} |
||||
|
|
||||
|
motor(); |
||||
|
} |
||||
|
|
||||
|
module motor_arm() { |
||||
|
difference() { |
||||
|
union() { |
||||
|
translate([0, motor_arm_length+motor_clamp_r, 0]) |
||||
|
motor_clamp(); |
||||
|
color("blue") { |
||||
|
aligned_cube([motor_arm_width, motor_arm_length, motor_arm_height],[1,0,0]); |
||||
|
} |
||||
|
} |
||||
|
cable_cuts(); |
||||
|
} |
||||
|
} |
||||
|
module cable_cuts() { |
||||
|
union() { |
||||
|
// vertical cut |
||||
|
translate([0, motor_arm_length, -eps]) |
||||
|
aligned_cube([cable_cut_width, cable_cut_height, motor_clamp_hight+2*eps]); |
||||
|
|
||||
|
// lower cut |
||||
|
translate([0, motor_arm_length , -eps]) |
||||
|
aligned_cube([cable_cut_width, cable_cut_height, cable_cut_height+eps],[1,0,0]); |
||||
|
|
||||
|
// horizontal cut |
||||
|
translate([0, -eps,motor_arm_height+eps]) |
||||
|
aligned_cube([cable_cut_width,motor_arm_length, , cable_cut_height],[1,0,2]); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
module body() { |
||||
|
arm_offset=(body_width - motor_arm_width/sqrt(2))/sqrt(2); |
||||
|
difference() { |
||||
|
union() { |
||||
|
// arms |
||||
|
for(r = [45 : 90 : 360]) { |
||||
|
rotate([0, 0, r]) |
||||
|
translate([0,arm_offset,0]) |
||||
|
motor_arm(); |
||||
|
} |
||||
|
|
||||
|
// board mount |
||||
|
color("red") |
||||
|
aligned_cube([body_width, body_width, body_height]); |
||||
|
} |
||||
|
|
||||
|
// board pcb cutout |
||||
|
translate([0,0,body_wall_thickness]) |
||||
|
aligned_cube([body_width- 2*body_wall_thickness, body_width-2*body_wall_thickness, body_height]); |
||||
|
|
||||
|
// cable cutouts |
||||
|
for(r = [45 : 90 : 360]) { |
||||
|
rotate([0, 0, r]) |
||||
|
translate([0,arm_offset,0]) |
||||
|
cable_cuts(); |
||||
|
} |
||||
|
// usb cutout |
||||
|
translate([-2, -body_width / 2 - 1, 2]) |
||||
|
cube([usb_width, 4, usb_hight]); |
||||
|
|
||||
|
// base triangle cut-outs |
||||
|
translate([0, 0, -1]) |
||||
|
triangle_cuts(); |
||||
|
|
||||
|
|
||||
|
// text stamp |
||||
|
union() |
||||
|
{ |
||||
|
rotate([0,0,180]) |
||||
|
translate([0,-body_width/2+text_depth-eps,body_height/2]) |
||||
|
rotate([90,0,0]) |
||||
|
linear_extrude(height = text_depth) |
||||
|
{ |
||||
|
translate([0,2,0]) |
||||
|
text(halign="center",valign="center", $fn=$fn, size=5,font="Linux Libertine O", name); |
||||
|
translate([0,-3,0]) |
||||
|
text(halign="center",valign="center", $fn=$fn, size=2,font="Linux Libertine Mono O", version); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
} |
||||
|
|
||||
|
module quad() { |
||||
|
if(with_frame) { |
||||
|
body(); |
||||
|
} |
||||
|
if(with_pcbs) { |
||||
|
translate([0,0, body_wall_thickness+eps]) { |
||||
|
translate([-3, -14, 0]) |
||||
|
%pcb_flight_controller(); |
||||
|
|
||||
|
translate([-16, -12.5, 0]) |
||||
|
%pcb_rx_radio(); |
||||
|
} |
||||
|
} |
||||
|
if(with_akku) { |
||||
|
translate([0,0,body_height]) { |
||||
|
akku_holder(); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
module akku_holder() { |
||||
|
color([0.5,0.8,0.4,0.5]) |
||||
|
difference() { |
||||
|
union() { |
||||
|
aligned_cube([body_width,body_width,akku_holder_hight]); |
||||
|
translate([0,0,-1]) |
||||
|
aligned_cube([body_width-body_wall_thickness*2, |
||||
|
body_width-body_wall_thickness*2, |
||||
|
akku_holder_hight]); |
||||
|
} |
||||
|
translate([0,0,0.01]) { |
||||
|
aligned_cube([akku_holder_width, |
||||
|
body_width+1, |
||||
|
akku_holder_hight+2]); |
||||
|
} |
||||
|
translate([0, 0, -2]) |
||||
|
triangle_cuts(h=6); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
quad(); |
||||
|
//body(); |
||||
|
//motor_arm(); |
||||
|
//motor_clamp(); |
||||
|
//akku_holder(); |
@ -1,251 +0,0 @@ |
|||||
$fn = 25; |
|
||||
with_props=0; |
|
||||
with_motor=0; |
|
||||
with_pcbs=1; |
|
||||
with_akku=0; |
|
||||
|
|
||||
motor_size = 8.465; |
|
||||
motor_height = 21; |
|
||||
motor_wall_d = 2.2; |
|
||||
motor_clamp_cut = 3; |
|
||||
|
|
||||
usb_width=12; |
|
||||
usb_hight=8; |
|
||||
|
|
||||
motor_helper_disc = 40; |
|
||||
motor_helper_height = 0.2; |
|
||||
|
|
||||
motor_arm_width = 8; |
|
||||
motor_arm_height = 6; |
|
||||
motor_arm_length = 20; |
|
||||
|
|
||||
motor_body_len = 40; |
|
||||
motor_body_height = 12; |
|
||||
motor_body_wall = 2; |
|
||||
|
|
||||
triangle_cut_height = 10; |
|
||||
cable_cut_width = 3; |
|
||||
cable_cut_height = 3; |
|
||||
|
|
||||
akku_holder_hight = 9.1; |
|
||||
akku_holder_width =27; |
|
||||
motor_body_arm_dist = (motor_body_len - motor_arm_width + 2) / sqrt(2); |
|
||||
module aligned_cube(size, aligned=[1,1,0]) |
|
||||
{ |
|
||||
translate(-0.5*[size[0]*aligned[0], size[1]*aligned[1], size[2]*aligned[2]]) |
|
||||
cube(size); |
|
||||
} |
|
||||
|
|
||||
module triangle(o_len, a_len, depth) { |
|
||||
linear_extrude(height=depth) |
|
||||
polygon(points=[[0,0],[a_len,0],[0,o_len]], paths=[[0,1,2]]); |
|
||||
} |
|
||||
module triangle_cuts(h=4) { |
|
||||
translate([0, -motor_body_len / 3, 0]) { |
|
||||
triangle(triangle_cut_height, motor_body_len / 4, h); |
|
||||
triangle(triangle_cut_height, -motor_body_len / 4, h); |
|
||||
} |
|
||||
translate([0, motor_body_len / 3, 0]) { |
|
||||
triangle(-triangle_cut_height, motor_body_len / 4, h); |
|
||||
triangle(-triangle_cut_height, -motor_body_len / 4, h); |
|
||||
} |
|
||||
translate([-motor_body_len / 3, 0, 0]) |
|
||||
rotate([0, 0, -90]) { |
|
||||
triangle(triangle_cut_height, motor_body_len / 4, h); |
|
||||
triangle(triangle_cut_height, -motor_body_len / 4, h); |
|
||||
} |
|
||||
translate([motor_body_len / 3, 0, 0]) |
|
||||
rotate([0, 0, 90]) { |
|
||||
triangle(triangle_cut_height, motor_body_len / 4, h); |
|
||||
triangle(triangle_cut_height, -motor_body_len / 4, h); |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
module fc_pcb() { |
|
||||
fc_width = 20; |
|
||||
fc_height = 28; |
|
||||
if(with_pcbs) |
|
||||
cube([fc_width, fc_height, 2]); |
|
||||
} |
|
||||
|
|
||||
module rx_pcb() { |
|
||||
rx_width = 12; |
|
||||
rx_height = 25; |
|
||||
if(with_pcbs) |
|
||||
cube([rx_width, rx_height, 2]); |
|
||||
} |
|
||||
|
|
||||
module motor() { |
|
||||
color([0.8,0.2,0.2,0.5]) { |
|
||||
if (with_motor) { |
|
||||
cylinder(d = motor_size, h = motor_height ); |
|
||||
translate([0, 0, -5]) |
|
||||
cylinder(d = 2, h = motor_height + 5); |
|
||||
} |
|
||||
if (with_props) { |
|
||||
translate([0, 0, -5]) |
|
||||
cylinder(d = 66.5, h = 2); |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
module motor_clamp() { |
|
||||
// motor / prop mockup |
|
||||
|
|
||||
difference() { |
|
||||
union () { |
|
||||
color("blue") |
|
||||
// motor stand |
|
||||
hull() { |
|
||||
cylinder(d = motor_size + motor_wall_d, h = motor_height); |
|
||||
|
|
||||
translate([-motor_arm_width / 2, -(motor_size + motor_wall_d) / 2 - 2, motor_height - motor_arm_height]) |
|
||||
cube([motor_arm_width, 1, motor_arm_height]); |
|
||||
} |
|
||||
|
|
||||
// print support |
|
||||
color("green") |
|
||||
translate([0, 0, motor_height - motor_helper_height]) |
|
||||
cylinder(d = motor_helper_disc, h = motor_helper_height); |
|
||||
|
|
||||
color("blue") |
|
||||
|
|
||||
translate([0, 0, -2]) |
|
||||
cylinder(d = motor_size + motor_wall_d,h=7); |
|
||||
} |
|
||||
|
|
||||
// cable hole |
|
||||
translate([-cable_cut_width / 2, -(motor_size + motor_wall_d) / 2 - cable_cut_height, 0]) |
|
||||
cube([cable_cut_width, cable_cut_height, 25]); |
|
||||
|
|
||||
translate([0, -(motor_size) / 2 , motor_height- cable_cut_height]) |
|
||||
aligned_cube([cable_cut_width, cable_cut_height, cable_cut_height]); |
|
||||
|
|
||||
// motor hole |
|
||||
translate([0, 0, -1]) |
|
||||
cylinder(d = motor_size, h = motor_height + 2); |
|
||||
|
|
||||
// clamp cutout |
|
||||
translate([-motor_clamp_cut / 2, -3, -motor_size - motor_wall_d - 1]) |
|
||||
cube([motor_clamp_cut, motor_size + motor_wall_d + 5, motor_height + motor_size + motor_wall_d + 2]); |
|
||||
translate([0, 0, -motor_size - motor_wall_d - 1]) |
|
||||
cylinder(d=6.5, h= motor_height + motor_size + motor_wall_d + 2); |
|
||||
translate([0, 0, -1.75]) |
|
||||
cylinder(d2=motor_size,d1=6.5, h=0.75); |
|
||||
|
|
||||
//sphere(d = motor_size); |
|
||||
} |
|
||||
|
|
||||
%motor(); |
|
||||
} |
|
||||
|
|
||||
module arm() { |
|
||||
motor_clamp(); |
|
||||
|
|
||||
// motor arm itself |
|
||||
color("blue") |
|
||||
translate([-motor_arm_width / 2, -(motor_arm_length + ((motor_size + motor_wall_d) / 2) + 2), motor_height - motor_arm_height]) |
|
||||
cube([motor_arm_width, motor_arm_length, motor_arm_height]); |
|
||||
} |
|
||||
|
|
||||
module body() { |
|
||||
// arms |
|
||||
for(r = [45 : 90 : 360]) { |
|
||||
rotate([0, 0, r]) |
|
||||
translate([0, motor_arm_length + ((motor_size + motor_wall_d) / 2) + motor_body_arm_dist + 1, 0]) |
|
||||
difference() { |
|
||||
arm(); |
|
||||
|
|
||||
translate([-cable_cut_width / 2, -motor_arm_length - ((motor_size + motor_wall_d) / 2) - 2, motor_height - motor_arm_height-3]) |
|
||||
|
|
||||
cube([cable_cut_width, motor_arm_length + 2, cable_cut_height + 3]); |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
color("red") |
|
||||
translate([0,0, motor_height]) |
|
||||
difference() { |
|
||||
aligned_cube([motor_body_len, motor_body_len, motor_body_height],[1,1,2]); |
|
||||
|
|
||||
for(r = [45 : 90 : 360]) { |
|
||||
translate([0,0, -motor_height + motor_body_height]) |
|
||||
rotate([0, 0, r]) |
|
||||
translate([0, motor_body_len / 2 * sqrt(2) - 2, cable_cut_height]) { |
|
||||
aligned_cube([cable_cut_width, 8, cable_cut_height ]); |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
module quad() { |
|
||||
difference() { |
|
||||
translate([0, 0, motor_height]) |
|
||||
rotate([180, 0, 0]) |
|
||||
{ |
|
||||
body(); |
|
||||
|
|
||||
translate([0,0, 15]) |
|
||||
{ |
|
||||
translate([-3, -14, 0]) |
|
||||
%fc_pcb(); |
|
||||
|
|
||||
translate([-16, -12.5, 0]) |
|
||||
%rx_pcb(); |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
// cut out for actual PCBs |
|
||||
translate([-(motor_body_len - (2 * motor_body_wall)) / 2, -(motor_body_len - (2 * motor_body_wall)) / 2, motor_body_wall]) |
|
||||
cube([motor_body_len - (2 * motor_body_wall), motor_body_len - (2 * motor_body_wall), motor_body_height - motor_body_wall + 1]); |
|
||||
|
|
||||
// akku cutout |
|
||||
akku_cut=motor_body_len - motor_body_wall*2; |
|
||||
translate([0,0, motor_body_height]) { |
|
||||
scale([1,1,1]) |
|
||||
rotate([0,0,45]) |
|
||||
//cylinder($fn=4, d1=akku_cut*1.4, d2=30, h=11); |
|
||||
translate([1,-12.5,0]) { |
|
||||
//cube([20,25,10]); |
|
||||
} |
|
||||
translate([-30,-12.5,0]) { |
|
||||
//cube([20,25,10]); |
|
||||
} |
|
||||
} |
|
||||
translate([-motor_body_len/2,-(akku_cut)/2, motor_body_height]) { |
|
||||
//cube([motor_body_len, akku_cut/2, 10]); |
|
||||
} |
|
||||
|
|
||||
// usb cutout |
|
||||
translate([-2, -motor_body_len / 2 - 1, 2]) |
|
||||
cube([usb_width, 4, usb_hight]); |
|
||||
|
|
||||
// triangle cut-outs |
|
||||
translate([0, 0, -1]) |
|
||||
triangle_cuts(); |
|
||||
} |
|
||||
} |
|
||||
module akku_holder() { |
|
||||
color([0.5,0.8,0.4,0.5]) |
|
||||
difference() { |
|
||||
union() { |
|
||||
aligned_cube([motor_body_len,motor_body_len,akku_holder_hight]); |
|
||||
translate([0,0,-1]) |
|
||||
aligned_cube([motor_body_len-motor_body_wall*2, |
|
||||
motor_body_len-motor_body_wall*2, |
|
||||
akku_holder_hight]); |
|
||||
} |
|
||||
translate([0,0,0.01]) { |
|
||||
aligned_cube([akku_holder_width, |
|
||||
motor_body_len+1, |
|
||||
akku_holder_hight+2]); |
|
||||
} |
|
||||
translate([0, 0, -2]) |
|
||||
triangle_cuts(h=6); |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
quad(); |
|
||||
|
|
||||
translate([0,0,motor_body_height]) { |
|
||||
akku_holder(); |
|
||||
} |
|
Write
Preview
Loading…
Cancel
Save
Reference in new issue