include include radxa_zero_3e_pcb_w = 30; radxa_zero_3e_pcb_h = 65; radxa_zero_3e_pcb_thickness = 1.6; radxa_zero_3e_pcb_screw_offset = 3.5; radxa_zero_3e_pcb_distance_between_holes_w = 23; radxa_zero_3e_pcb_distance_between_holes_h = radxa_zero_3e_pcb_h - radxa_zero_3e_pcb_screw_offset * 2; rpi_protoboard_connectors_h = 12; rpi_protoboard_z_offset = 15; radxa_zero_3e_fan_hole_offset = 28; radxa_zero_3e_mount_plate_screw_holder_height = 4; radxa_zero_3e_mount_plate_h = 2; function radxa_zero_3e_pcb_size() = [ radxa_zero_3e_pcb_w, radxa_zero_3e_pcb_h, radxa_zero_3e_pcb_thickness]; module radxa_zero_3e() { pcb_w = radxa_zero_3e_pcb_w; pcb_h = radxa_zero_3e_pcb_h; pcb_t = radxa_zero_3e_pcb_thickness; //rotate([90, 0, 0]) //translate([-pcb_w / 2, -pcb_h / 2, veye_imx287_pcb_thickness]) translate([-pcb_w / 2, 0, 0]) rotate([0, 0, -90]) translate([0, 0, pcb_t]) import("rs109_pcba.stl"); // sd card sd_card_z_offset = 3; sd_card_w = 11; translate([0, -pcb_h, -3]) cube([sd_card_w, sd_card_z_offset * 2, 1], center = true); } module rpi_zero_protoboard() { s = radxa_zero_3e_pcb_size(); w = s[0]; h = s[1]; t = s[2] + rpi_protoboard_connectors_h; r = 2.5; //translate([0, -s[1] / 2, 0]) //cube(s, center = true); translate([0, 0, rpi_protoboard_z_offset]) hull() { for (x = [-(w / 2 - r), (w / 2 - r)], y = [-(h - r), -r]) { translate([x, y, 0]) cylinder($fn = diameterToFn(r * 2), h = t, r = r); } } } module radxa_zero_3e_with_protoboard() { radxa_zero_3e(); rpi_zero_protoboard(); } module radxa_zero_3e_rj45_male() { // outer z (scanner coords) size of rj45 connector is // 8 mm, including bended wires z_delta = 8; w = 11.6; h = 6.6; // apply outer z (scanner coords) size // put inside rj45 female translate([0, 10.45, 2.3]) cube([w, z_delta, h], center = true); } module radxa_zero_3e_with_protoboard_and_connectors() { radxa_zero_3e_with_protoboard(); radxa_zero_3e_rj45_male(); } module radxa_zero_3e_mount_plate() { // outer screw holder diameter. there is no more space there, // so only round 6 mm screw holders will fit under radxa oshd = 6; // screw holder height shh = radxa_zero_3e_mount_plate_screw_holder_height; dbhw = radxa_zero_3e_pcb_distance_between_holes_w; dbhh = radxa_zero_3e_pcb_distance_between_holes_h; so = radxa_zero_3e_pcb_screw_offset; outer_cyl_delta = so - oshd / 2; ocd = outer_cyl_delta; bph = radxa_zero_3e_mount_plate_h; hih = hole_insert_height; hid = hole_insert_diameter; echo("radxa_zero_3e_pcb_distance_between_holes_h: ", radxa_zero_3e_pcb_distance_between_holes_h); echo("dbhh: ", dbhh); difference() { union() { // hole holders translate([0, 0, -shh / 2]) for (xo = [-dbhw / 2, dbhw / 2], yo = [-so, -so - dbhh]) { //translate([-dbhw / 2, -so, 0]) translate([xo, yo, 0]) cylinder($fn = dToFn(oshd), d = oshd, h = shh, center = true); } // outer hole holders *translate([0, 0, -shh / 2]) for (xo = [-dbhw / 2 - ocd, dbhw / 2 + ocd], yo = [-so + ocd, -so - dbhh - ocd]) { translate([xo, yo, 0]) cylinder($fn = dToFn(oshd), d = oshd, h = shh, center = true); } // bottom plate hull() translate([0, 0, -shh - bph / 2]) for (xo = [-dbhw / 2, dbhw / 2], yo = [-so, -so - dbhh]) { //translate([-dbhw / 2, -so, 0]) translate([xo, yo, 0]) cylinder($fn = dToFn(oshd), d = oshd + 1, h = bph, center = true); } // fan: distance between holes fdbh = ld3007ms_distance_between_holes; // fan/plate hole holders fan_plate_hole_holder_h = hih - bph; fphhh = fan_plate_hole_holder_h; translate([0, 0, -shh / 2]) translate([0, -radxa_zero_3e_fan_hole_offset / 2 - (oshd - hid), -fphhh / 2]) for (xo = [-fdbh / 2, fdbh / 2], yo = [0, 0 - fdbh]) { //translate([-dbhw / 2, -so, 0]) translate([xo, yo, 0]) cylinder($fn = dToFn(oshd), d = oshd, h = fphhh, center = true); } } } } // with screw holes and fan holes // TODO: production: create a new one with normal holes and w/o fan holes module radxa_zero_3e_mount_plate_holes() { // fan hole diameter, put under CPU fan_hole_d = ld3007ms_w - 2; fhd = fan_hole_d; fan_hole_h = 10; fhh = fan_hole_h; // screw holder height shh = radxa_zero_3e_mount_plate_screw_holder_height; // TODO: deduplicate, move to a global var bottom_plate_h = 2; bph = bottom_plate_h; dbhw = radxa_zero_3e_pcb_distance_between_holes_w; dbhh = radxa_zero_3e_pcb_distance_between_holes_h; so = radxa_zero_3e_pcb_screw_offset; hid = hole_insert_diameter; // fan holes translate([0, -radxa_zero_3e_fan_hole_offset, 0]) hull() { // top translate([0, 0, -shh + $tiny_padding]) cylinder($fn = dToFn(fhd), d = fhd - 2, h = 0.001, center = true); // bottom translate([0, 0, -shh - bph + $tiny_padding]) //cylinder($fn = dToFn(fhd), d = fhd, h = fhh, center = true); cylinder($fn = dToFn(fhd), d = fhd, h = 0.001, center = true); // prolongate to cut scanner main frame translate([0, 0, -20]) //cylinder($fn = dToFn(fhd), d = fhd, h = fhh, center = true); cylinder($fn = dToFn(fhd), d = fhd, h = 0.001, center = true); } // fan screw holders holes translate([0, 0, -bph - shh - $tiny_padding]) radxa_zero_3e_mount_plate_outer_holes(); // radxa hot inserts holes translate([0, 0, -shh / 2]) for (xo = [-dbhw / 2, dbhw / 2], yo = [-so, -so - dbhh]) { //translate([-dbhw / 2, -so, 0]) translate([xo, yo, $tiny_padding]) cylinder($fn = dToFn(hid), d = hid, h = shh, center = true); } } module radxa_zero_3e_mount_plate_with_holes() { shh = radxa_zero_3e_mount_plate_screw_holder_height; bph = radxa_zero_3e_mount_plate_h; //color("green", 0.1) difference() { radxa_zero_3e_mount_plate(); radxa_zero_3e_mount_plate_holes(); } translate([0, -radxa_zero_3e_fan_hole_offset, -shh - bph]) rotate([-90, 0, 0]) *%ld3007ms(); } // these holes should be positioned by a module which knows // radxa position in body, so putting them at z==0 for now module radxa_zero_3e_mount_plate_outer_holes() { shh = radxa_zero_3e_mount_plate_screw_holder_height; bph = radxa_zero_3e_mount_plate_h; translate([0, -radxa_zero_3e_fan_hole_offset, 0]) rotate([90, 0, 0]) ld3007ms_holes(); } //radxa_zero_3e(); //rpi_zero_protoboard(); //radxa_zero_3e_with_protoboard(); //%radxa_zero_3e_rj45_male(); *%radxa_zero_3e_with_protoboard_and_connectors(); *translate([0, 0, -6 - $tiny_padding]) *radxa_zero_3e_mount_plate_outer_holes(); *radxa_zero_3e_mount_plate(); *radxa_zero_3e_mount_plate_with_holes(); *radxa_zero_3e_mount_plate_outer_holes(); //translate([0, fwo, 0]) //translate([0, 0, 20]) translate([0, 0, -10]) //translate([0, 0, radxa_zero_3e_pcb_h - 5]) //rotate([90, 0, 0]) *%radxa_zero_3e_mount_plate_outer_holes(); // debug, visualize 1 mm *union() { translate([15 - 0.5, -28, -6]) cube([1, 1, 1], center = true); translate([15 - 0.5, -28, -3]) cube([1, 1, 1], center = true); }