1.1 --- a/cartridge.scad Thu Aug 13 19:36:07 2015 +0200
1.2 +++ b/cartridge.scad Fri Apr 08 16:45:08 2016 +0200
1.3 @@ -1,5 +1,5 @@
1.4 /*
1.5 -Copyright (C) 2014, 2015 Paul Boddie
1.6 +Copyright (C) 2014, 2015, 2016 Paul Boddie
1.7
1.8 This program is free software; you can redistribute it and/or modify it under
1.9 the terms of the GNU General Public License as published by the Free Software
1.10 @@ -19,23 +19,45 @@
1.11 {
1.12 $fn = 50;
1.13
1.14 - /* Configure the generated shapes. */
1.15 -
1.16 - BACK_CAVITY = 1;
1.17 - FRONT_LABEL_INSET = 1;
1.18 - TOP_LABEL_INSET = 1;
1.19 - GROOVE = 1;
1.20 - SHORT_PCB = 0;
1.21 -
1.22 - /* Model configurations. */
1.23 + /* Model configurations. Do not edit! */
1.24
1.25 ROM_CARTRIDGE = 0;
1.26 WIDE_CARTRIDGE = 1;
1.27
1.28 + /*
1.29 + Configure the generated shapes.
1.30 + For the absolute simplest shape (for basic 3D printers)...
1.31 +
1.32 + BACK_CAVITY = 0; FRONT_LABEL_INSET = 0; TOP_LABEL_INSET = 0;
1.33 + GROOVE = 0; ROUND_EDGES = 0; ROUND_CONNECTING_EDGES = 0
1.34 +
1.35 + Leave all options enabled for more capable 3D printers.
1.36 + */
1.37 +
1.38 + /* A cosmetic cut-out to match the necessary interior cavity. */
1.39 + BACK_CAVITY = 1;
1.40 +
1.41 + /* Optional insets for labels. */
1.42 + FRONT_LABEL_INSET = 1;
1.43 + TOP_LABEL_INSET = 1;
1.44 +
1.45 + /* Optional groove between the pieces to match the Electron. */
1.46 + GROOVE = 1;
1.47 +
1.48 + /* Optional rounding of the external edges. */
1.49 + ROUND_EDGES = 1;
1.50 +
1.51 + /* Recommended rounding of connection edges. */
1.52 + ROUND_CONNECTING_EDGES = 1;
1.53 +
1.54 /* Set this to the desired model type. */
1.55
1.56 MODEL = ROM_CARTRIDGE;
1.57
1.58 + /* Set this where a shorter PCB is to be used. */
1.59 +
1.60 + SHORT_PCB = 0;
1.61 +
1.62 /*
1.63 Options for checking. Some useful combinations...
1.64
1.65 @@ -527,8 +549,9 @@
1.66
1.67 /* Tapered off for easier connection. */
1.68
1.69 - translate([0, 0, pcb_lug_depth - pcb_lug_ro])
1.70 - fillet_torus(pcb_lug_outer_radius, pcb_lug_rr);
1.71 + if (ROUND_CONNECTING_EDGES)
1.72 + translate([0, 0, pcb_lug_depth - pcb_lug_ro])
1.73 + fillet_torus(pcb_lug_outer_radius, pcb_lug_rr);
1.74 }
1.75 }
1.76
1.77 @@ -749,41 +772,43 @@
1.78 /* Fillets to round off the edges. */
1.79
1.80 union() {
1.81 + if (ROUND_EDGES) {
1.82
1.83 - /* Top left and right rounding. */
1.84 -
1.85 - translate([payload_left_extent + ro, -front_depth / 2, upper_extent - ro])
1.86 - rotate([0, 0, 180])
1.87 + /* Top left and right rounding. */
1.88 +
1.89 + translate([payload_left_extent + ro, -front_depth / 2, upper_extent - ro])
1.90 + rotate([0, 0, 180])
1.91 + rotate([90, 0, 0])
1.92 + fillet(rr, front_depth);
1.93 + translate([payload_right_extent - ro, -front_depth / 2, upper_extent - ro])
1.94 rotate([90, 0, 0])
1.95 fillet(rr, front_depth);
1.96 - translate([payload_right_extent - ro, -front_depth / 2, upper_extent - ro])
1.97 - rotate([90, 0, 0])
1.98 - fillet(rr, front_depth);
1.99
1.100 - /* Top front rounding. */
1.101 -
1.102 - translate([payload_centre, -front_depth + ro, upper_extent - ro])
1.103 - rotate([0, 0, 180])
1.104 - rotate([0, -90, 0])
1.105 - fillet(rr, payload_width);
1.106 + /* Top front rounding. */
1.107 +
1.108 + translate([payload_centre, -front_depth + ro, upper_extent - ro])
1.109 + rotate([0, 0, 180])
1.110 + rotate([0, -90, 0])
1.111 + fillet(rr, payload_width);
1.112
1.113 - /* Edge rounding. */
1.114 -
1.115 - translate([payload_right_extent - ro, -front_depth + ro, int_payload_lower_extent - bottom - extra])
1.116 - rotate([0, 0, 270])
1.117 - fillet_justified(rr, payload_height + bottom + extra);
1.118 + /* Edge rounding. */
1.119 +
1.120 + translate([payload_right_extent - ro, -front_depth + ro, int_payload_lower_extent - bottom - extra])
1.121 + rotate([0, 0, 270])
1.122 + fillet_justified(rr, payload_height + bottom + extra);
1.123
1.124 - translate([payload_left_extent + ro, -front_depth + ro, int_payload_lower_extent - bottom - extra])
1.125 - rotate([0, 0, 180])
1.126 - fillet_justified(rr, payload_height + bottom + extra);
1.127 + translate([payload_left_extent + ro, -front_depth + ro, int_payload_lower_extent - bottom - extra])
1.128 + rotate([0, 0, 180])
1.129 + fillet_justified(rr, payload_height + bottom + extra);
1.130
1.131 - translate([connector_width / 2 - ro, -front_depth + ro, lower_extent])
1.132 - rotate([0, 0, 270])
1.133 - fillet_partitioned(rr, connector_height - bottom);
1.134 + translate([connector_width / 2 - ro, -front_depth + ro, lower_extent])
1.135 + rotate([0, 0, 270])
1.136 + fillet_partitioned(rr, connector_height - bottom);
1.137
1.138 - translate([-connector_width / 2 + ro, -front_depth + ro, lower_extent])
1.139 - rotate([0, 0, 180])
1.140 - fillet_partitioned(rr, connector_height - bottom);
1.141 + translate([-connector_width / 2 + ro, -front_depth + ro, lower_extent])
1.142 + rotate([0, 0, 180])
1.143 + fillet_partitioned(rr, connector_height - bottom);
1.144 + }
1.145 }
1.146 }
1.147
1.148 @@ -862,10 +887,11 @@
1.149 cube_at(back_left - groove_depth, groove_width_extra, inner_payload_front_cutout_height,
1.150 -1, 1, 1,
1.151 int_payload_left_extent, -groove_width_extra, int_payload_lower_extent);
1.152 - translate([int_payload_left_extent - groove_ro, -groove_width_extra + groove_ro,
1.153 - int_payload_lower_extent])
1.154 - rotate([0, 0, -90])
1.155 - fillet_justified(groove_rr, inner_payload_front_cutout_height);
1.156 + if (ROUND_CONNECTING_EDGES)
1.157 + translate([int_payload_left_extent - groove_ro, -groove_width_extra + groove_ro,
1.158 + int_payload_lower_extent])
1.159 + rotate([0, 0, -90])
1.160 + fillet_justified(groove_rr, inner_payload_front_cutout_height);
1.161 }
1.162
1.163 /* Right side of payload. */
1.164 @@ -874,10 +900,11 @@
1.165 cube_at(back_right - groove_depth, groove_width_extra, inner_payload_front_cutout_height,
1.166 1, 1, 1,
1.167 int_payload_right_extent, -groove_width_extra, int_payload_lower_extent);
1.168 - translate([int_payload_right_extent + groove_ro, -groove_width_extra + groove_ro,
1.169 - int_payload_lower_extent])
1.170 - rotate([0, 0, 180])
1.171 - fillet_justified(groove_rr, inner_payload_front_cutout_height);
1.172 + if (ROUND_CONNECTING_EDGES)
1.173 + translate([int_payload_right_extent + groove_ro, -groove_width_extra + groove_ro,
1.174 + int_payload_lower_extent])
1.175 + rotate([0, 0, 180])
1.176 + fillet_justified(groove_rr, inner_payload_front_cutout_height);
1.177 }
1.178
1.179 /* Left side of connector. */
1.180 @@ -886,10 +913,11 @@
1.181 cube_at(back_left - groove_depth, groove_width_extra, inner_connector_front_cutout_height,
1.182 -1, 1, -1,
1.183 -int_connector_width / 2, -groove_width_extra, int_payload_lower_extent);
1.184 - translate([-int_connector_width / 2 - groove_ro, -groove_width_extra + groove_ro,
1.185 - lower_extent])
1.186 - rotate([0, 0, -90])
1.187 - fillet_partitioned(groove_rr, inner_connector_front_cutout_height + extra);
1.188 + if (ROUND_CONNECTING_EDGES)
1.189 + translate([-int_connector_width / 2 - groove_ro, -groove_width_extra + groove_ro,
1.190 + lower_extent])
1.191 + rotate([0, 0, -90])
1.192 + fillet_partitioned(groove_rr, inner_connector_front_cutout_height + extra);
1.193 }
1.194
1.195 /* Right side of connector. */
1.196 @@ -898,10 +926,11 @@
1.197 cube_at(back_right - groove_depth, groove_width_extra, inner_connector_front_cutout_height,
1.198 1, 1, -1,
1.199 int_connector_width / 2, -groove_width_extra, int_payload_lower_extent);
1.200 - translate([int_connector_width / 2 + groove_ro, -groove_width_extra + groove_ro,
1.201 - lower_extent])
1.202 - rotate([0, 0, 180])
1.203 - fillet_partitioned(groove_rr, inner_connector_front_cutout_height + extra);
1.204 + if (ROUND_CONNECTING_EDGES)
1.205 + translate([int_connector_width / 2 + groove_ro, -groove_width_extra + groove_ro,
1.206 + lower_extent])
1.207 + rotate([0, 0, 180])
1.208 + fillet_partitioned(groove_rr, inner_connector_front_cutout_height + extra);
1.209 }
1.210
1.211 /* Top side. */
1.212 @@ -910,11 +939,12 @@
1.213 cube_at(payload_width - groove_depth * 2, groove_width_extra, top - top_groove_depth,
1.214 0, 1, 1,
1.215 payload_centre, -groove_width_extra, int_payload_upper_extent);
1.216 - translate([payload_centre, -groove_width_extra + groove_ro,
1.217 - int_payload_upper_extent + groove_ro])
1.218 - rotate([0, 0, 180])
1.219 - rotate([0, 90, 0])
1.220 - fillet(groove_rr, payload_width - groove_depth * 2);
1.221 + if (ROUND_CONNECTING_EDGES)
1.222 + translate([payload_centre, -groove_width_extra + groove_ro,
1.223 + int_payload_upper_extent + groove_ro])
1.224 + rotate([0, 0, 180])
1.225 + rotate([0, 90, 0])
1.226 + fillet(groove_rr, payload_width - groove_depth * 2);
1.227 }
1.228 }
1.229
1.230 @@ -1088,78 +1118,83 @@
1.231 /* Fillets to round off the edges. */
1.232
1.233 union() {
1.234 + if (ROUND_EDGES) {
1.235
1.236 - /* Top left and right rounding. */
1.237 -
1.238 - translate([payload_left_extent + ro, back_depth / 2, upper_extent - ro])
1.239 - rotate([0, 0, 180])
1.240 + /* Top left and right rounding. */
1.241 +
1.242 + translate([payload_left_extent + ro, back_depth / 2, upper_extent - ro])
1.243 + rotate([0, 0, 180])
1.244 + rotate([90, 0, 0])
1.245 + fillet(rr, back_depth);
1.246 + translate([payload_right_extent - ro, back_depth / 2, upper_extent - ro])
1.247 rotate([90, 0, 0])
1.248 fillet(rr, back_depth);
1.249 - translate([payload_right_extent - ro, back_depth / 2, upper_extent - ro])
1.250 - rotate([90, 0, 0])
1.251 - fillet(rr, back_depth);
1.252 -
1.253 - /* Top back rounding. */
1.254 -
1.255 - translate([payload_centre, back_depth - ro, upper_extent - ro])
1.256 - rotate([0, -90, 0])
1.257 - fillet(rr, payload_width);
1.258 -
1.259 - /* Outer edge rounding. */
1.260 -
1.261 - translate([payload_right_extent - ro, back_depth - ro, int_payload_lower_extent - bottom - extra])
1.262 - fillet_justified(rr, payload_height + bottom + extra);
1.263 +
1.264 + /* Top back rounding. */
1.265 +
1.266 + translate([payload_centre, back_depth - ro, upper_extent - ro])
1.267 + rotate([0, -90, 0])
1.268 + fillet(rr, payload_width);
1.269
1.270 - translate([payload_left_extent + ro, back_depth - ro, int_payload_lower_extent - bottom - extra])
1.271 - rotate([0, 0, 90])
1.272 + /* Outer edge rounding. */
1.273 +
1.274 + translate([payload_right_extent - ro, back_depth - ro, int_payload_lower_extent - bottom - extra])
1.275 fillet_justified(rr, payload_height + bottom + extra);
1.276
1.277 - translate([connector_width / 2 - ro, back_depth - ro, lower_extent])
1.278 - fillet_partitioned(rr, connector_height - bottom);
1.279 + translate([payload_left_extent + ro, back_depth - ro, int_payload_lower_extent - bottom - extra])
1.280 + rotate([0, 0, 90])
1.281 + fillet_justified(rr, payload_height + bottom + extra);
1.282
1.283 - translate([-connector_width / 2 + ro, back_depth - ro, lower_extent])
1.284 - rotate([0, 0, 90])
1.285 + translate([connector_width / 2 - ro, back_depth - ro, lower_extent])
1.286 fillet_partitioned(rr, connector_height - bottom);
1.287
1.288 - /*
1.289 - Outer edge rounding of the back extension. This is done as a
1.290 - separate removal operation rather than occurring when creating the
1.291 - extension in order to ensure that the edges are actually rounded.
1.292 + translate([-connector_width / 2 + ro, back_depth - ro, lower_extent])
1.293 + rotate([0, 0, 90])
1.294 + fillet_partitioned(rr, connector_height - bottom);
1.295 + }
1.296
1.297 - An extra overlapping measure is employed so that the filleting is
1.298 - continuous between the payload and connector portions. On the outside
1.299 - edges, the payload filleting is extended downwards.
1.300 - */
1.301 + if (ROUND_CONNECTING_EDGES) {
1.302
1.303 - translate([payload_left_extent + groove_depth + groove_ro, -groove_width_extra + groove_ro,
1.304 - int_payload_lower_extent - extra])
1.305 - rotate([0, 0, 180])
1.306 - fillet_justified(groove_rr, inner_payload_front_cutout_height + extra);
1.307 + /*
1.308 + Outer edge rounding of the back extension. This is done as a
1.309 + separate removal operation rather than occurring when creating the
1.310 + extension in order to ensure that the edges are actually rounded.
1.311
1.312 - translate([payload_right_extent - groove_depth - groove_ro, -groove_width_extra + groove_ro,
1.313 - int_payload_lower_extent - extra])
1.314 - rotate([0, 0, -90])
1.315 - fillet_justified(groove_rr, inner_payload_front_cutout_height + extra);
1.316 + An extra overlapping measure is employed so that the filleting is
1.317 + continuous between the payload and connector portions. On the outside
1.318 + edges, the payload filleting is extended downwards.
1.319 + */
1.320 +
1.321 + translate([payload_left_extent + groove_depth + groove_ro, -groove_width_extra + groove_ro,
1.322 + int_payload_lower_extent - extra])
1.323 + rotate([0, 0, 180])
1.324 + fillet_justified(groove_rr, inner_payload_front_cutout_height + extra);
1.325
1.326 - /* Sides of connector. */
1.327 + translate([payload_right_extent - groove_depth - groove_ro, -groove_width_extra + groove_ro,
1.328 + int_payload_lower_extent - extra])
1.329 + rotate([0, 0, -90])
1.330 + fillet_justified(groove_rr, inner_payload_front_cutout_height + extra);
1.331
1.332 - translate([-connector_width / 2 + groove_depth + groove_ro, -groove_width_extra + groove_ro,
1.333 - lower_extent])
1.334 - rotate([0, 0, 180])
1.335 - fillet_partitioned(groove_rr, inner_connector_front_cutout_height);
1.336 + /* Sides of connector. */
1.337 +
1.338 + translate([-connector_width / 2 + groove_depth + groove_ro, -groove_width_extra + groove_ro,
1.339 + lower_extent])
1.340 + rotate([0, 0, 180])
1.341 + fillet_partitioned(groove_rr, inner_connector_front_cutout_height);
1.342
1.343 - translate([connector_width / 2 - groove_depth - groove_ro, -groove_width_extra + groove_ro,
1.344 - lower_extent])
1.345 - rotate([0, 0, -90])
1.346 - fillet_partitioned(groove_rr, inner_connector_front_cutout_height);
1.347 + translate([connector_width / 2 - groove_depth - groove_ro, -groove_width_extra + groove_ro,
1.348 + lower_extent])
1.349 + rotate([0, 0, -90])
1.350 + fillet_partitioned(groove_rr, inner_connector_front_cutout_height);
1.351 +
1.352 + /* Top of payload. */
1.353
1.354 - /* Top of payload. */
1.355 -
1.356 - translate([payload_centre, -groove_width_extra + groove_ro,
1.357 - int_payload_upper_extent + inner_top_front_cutout_height - groove_ro])
1.358 - rotate([0, 0, 180])
1.359 - rotate([0, -90, 0])
1.360 - fillet(groove_rr, payload_width - groove_depth * 2);
1.361 + translate([payload_centre, -groove_width_extra + groove_ro,
1.362 + int_payload_upper_extent + inner_top_front_cutout_height - groove_ro])
1.363 + rotate([0, 0, 180])
1.364 + rotate([0, -90, 0])
1.365 + fillet(groove_rr, payload_width - groove_depth * 2);
1.366 + }
1.367 }
1.368 }
1.369