142 lines
2.7 KiB
OpenSCAD
142 lines
2.7 KiB
OpenSCAD
$fs = 0.5;
|
|
// epsilon
|
|
e = 0.1;
|
|
// tolerance
|
|
tol = 0.5;
|
|
// wall thickness
|
|
wall = 3;
|
|
|
|
// A cube with rounded edges
|
|
module rcube(s, r=4) {
|
|
hull() {
|
|
for (x = [r, s[0]-r]) {
|
|
for (y = [r, s[1]-r]) {
|
|
translate([x, y, 0])
|
|
cylinder(h=s[2], r=r);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Outer dimensions of the phone
|
|
motoe2lte_s = [130, 67+tol, 12.5+tol];
|
|
|
|
module motoe2lte(s=motoe2lte_s) {
|
|
module body() {
|
|
hull() {
|
|
// Front
|
|
// 12 mm radius on the corners.
|
|
r = 12;
|
|
|
|
// Sides
|
|
// ~7mm on the edge, going to `t` over ~8mm
|
|
ts = 7;
|
|
|
|
// Bottom end
|
|
// 12 mm radius on the corners.
|
|
// Pulls in to 8 mm thick over the last 15 mm to the USB connector.
|
|
tb = 8;
|
|
translate([r, r, 0])
|
|
cylinder(h=ts, r=r);
|
|
translate([r, s[1]-r, 0])
|
|
cylinder(h=ts, r=r);
|
|
// Top end
|
|
// ~9 mm thick on the edge, going to `t` over ~8mm
|
|
tt = 9;
|
|
translate([s[0] - r, r, 0])
|
|
cylinder(h=ts, r=r);
|
|
translate([s[0] - r, s[1]-r, 0])
|
|
cylinder(h=ts, r=r);
|
|
// Back plate
|
|
bs = [s[0] - 15-8, s[1]-8-8, 1];
|
|
translate([15, (s[1]-bs[1])/2, s[2]-bs[2]])
|
|
rcube(bs);
|
|
}
|
|
}
|
|
color("silver")
|
|
body();
|
|
// Volume button
|
|
color("skyblue")
|
|
translate([65, s[1]-e, 12.5-9-tol])
|
|
cube([17, 1+e, 1.5]);
|
|
// Headphone jack hole
|
|
jd = 9+2;
|
|
translate([s[0]-10, s[1]/2, 1+jd/2])
|
|
rotate(90, [0, 1, 0])
|
|
cylinder(h=30, d=jd);
|
|
// USB socket hole
|
|
us = [11+2, 9+2, 30];
|
|
translate([-us[2]/2+10, s[1]/2, us[1]/2])
|
|
rotate(90, [1, 0, 0])
|
|
rotate(90, [0, 1, 0])
|
|
translate(-us/2)
|
|
rcube(us, r=2);
|
|
// Display
|
|
ds = [100, 56, e];
|
|
color("DarkSlateGray")
|
|
translate([12, (s[1]-ds[1])/2, -e/2])
|
|
rcube(ds, r=1);
|
|
};
|
|
|
|
module motoe2lte_up() {
|
|
rotate(90-10, [1, 0, 0])
|
|
rotate(180, [1, 0, 0])
|
|
rotate(-90, [0, 0, 1])
|
|
translate([0, -motoe2lte_s[1]/2, 0])
|
|
motoe2lte();
|
|
};
|
|
|
|
module motoe2lte_right() {
|
|
rotate(-90-10, [1, 0, 0])
|
|
rotate(180, [0, 0, 1])
|
|
translate([-motoe2lte_s[0]/2, 0, 0])
|
|
motoe2lte();
|
|
};
|
|
|
|
module stand(s, ph) {
|
|
module base() {
|
|
// Base
|
|
translate([-s[0]/2, 0, 0]) {
|
|
r = 4;
|
|
hull() {
|
|
for (x = [r, s[0]-r]) {
|
|
translate([x, r, 0])
|
|
cylinder(h=s[2], r=r);
|
|
translate([x, s[1]-r, 0])
|
|
cylinder(h=wall*1.5, r=r);
|
|
}
|
|
}
|
|
}
|
|
// Back stand
|
|
w = ph[1]+wall*2;
|
|
h = 65;
|
|
difference() {
|
|
rotate(-10, [1, 0, 0])
|
|
difference() {
|
|
translate([-w/2, 4, 0])
|
|
cube([w, 40, h]);
|
|
|
|
rotate(20, [1, 0, 0])
|
|
translate([-(s[0]+e)/2, 40, -20])
|
|
cube([s[0]+e, 40, 1000]);
|
|
}
|
|
// Cut of anything below the base
|
|
translate([-(s[0]+e)/2, 0, -s[2]])
|
|
cube([s[0]+e, s[1]+e, s[2]]);
|
|
}
|
|
}
|
|
difference() {
|
|
base(s, ph);
|
|
translate([0, wall, wall])
|
|
motoe2lte_up();
|
|
}
|
|
}
|
|
|
|
module motoe2lte_stand() {
|
|
s = [motoe2lte_s[1]+20, 50, 15];
|
|
stand(s, motoe2lte_s);
|
|
}
|
|
|
|
motoe2lte_stand();
|
|
//motoe2lte();
|