Compare commits

...

2 commits

Author SHA1 Message Date
Michael Hope 5a6d4dc983 cad: add a universal DIN rail mount 2024-02-25 17:54:24 +01:00
Michael Hope ce660d3e91 cad: add a Insta 360 Go 2 on Funcub mount 2024-02-24 13:16:32 +01:00
2 changed files with 397 additions and 0 deletions

168
din-rail/unversal.scad Normal file
View file

@ -0,0 +1,168 @@
$fn = 20;
din_w = 35;
din_w2 = 25;
din_wall = 1;
din_h = 7.5;
tol = 0.1;
m = 3;
wall = 1.5;
module cylindery(l, d) {
translate([d/2, 0, d/2])
rotate(90, [-1, 0, 0])
cylinder(l, d/2, d/2);
}
module cylinderx(l, d) {
translate([0, d/2, d/2])
rotate(90, [0, 1, 0])
cylinder(l, d/2, d/2);
}
module cylinderz(l, d) {
translate([d/2, d/2, 0])
cylinder(l, d/2, d/2);
}
h1 = m + 2;
h2 = 3;
module top_clip(bar_s) {
cube([wall, bar_s.y, din_wall+h2-wall/2]);
hull() {
translate([0, 0, din_wall]) cube([wall, bar_s.y, wall]);
translate([0, 0, din_wall+h2-wall/2]) {
cylindery(bar_s.y, wall);
translate([-2, 0, 0]) cylindery(bar_s.y, wall);
}
}
z = wall*1.2;
translate([wall, bar_s.y/2, 0])
rotate(45, [0, 1, 0])
cube([z, bar_s.y, z], center=true);
}
module bottom_clip_holes(bar_s) {
h = bar_s.y/2 + m;
translate([-10, h - wall, m/2 + 0.2])
cylinderx(50, m);
}
module bottom_clip(bar_s) {
h = bar_s.y/2 + m;
difference() {
union() {
cube([wall, bar_s.y, din_wall+h1]);
translate([0, 0, din_wall+h1-wall/2])
cylindery(bar_s.y, wall);
translate([-wall, 0, 0]) {
cube([wall, h, h1 + din_wall]);
translate([0, h - (h1+din_wall)/2, 0])
cylinderx(wall, h1 + din_wall);
}
}
bottom_clip_holes(bar_s);
}
}
module main_bar(bar_s) {
hull() {
cylindery(bar_s.y, wall);
translate([bar_s.x - wall, 0, 0]) cylindery(bar_s.y, wall);
}
}
module bottom_ledge(bar_s) {
h = bar_s.y / 2 - wall;
translate([wall, 0, wall]) {
cube([m + wall, h, wall]);
translate([0, h - (m+wall)/2, 0])
cylinderz(wall, m+wall);
}
}
module bottom_ledge_holes(bar_s) {
h = (bar_s.y - m)/2 - wall;
translate([(wall + m)/2, h, -5])
cylinderz(50, m);
}
tie_w = 3;
tie_wall = wall + 1;
module tie_holes(bar_s) {
w = tie_w;
translate([(bar_s.x - 22)/2, 0, 0])
for (y = [tie_wall, bar_s.y - tie_wall - w]) {
hull() {
for (x = [0, 22]) {
translate([x, y, -1]) cylinderz(50, w);
}
}
}
}
module bar(bar_s) {
difference() {
union() {
main_bar(bar_s);
bottom_ledge(bar_s);
translate([(bar_s.x - din_w - wall)/2, 0, bar_s.z]) {
bottom_clip(bar_s);
translate([din_w + wall + 0.5, 0, 0]) top_clip(bar_s);
}
}
bottom_ledge_holes(bar_s);
tie_holes(bar_s);
}
}
module fillet(d) {
difference() {
cube([d, d, wall]);
translate([0, 0, -1]) cylinderz(50, d*2);
}
}
joiner_l = 10;
// Joins two bars.
module joiner(w) {
cube([joiner_l, w, wall]);
translate([joiner_l, 0, 0]) fillet(3);
translate([0, 0, 0]) mirror([1, 0, 0]) fillet(3);
translate([0, w, 0]) mirror([1, 1, 0]) fillet(3);
translate([joiner_l, w, 0]) mirror([0, 1, 0]) fillet(3);
}
module assembly(w=50) {
max_w = 20;
if (w >= max_w*2) {
bar_s = [60+10, max_w, wall];
bar(bar_s);
translate([0, w - bar_s.y, 0]) bar(bar_s);
for (x = [bar_s.x*1/4, bar_s.x*3/4]) {
translate([x - joiner_l/2, bar_s.y, 0]) joiner(w - bar_s.y*2);
}
} else {
bar_s = [60+10, w, wall];
bar(bar_s);
}
}
tplink_mc220l_s = [94, 73, 27];
edimax_es550g_s = [98, 71, 25.5]; // Note: filleted edges
nanopi_r5c_s = [62.5, 62.5, 29];
u_poe_af_s = [86, 46, 33];
tie_offset = tie_wall * 2 + tie_w;
//assembly(tplink_mc220l_s.y + tie_offset);
//assembly(edimax_es550g_s.x + tie_offset - 6);
//assembly(nanopi_r5c_s.z + tie_offset);
//assembly(nanopi_r5c_s.x + tie_offset);
assembly(u_poe_af_s.y + tie_offset);

