include include include include include include include include include // main frame size // 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 = 56; // wall and wall thickness $sbfwo = $scannerBodyFrontWallOffsetMm; $wawt = -$scannerBodyFrontWallOffsetMm + $scannerBodyWallThicknessMm; wt = $scannerBodyWallThicknessMm; wzo = $scannerBodyFrontWallOffsetMm; module cam_and_lense_new() { lhs = laser_holder_size(); // screw insert diameter id = 4; // cam and lense holder mount plate z size (scanner coords) //calhmpzs = 20; calhmpzs = 8; // cam and lense holder mount plate y height (scanner coords) //calhmpyh = 13; //calhmpyh = 25.714; calhmpyh = 20; // cam and lense holder mount plate z offset (scanner coords) //calhmpzo = 5.07; calhmpzo = -0.93; //tpw = $m12_lense_holder_size; tpw = veye_imx287_pcb_w; color("pink", 0.6) union() { //color("green", 0.3) difference() { //color("blue", 0.3) hull() { translate([0, 0, $lenseYPosMm]) rotate([-$opticalAxisAngleDegrees, 0, 0]) translate([0, -$lenseSensorDistanceMm, 0]) rotate([$sensorLenseAngleDegrees, 0, 0]) veye_imx287_mount_plate_outer(); translate([0, 0, $lenseYPosMm]) rotate([-$opticalAxisAngleDegrees, 0, 0]) { //color("blue", 0.3) { m12_lense_holder_base(); color("blue", 0.3) %m12_lense_holder(); } } } hull() translate([0, 0, $lenseYPosMm]) rotate([-$opticalAxisAngleDegrees, 0, 0]) { m12_lense_circle(); translate([0, -$lenseSensorDistanceMm, 0]) rotate([$sensorLenseAngleDegrees, 0, 0]) veye_imx287_mount_plate_inner(); } } // top part hull() { // lense holder helper { //color("red", 0.3) translate([0, 0, $lenseYPosMm]) rotate([-$opticalAxisAngleDegrees, 0, 0]) //translate([0, -$lenseSensorDistanceMm, 0]) //rotate([$sensorLenseAngleDegrees, 0, 0]) m12_lense_holder_top(); } // cam holder helper { pcb_w = veye_imx287_pcb_w; pcb_h = veye_imx287_pcb_h; //color("yellow", 0.5) translate([0, 0, $lenseYPosMm]) rotate([-$opticalAxisAngleDegrees, 0, 0]) translate([0, -$lenseSensorDistanceMm, 0]) rotate([$sensorLenseAngleDegrees, 0, 0]) //cube([pcb_w + $tiny_padding * 2, 1, 1]); veye_imx287_mount_plate_outer_top(); } // wall near body { //color("orange", 0.3) translate([-pcb_w / 2, -$sbfwo, 116]) rotate([90, 0, 0]) cube([pcb_w, 14, 1]); } } } } module cam_and_lense() { lhs = laser_holder_size(); // screw insert diameter id = 4; // cam and lense holder mount plate z size (scanner coords) calhmpzs = 20; // cam and lense holder mount plate y height (scanner coords) calhmpyh = 13; // cam and lense holder mount plate z offset (scanner coords) calhmpzo = 5.07; //tpw = $m12_lense_holder_size; tpw = veye_imx287_pcb_w; translate([0, 0, $lenseYPosMm]) %rotate([-$opticalAxisAngleDegrees, 0, 0]) { //color("orange", 0.6) m12_lense_holder(); %m12_lense(); //color("red", 0.3) //%m12_lense_circle(); translate([0, -$lenseSensorDistanceMm, 0]) rotate([$sensorLenseAngleDegrees, 0, 0]) { //color("yellow", 0.3) veye_imx287_natural(); } color("green", 0.5) *difference() { // outer area //color("blue", 0.8) //color("blue") hull() { m12_lense_holder_base(); { translate([0, -$lenseSensorDistanceMm, 0]) rotate([$sensorLenseAngleDegrees, 0, 0]) veye_imx287_mount_plate_outer(); } } //m12_lense_circle(); // inner area to cut //color("red", 0.3) hull() { m12_lense_circle(); translate([0, -$lenseSensorDistanceMm, 0]) rotate([$sensorLenseAngleDegrees, 0, 0]) veye_imx287_mount_plate_inner(); } } } color("green", 0.3) *hull() { translate([0, 0, $lenseYPosMm]) rotate([-$opticalAxisAngleDegrees, 0, 0]) { color("green", 0.3) { m12_lense_holder_base(); { translate([0, -$lenseSensorDistanceMm, 0]) rotate([$sensorLenseAngleDegrees, 0, 0]) veye_imx287_mount_plate_outer(); } } } // cam and lense mount plate color("red", 0.5) translate([ 0, calhmpzo, //0, -$tiny_padding - lhs[2] / 2 + main_frame_height_y]) cube([ //veye_imx287_pcb_h / 2, tpw, //calhmpzs, //tpw / 2, $tiny_padding, $tiny_padding ], center = true); } color("green", 0.3) *hull() { color("red", 0.5) translate([ 0, calhmpzo, //0, -$tiny_padding - lhs[2] / 2 + main_frame_height_y]) cube([ //veye_imx287_pcb_h / 2, tpw, //calhmpzs, //tpw / 2, $tiny_padding, $tiny_padding ], center = true); } // AAAAAAAAAAAAA //union() color("blue", 0.3) hull() { translate([0, 0, $lenseYPosMm]) rotate([-$opticalAxisAngleDegrees, 0, 0]) translate([0, -$lenseSensorDistanceMm, 0]) rotate([$sensorLenseAngleDegrees, 0, 0]) veye_imx287_mount_plate_outer(); translate([0, 0, $lenseYPosMm]) rotate([-$opticalAxisAngleDegrees, 0, 0]) { color("blue", 0.3) { m12_lense_holder_base(); } } // second top plate height stph = 5; translate([ 0, //-4.917, -3.85, //0, -$tiny_padding - lhs[2] / 2 + main_frame_height_y -stph / 2 ]) *cube([ veye_imx287_pcb_h,// - veye_imx287_mount_plate_corner_radius * 2, //tpw, //calhmpzs, //tpw / 2, $tiny_padding, //$tiny_padding stph ], center = true); } { // cam and lense mount plate color("orange", 0.5) translate([ 0, calhmpzo, //0, -$tiny_padding - lhs[2] / 2 + main_frame_height_y - calhmpyh / 2]) cube([ //veye_imx287_pcb_h / 2, tpw, //calhmpzs, //tpw / 2, //10, 10 calhmpzs, //$tiny_padding, //$tiny_padding calhmpyh ], center = true); translate([0, 0, $lenseYPosMm]) rotate([-$opticalAxisAngleDegrees, 0, 0]) { color("red", 0.3) { m12_lense_holder_base(); } } } // cam and lense holder screw holes *union() { // multipliers are in scanner coords for (x_mult = [-1, 1], z = [0, -16]) { /*translate([ -lhs[0] * 1 / 3 * x_mult, //-lhs[1] / 2 * z_mult +- 4, z, -lhs[2] / 2]) */ translate([ veye_imx287_pcb_h / 3 * x_mult, //calhmpzs / 2, calhmpzo, -lhs[2] / 2 + main_frame_height_y]) screw_hole( m = m2, id = id, il = hole_insert_height * 2, hd = m2_head_diameter, hh = m2_head_height, hs = hole_side_top); } } } module cam_and_lense_holder() { color("red", 0.3) m12_lense_circle(); } module camera_hole() { // TODO: calc Y (scanner coords) offset instead of // hardcoding it y_offset = 100; translate([0, 0, y_offset]) // move to the front border of scanner body translate([0, $wawt, 0]) front_glass_hole(gw = 26.6, gh = 19.6, gt = 2, gcr = 1); } module laser_glass_hole() { // TODO: calc Y (scanner coords) offset instead of // hardcoding it y_offset = 0; translate([0, 0, y_offset]) // move to the front border of scanner body translate([0, $wawt, 0]) front_glass_hole(gw = 14, gh = 6, gt = 2, gcr = 1); } module laser_holder_screw_holes() { lzo = -$laserZOffsetMm; ll = $laserBodyLengthMm; lhs = laser_holder_size(); id = 4; // multipliers are in scanner coords for (x_mult = [-1, 1], z = [0, -16]) { translate([ -lhs[0] * 1 / 3 * x_mult, //-lhs[1] / 2 * z_mult +- 4, z, -lhs[2] / 2]) screw_hole( m = m2, id = id, il = hole_insert_height * 2, hd = m2_head_diameter, hh = m2_head_height, hs = hole_side_bottom); } } module visualize_yz_range() { lenseY = $lenseYPosMm; zBase = $actualZBaseMm + $wawt; farZ = zBase + $actualZRangeMm; color("red", 0.3) rotate([0, -90, 0]) %polygon([ [lenseY, 0], [0, zBase], [0, farZ], ]); } module visualize_xz_range() { zBase = $actualZBaseMm + $wawt; farZ = zBase + $actualZRangeMm; color("red", 0.3) %polygon( [[$actualXStartMm / 2, zBase], [-$actualXStartMm / 2, zBase], [-$actualXEndMm / 2, farZ], [$actualXEndMm / 2, farZ],]); } module visualize_range() { lenseY = $lenseYPosMm; zBase = $actualZBaseMm + $wawt; // TODO: use `zEnd` name instead of `farZ`? farZ = zBase + $actualZRangeMm; xs = $actualXStartMm; xe = $actualXEndMm; // lense center lc = [0, 0, lenseY]; // x start left xsl = [-xs / 2, zBase, 0]; xsr = [xs / 2, zBase, 0]; xel = [-xe / 2, farZ, 0]; xer = [xe / 2, farZ, 0]; // 0 1 2 3 4 points = [lc, xsl, xsr, xel, xer]; // front (top?) face // ff = [lc, xel, xer]; ff = [0, 3, 4]; // right face // rf = [xer, lc, xsr]; rf = [4, 0, 2]; // back (ass) face // bkf = [xsr, lc, xsl]; bkf = [2, 0, 1]; // left face // lf = [xsl, lc, xel]; lf = [1, 0, 3]; // bottom face // bmf = [xel, xer, xsr, xsl]; bmf = [3, 4, 2, 1]; faces = [ff, rf, bkf, lf, bmf]; //faces = [ff]; //polyhedron(points, faces); color("red", 0.4) polyhedron( [lc, xsl, xsr, xel, xer], //[ff, rf, bkf] faces ); } // main frame module scanner_main_frame() { lhs = laser_holder_size(); // inner height, width, depth and radius ih = main_frame_height_y; iw = main_frame_width_x; id = main_frame_depth_z; ir = wt; // 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 // chinese fan //translate([0, -$scannerBodyFrontWallOffsetMm, 40]) translate([0, ld3007ms_t - wzo - id, 80]) *ld3007ms(); } module m12_connectors() { // inner height, width, depth and radius ih = main_frame_height_y; iw = main_frame_width_x; id = main_frame_depth_z; ir = wt; { // add outer m12 connectors //scale([1.05, 1, 1.05]) translate([0, -wzo - id + $tiny_padding, 20 + m12_male_conn_body_thick_part_d + 5]) m12_female_connector(); translate([0, -wzo - id + $tiny_padding, 20]) m12_male_connector(); } } module laser_with_holder() { translate([0, -$laserZOffsetMm, 0]) { %laser_body(); %laser_holder(); } } module 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(); } module other() { //cam_and_lense(); cam_and_lense_new(); //visualize_yz_range(); //visualize_xz_range(); visualize_range(); laser_with_holder(); radxa(); } *other(); difference() { scanner_main_frame(); camera_hole(); laser_glass_hole(); laser_holder_screw_holes(); m12_connectors(); }