Skip to content

Commit 42043ae

Browse files
committed
OBS Lite:
- working screwmounts - attaches to StandardMountAdapter - including pcb spacer
1 parent fb52f8b commit 42043ae

4 files changed

Lines changed: 250 additions & 2 deletions

File tree

src/LiteCase/LiteCase.scad

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
// 0,0,0: Mitte des Lite-PCB, auf der Seite mit dem OpenBIkeSensor logo, x: Richtung USB-Port, Z: Richtung Ultraschallsensoren
2+
$fn = 100;
3+
4+
Lite_PCB_x = 44;
5+
Lite_PCB_y = 29.2;
6+
Lite_PCB_z = 1.7;
7+
Lite_PCB_Dimensions = [Lite_PCB_x, Lite_PCB_y, Lite_PCB_z];
8+
9+
Lite_ESP_socket_x = 38;
10+
Lite_ESP_socket_y = 2.54;
11+
Lite_ESP_socket_z = 9;
12+
Lite_ESP_socket_dimensions = [Lite_ESP_socket_x, Lite_ESP_socket_y, Lite_ESP_socket_z];
13+
14+
Lite_transducer_position = [23.8, 0, 20.1];
15+
Lite_transducer_variance = 0.8;
16+
Lite_transducer_diameter = 16 + Lite_transducer_variance;
17+
Lite_transducer_diameter_small = 12.5 + Lite_transducer_variance;
18+
19+
20+
21+
Lite_ESP_position_x = 0;
22+
Lite_ESP_position_y = 0;
23+
Lite_ESP_position_z = - 15.2;
24+
25+
Lite_USB_position_x = 0;
26+
Lite_USB_position_y = 0;
27+
Lite_USB_position_z = 0;
28+
29+
Lite_ESP_position = [Lite_ESP_position_x, Lite_ESP_position_y, Lite_ESP_position_z];
30+
module ESP() color("black")translate([25, 0, 0])cube([51.5, 28.5, 4.5], center = true);
31+
module Ultrasonic(i) {
32+
color("blue") translate([23.9, i * 7.3, 17.99])cube([41.5, 1.4, 36], center = true);
33+
#translate([23.9, 0, 16.99])cube([41.5, 19.5, 35], center = true);
34+
35+
translate(Lite_transducer_position - [0, 8 * i, 100])rotate([i * 90, 0, 0])cylinder(d2 = Lite_transducer_diameter, h = 8.5);
36+
37+
38+
#translate(Lite_transducer_position - [0, 8 * i, 0])rotate([i * 90, 0, 0])cylinder(d = Lite_transducer_diameter_small, h = 40);
39+
}
40+
41+
42+
module LiteElectronics(onlyboards = false) {
43+
// the rendered model from stls (not closed, only for preview)
44+
translate([15, 0, 0])rotate([180, 00, 00])rotate([0, 0, 90])import("../../lib/OpenBikeSensor-Lite-PCB-0.1.2.stl");
45+
46+
// board cube
47+
color("green")translate(- [0, Lite_PCB_y / 2, Lite_PCB_z])cube(Lite_PCB_Dimensions, center = false);
48+
49+
// sockets for ESP
50+
for (i = [- 1, 1]) color("darkgrey")translate([3.5, i * Lite_PCB_y / 2 - (i + 1) * Lite_ESP_socket_y / 2 - i * 0.45, - Lite_ESP_socket_dimensions[2] - Lite_PCB_Dimensions[2]])
51+
cube(Lite_ESP_socket_dimensions);
52+
53+
#translate(Lite_ESP_position)ESP();
54+
55+
for (i = [- 1, 1])Ultrasonic(i);
56+
}
57+
LiteElectronics();
58+
difference() {
59+
//translate([12.5, - 18, 9])cube([23, 36, 28]);
60+
for (i = [- 1, 1])Ultrasonic(i);
61+
}

src/LiteCase/LiteCase_bottom.scad

