include include veye_imx287_pcb_w = 29; veye_imx287_pcb_h = 29; veye_imx287_pcb_thickness = 1.6; veye_imx287_pcb_stack_h = 11; imx287_thickness = 1.3; module veye_imx287_wo_holes() { pcb_w = veye_imx287_pcb_w; pcb_h = veye_imx287_pcb_h; pcb_stack_h = veye_imx287_pcb_stack_h; // connector size conn_w = 23; conn_h = 8; conn_d = 19; translate([0, -pcb_stack_h / 2, 0]) cube([pcb_w, pcb_stack_h, pcb_h], center = true); translate([0, -conn_d / 2 - pcb_stack_h, -conn_h / 2 + pcb_h / 2]) cube([conn_w, conn_d, conn_h], center = true); } module veye_imx287() { hole_d = 2.05; center_to_hole_dist = 12.5; pcb_stack_h = veye_imx287_pcb_stack_h; difference() { veye_imx287_wo_holes(); union() for (x_mult = [-1, 1], z_mult = [-1, 1]) { dx = center_to_hole_dist * x_mult; dy = $tiny_padding; dz = center_to_hole_dist * z_mult; translate([dx, dy, dz]) rotate([90, 0, 0]) cylinder($fn = diameterToFn(hole_d), d = hole_d, h = pcb_stack_h + $tiny_padding * 2); } } } module veye_imx287_stl_front() { pcb_w = veye_imx287_pcb_w; pcb_h = veye_imx287_pcb_h; rotate([90, 0, 0]) translate([-pcb_w / 2, -pcb_h / 2, veye_imx287_pcb_thickness]) import("PCB-RAW-IMX287-V11-0105-3D.stl"); } module veye_imx287_stl_back(with_connector = true) { pcb_w = veye_imx287_pcb_w; pcb_h = veye_imx287_pcb_h; rotate([90, 90, 0]) translate([-pcb_w / 2, -pcb_h / 2, -veye_imx287_pcb_thickness]) // fix not-centered source model //rotate([0, 0, 90]) translate([-50, 121 + pcb_h]) import("ADP-MV1-STEP.stl"); if (with_connector) { // connector size conn_w = 23; conn_h = 8; conn_d = 19; // a bit of hardcode for connector cyl_d = 6; cyl_z_offset = -2; translate([0, -conn_d + cyl_d / 2, veye_imx287_pcb_h / 2 - cyl_d / 2 + cyl_z_offset]) rotate([0, 90, 0]) cylinder($fn = diameterToFn(cyl_d), d = cyl_d, h = conn_w, center = true); } } *#veye_imx287(); // centered in senser center module veye_imx287_natural() { translate([0, -imx287_thickness, 0]) union() { veye_imx287_stl_front(); translate([0, -veye_imx287_pcb_stack_h, 0]) veye_imx287_stl_back(); } } veye_imx287_natural();