chiark / gitweb /
6edad92fccdbe3fc8927bf0fce3b33c480f939e2
[reprap-play.git] / digispark-with-cable.scad
1 // -*- C -*-
2 //
3 // Print (fine detail settings):
4 //
5 //   * Bottom
6 //   * MiddlePrint
7 //   * CoverPrint
8
9 include <utils.scad>
10
11 //tongue_w = 11.92 + 0.4;
12
13 usb_w = 12.01 + 0.19;
14 usb_wall_w = 0.51;
15 usb_tongue_d = 8.97 - 0.2;
16 usb_tongue_w_slop = +0.5;
17 usb_wall_h = 4.54 - 2.04;
18 usb_ceil_th = 0.425;
19
20 side_wall_th = 1.5; // XXXX rename wall_th
21
22 board_l = 17.56 + 0.2;
23 board_w = 19.14 + 0.2;
24 board_th = 1.92 + 0.1;
25
26 sw_to_edge = board_w/2 + 0.1;
27
28 front_wall_th = 0.75;
29 // egress_w = 8.0;
30
31 wall_y_min = -board_l - side_wall_th; // XXXX remove
32 ceil_y_min = wall_y_min - 5;;
33
34 small_walls = [
35                [ [0, 0], [-sw_to_edge, -1.0] ],
36                [ [sw_to_edge-4.5, -4.5], [sw_to_edge, -5.7] ],
37 //             [ [3.0, -11.72],              [sw_to_edge, -13.38] ],
38                [ [-sw_to_edge+3.85, -14.90], [sw_to_edge, -13.38] ],
39                ];
40 chip_cutout = [[ -sw_to_edge + 4.20,    -3.75 ],
41                [ -sw_to_edge + 11.95,  -11.90 ]];
42
43 strain_w = 2.0 + 0.5;
44 strain_t = 1.0 + 0.5;
45 strain_pitch_across = 5;
46 strain_pitch_along = 10;
47 strain_groove_d = 2;
48 strain_groove_w = 3;
49
50 cover_strap_c_d_y = 5.5; // from front of board
51 cover_registration_sz_y = 2;
52 cover_registration_sz_z = 3;
53
54 cable_space_z = 6;
55 cable_dia = 5;
56 bottom_floor_th = 1.5;
57
58 fit_gap_z = 0.5;
59 fit_gap_y = 0.25;
60 side_x_gap = 0.5;
61
62 cover_ceil_th = 0.9;
63
64 cover_strap_sz_x = side_wall_th * 3.5;
65
66 // calculated
67
68 strap_w = strain_w;
69 cover_strap_cutout_z = side_wall_th;
70
71 middle_top_z = usb_wall_h;
72 middle_base_z = -board_th;
73 bottom_base_z = middle_base_z - cable_space_z - bottom_floor_th;;
74
75 front_y_max = front_wall_th;
76 main_y_min = -board_l - side_wall_th;
77
78 strain_0_y_c = main_y_min - strain_w/2;
79 strain_1_y_c = strain_0_y_c - strain_pitch_along;
80 total_y_min = strain_1_y_c - strain_w/2 - side_wall_th;
81
82 bottom_wall_top_z = (middle_top_z + middle_base_z) * 0.5 - fit_gap_z/2;
83 cover_wall_bot_z  = (middle_top_z + middle_base_z) * 0.5 + fit_gap_z/2;
84 cover_top_z  = middle_top_z + cover_ceil_th;
85
86 middle_side_wall_x = +board_w/2 + side_wall_th;
87 total_side_wall_x = middle_side_wall_x + side_wall_th + side_x_gap;
88
89 cover_registration_c_dy = -cover_strap_c_d_y - strap_w/2
90   - side_wall_th - cover_registration_sz_y/2;
91
92 module BothSides(){
93   for (m=[0,1]) {
94     mirror([m,0,0]) {
95       children();
96     }
97   }
98 }
99
100 module NormalStrapCutouts(y_c, z, rot){
101   BothSides(){
102     translate([ -total_side_wall_x, y_c, z ])
103       rotate([0, rot, 0])
104       cube([ side_wall_th,
105              strap_w,
106              10 ],
107            center=true);
108   }
109 }
110 module BottomStrapCutouts(y_c){
111   NormalStrapCutouts(y_c, bottom_base_z, -45);
112 }
113 // XXXX check strap width
114 // XXXX check cable diameter
115 // XXXX need rear strap
116 // XXXX need bottom-to-middle registration
117 module CoverStrapCutouts(){
118   BothSides(){
119     translate([ -total_side_wall_x, -cover_strap_c_d_y, cover_top_z ])
120       cube([ cover_strap_sz_x*2,
121              strap_w,
122              cover_strap_cutout_z*2 ],
123            center=true);
124   }
125 }
126
127 module FrontWallsPlan(slop) {
128   BothSides(){
129     rectfromto([ -board_w/2 - side_wall_th,    0             ],
130                [ -usb_w/2 - slop,              front_wall_th ]);
131   }
132 }
133 module MiddleSmallWallsPlan() {
134   for (m=[0,1]) {
135     mirror([m,0]) {
136       rectfromto([ -usb_w/2,              -0.01        ],
137                  [ -usb_w/2 + usb_wall_w, usb_tongue_d ]);
138     }
139   }
140   FrontWallsPlan(0);
141   for (w=small_walls) {
142     rectfromto(w[0], w[1]);
143   }
144 }
145 module MiddleCeilPlan() {
146   difference(){
147     BothSides(){
148       rectfromto([ -usb_w/2,              -0.01        ],
149                  [ 0.1,                   usb_tongue_d ]);
150       rectfromto([ -board_w/2 - side_wall_th, 0            ],
151                  [ 0.1,                       ceil_y_min   ]);
152     }
153     rectfromto(chip_cutout[0], chip_cutout[1]);
154   }
155 }
156 module MiddleMainWallsPlan() {
157   BothSides(){
158     rectfromto([ -board_w/2 - side_wall_th, 0          ],
159                [ -board_w/2,                wall_y_min ]);
160   }
161   FrontWallsPlan(usb_tongue_w_slop);
162   rectfromto([ -board_w/2 - side_wall_th + 0, -      board_l   ],
163              [ +board_w/2 + side_wall_th,            total_y_min ]);
164 }
165
166 module CoverRegistrations(){
167   linextr_y_xz(cover_registration_c_dy - strap_w/2,
168                cover_registration_c_dy + strap_w/2) {
169     difference(){
170       rectfromto([ -total_side_wall_x,
171                           cover_wall_bot_z - cover_registration_sz_z  ],
172                  [ +total_side_wall_x, cover_top_z ]);
173       hull(){
174         MiddleElevationForCutout();
175         translate([0, -20]) MiddleElevationForCutout();
176       }
177     }
178   }
179 }
180
181 module Middle(){ ////toplevel
182   difference(){
183     union(){
184       linextr(0, usb_wall_h)
185         MiddleSmallWallsPlan();
186       linextr(usb_wall_h - usb_ceil_th, usb_wall_h)
187         MiddleCeilPlan();
188       linextr(-board_th, usb_wall_h)
189         MiddleMainWallsPlan();
190       BothSides()
191         linextr(cover_wall_bot_z, middle_top_z)
192         rectfromto([ -(board_w/2 + 0.1),  total_y_min             ],
193                    [ -total_side_wall_x,  main_y_min - fit_gap_y  ]);
194     }
195
196     for (y_c = [strain_0_y_c, strain_1_y_c]) {
197       for (x_c = [-1,+1] * strain_pitch_across/2) {
198         translate([x_c, y_c, 0])
199           linextr(-20, 20)
200           square([ strain_t, strain_w ], center=true);
201       }
202     }
203     linextr_y_xz(total_y_min-1, main_y_min)
204       translate([0, middle_base_z])
205       scale([1, strain_groove_d/strain_groove_w])
206       circle(strain_groove_w/2, $fn = 8);
207   }
208 }
209 module MiddlePrint(){ ////toplevel
210   rotate([180,0,0]) Middle();
211 }
212
213 module MiddleElevationForCutout(){
214     rectfromto([ -(middle_side_wall_x + side_x_gap), middle_base_z ],
215                [ +(middle_side_wall_x + side_x_gap), middle_top_z  ]);
216 }
217 module BottomMainElevation(){
218   difference(){
219     rectfromto([ -total_side_wall_x, bottom_base_z        ],
220                [ +total_side_wall_x, bottom_wall_top_z    ]);
221
222     MiddleElevationForCutout();
223   }
224 }
225 module Bottom(){ ////toplevel
226   difference(){
227     union(){
228       linextr_y_xz(total_y_min, front_y_max)
229         BottomMainElevation();
230     }
231
232     linextr_y_xz(total_y_min + side_wall_th,
233                  front_y_max - side_wall_th)
234       rectfromto([ -board_w/2, bottom_base_z + bottom_floor_th ],
235                  [ +board_w/2, 20         ]);
236
237     linextr_y_xz(total_y_min - 1,
238                  total_y_min + side_wall_th + 1){
239       translate([ 0, middle_base_z ]){
240         hull(){
241           translate([ 0, -cable_dia/2 ])
242             circle(r = cable_dia/2, $fa = 10, $fs = 1);
243           square([ cable_dia, 0.1 ], center=true);
244         }
245       }
246     }
247     minkowski(){
248       CoverRegistrations();
249       cube([ 1, fit_gap_y*2, fit_gap_z*2 ], center=true);
250     }
251     BottomStrapCutouts(-cover_strap_c_d_y);
252   }
253 }
254
255 module CoverMainElevation(){
256   difference(){
257     rectfromto([ -total_side_wall_x, cover_wall_bot_z        ],
258                [ +total_side_wall_x, cover_top_z    ]);
259
260     MiddleElevationForCutout();
261   }
262 }
263 module Cover(){ ////toplevel
264   difference(){
265     union(){
266       linextr_y_xz(main_y_min, front_y_max)
267         CoverMainElevation();
268       CoverRegistrations();
269     }
270     CoverStrapCutouts();
271   }
272 }
273 module CoverPrint(){ ////toplevel
274   rotate([180,0,0]) Cover();
275 }
276
277 module BottomDemo(){ ////toplevel
278   translate([0, 0, -0.25]) Bottom();
279   %Middle();
280   translate([0, 0, +0.25]) Cover();
281 }