222 lines
9.0 KiB
OpenSCAD
222 lines
9.0 KiB
OpenSCAD
//uniBox2
|
|
|
|
$fn = 32;
|
|
include <./camferCube.scad>
|
|
include <./screwShapes1.scad>
|
|
|
|
pcbW = 25; // inside width, mm
|
|
pcbL = 90; // inside length, mm
|
|
pcb_margin = 0.5; // extra space on each edge of PCB, but accounted for in pillar and hole location, mm
|
|
bottomHeight = 50; // height of inside wall for side without screws, mm
|
|
screwSideHeight = 3; // mm
|
|
wall = 2; // wall thickness, mm
|
|
pcb_thickness = 2; // leaves gap between pillars for PCB, mm
|
|
pillar_x = 1; // distance in from edge of PCB, mm
|
|
pillar_y = 1; // distance in from edge of PCB, mm
|
|
screw_thread_diam = 1.5; // diameter of pillar that will accept screw threads
|
|
screw_hole_diam = 2.2;
|
|
|
|
// TODO also consider taking PCB a) dimensions and b) hole spacing and
|
|
// building the box around those values (first screw holes, then box).
|
|
|
|
// Define box dimensions
|
|
bottomDimsInside = [pcbW + screw_thread_diam + (1.5 * wall),
|
|
pcbL + (2 * pcb_margin),
|
|
bottomHeight + wall];
|
|
bottomDimsOutside = bottomDimsInside + [2 * wall, 2 * wall, 0];
|
|
screwSideDimsInside = [pcbW + screw_thread_diam + (1.5 * wall),
|
|
pcbL + (2 * pcb_margin),
|
|
screwSideHeight + wall];
|
|
screwSideDimsOutside = screwSideDimsInside + [2 * wall, 2 * wall, 0];
|
|
|
|
// Define pillar XY locations
|
|
pillarSW = [wall + pillar_x ,
|
|
wall + pillar_y ,
|
|
wall];
|
|
pillarSE = [bottomDimsInside[0] - pillar_x + wall,
|
|
wall + pillar_y,
|
|
wall];
|
|
pillarNW = [wall + pillar_x,
|
|
bottomDimsInside[1] - pillar_y + wall,
|
|
wall];
|
|
pillarNE = [bottomDimsInside[0] - pillar_x + wall,
|
|
bottomDimsInside[1] - pillar_y + wall,
|
|
wall];
|
|
// Echo hole spacing
|
|
echo("X screw center spacing: ", pillarSE[0] - pillarSW[0]);
|
|
echo("Y screw center spacing: ", pillarNE[1] - pillarSE[1]);
|
|
|
|
// Define ridge locations
|
|
ridgeWest = [wall/2, bottomDimsInside[1] / 2 + wall, bottomDimsInside[2]];
|
|
ridgeEast = [bottomDimsOutside[0] - wall / 2, bottomDimsInside[1] / 2 + wall , bottomDimsInside[2]];
|
|
ridgeWestScrew = [wall/2, bottomDimsInside[1] / 2 + wall, screwSideDimsInside[2]];
|
|
ridgeEastScrew = [bottomDimsOutside[0] - wall / 2, bottomDimsInside[1] / 2 + wall , screwSideDimsInside[2]];
|
|
|
|
|
|
module bottom(screwSide = false) {
|
|
difference() {
|
|
if (screwSide) {
|
|
difference(){
|
|
difference() {
|
|
camferHalfCube(screwSideDimsOutside, false);
|
|
translate([wall, wall, wall]) cube(screwSideDimsInside);
|
|
}
|
|
// Add text
|
|
translate([bottomDimsOutside[0] / 3,
|
|
bottomDimsOutside[1] / 3.5,
|
|
1]) rotate([180, 0, 270])
|
|
linear_extrude(2)
|
|
text("Vulpes v01", valign = "center", halign = "center", size = 6, );
|
|
translate([bottomDimsOutside[0] / 1.5 ,
|
|
bottomDimsOutside[1] / 1.5,
|
|
1]) rotate([180, 0, 270])
|
|
linear_extrude(2)
|
|
text("W1CDN", valign = "center", halign = "center", size = 6, );
|
|
|
|
}
|
|
} else {
|
|
difference() {
|
|
difference(){
|
|
camferHalfCube(bottomDimsOutside, false);
|
|
translate([wall, wall, wall]) cube(bottomDimsInside);
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
// side ridge concave
|
|
translate(ridgeWest) sideRidge();
|
|
translate(ridgeEast) sideRidge();
|
|
|
|
// Screw insets
|
|
if (screwSide) {
|
|
translate(pillarSW) translate([0, 0, -wall - 0.02]) flatHeadM2(bottomHeight);
|
|
translate(pillarSE) translate([0, 0, -wall - 0.02]) flatHeadM2(bottomHeight);
|
|
translate(pillarNW) translate([0, 0, -wall - 0.02]) flatHeadM2(bottomHeight);
|
|
translate(pillarNE) translate([0, 0, -wall - 0.02]) flatHeadM2(bottomHeight);
|
|
|
|
// Holes for Vulpes board v01.
|
|
// Lay out holes on XY plane, then rotate into place and move to correct side.
|
|
// Measure relative to bottom of PCB.
|
|
translate([bottomDimsInside[0] - (wall * 1.5) - screw_thread_diam,
|
|
wall*1.5,
|
|
0 + wall/2]){
|
|
rotate([0, -180, 90]){
|
|
// Key jack
|
|
translate([-26, 3, 0])
|
|
cylinder(d = 8, h = wall + 0.04, center = true);
|
|
// Key block
|
|
translate([-14, 4, 0])
|
|
cube([10, 6, wall + 0.04], center = true);
|
|
// USB
|
|
translate([-59, 14, 0])
|
|
cube([12, 8, wall + 0.04], center = true);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
if (screwSide) { // if screw side
|
|
// side ridge convex
|
|
translate(ridgeWestScrew) sideRidge(wall);
|
|
translate(ridgeEastScrew) sideRidge(wall);
|
|
// Pillars
|
|
translate(pillarSW) screwPillar(screwSide, screwSideDimsInside[2] - wall, screw_hole_diam, screw_thread_diam);
|
|
translate(pillarSE) screwPillar(screwSide, screwSideDimsInside[2] - wall, screw_hole_diam, screw_thread_diam);
|
|
translate(pillarNW) screwPillar(screwSide, screwSideDimsInside[2] - wall, screw_hole_diam, screw_thread_diam);
|
|
translate(pillarNE) screwPillar(screwSide, screwSideDimsInside[2] - wall, screw_hole_diam, screw_thread_diam);
|
|
|
|
// Grooves for PCB
|
|
translate([pillarSE[0] - pcb_thickness - (wall * 1.5) - (screw_thread_diam / 2), wall, 0])
|
|
cube([wall/2, wall*1.5, screwSideDimsInside[2]]);
|
|
translate([pillarNE[0] - pcb_thickness - (wall * 1.5) - (screw_thread_diam / 2), bottomDimsInside[1] - wall/2, 0])
|
|
cube([wall/2, wall*1.5, screwSideDimsInside[2]]);
|
|
}
|
|
else { // if not screw side
|
|
translate(pillarSW) screwPillar(screwSide, bottomDimsInside[2] - wall, screw_hole_diam, screw_thread_diam);
|
|
translate(pillarSE) screwPillar(screwSide, bottomDimsInside[2] - wall, screw_hole_diam, screw_thread_diam);
|
|
translate(pillarNW) screwPillar(screwSide, bottomDimsInside[2] - wall, screw_hole_diam, screw_thread_diam);
|
|
translate(pillarNE) screwPillar(screwSide, bottomDimsInside[2] - wall, screw_hole_diam, screw_thread_diam);
|
|
|
|
// Grooves for PCB
|
|
translate([pillarSE[0] - pcb_thickness - (wall * 1.5) - (screw_thread_diam / 2), wall, 0])
|
|
cube([wall/2, wall*1.5, bottomDimsInside[2]]);
|
|
translate([pillarNE[0] - pcb_thickness - (wall * 1.5) - (screw_thread_diam / 2), bottomDimsInside[1] - wall/2, 0])
|
|
cube([wall/2, wall*1.5, bottomDimsInside[2]]);
|
|
}
|
|
|
|
}
|
|
|
|
module sideRidge(redux = 0) {
|
|
ridgeSize = wall * 0.5;
|
|
rotate([0, 45, 0]) cube([ridgeSize, pcbL - 7 * wall - redux, ridgeSize], true);
|
|
}
|
|
|
|
module sideRidge2(redux = 0) {
|
|
ridgeSize = wall * 0.5;
|
|
rotate([0, 45, 0]) cube([ridgeSize, pcbW - 7 * wall - redux, ridgeSize], true);
|
|
}
|
|
|
|
module flatHeadM2(length) {
|
|
headMax = 3.75;
|
|
headMin = 2.2;
|
|
headHeight = 2.01;
|
|
cylinder(d1 = headMax, d2 = headMin, h = headHeight + 0.01);
|
|
translate([0, 0, headHeight]) cylinder(d = headMin, h = length - headHeight);
|
|
}
|
|
|
|
module bezelCube(dims, center = false, camfer = 1.0) {
|
|
width = dims[0];
|
|
height = dims[1];
|
|
length = dims[2];
|
|
radius = 0.01;
|
|
translate([width, height, length]) {
|
|
rotate([-90, 0, 180]) {
|
|
hull() {
|
|
// lower plane
|
|
translate([0, 0, 0]) sphere(r = radius);
|
|
translate([ width, 0, 0]) sphere(r = radius);
|
|
translate([0, length, 0]) sphere(r = radius);
|
|
translate([ width, length, 0]) sphere(r = radius);
|
|
// upper plane
|
|
translate([- camfer, - camfer, height]) sphere(r = radius);
|
|
translate([ width + camfer, - camfer, height]) sphere(r = radius);
|
|
translate([- camfer, length + camfer, height]) sphere(r = radius);
|
|
translate([ width + camfer, length + camfer, height]) sphere(r = radius);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
module screwPillar(screwSide = false, height, insideDiamHole, insideDiamThread) {
|
|
//insideDiam = 2.6;
|
|
outsideDiam = insideDiamHole + 1.5 * wall;
|
|
difference() {
|
|
union(){
|
|
cylinder(d = outsideDiam, h = height) ;
|
|
//cylinder(h = height * 0.15, r2 = (outsideDiam/2), r1 = outsideDiam*0.7);
|
|
}
|
|
translate([0, 0, -0.01]) {
|
|
if (screwSide) {
|
|
cylinder(d = insideDiamHole, h = height + 0.02);
|
|
} else {
|
|
cylinder(d = insideDiamThread, h = height + 0.02);
|
|
}
|
|
}
|
|
}
|
|
// Extra support at base
|
|
|
|
}
|
|
|
|
// Make the not-screw side
|
|
translate([10 - wall, 0 - wall, 0]) bottom();
|
|
// Make the screw side and scale it
|
|
translate([-pcbW - 10 - wall, 0 - wall, 0]) bottom(true);
|
|
|
|
|
|
|
|
|
|
|
|
|