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();
0 commit comments