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/)
|
which was shared under a [Creative Commons (4.0 International License) Attribution](http://creativecommons.org/licenses/by/4.0/)
|
||||||
license.
|
license.
|
||||||
|
|
||||||
|
Designed in OpenSCAD. It is paramaterized.
|
||||||
|
|
||||||
Related:
|
Related:
|
||||||
- [ESP32-based radio controller for radio orienteering/ARDF](https://amiok.net/gitea/W1CDN/vulpes)
|
- [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/)
|
- [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