Add most recent version of design and images.
This commit is contained in:
parent
f765de1233
commit
1309ca27b4
|
@ -6,6 +6,14 @@ Based on ["UniBox" by fjkraan at Printables](https://www.printables.com/model/47
|
|||
which was shared under a [Creative Commons (4.0 International License) Attribution](http://creativecommons.org/licenses/by/4.0/)
|
||||
license.
|
||||
|
||||
Designed in OpenSCAD. It is paramaterized.
|
||||
|
||||
Related:
|
||||
- [ESP32-based radio controller for radio orienteering/ARDF](https://amiok.net/gitea/W1CDN/vulpes)
|
||||
- [Vulpes Radio Orienteering Controller](https://w1cdn.net/projects/vulpes-radio-orienteering-controller/)
|
||||
|
||||
![Alt text](docs/vulpes_box_openscad.png "OpenSCAD")
|
||||
|
||||
![Photo of 3d-printed box with PCB held in a slot.](docs/vulpes_box_photo_front_open.jpg "PCB in place")
|
||||
|
||||
![Photo of same box, with cover on and all openings lined up.](docs/vulpes_box_photo_front.jpg "Cover in place")
|
BIN
docs/vulpes_box_openscad.png
Normal file
BIN
docs/vulpes_box_openscad.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 103 KiB |
BIN
docs/vulpes_box_photo_front.jpg
Normal file
BIN
docs/vulpes_box_photo_front.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 689 KiB |
BIN
docs/vulpes_box_photo_front_open.jpg
Normal file
BIN
docs/vulpes_box_photo_front_open.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 549 KiB |
259407
vulpes_box-0.2-2h17m-1-6.gcode
Normal file
259407
vulpes_box-0.2-2h17m-1-6.gcode
Normal file
File diff suppressed because it is too large
Load Diff
BIN
vulpes_box.3mf
Normal file
BIN
vulpes_box.3mf
Normal file
Binary file not shown.
221
vulpes_box.scad
Normal file
221
vulpes_box.scad
Normal file
|
@ -0,0 +1,221 @@
|
|||
//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);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
BIN
vulpes_box.stl
Normal file
BIN
vulpes_box.stl
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user