// The basic dimensions of an Expansion Card base = [30.0, 32.0, 6.8]; // The extension for the mini PCIe slot base_ext = [59, 33, 13]; // The default wall thickness side_wall = 1.5; // Size and location of the typical PCB pcb_gap = 0.5; pcb = [26.0, 30.0, 0.8]; pcb_h = 3.05; // USB-C plug dimensions usb_c_r = 1.315; usb_c_w = 5.86+usb_c_r*2; usb_c_h = 2.2; rail_h = 4.25; // to top of rail // Boss locations matching the other Framework Expansion Cards boss_y = 10.5; boss_x = 3.7; // The cutout for the USB-C plug module usb_c_cutout(open_top) { // The plug is "pushed in" by an extra 0.6 to account for 3d printing tolerances translate([-usb_c_w/2+usb_c_r, 7-10+0.6, usb_c_r]) rotate([-90, 0, 0]) union() { translate([0, usb_c_r, 0]) cylinder(r = usb_c_r, h = 10, $fn = 64); translate([usb_c_w-usb_c_r*2, usb_c_r, 0]) cylinder(r = usb_c_r, h = 10, $fn = 64); cube([usb_c_w-usb_c_r*2, usb_c_r*2, 10]); // Cutout for the pin side of the shell that expands out translate([0, usb_c_r, 0]) cylinder(r2 = usb_c_r, r1 = 3.84/2, h = 10-7.7, $fn = 64); translate([usb_c_w-usb_c_r*2, usb_c_r, 0]) cylinder(r2 = usb_c_r, r1 = 3.84/2, h = 10-7.7, $fn = 64); translate([usb_c_w/2-usb_c_r, usb_c_r, 0]) scale([1.8, 1, 1]) rotate([0, 0, 45]) cylinder(r2 = usb_c_r*sqrt(2), r1 = 3.84/2*sqrt(2), h = 10-7.7, $fn = 4); // If the card drops in from the top rather than sliding in from the front, // cut out a slot for the USB-C plug to drop into. if (open_top) { translate([-usb_c_r, -10+usb_c_r, 0]) cube([usb_c_w, 10, 10]); } } } // Incomplete implementation of a lid to use with this shell module expansion_card_lid() { gap = 0.25; difference() { union() { 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]); 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, base[1], usb_c_r+usb_c_h]) usb_c_cutout(false); } } // engrave LES logo into lid translate([3, 20, 6]) linear_extrude(height=1.6, center=true) { offset(0.01) import("LES.svg"); // the offset fixes a weird error about the svg's mesh being incomplete } } } expansion_card_lid(); translate([3, 20, 6]) linear_extrude(height=1, center=true) { offset(0.01) import("LES.svg"); // the offset fixes a weird error about the svg's mesh being incomplete }