summaryrefslogtreecommitdiff
path: root/body/body.scad
diff options
context:
space:
mode:
authorNikita Kostovsky <nikita@kostovsky.me>2026-01-07 15:20:08 +0100
committerNikita Kostovsky <nikita@kostovsky.me>2026-01-07 15:20:08 +0100
commit7d3798f2a7c28d558d975d1844bb729fe8de0923 (patch)
tree8e8ff2ce2f61c2e407c6905583b783ddb6b8c182 /body/body.scad
parent8afef3bc72c8b73244cb5fe083e16fc3d9066fa6 (diff)
add fans and radxa; implement body prototype
Diffstat (limited to 'body/body.scad')
-rw-r--r--body/body.scad125
1 files changed, 123 insertions, 2 deletions
diff --git a/body/body.scad b/body/body.scad
index 506422b..2863d99 100644
--- a/body/body.scad
+++ b/body/body.scad
@@ -2,6 +2,127 @@ include <design.scad>
include <helpers.scad>
include <m12_lense_holder.scad>
include <m12_lense_holder_adapter.scad>
+include <noctua_nf_a4x20.scad>
+include <radxa_zero_3e.scad>
+include <veye_imx287.scad>
-m12_lense_holder();
-//m12_lense_holder_wo_holes(); \ No newline at end of file
+// cam + 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();
+}
+
+// laser
+translate([0, -$laserZOffsetMm, 0])
+{
+ %laser_body();
+ laser_holder();
+}
+
+// radxa
+translate([0, 0, 20])
+translate([0, 10, radxa_zero_3e_pcb_h - 5])
+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();
+
+// chinese fan
+translate([0, -$scannerBodyFrontWallOffsetMm, 40])
+%ld3007ms();
+
+// 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
+
+ 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);
+ }
+ }
+ }
+ }
+
+ // 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
+}
+
+%scanner_main_frame(); \ No newline at end of file