248 lines
6.3 KiB
OpenSCAD
248 lines
6.3 KiB
OpenSCAD
// lee@braains.net pi zero frame for Einsy RAMBo 2020-07-18
|
|
|
|
// b/c Prusa's SCAD is MIA
|
|
// re: https://github.com/prusa3d/Original-Prusa-i3/issues/132
|
|
|
|
// dimensions are derrived from the original STL, with some cleanup
|
|
//color("red") translate([0,pizd[1],0]) translate([3.5,-3.5,4.5]) import("rpi-zero-frame.stl");
|
|
|
|
// pi zero dimensions
|
|
pizd=[65,30,4];
|
|
|
|
// pin shroud thickness
|
|
pinz=2.5;
|
|
|
|
// pin clearance
|
|
pc=1.8;
|
|
|
|
// part thickness
|
|
pt=2;
|
|
|
|
// pcb thickness
|
|
pcbt=1.4;
|
|
|
|
inch=25.4;
|
|
|
|
// f'n around
|
|
$fn=32;
|
|
|
|
|
|
final_part();
|
|
module final_part(){
|
|
difference(){
|
|
base();
|
|
pins_cut();
|
|
hdmi_cut();
|
|
usb_cut();
|
|
inductor_cut();
|
|
weight_loss();
|
|
//mounting_fasteners();
|
|
under_cuts();
|
|
nice_cut();
|
|
}
|
|
}
|
|
|
|
module base(){
|
|
// inset for "shrunk" outer dims, matching OEM.
|
|
translate([0.5,0.5,0])
|
|
|
|
// base block
|
|
cheese_slice(pizd[0]-1,pizd[1]-1,pt,6);
|
|
|
|
// support columns & pegs
|
|
translate([3.5,3.5,0]){
|
|
for(x=[0:58:58]){
|
|
for(y=[0:23:23]){
|
|
// peg
|
|
translate([x,y,0]) cylinder(d=2.70, h=pt+pinz+pcbt);
|
|
// column
|
|
translate([x,y,0]) cylinder(d=6, h=pt+pinz);
|
|
}
|
|
}
|
|
}
|
|
|
|
// braces around gpio pins
|
|
arm_rests();
|
|
|
|
// this isn't really needed, but it's on the OEM frame.
|
|
arm_rest_flap();
|
|
|
|
// support flap for SD Card side under cuts
|
|
// could be shorter to save a little material
|
|
hull(){
|
|
translate([3.5,3.5,pt]) cylinder(d=6,h=pinz-1.5);
|
|
translate([3.5,pizd[1]-3.5,pt]) cylinder(d=6,h=pinz-1.5);
|
|
}
|
|
|
|
// support flap for camera connector side
|
|
// could also be shorter to save a little material
|
|
hull(){
|
|
translate([pizd[0]-3.5,0.5+3,pt]) cylinder(d=6,h=pinz-1.2);
|
|
translate([pizd[0]-3.5,pizd[1]-3.5,pt]) cylinder(d=6,h=pinz-1.2);
|
|
}
|
|
|
|
// extension above USB power connector to prevent shorting.
|
|
usb_flap();
|
|
}
|
|
|
|
module nice_cut(){
|
|
// it bugged me, so I fixed it.
|
|
translate([3.5,3.5+pizd[1]-7,pt-4.4+pinz+1])
|
|
difference(){
|
|
translate([-3,0,0]) cube([6,6,10]);
|
|
cylinder(d=6,h=10);
|
|
}
|
|
}
|
|
|
|
module pins_cut(){
|
|
// all the pins
|
|
// translate([(pizd[0]-inch*2)/2,3.5-(inch*.05),0])
|
|
// for(x=[0:inch*.1:inch*2]){
|
|
// for(y=[0:inch*.1:inch*.1]){
|
|
// translate([x,y,0]) cylinder(d=1,h=20);
|
|
// }
|
|
// }
|
|
|
|
// first four
|
|
translate([(pizd[0]-inch*2)/2+inch*.05,3.5-(inch*.05),0])
|
|
for(x=[inch*.1:inch*.1:inch*.4]){
|
|
for(y=[0:inch*.1:0]){
|
|
translate([x,y,0]) cylinder(d=1.6,h=20);
|
|
}
|
|
}
|
|
// other two
|
|
translate([(pizd[0]-inch*2)/2+inch*.05,3.5-(inch*.05),0])
|
|
for(x=[inch*.7:inch*.1:inch*.7]){
|
|
for(y=[0:inch*.1:inch*.1]){
|
|
translate([x,y,0]) cylinder(d=1.6,h=20);
|
|
}
|
|
}
|
|
}
|
|
|
|
module inductor_cut(){
|
|
translate([pizd[0]-5-6.5+2,10.5,pt+1.3-.6]) cheese_slice(5,5,.6,2);
|
|
}
|
|
|
|
module hdmi_cut(){
|
|
translate([6.5,pizd[1]-8,pt-4.4+pinz+1]) cube([12,8,4.4]);
|
|
}
|
|
|
|
module usb_flap(){
|
|
translate([47.7+1+3,pizd[1]-2.5,0]) cheese_slice(6,4,pt+.4,2);
|
|
}
|
|
|
|
module usb_cut(){
|
|
//translate([47.7-10,pizd[1]-5.5,pt+pinz+1.6-4]) cube([20,7,4]);
|
|
translate([47.7-10,pizd[1]-5.5,pt+pinz+1.6-4])
|
|
cheese_slice(20,7,4,1);
|
|
|
|
// nice edge for usb flange
|
|
translate([48.5,pizd[1]-2.5+4,1.5]) rotate([45,0,0]) cube(10);
|
|
}
|
|
|
|
module weight_loss(){
|
|
translate([6.5,6.5,0]) cube(pizd-[13,13,0]+[0,0,10]);
|
|
}
|
|
|
|
module under_cuts(){
|
|
// sorry for the translate wrap, I manually shifted the geometry against
|
|
// the abandoned rpi-zero-frame.stl.
|
|
translate([0,pizd[1],0]){
|
|
// under usb power input
|
|
hull(){
|
|
translate([54.7,-4.3,0]) twoby();
|
|
translate([54.7,-4.3+inch*.2,0]) twoby();
|
|
}
|
|
|
|
// beside usb power input
|
|
translate([54.7-inch*.25,-4.3-inch*.1,0]) twoby();
|
|
|
|
// straddle cut on gpio side
|
|
translate([34,-26,0]){
|
|
hull(){
|
|
twoby();
|
|
translate([inch*.4,0,0]) twoby();
|
|
}
|
|
}
|
|
|
|
// straddle cut above sd card slot
|
|
translate([0,-8.4,0]) twoby();
|
|
|
|
// through cut under sd card slot
|
|
hull(){
|
|
translate([2.3-inch*.1,-21,0]) twoby();
|
|
translate([2.3+inch*.2,-21,0]) twoby();
|
|
}
|
|
|
|
// through cut gpio side
|
|
hull(){
|
|
translate([52.7,-26.3-inch*.2,0]) rotate([0,0,-90]) twoby();
|
|
translate([52.7,-26.3+inch*.2,0]) rotate([0,0,-90]) twoby();
|
|
}
|
|
|
|
// corner cut (supports here)
|
|
hull(){
|
|
translate([3.6,-30.3,0]) twoby();
|
|
translate([3.6-inch*.1,-30.3,0]) twoby();
|
|
}
|
|
} // end translate
|
|
}
|
|
|
|
module twoby(){
|
|
// seemed like a good idea, got the job done
|
|
hull(){
|
|
cylinder(d=2.5,h=pc);
|
|
translate([0,inch*.1,0]) cylinder(d=2.5,h=pc);
|
|
}
|
|
}
|
|
|
|
module mounting_fasteners(){
|
|
translate([3.5,(pizd[1]-10)/2,0])
|
|
for(x=[0:58:58]){
|
|
for(y=[0:10:10]){
|
|
translate([x,y,0]) screw_hole();
|
|
}
|
|
}
|
|
}
|
|
|
|
module screw_hole(){
|
|
translate([0,0,2]) cylinder(d=6,h=pt);
|
|
cylinder(d=3,h=pt);
|
|
}
|
|
|
|
module arm_rests(){
|
|
// long side from camera side
|
|
hull(){
|
|
translate([0.5+pizd[0]-33-3.5,0.5,pt]) cheese_slice(33,6,pinz,3);
|
|
translate([0.5+pizd[0]-33/2-3.5,0.5,pt]) cube([33/2,6,pinz]);
|
|
translate([pizd[0]-3.5,0.5+3,pt]) cylinder(d=6,h=pinz);
|
|
}
|
|
|
|
// short side from sd card slot side
|
|
hull(){
|
|
translate([0.5+3.5+2,0.5,pt]) cheese_slice(inch*.1,6,pinz,3);
|
|
translate([0.5+3.5,0.5,pt]) cube([inch*.1/2,6,pinz]);
|
|
translate([3.5,0.5+3,pt]) cylinder(d=6,h=pinz);
|
|
}
|
|
}
|
|
|
|
module arm_rest_flap(){
|
|
hull(){
|
|
translate([0.5+pizd[0]-36.5-3.5,0.5+pizd[1]-7,pt]) cheese_slice(33,6,.4,1);
|
|
translate([0.5+pizd[0]-36.5/2-3.5,0.5+pizd[1]-7,pt]) cube([33/2,6,.4]);
|
|
translate([pizd[0]-3.5,0.5+3+pizd[1]-7,pt]) cylinder(d=6,h=.4);
|
|
}
|
|
|
|
// stand
|
|
translate([26.5-1,pizd[1]-3.5-1,pt]) cheese_slice(3,4,pinz,1);
|
|
}
|
|
|
|
module cheese_slice(width,depth,height,radius){
|
|
hull(){
|
|
for(x=[0:width-radius:width-radius]){
|
|
for(y=[0:depth-radius:depth-radius]){
|
|
translate([x,y,0]+[radius,radius]/2) cylinder(d=radius, h=height);
|
|
}
|
|
}
|
|
}
|
|
} |