198 lines
8.8 KiB
OpenSCAD
198 lines
8.8 KiB
OpenSCAD
|
// Kossel bottom outer cover for 20x20 aluminium extrusion
|
||
|
// by zeus - zeus@ctdo.de - CC-BY-NC-4.0
|
||
|
// -> https://www.thingiverse.com/zeus
|
||
|
// -> https://github.com/zeus86
|
||
|
// 2020-10-01
|
||
|
//### global vars:
|
||
|
|
||
|
cover_h=60; //overall height to cover
|
||
|
cover_w=80; //overall width to cover (kossel mini default full widthwidth to cover is 240mm)
|
||
|
mt=2; //material thickness, applies to various things
|
||
|
scr_hole_dia=4.3; //screw hole diameter for mounting holes
|
||
|
tab_w=4.6; // width of the indented tab, which goes into the groove of the extruded beam
|
||
|
tab_h=1; //height of the tab
|
||
|
beam_h=20; // 20x20 beam
|
||
|
beam_w=beam_h;
|
||
|
showtext=1; // 0 or 1, show text or not
|
||
|
tabs=1; // 0,1,2,3, use tabs for 2020 beams (none,all,top,bottom)
|
||
|
$fn=100;
|
||
|
|
||
|
//### end of global vars, start of models
|
||
|
|
||
|
module plate(){
|
||
|
// socket baseplate
|
||
|
difference(){
|
||
|
union(){
|
||
|
cube([cover_w,cover_h,mt],center=true); //plate
|
||
|
if (tabs==1) {for (h=[cover_h/2-beam_w/2,-cover_h/2+beam_h/2]) translate([0,(h),mt/2+tab_h/2]) cube([cover_w,tab_w,tab_h],center=true);}; //recessed tabs (both)
|
||
|
if (tabs==2) {for (h=[-cover_h/2+beam_h/2]) translate([0,(h),mt/2+tab_h/2]) cube([cover_w,tab_w,tab_h],center=true);}; //recessed tabs (top)
|
||
|
if (tabs==3) {for (h=[cover_h/2-beam_w/2]) translate([0,(h),mt/2+tab_h/2]) cube([cover_w,tab_w,tab_h],center=true);}; //recessed tabs (bottom)
|
||
|
}
|
||
|
for (w=[cover_w/2-beam_h/2,-cover_w/2+beam_h/2],h=[cover_h/2-beam_w/2,-cover_h/2+beam_h/2]){ // for-loop to position the screw holes accordingly
|
||
|
translate([(w),(h),tab_h/2]) cylinder(r=scr_hole_dia/2,h=mt+tab_h+0.1,center=true); //screw-holes
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
module plate_extrahole(){
|
||
|
// socket baseplate but with extra holes on the tab
|
||
|
cutout_extrahole_dia=scr_hole_dia;
|
||
|
cutout_extrahole_w=10; //center-to-center
|
||
|
cutout_extrahole_offset=10;
|
||
|
difference(){
|
||
|
union(){
|
||
|
cube([cover_w,cover_h,mt],center=true); //plate
|
||
|
if (tabs==1) {for (h=[cover_h/2-beam_w/2,-cover_h/2+beam_h/2]) translate([0,(h),mt/2+tab_h/2]) cube([cover_w,tab_w,tab_h],center=true);}; //recessed tabs (both)
|
||
|
if (tabs==2) {for (h=[-cover_h/2+beam_h/2]) translate([0,(h),mt/2+tab_h/2]) cube([cover_w,tab_w,tab_h],center=true);}; //recessed tabs (top)
|
||
|
if (tabs==3) {for (h=[cover_h/2-beam_w/2]) translate([0,(h),mt/2+tab_h/2]) cube([cover_w,tab_w,tab_h],center=true);}; //recessed tabs (bottom)
|
||
|
}
|
||
|
for (w=[cover_w/2-beam_h/2,-cover_w/2+beam_h/2],h=[cover_h/2-beam_w/2,-cover_h/2+beam_h/2]){ // for-loop to position the screw holes accordingly
|
||
|
translate([(w),(h),tab_h/2]) cylinder(r=scr_hole_dia/2,h=mt+tab_h+0.1,center=true); //screw-holes
|
||
|
}
|
||
|
for (w=[-cutout_extrahole_w/2:0.5:cutout_extrahole_w/2],h=[-cover_h/2+beam_w/2]){ // for-loop for extra-holes
|
||
|
translate([(w-cutout_extrahole_offset),(h),tab_h/2]) cylinder(r=scr_hole_dia/2+0.2,h=mt+tab_h+0.1,center=true); //screw-holes
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
module cutout_xt60(){
|
||
|
// cutout for plate-mounted xt60-socket
|
||
|
cutout_xt60_screw_dia=3.5; //mounting screws
|
||
|
cutout_xt60_screw_spacing=20.5; //~20.5mm apart from each other (center to center)
|
||
|
cutout_xt60_w=16;
|
||
|
cutout_xt60_h=8.5;
|
||
|
cutout_xt60_text_h=5;
|
||
|
|
||
|
linear_extrude(height = mt+0.1, center = true, convexity = 1) {
|
||
|
polygon(points = [
|
||
|
[-cutout_xt60_w/2,-cutout_xt60_h/2],
|
||
|
[cutout_xt60_w/2-1,-cutout_xt60_h/2],
|
||
|
[cutout_xt60_w/2,-cutout_xt60_h*0.37],
|
||
|
[cutout_xt60_w/2,cutout_xt60_h*0.37],
|
||
|
[cutout_xt60_w/2-1,cutout_xt60_h/2],
|
||
|
[-cutout_xt60_w/2,cutout_xt60_h/2]
|
||
|
], paths=undef, convexity=1); //shape of the cutout
|
||
|
}
|
||
|
for (x=[cutout_xt60_screw_spacing/2,-cutout_xt60_screw_spacing/2]) translate([(x),0,0]) cylinder(r=cutout_xt60_screw_dia/2,h=mt+0.1,center=true); // screw holes
|
||
|
if (showtext==1) mirror([0,1,0])translate([0,cover_h/2-beam_h+1,-mt/2-0.1])linear_extrude(1)text("12V DC",cutout_xt60_text_h,halign="center",valign="center"); //some text
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
module cutout_usba(){
|
||
|
// cutout for plate-mounted USB-type-a-socket
|
||
|
cutout_usba_screw_dia=3.5; //mounting screws
|
||
|
cutout_usba_screw_spacing=30; //~30mm apart from each other (center to center)
|
||
|
cutout_usba_w=12.5;
|
||
|
cutout_usba_h=11.5;
|
||
|
cutout_usba_text_h=5;
|
||
|
cube([cutout_usba_w,cutout_usba_h,mt+0.1],center=true); //shape of the cutout
|
||
|
translate([0,0,mt/2]) cube([cutout_usba_screw_spacing+2*cutout_usba_screw_dia,cutout_usba_w*1.3,mt/2],center=true); //helper-plate for further recess into plate
|
||
|
for (x=[cutout_usba_screw_spacing/2,-cutout_usba_screw_spacing/2]) translate([(x),0,0]) cylinder(r=cutout_usba_screw_dia/2,h=mt+0.1,center=true); // screw holes
|
||
|
if (showtext==1) mirror([0,1,0])translate([0,cover_h/2-beam_h+1,-mt/2-0.1])linear_extrude(1)text("USB",cutout_usba_text_h,halign="center",valign="center"); //some text
|
||
|
}
|
||
|
|
||
|
module cutout_vmeter(){
|
||
|
// cutout for pcb-mounted 7-segment-LCD displaying a supplied voltage
|
||
|
cutout_vmeter_screw_spacing=26.5; //~30mm apart from each other (center to center)
|
||
|
cutout_vmeter_screw_dia=1.6; // module uses holes for M2.5, mounted from the inside on spacers!!
|
||
|
cutout_vmeter_w=23;
|
||
|
cutout_vmeter_h=10.5;
|
||
|
cutout_vmeter_d=6.5; //depth without pcb
|
||
|
cutout_vmeter_text_h=5;
|
||
|
cube([cutout_vmeter_w,cutout_vmeter_h,mt+0.1],center=true); //shape of the cutout
|
||
|
for (x=[cutout_vmeter_screw_spacing/2,-cutout_vmeter_screw_spacing/2]) translate([(x),0,0.25/2]) cylinder(r=cutout_vmeter_screw_dia/2,h=mt-0.25+0.01,center=true); // screw holes
|
||
|
if (showtext==1) mirror([0,1,0])translate([0,cover_h/2-beam_h+1,-mt/2-0.1])linear_extrude(1)text("V_IN",cutout_vmeter_text_h,halign="center",valign="center"); //some text
|
||
|
}
|
||
|
|
||
|
module cutout_socketswitch(){
|
||
|
cutout_socketswitch_dia=20;
|
||
|
cutout_socketswitch_w=16;
|
||
|
cutout_socketswitch_h=mt+0.1;
|
||
|
|
||
|
cutout_socketswitch_bump=5; //excess tabs width for clearance on press-fit/snap-in switches
|
||
|
cutout_socketswitch_text_h=5;
|
||
|
|
||
|
cylinder(r=cutout_socketswitch_dia/2,h=cutout_socketswitch_h,center=true); //shape of the cutout
|
||
|
|
||
|
for (r=[0,90])
|
||
|
rotate([0,0,(r)]) cube([cutout_socketswitch_dia+(cutout_socketswitch_bump/3),cutout_socketswitch_bump,cutout_socketswitch_h],center=true); // excess tabs
|
||
|
if (showtext==1) mirror([0,1,0])translate([0,cover_h/2-cutout_socketswitch_dia/2-cutout_socketswitch_bump*1.1,-mt/2-0.1])linear_extrude(1)text("ON/OFF",cutout_socketswitch_text_h,halign="center",valign="center"); //some text
|
||
|
|
||
|
}
|
||
|
module cutout_fangrill(){
|
||
|
cutout_fangrill_w=cover_w*0.85;
|
||
|
cutout_fangrill_h=cover_h-(2*beam_h)*0.85;
|
||
|
cutout_fangrill_text_h=4.5;
|
||
|
difference(){
|
||
|
cube([cutout_fangrill_w,cutout_fangrill_h,mt+0.1],center=true);
|
||
|
for (y=[-(cutout_fangrill_h/2-1):mt*2:(cutout_fangrill_h/2+1)]) translate([0,(y),0]) rotate([-45,0,0]) cube([cutout_fangrill_w+0.1,mt/2,mt*PI+0.1],center=true); // tilted slots
|
||
|
cube([mt+0.2,cutout_fangrill_h+0.1,mt+0.1+0.1],center=true);
|
||
|
}
|
||
|
if (showtext==1) mirror([0,1,0])translate([0,cover_h/2-beam_h/2,-mt/2-0.1])linear_extrude(1)
|
||
|
text("DELTAZEUS V2.1",cutout_fangrill_text_h,halign="center",valign="center"); //some text
|
||
|
}
|
||
|
|
||
|
module cutout_cableroute(){
|
||
|
cutout_cableroute_w=22;
|
||
|
cutout_cableroute_h=12;
|
||
|
cutout_cableroute_text_h=5;
|
||
|
cube([cutout_cableroute_w,cutout_cableroute_h,mt+0.1],center=true);
|
||
|
if (showtext==1) mirror([0,1,0])translate([0,cutout_cableroute_h,-mt/2-0.1])linear_extrude(1)
|
||
|
text("Display",cutout_cableroute_text_h,halign="center",valign="center"); //some text
|
||
|
}
|
||
|
|
||
|
module fullmodel_plain(){
|
||
|
|
||
|
// fullplate without any cutouts:
|
||
|
plate();
|
||
|
}
|
||
|
|
||
|
module fullmodel_testfit(){
|
||
|
// fullplate without any cutouts. 10%-version for testfit:
|
||
|
difference(){
|
||
|
plate();
|
||
|
translate([-cover_w/2-2.5,-cover_h/2-2.5,-(mt/2+1)]) #cube([cover_w*0.88+5,cover_h+5,mt+5]); // overlay to cut away 90% of the model to generate a model for testfit.
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
module fullmodel_powerplate(){
|
||
|
// full model, powerplate variant
|
||
|
difference(){
|
||
|
plate();
|
||
|
translate([-(cover_w/2-26),0,0]) cutout_socketswitch();
|
||
|
translate([(cover_w/2-24),0,0]) cutout_xt60();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
module fullmodel_vmeterandusb(){
|
||
|
// full model, vmeter & usb-type-a variant
|
||
|
difference(){
|
||
|
plate();
|
||
|
translate([-(cover_w/2-20),0,0]) cutout_vmeter();
|
||
|
translate([(cover_w/2-18),0,0]) cutout_usba();
|
||
|
}
|
||
|
}
|
||
|
module fullmodel_fangrill(){
|
||
|
// full model, fan grill for air exhaust
|
||
|
difference(){
|
||
|
plate();
|
||
|
translate([0,0,0]) cutout_fangrill();
|
||
|
//translate([(cover_w/2-18),0,0]) cutout_usba();
|
||
|
}
|
||
|
}
|
||
|
module fullmodel_cableroute(){
|
||
|
// full model with hole for display-cables
|
||
|
difference(){
|
||
|
plate();
|
||
|
translate([0,0,0]) cutout_cableroute();
|
||
|
}
|
||
|
}
|
||
|
module fullmodel_extrahole(){
|
||
|
// full model with hole for display-mounting-holes
|
||
|
plate_extrahole();
|
||
|
}
|
||
|
|
||
|
//cutout_extrahole();
|
||
|
fullmodel_powerplate();
|