Merge revamped design #1

Merged
jacob.eva merged 31 commits from revamp into master 2023-07-26 20:29:07 +02:00
4 changed files with 120 additions and 51 deletions
Showing only changes of commit 54fabf89d2 - Show all commits

BIN
Mechanical/OpenSCAD/PCB.stl Normal file

Binary file not shown.

View File

@ -12,8 +12,8 @@
// The basic dimensions of an Expansion Card // The basic dimensions of an Expansion Card
base = [30.0, 32.0, 6.8]; base = [30.0, 32.0, 6.8];
// The extension for the mini PCIe slot // The extension for the SMA connectors & EG95
base_ext = [56.4, 33, 13]; base_ext = [40, 20.2, 16.5];
// The default wall thickness // The default wall thickness
side_wall = 1.5; side_wall = 1.5;
@ -31,9 +31,30 @@ usb_c_h = 2.2;
rail_h = 4.25; // to top of rail rail_h = 4.25; // to top of rail
// Boss locations matching the other Framework Expansion Cards // Boss locations matching the other Framework Expansion Cards
boss_y = 10.5; boss_inc_y = 10.5;
boss_x = 4.2; boss_inc_x = 4.2;
boss_r = 2.95; boss_r = 3;
boss_ext_y = 8.75;
boss_ext_x = 4;
boss_ext_top_y = 6;
lid_boss_depth = 3;
lid_wall_thickness = lid_boss_depth+side_wall;
gap = 0.25;
sma_height = 11.28;
sma = 10.035;
hollow_bottom_z = 0.7;
bottom_thickness = hollow_bottom_z+0.2;
ext_screw_hole = 2.5+side_wall;
ledge_cut = 0.6;
ledge_cut_d = 3.2;
// The rail cutout in the sides of the card // The rail cutout in the sides of the card
module rail(make_printable) { module rail(make_printable) {
@ -118,36 +139,56 @@ module qsphere(radius = 1) {
} }
// The screw boss for the PCB, optionally with space for a threaded insert // The screw boss for the PCB, optionally with space for a threaded insert
module boss(radius, use_insert, make_printable) { module boss(radius, height = pcb_h, inner_size, make_printable) {
difference() { difference() {
cylinder(r = radius, h = pcb_h, $fn = 64); cylinder(r = radius, h = height, $fn = 64);
translate([0, 0, side_wall]) cylinder(r = 1.25, h = pcb_h, $fn = 64); translate([0, 0, side_wall]) cylinder(r = inner_size/2, h = pcb_h, $fn = 64);
} }
} }
// Incomplete implementation of a lid to use with this shell module sma_hole() {
radius = 3.15;
rotate([90,0,0]) cylinder(h = side_wall,r = radius, $fn = 64);
}
// make expansion card lid
module expansion_card_lid() { module expansion_card_lid() {
gap = 0.25; lower_lid_z = 0.6;
ext_side_extension = 5;
difference() { difference() {
union() { union() {
// makes lower lid // makes lower lid
translate([side_wall+gap, side_wall+gap, base[2]-side_wall]) cube([base[0]-side_wall*2-gap*2, base[1]-side_wall*2-gap*2, side_wall]); translate([side_wall+gap, 0, base[2]-lower_lid_z]) cube([base[0]-side_wall*2-gap*2, base[1]-side_wall-gap, lower_lid_z]);
// makes upper lid // makes upper lid
translate([base[0]-base_ext[0]+side_wall+gap, -base_ext[1]+2*(side_wall+gap), base_ext[2]-side_wall]) cube([base_ext[0]-side_wall*2-gap*2, base_ext[1]-side_wall*2-gap*2, side_wall]); translate([-side_wall*2-gap, -base_ext[1]+side_wall+gap, base_ext[2]-side_wall]) cube([base_ext[0]-side_wall*2-gap*2, base_ext[1]-side_wall*2-gap*2, side_wall]);
// joins them together // joins them together
translate([side_wall+gap,0,base_ext[2]-(base_ext[2]-base[2])-side_wall]) cube([base[0]-side_wall*2-gap*2, side_wall+gap, base_ext[2]-base[2]+side_wall]); translate([side_wall+gap, -side_wall, base[2]-lower_lid_z]) cube([base[0]-side_wall*2-gap*2, side_wall, base_ext[2]-base[2]+gap*2+0.1]);
translate([side_wall+gap,-gap-side_wall,base_ext[2]-side_wall]) cube([base[0]-side_wall*2-gap*2, side_wall, side_wall]);
difference() { difference() {
translate([base[0]/2-usb_c_w/2+gap, base[1]-side_wall-gap, usb_c_r+usb_c_h]) cube([usb_c_w-gap*2, side_wall+gap, base[2]-(usb_c_r+usb_c_h)]); translate([base[0]/2-usb_c_w/2+gap, base[1]-side_wall-gap, usb_c_r+usb_c_h]) cube([usb_c_w-gap*2, side_wall+gap, base[2]-(usb_c_r+usb_c_h)]);
translate([base[0]/2, base[1], usb_c_r+usb_c_h]) usb_c_cutout(false); translate([base[0]/2, base[1], usb_c_r+usb_c_h]) usb_c_cutout(false);
} }
// Adds screw holder to lid // join on sma cover
screw_holders(); translate([-side_wall*2-gap,-base_ext[1],base_ext[2]-side_wall]) cube([base_ext[0]-side_wall*2-gap*2, side_wall+gap, side_wall]);
// make sma cover half
translate([-side_wall*2-gap, -base_ext[1], sma_height]) cube ([base_ext[0]-side_wall*2-gap*2, side_wall, base_ext[2]-sma_height]);
// add screw holder to lid
difference() {
translate([-3.25,-base_ext[2]-side_wall-gap*3,sma_height]) cube([lid_wall_thickness, base_ext[2]+gap*2, base_ext[2]-sma_height-side_wall]);
rotate([0,90,0]) translate([-base_ext[2]+3,-6,-3.25]) cylinder(r = lid_boss_depth/2, h = pcb_h, $fn = 64);
} }
// engrave LES logo into lid
translate([3, 20, 7]) linear_extrude(height=1.5, center=true) { difference() {
offset(0.01) import("LES.svg"); // the offset fixes a weird error about the svg's mesh being incomplete translate([base_ext[0]-3.25*2-side_wall*3-gap,-base_ext[2]-side_wall-gap*3,sma_height]) cube([lid_wall_thickness, base_ext[2]+gap*2, base_ext[2]-sma_height-side_wall]);
rotate([0,90,0]) translate([-base_ext[2]+3,-6,base_ext[0]-2.52*2-side_wall*3-gap]) cylinder(r = lid_boss_depth/2, h = pcb_h, $fn = 64);
} }
} }
// make sma holes
translate([sma-side_wall*2, -base_ext[2]-side_wall-side_wall/2+0.05, sma_height]) sma_hole();
translate([base_ext[0]-sma-side_wall*4-gap*4, -base_ext[2]-side_wall-side_wall/2+0.05, sma_height]) sma_hole();
}
} }
// A basic, printable Expansion Card enclosure // A basic, printable Expansion Card enclosure
@ -157,16 +198,20 @@ module expansion_card_lid() {
// "boss_insert" for fastener with a threaded insert, // "boss_insert" for fastener with a threaded insert,
// "clip" for a fastener-less clip, or // "clip" for a fastener-less clip, or
// "" for no PCB mounting structure // "" for no PCB mounting structure
module expansion_card_base(open_end, make_printable, pcb_mount="boss_insert") { module expansion_card_base(open_end, make_printable, pcb_mount="boss") {
// Hollowing of the inside // Hollowing of the inside
extra = 0.1; extra = 0.1;
inner = [base[0]-side_wall*2, base[1]-side_wall*2, base[2]-side_wall+extra]; inner = [base[0]-side_wall*2, base[1]-side_wall*2, base[2]-side_wall+extra];
ledge_fillet_r = 0.3;
notch_l = 3.0;
difference() { difference() {
cube(base); cube(base);
difference() { difference() {
notch = 1.0; notch = 1.0;
notch_l = 3.0;
notch_h = 3.8; notch_h = 3.8;
// The main hollow // The main hollow
translate([side_wall, 0, side_wall]) cube([inner[0], inner[1]+side_wall, inner[2]]); translate([side_wall, 0, side_wall]) cube([inner[0], inner[1]+side_wall, inner[2]]);
@ -188,33 +233,39 @@ module expansion_card_base(open_end, make_printable, pcb_mount="boss_insert") {
translate([base[0], base[1], rail_h]) mirror([1, 0, 0]) rail(make_printable); translate([base[0], base[1], rail_h]) mirror([1, 0, 0]) rail(make_printable);
// Cut out the end of what is normally the aluminum cover // Cut out the end of what is normally the aluminum cover
ledge_cut = 0.6;
ledge_cut_d = 3.2;
ledge_fillet_r = 0.3;
translate([0, base[1]-ledge_cut_d, 0]) cube([base[0], ledge_cut_d, ledge_cut]); translate([0, base[1]-ledge_cut_d, 0]) cube([base[0], ledge_cut_d, ledge_cut]);
// The fillet on that cover
translate([base[0], base[1]-ledge_cut_d, 0]) rotate([0, 0, 180]) fillet(ledge_cut/2, base[0]); // hollow bottom to provide room for back of board
translate([side_wall,-notch_l,-hollow_bottom_z+1.5]) cube([base[0]-side_wall*2, base[1]-side_wall, hollow_bottom_z]);
}
difference() {
// add extra bottom thickness to provide room for back of board
translate([0,0,-hollow_bottom_z]) cube([base[0], base[1]-ledge_cut_d, bottom_thickness]);
// engrave LES logo into bottom
translate([base[0]-3, 20, -0.8]) rotate([0,180,0]) linear_extrude(height=bottom_thickness, center=true) {
offset(0.01) import("LES.svg"); // the offset fixes a weird error about the svg's mesh being incomplete
translate([3,-16,0]) text("OPENCOM LTE", font = "Liberated Sans", size = 2, direction = "ltr", spacing = 1 );
translate([9.6,-18.5,0]) text("#001", font = "Liberated Sans", size = 1.5, direction = "ltr", spacing = 1 );
}
// The fillets on the aluminum cover
translate([base[0], base[1]-ledge_cut_d, -ledge_cut/2-hollow_bottom_z+0.3]) rotate([0, 0, 180]) fillet(ledge_cut/2, base[0]);
} }
if (pcb_mount == "boss" || pcb_mount == "boss_insert") { if (pcb_mount == "boss" || pcb_mount == "boss_insert") {
// Add the screw bosses // Add the screw bosses
translate([boss_x, boss_y, 0]) boss(boss_r, pcb_mount == "boss_insert", make_printable); // left int screwhole translate([boss_inc_x, boss_inc_y, 0]) boss(boss_r, pcb_h, 0, make_printable); // left int screwhole
translate([base[0]-boss_x, boss_y, 0]) boss(boss_r, pcb_mount == "boss_insert", make_printable); // right int screwhole translate([base[0]-boss_inc_x, boss_inc_y, 0]) boss(boss_r, pcb_h, 0, make_printable); // right int screwhole
translate([base[0]-boss_x, boss_y-base_ext[1]-boss_y+2+2.2, 0]) boss(boss_r, pcb_mount == "boss_insert", make_printable); // right bottom ext screwhole
translate([base[0]-base_ext[0]+boss_x, boss_y-base_ext[1]-boss_y+2+2.2, 0]) boss(boss_r, pcb_mount == "boss_insert", make_printable); // left bottom ext screwhole
translate([base[0]-base_ext[0]+boss_x, base_ext[1]+boss_y-base_ext[1]-boss_y-2-2.2, 0]) boss(boss_r, pcb_mount == "boss_insert", make_printable); // left top ext screwhole
translate([base[0]-boss_x, base_ext[1]+boss_y-base_ext[1]-boss_y-2-2.2, 0]) boss(boss_r, pcb_mount == "boss_insert", make_printable); // right top ext screwhole
} else if (pcb_mount == "clip") { } else if (pcb_mount == "clip") {
clip_w = 1.5; clip_w = 1.5;
clip_gap = 0.5; clip_gap = 0.5;
translate([boss_x-boss_r, boss_y-boss_r, 0]) { translate([boss_inc_x-boss_r, boss_inc_y-boss_r, 0]) {
cube([boss_r*2, boss_r*2, pcb_h]); cube([boss_r*2, boss_r*2, pcb_h]);
if (make_printable) if (make_printable)
translate([boss_r, boss_r*2, 0]) rib(boss_r*2, pcb_h); translate([boss_r, boss_r*2, 0]) rib(boss_r*2, pcb_h);
translate([0, boss_r-clip_w, pcb_h+pcb[2]+clip_gap]) rotate([0, 0, 180]) qsphere(clip_w); translate([0, boss_r-clip_w, pcb_h+pcb[2]+clip_gap]) rotate([0, 0, 180]) qsphere(clip_w);
} }
translate([base[0]-boss_x-boss_r, boss_y-boss_r, 0]) { translate([base[0]-boss_inc_x-boss_r, boss_inc_y-boss_r, 0]) {
cube([boss_r*2, boss_r*2, pcb_h]); cube([boss_r*2, boss_r*2, pcb_h]);
if (make_printable) if (make_printable)
translate([boss_r, boss_r*2, 0]) rib(boss_r*2, pcb_h); translate([boss_r, boss_r*2, 0]) rib(boss_r*2, pcb_h);
@ -224,32 +275,48 @@ module expansion_card_base(open_end, make_printable, pcb_mount="boss_insert") {
} }
module expansion_card_ext() { module expansion_card_ext(make_printable, pcb_mount="boss_insert") {
// Hollowing of the inside // Hollowing of the inside
extra = 0.1; extra = 0.1;
inner = [base_ext[0]-side_wall*2, base_ext[1]-side_wall*2, base_ext[2]-side_wall+extra]; inner = [base_ext[0]-side_wall*2, base_ext[1]-side_wall*2, base_ext[2]-side_wall+extra];
cutout = [base[0]-side_wall*2, base_ext[1]-side_wall*2, base_ext[2]-side_wall+extra]; cutout = [base[0]-side_wall*2, base_ext[1]-side_wall*2, base_ext[2]-side_wall+extra];
boss_r = 2.3; sma_cutout = [base_ext[0]-side_wall*2, base_ext[1]-side_wall*2, base_ext[2]];
translate([boss_ext_x, boss_ext_y, 0]) boss(boss_r, pcb_h, 3, make_printable); // left ext screwhole
translate([base_ext[0]-boss_ext_x, boss_ext_y, 0]) boss(boss_r, pcb_h, 3, make_printable); // right ext screwhole
difference() { difference() {
cube(base_ext); cube(base_ext);
// cutout to bring base and ext card together // cutout to bring base and ext card together
// not sure why it needs 0.5mm added, rounding error maybe? // not sure why it needs 0.5mm added, rounding error maybe? <---- FIX THIS
translate([base[0]-2.1, 5, side_wall]) cube([cutout[0], cutout[1], cutout[2]]); translate([base[0]-23.5, 5, side_wall]) cube([cutout[0], cutout[1], cutout[2]]);
// half cut out for sma connectors
translate([side_wall, 0-1, sma_height]) cube([sma_cutout[0], sma_cutout[1], sma_cutout[2]]);
// sma holes
translate([sma+side_wall+gap*2, side_wall, sma_height]) sma_hole();
translate([base_ext[0]-sma-side_wall-gap*2, side_wall, sma_height]) sma_hole();
// screw holes
translate([0,base_ext[1]-boss_ext_top_y,base_ext[2]-boss_r]) rotate([0,90,0]) cylinder(r = 1.5, h = side_wall, $fn = 64);
translate([base_ext[0]-side_wall,base_ext[1]-boss_ext_top_y,base_ext[2]-boss_r]) rotate([0,90,0]) cylinder(r = 1.5, h = side_wall, $fn = 64);
difference() { difference() {
notch = 1.0;
notch_l = 3.0;
notch_h = 3.8;
// The main hollow // The main hollow
translate([side_wall, side_wall, side_wall]) cube([inner[0], inner[1], inner[2]]); translate([side_wall, side_wall, side_wall]) cube([inner[0], inner[1], inner[2]]);
// Extra wall thickness where the latch cutouts are
/*translate([side_wall, inner[1]+side_wall-notch_l, side_wall+notch_h/2]) rotate([0, 0, -90]) rotate([0, 90, 0]);
translate([side_wall, inner[1]+side_wall-notch_l, side_wall]) cube([notch, notch_l, notch_h]);
translate([inner[0]+side_wall, inner[1]+side_wall-notch_l, side_wall+notch_h/2]) rotate([0, 0, 180]) rotate([0, 90, 0]) rib(notch_h, notch);
translate([inner[0]+side_wall-notch, inner[1]+side_wall-notch_l, side_wall]) cube([notch, notch_l, notch_h]);*/
} }
// hollow bottom to provide room for back of board
translate([(base_ext[0]-base[0])/2+side_wall,base_ext[1]-base_ext[1]/2+side_wall,-hollow_bottom_z+1.5]) cube([base[0]-side_wall*2, (base_ext[1]/2)-side_wall, hollow_bottom_z]);
}
difference() {
// add extra bottom thickness to provide room for back of board
translate([(base_ext[0]-base[0])/2,base_ext[1]-base_ext[1]/2+side_wall,-hollow_bottom_z]) cube([base[0], (base_ext[1]/2)-side_wall, hollow_bottom_z]);
translate([5, base_ext[1]-base_ext[1]/2+side_wall-0.001, -ledge_cut/2-hollow_bottom_z+0.3]) fillet(ledge_cut/2, base[0]);
rotate([0,180,0]) translate([-base_ext[0]/2-13.5,18.5,0]) linear_extrude(height=1.5, center=true) text("LIBERATED EMBEDDED SYSTEMS", font = "Liberated Sans", size = 1.3, direction = "ltr", spacing = 1 );
} }
} }
@ -259,12 +326,14 @@ module screw_holders() {
cube([outline[0],outline[1],outline[2]]); cube([outline[0],outline[1],outline[2]]);
radius = 2; radius = 2;
height = 10; height = 10;
rotate([0,90,0]) translate([(-outline[0]*2)-0.5,outline[1]/2, (outline[2]/2)-5]) cylinder(h = height,r = radius); rotate([0,90,0]) translate([(-outline[0]*2)-0.5,outline[1]/2, (outline[2]/2)-5]) cylinder(h = height,r = radius, $fn = 64);
} }
} }
translate([0, -base[1], 0]) expansion_card_base(open_end = false, make_printable = true, pcb_mount="boss"); translate([0, -base[1], 0]) expansion_card_base(open_end = false, make_printable = true, pcb_mount="boss");
translate([-base_ext[0]+base[0], -base_ext[1]-base[1], 0]) expansion_card_ext(); translate([-base_ext[0]+base[0]+5, -base_ext[1]-base[1], 0]) expansion_card_ext(make_printable = true, pcb_mount="boss");
translate([-60, -35, 0]) expansion_card_lid(); translate([45, -19, 17]) rotate([180,0,0]) expansion_card_lid();
//translate([-128.75, 95.8, pcb_h]) import("PCB.stl");

Binary file not shown.

Binary file not shown.