include include include include include include include include module cam_and_lense() { translate([0, 0, $lenseYPosMm]) rotate([-$opticalAxisAngleDegrees, 0, 0]) { m12_lense_holder(); %m12_lense(); translate([0, -$lenseSensorDistanceMm, 0]) rotate([$sensorLenseAngleDegrees, 0, 0]) veye_imx287_natural(); } } cam_and_lense(); // laser translate([0, -$laserZOffsetMm, 0]) { %laser_body(); laser_holder(); } // radxa translate([0, 0, 20]) translate([ 0, -$scannerBodyFrontWallOffsetMm - 5, radxa_zero_3e_pcb_h - 10]) rotate([90, 0, 0]) //radxa_zero_3e_with_protoboard(); radxa_zero_3e_with_protoboard_and_connectors(); // noctua fan //translate([0, -$laserBodyLengthMm, $lenseYPosMm + 20]) translate([0, -$scannerBodyFrontWallOffsetMm, 40]) *noctua_nf_a4x20(); // main frame module scanner_main_frame() { lhs = laser_holder_size(); wt = $scannerBodyWallThicknessMm; wzo = $scannerBodyFrontWallOffsetMm; // in scanner coords // inner height is a bit random // TODO: choose constant size to use one frame for // many similar ranges main_frame_height_y = 150; main_frame_width_x = 34; main_frame_depth_z = 65; // inner height, width, depth and radius ih = main_frame_height_y; iw = main_frame_width_x; id = main_frame_depth_z; ir = wt; // front wall translate([-iw / 2, -wzo, -lhs[2] / 2]) cube([iw, wt, ih]); // back wall translate([0, -wzo - id, 0]) // initial positioning translate([-iw / 2, -wt, -lhs[2] / 2]) cube([iw, wt, ih]); // bottom wall // apply body sizes translate([0, -wzo, -lhs[2] / 2]) // initial positioning translate([0, -id / 2, -wt / 2]) cube([iw, id, wt], center = true); // top wall // apply body sizes translate([0, -wzo, -lhs[2] / 2 + ih]) // initial positioning translate([0, -id / 2, wt / 2]) cube([iw, id, wt], center = true); // now try to cut body with rounded corners to simplify // cnc manufacturing // TODO: move this shit to a module difference() { hull() { // outer cylinders union() { for (yd = [0, -id], zd = [0, ih]) { translate([0, -wzo + yd, -lhs[2] / 2 + zd]) rotate([0, 90, 0]) cylinder($fn = dToFn(ir * 2), r = ir, h = iw, center = true); } } } // inner cylinders hull() { union() { for (yd = [0 - ir, -id + ir], zd = [0 + ir, ih - ir]) { translate([0, -wzo + yd, -lhs[2] / 2 + zd]) rotate([0, 90, 0]) // scale by x a bit to fully cut cylinder($fn = dToFn(ir * 2), r = ir, h = iw * 1.1, center = true); } } } } // TODO: and now add some stands for screwing left/right covers // TODO: simplify inner cut cube after implementing this: // rounded corners won't be needed anymore // add outer m12 connectors translate([0, -wzo - id, 20 + m12_male_conn_body_thick_part_d + 5]) m12_female_connector(); translate([0, -wzo - id, 20]) m12_male_connector(); // chinese fan //translate([0, -$scannerBodyFrontWallOffsetMm, 40]) translate([0, ld3007ms_t - wzo - id, 80]) %ld3007ms(); } %scanner_main_frame();