Lines changed: 182 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,182 @@
1+
use <../../lib/Round-Anything/polyround.scad>
2+
3+
use <../Mounting/StandardMountAdapter.scad>
4+
5+
6+
corner_x = 24;
7+
boardcorner_x = 17;
8+
boardcorner_y = 23;
9+
square_x = 5;
10+
lite_l = 45;
11+
lite_w = 80 - 18;
12+
13+
14+
// 0,0,0: Mitte des Lite-PCB, auf der Seite mit dem OpenBIkeSensor logo, x: Richtung USB-Port, Z: Richtung Ultraschallsensoren
15+
$fn = 120;
16+
17+
Lite_PCB_x = 44;
18+
Lite_PCB_y = 29.2;
19+
Lite_PCB_z = 1.7;
20+
Lite_PCB_Dimensions = [Lite_PCB_x, Lite_PCB_y, Lite_PCB_z];
21+
22+
Lite_ESP_socket_x = 38;
23+
Lite_ESP_socket_y = 2.54;
24+
Lite_ESP_socket_z = 9 + Lite_PCB_z + 1.8;
25+
Lite_ESP_socket_dimensions = [Lite_ESP_socket_x, Lite_ESP_socket_y, Lite_ESP_socket_z];
26+
27+
Lite_transducer_position = [23.8, 0, 20.6];
28+
Lite_transducer_variance = 1.2;
29+
Lite_transducer_diameter = 16 + Lite_transducer_variance;
30+
Lite_transducer_diameter_small = 12.5 + Lite_transducer_variance;
31+
32+
Lite_ESP_position_x = 0;
33+
Lite_ESP_position_y = 0;
34+
Lite_ESP_position_z = - 16.2;
35+
36+
Lite_ESP_dimensions = [53, 29, 4.8];
37+
38+
Lite_USB_position_x = 55;
39+
Lite_USB_position_y = 0;
40+
Lite_USB_position_z = - 15;
41+
42+
Lite_screwmount_top = 4;
43+
Lite_screwmount_bottom = 6;
44+
Lite_screwmount_height = Lite_screwmount_top + Lite_screwmount_bottom;
45+
46+
Lite_USB = [Lite_USB_position_x, Lite_USB_position_y, Lite_USB_position_z];
47+
48+
Lite_ESP_position = [Lite_ESP_position_x, Lite_ESP_position_y, Lite_ESP_position_z];
49+
50+
sensor_x = - Lite_transducer_position[2]+.5;
51+
sensor_y = Lite_transducer_position[0];
52+
53+
function angle_three_points_2d(pa, pb, pc) = asin(cross(pb - pa, pb - pc) / (norm(pb - pa) * norm(pb - pc)));
54+
55+
module SidePolygon() {
56+
corners = [
57+
[square_x, - lite_w / 2, 9],
58+
// chose radius so the corners match
59+
[- corner_x, - 0, (corner_x - boardcorner_x) / (1 / sin(angle_three_points_2d([0, 0], [- corner_x, - 0], [square_x, lite_w / 2])) - 1)],
60+
[square_x, lite_w / 2, 9],
61+
[lite_l, lite_w / 2, 5],
62+
[lite_l, - lite_w / 2, 5]
63+
];
64+
translate([sensor_x, sensor_y])polygon(polyRound(corners, fn = 150));
65+
}
66+
67+
68+
module MidPolygon() {
69+
corners = [[square_x, - lite_w / 2, 5], [- boardcorner_x, - boardcorner_y, 5], [- boardcorner_x, boardcorner_y, 5], [square_x, lite_w / 2, 5], [lite_l, lite_w / 2, 5], [lite_l, -
70+
lite_w / 2, 5]];
71+
translate([sensor_x, sensor_y]) polygon(polyRound(corners));
72+
}
73+
74+
module LidCutter() {
75+
translate([30, 0, Lite_ESP_position_z + 0.8])cube([90, 60, 0.1], center = true);
76+
}
77+
78+
module Box() {
79+
hull() {
80+
for (i = [- 1, 1]) {
81+
translate([0, 0, i * 9 - (i + 1) / 2])linear_extrude(1)MidPolygon();
82+
translate([0, 0, i * 18 - (i + 1) / 2])linear_extrude(1)SidePolygon();
83+
}
84+
}
85+
}
86+
87+
module ESP() {
88+
difference() {
89+
color("black")translate([24.6, 0, 0.2])cube(Lite_ESP_dimensions, center = true);
90+
for (i = [- 1, 1])for (j = [- 1, 1]) {
91+
translate([i * 24.6 + 22.6, j * 12.5 - 2.5, - 4.7])cube([4, 5, 5]);
92+
}
93+
}
94+
}
95+
96+
module Ultrasonic(i, onlyboards = false, h = 30) {
97+
translate([0, 0, - h / 2 + 34 / 2]) {
98+
color("blue") translate([23.9, i * 7.3, 17.99])cube([42.5, 1.4, h], center = true);
99+
hull() {
100+
translate([Lite_transducer_position[0], 0, 14.99])cube([42.5, 21.5, h], center = true);
101+
translate([Lite_transducer_position[0], 0, 16.99])cube([42.5, 16.5, h], center = true);
102+
translate([Lite_transducer_position[0], 0, 10.99])cube([49.5, 18.5, h], center = true);
103+
}
104+
intersection() {
105+
translate([0, 0, + h / 2 - 34 / 2])hull() {
106+
translate(Lite_transducer_position - [0, 8 * i, 100])rotate([i * 90, 0, 0])cylinder(d1 = Lite_transducer_diameter + 12, d2 = Lite_transducer_diameter, h = 8.5);
107+
translate(Lite_transducer_position - [0, 8 * i, 0])rotate([i * 90, 0, 0])cylinder(d1 = Lite_transducer_diameter + 12, d2 = Lite_transducer_diameter, h = 8.5);
108+
}
109+
color("blue") translate([23.9, i * 7, 17.99])cube([41.5, 60, h + 14], center = true);
110+
111+
}
112+
}
113+
translate(Lite_transducer_position - [0, 8 * i, 0])rotate([i * 90, 0, 0])cylinder(d = Lite_transducer_diameter_small, h = 40);
114+
}
115+
116+
module USB_hole() {
117+
translate(Lite_USB)cube([20, 12, 10], center = true);
118+
}
119+
120+
module Screwbump(size = 6, hole_diameter = 2.8, height = 6, bottom = true, toppart = 2.1) {
121+
outer_polygon = [[size, 0, 0], [- size, 0, 0], [- size, size, size], [0, 3 * size, size], [size, size, size]];
122+
difference() {
123+
hull() {
124+
translate([0, 0, 0])polyRoundExtrude(outer_polygon, 1, 0, 0);
125+
126+
translate([0, 0, height - 1])polyRoundExtrude(outer_polygon, 1, 0, 0);
127+
if (bottom)translate([0, - 0.01, 1.3 * height])rotate([90, 0, 0])cylinder(d = size, h = 0.1);
128+
}
129+
translate([0, size, 0])cylinder(d = hole_diameter, h = height);
130+
translate([0, size, - .01])cylinder(d = hole_diameter + 0.4, h = toppart);
131+
}
132+
}
133+
134+
135+
module LiteElectronics(onlyboards = false) {
136+
// the rendered model from stls (not closed, only for preview)
137+
//if (!$preview) translate([15, 0, 0])rotate([180, 00, 00])rotate([0, 0, 90])import("../../lib/OpenBikeSensor-Lite-PCB-0.1.2.stl");
138+
139+
// board cube
140+
color("green")translate(- [0, Lite_PCB_y / 2, Lite_PCB_z])cube(Lite_PCB_Dimensions, center = false);
141+
color("green")translate(- [0.2, Lite_PCB_y / 2 + 0.2, Lite_PCB_z + 14])cube(Lite_PCB_Dimensions + [0.4, 0.4, 14], center = false);
142+
143+
144+
// sockets for ESP
145+
for (i = [- 1, 1]) color("darkgrey")translate([3.5, i * Lite_PCB_y / 2 - (i + 1) * Lite_ESP_socket_y / 2 - i * 0.45, - Lite_ESP_socket_dimensions[2] + 1.8])
146+
cube(Lite_ESP_socket_dimensions);
147+
148+
translate(Lite_ESP_position)ESP();
149+
150+
// printability chamfers above ESP
151+
hull() {
152+
translate([24.6, 0, Lite_ESP_position_z - 2])cube([45, 29, 1], center = true);
153+
translate([24.6, 0, Lite_ESP_position_z - 4.3])cube([45, 18.5, 5.01], center = true);
154+
}
155+
translate([0, 0, 0])hull() {
156+
translate([24.6, 0, Lite_ESP_position_z - 2])cube([Lite_ESP_dimensions[0], 20, 0.5], center = true);
157+
translate([25., 0, Lite_ESP_position_z - 4.3])cube([45, 18.5, 0.1], center = true);
158+
}
159+
for (i = [- 1, 1])Ultrasonic(i, onlyboards = onlyboards, h = 50);
160+
USB_hole();
161+
}
162+
163+
difference() {
164+
union() {
165+
translate([- 7, 0, Lite_ESP_position_z + 0.8 + 0.05 - Lite_screwmount_top])rotate([0, 0, 90])
166+
Screwbump(size = 4, hole_diameter = 2.8, height = Lite_screwmount_height, bottom = true, toppart = Lite_screwmount_top);
167+
translate([lite_w - 7.3, 12, Lite_ESP_position_z + 0.8 + 0.05 - Lite_screwmount_top])rotate([0, 0, - 90])
168+
Screwbump(size = 4, hole_diameter = 2.8, height = Lite_screwmount_height, bottom = true, toppart = Lite_screwmount_top);
169+
translate([lite_w - 7.3, - 12, Lite_ESP_position_z + 0.8 + 0.05 - Lite_screwmount_top])rotate([0, 0, - 90])
170+
Screwbump(size = 4, hole_diameter = 2.8, height = Lite_screwmount_height, bottom = true, toppart = Lite_screwmount_top);
171+
translate([23.8, - 3.5, - 17.9])rotate([180, 0, 90])StandardMountAdapter(screwholes = false, channels = false);
172+
difference() {
173+
rotate([90, 90, 0])Box();
174+
hull() translate([23.8, - 3.5, - 18])rotate([180, 0, 90])StandardMountAdapter(screwholes = false, channels = false);
175+
176+
}
177+
}
178+
LiteElectronics();
179+
LidCutter();
180+
}
181+
182+
if ($preview) translate([80,0,0])LiteElectronics();

src/LiteCase/Sensor_spacer.scad

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
difference(){
2+
cube([4,20,4]);
3+
translate([-1,2,2])cube([10,1.2,10]);
4+
translate([-1,2+16-1.2,2])cube([10,1.2,10]);
5+
}

src/Mounting/StandardMountAdapter.scad

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,11 +72,11 @@ module StandardMountAdapterBody() {
7272
}
7373
}
7474

75-
module StandardMountAdapter(channels=true) {
75+
module StandardMountAdapter(channels=true, screwholes=true) {
7676
difference() {
7777
StandardMountAdapterBody();
7878

79-
translate([0, 0, StandardMountAdapter_thickness])
79+
if(screwholes)translate([0, 0, StandardMountAdapter_thickness])
8080
StandardMountAdapterScrewHoles()
8181
ScrewHoleM3(depth=100, head_depth= StandardMountAdapter_thickness - (8 - m3_hex_nut_thickness)/2 );
8282

0 commit comments

Comments
 (0)