229
insta-fun/insta-fun.scad Normal file
View file

@ -0,0 +1,229 @@
$fn = 60;
tol = 0.1;
wall = 1;
f = wall*5;
insta360_s = [53.0, 23.6, 17.5];
lens_r = 17.1/2 + wall;
r = 5;
l = insta360_s.x+wall*2 + tol*2;
w = insta360_s.y+wall*2 + tol*3;
h = insta360_s.z + tol - 1;
m = 3;
nut = 5.5;
module rcubez(s, r) {
hull() {
for (x = [r, s.x - r]) {
for (y = [r, s.y - r]) {
translate([x, y, 0]) cylinder(s.z, r, r);
}
}
}
}
module toroid(h, r) {
translate([0, 0, h/2])
rotate_extrude(convexity = 5)
translate([r-h/2, 0]) circle(d=h);
}
module prism(l, w, h){
polyhedron(//pt 0 1 2 3 4 5
points=[[0,0,0], [l,0,0], [l,w,0], [0,w,0], [0,w,h], [l,w,h]],
faces=[[0,1,2,3],[5,4,3,2],[0,4,5,1],[0,3,4],[5,2,1]]
);
}
module button(r=r) {
toroid(f, r);
cylinder(f, r-f/2, r-f/2);
}
// Bottom rounded plate.
module plate(l=l, w=w, h=h) {
translate([w/2, 0, 0]) {
button(w/2);
translate([l-w, 0, 0]) button(w/2);
// Left and right arms.
translate([l-w, w/2-f/2, f/2])
rotate(90, [0, -1, 0])
cylinder(l-w, f/2, f/2);
translate([l-w, -w/2+f/2, f/2])
rotate(90, [0, -1, 0])
cylinder(l-w, f/2, f/2);
// Inner fill.
translate([0, -w/2+f/2, 0]) cube([l-w, w-f, h]);
translate([0, -w/2, f/2]) cube([l-w, w, h-f/2]);
// Height extensions.
translate([0, 0, f/2]) cylinder(h-f/2, w/2, w/2);
translate([l-w, 0, f/2]) cylinder(h-f/2, w/2, w/2);
}
}
module rails() {
translate([w/2, w/2 - wall/2, h])
rotate(90, [0, 1, 0])
cylinder(l-w, wall/2, wall/2);
translate([w/2, -w/2 + wall/2, h])
rotate(90, [0, 1, 0])
cylinder(l-w, wall/2, wall/2);
translate([w/2, 0, h-wall/2])
difference() {
toroid(h=wall, r=w/2);
translate([0, -2*w, 0]) cube([w*4, w*4, w]);
}
translate([l-w/2, 0, h-wall/2])
difference() {
toroid(h=wall, r=w/2);
mirror([1, 0, 0])
translate([0, -2*w, 0]) cube([w*4, w*4, w]);
}
}
module lens_hole() {
translate([wall + lens_r + w/2 - lens_r
- 1.5, // Patch.
0, -1]) {
// Lens.
cylinder(h=20, lens_r, lens_r);
// LED bar.
translate([lens_r + 2, 0, 0])
cylinder(h=20, wall*2, wall*2);
translate([lens_r-1, -wall*2, 0])
cube([2+1, wall*4, 4]);
}
}
module button_hole() {
r1 = w*0.3;
translate([l - wall - w/2, 0, -1]) {
// Hole.
cylinder(h=20, r1, r1);
}
}
module retainer() {
t = 1.3 + wall/2;
translate([w/2, w/2 - wall/2, h - t + wall/2])
rotate(90, [1, 0, 0])
prism(l-w, t, t);
}
module microphone_hole() {
translate([-5, 0, h/2 + wall])
rotate(90,[0, 1, 0]) cylinder(l*2, wall*2, wall*2);
}
mount_plate_s = [l+ 15, h, wall*1.5];
module mount_plate(add_z=0) {
rcubez([mount_plate_s.x, mount_plate_s.y, mount_plate_s.z+add_z], 2);
}
module mount_plate_fillet() {
translate([0, mount_plate_s.y, 0])
rotate(90, [0, 0, -1])
translate([0, 0, 0])
prism(mount_plate_s.y, w/2, w/2);
}
module mount_plate_locators(pad=0) {
for (x = [1, 2, 3]) {
translate([mount_plate_s.x*x/4, 0, 0])
rotate(90, [-1, 0, 0])
cylinder(mount_plate_s.y*0.7+pad, wall+pad, wall+pad);
}
}
module mount_plate_holes() {
for (x = [m*1.5, mount_plate_s.x-m*1.5]) {
translate([x, mount_plate_s.y/2, -1])
cylinder(h=20, (m+0.5)/2, (m+0.5)/2);
}
}
module safety_mount() {
s = [3, 5, 3];
translate([mount_plate_s.x-m*3.5, s.y, s.x]) {
mirror([1, 0, 0]) {
translate([-s.x*1.76, 0, -s.x])
rotate(90, [0, 0, -1]) prism(s.y, s.x*2-3, s.x*2-1);
rotate(90, [1, 0, 0]) cylinder(s.y, s.x, s.x);
translate([0, -s.y, 0])
cube([s.x*3, s.y, s.x]);
}
}
}
module mount_plate_for_bolts() {
difference() {
union() {
mount_plate();
// Fillets.
translate([m*3, 0, 0]) mount_plate_fillet();
translate([mount_plate_s.x-m*3, 0, 0])
mirror([1, 0, 0]) mount_plate_fillet();
translate([mount_plate_s.x/4, 0, 0])
cube([mount_plate_s.x/2, mount_plate_s.y, mount_plate_s.z*3]);
// Locators.
mount_plate_locators();
// Safety wire.
safety_mount();
}
mount_plate_holes();
// Safety wire hole.
translate([mount_plate_s.x-m*3.5, 30, 3])
rotate(90, [1, 0, 0]) cylinder(60, 1, 1);
}
}
module mount_plate_for_nuts() {
pad = 1.5;
difference() {
mount_plate(pad);
translate([0, 0, mount_plate_s.z+pad]) mount_plate_locators(tol*2);
mount_plate_holes();
for (x = [m*1.5, mount_plate_s.x-m*1.5]) {
translate([x, mount_plate_s.y/2, 0])
cube([nut+tol, nut*1.3+tol, wall*3], center=true);
}
}
}
module shroud_mount_plate() {
translate([(l - mount_plate_s.x)/2,
w/2, 0])
rotate(90, [1, 0, 0]) mount_plate_for_bolts();
}
module shroud() {
difference() {
union() {
plate(l, w); rails(); shroud_mount_plate();
}
translate([wall, 0, wall])
plate(l-wall*2, w-wall*2, h=20);
lens_hole();
button_hole();
microphone_hole();
}
retainer();
mirror([0, 1, 0]) retainer();
}
//shroud();
//mount_plate_for_bolts();
//translate([0, 0, -10])
mount_plate_for_nuts();