68 lines
2.6 KiB
OpenSCAD
68 lines
2.6 KiB
OpenSCAD
// Concealed DFRobot DFR1154 V1.1 chair camera pod, prototype v1.
|
|
// Strap beneath the walkway-side wicker armrest; +Z faces the walkway.
|
|
// Board and optic positions MUST be verified on the physical V1.1 unit.
|
|
part = "tray"; // "tray", "cover", or "assembly"
|
|
$fn = 64;
|
|
|
|
module rounded_slot_x(x0, x1, y, diameter, z0, height) {
|
|
hull() {
|
|
translate([x0,y,z0]) cylinder(d=diameter,h=height);
|
|
translate([x1,y,z0]) cylinder(d=diameter,h=height);
|
|
}
|
|
}
|
|
|
|
module rounded_slot_y(x, y0, y1, diameter, z0, height) {
|
|
hull() {
|
|
translate([x,y0,z0]) cylinder(d=diameter,h=height);
|
|
translate([x,y1,z0]) cylinder(d=diameter,h=height);
|
|
}
|
|
}
|
|
|
|
module tray() {
|
|
difference() {
|
|
union() {
|
|
// Square rear plate and short side/top shroud. Bottom stays open
|
|
// for the board's USB-C plug and a downward cable drip loop.
|
|
translate([-27,-27,0]) cube([54,54,3]);
|
|
translate([-27,-27,3]) cube([3,54,10]);
|
|
translate([24,-27,3]) cube([3,54,10]);
|
|
translate([-27,24,3]) cube([54,3,10]);
|
|
// Four board spacers (3 mm high).
|
|
for (x=[-17,17], y=[-17,17])
|
|
translate([x,y,3]) cylinder(d=7,h=3);
|
|
// Two rear ears accept soft hook-and-loop straps threaded through
|
|
// the wicker frame. They stay behind the camera's front plane.
|
|
translate([-39,-18,0]) cube([13,36,4]);
|
|
translate([26,-18,0]) cube([13,36,4]);
|
|
}
|
|
// Adjustable PCB slots accommodate 30-38 mm horizontal hole pitch.
|
|
for (y=[-17,17], s=[-1,1])
|
|
rounded_slot_x(s*15,s*19,y,3.0,-1,9);
|
|
// Strap slots in the ears.
|
|
for (x=[-33,33])
|
|
rounded_slot_y(x,-11,11,5,-1,6);
|
|
// M2 cover screws: pilot bores into the side-wall corner lands.
|
|
for (x=[-25.5,25.5], y=[-23,23])
|
|
translate([x,y,5]) cylinder(d=1.6,h=9);
|
|
}
|
|
}
|
|
|
|
module cover() {
|
|
difference() {
|
|
translate([-27,-27,0]) cube([54,54,2.4]);
|
|
// Approximate source-board layout: lens ~6 mm above board center;
|
|
// two IR emitters on each side. Kept as separate unglazed openings
|
|
// so the IR cannot reflect from a shared close window into the lens.
|
|
translate([0,6,-1]) cylinder(d=18,h=5);
|
|
for (x=[-15.5,15.5])
|
|
rounded_slot_y(x,0,11,7,-1,5);
|
|
// The four side-wall screws secure a removable faceplate.
|
|
for (x=[-25.5,25.5], y=[-23,23])
|
|
translate([x,y,-1]) cylinder(d=2.4,h=5);
|
|
}
|
|
}
|
|
|
|
if (part == "tray") tray();
|
|
else if (part == "cover") cover();
|
|
else { tray(); translate([0,0,13]) cover(); }
|