@jwc/jscad-raspberrypi 3.2.0 → 3.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.vscode/settings.json +4 -1
- package/dist/examples/active-cooling-fan.jscad +210 -171
- package/dist/examples/bplus.jscad +209 -170
- package/dist/examples/bplus3.jscad +209 -170
- package/dist/examples/camera-module-v1.jscad +209 -170
- package/dist/examples/camera-module-v2.jscad +209 -170
- package/dist/examples/example.jscad +215 -176
- package/dist/examples/hat-standoff.jscad +209 -170
- package/dist/examples/hat.jscad +209 -170
- package/dist/examples/hq_camera-module.jscad +211 -172
- package/dist/examples/hyper-pixel-4-rectangular.jscad +2781 -0
- package/dist/examples/miniPiTFT.jscad +209 -170
- package/dist/examples/pi-tft22.jscad +209 -170
- package/dist/examples/pi-tft24 copy.jscad +2750 -0
- package/dist/examples/pi-tft24.jscad +209 -170
- package/dist/examples/pi4.jscad +210 -171
- package/dist/examples/pi5.jscad +215 -179
- package/dist/examples/spacer.jscad +209 -170
- package/dist/index.js +112 -125
- package/dist/v1compat.js +112 -125
- package/examples/active-cooling-fan.jscad +1 -1
- package/examples/example.jscad +6 -6
- package/examples/hq_camera-module.jscad +2 -2
- package/examples/hyper-pixel-4-rectangular.jscad +10 -0
- package/examples/pi4.jscad +1 -1
- package/examples/pi5.jscad +6 -9
- package/package.json +3 -3
- package/prettier.config.js +7 -0
- package/src/active-cooling-fan.js +0 -139
- package/src/boardutils.js +11 -4
- package/src/bplus.js +102 -62
- package/src/hq_camera-module.js +24 -20
- package/src/hyper-pixel-4-rectangular.js +58 -0
- package/src/index.js +2 -1
- package/src/miniPiTFT.js +1 -1
- package/src/rpi-parts.js +23 -5
|
@@ -1,66 +1,6 @@
|
|
|
1
1
|
import { Group, parts as Parts } from '@jwc/jscad-utils';
|
|
2
2
|
|
|
3
|
-
function boardButton(name, board, midline) {
|
|
4
|
-
var g = Group(name);
|
|
5
|
-
g.add(
|
|
6
|
-
Parts.Cube([6.5, 6.5, 2])
|
|
7
|
-
.color('silver')
|
|
8
|
-
.snap(board, 'xy', 'inside-')
|
|
9
|
-
.snap(board, 'z', 'outside-')
|
|
10
|
-
.midlineTo('y', midline),
|
|
11
|
-
'base'
|
|
12
|
-
);
|
|
13
|
-
g.add(
|
|
14
|
-
Parts.Cylinder(3, 1)
|
|
15
|
-
.color('black')
|
|
16
|
-
.align(g.parts.base, 'xy')
|
|
17
|
-
.snap(g.parts.base, 'z', 'outside-'),
|
|
18
|
-
'push'
|
|
19
|
-
);
|
|
20
3
|
|
|
21
|
-
return g;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
function buttonCap(name, button) {
|
|
25
|
-
var g = Group(name);
|
|
26
|
-
g.add(
|
|
27
|
-
Parts.Cylinder(4, 3)
|
|
28
|
-
.fillet(1, 'z+')
|
|
29
|
-
// .translate([0, 0, 1])
|
|
30
|
-
.union(
|
|
31
|
-
Parts.Cylinder(6, 0.5).bisect('x', -0.5).parts.negative //.translate([0, 0, 1])
|
|
32
|
-
)
|
|
33
|
-
|
|
34
|
-
.color('blue')
|
|
35
|
-
.align(button, 'xy')
|
|
36
|
-
.snap(button, 'z', 'outside-'),
|
|
37
|
-
'cap'
|
|
38
|
-
);
|
|
39
|
-
|
|
40
|
-
g.add(
|
|
41
|
-
Parts.Cylinder(7, 0.75)
|
|
42
|
-
.bisect('x', -0.5)
|
|
43
|
-
.parts.negative.color('green')
|
|
44
|
-
.union(Parts.Cylinder(4.5, 2).color('yellow').translate([0, 0, 0]))
|
|
45
|
-
.align(g.parts.cap, 'xy')
|
|
46
|
-
.snap(g.parts.cap, 'z', 'inside-'),
|
|
47
|
-
// .color('red'),
|
|
48
|
-
'clearance',
|
|
49
|
-
true
|
|
50
|
-
);
|
|
51
|
-
return g;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* Returns an Adafruit miniPiTFT Hat with buttons.
|
|
56
|
-
*
|
|
57
|
-
* Default parts: board,screen,display,button1,button2
|
|
58
|
-
*
|
|
59
|
-
* All parts: board,screen,display,display-clearance,button1,button1-base,button1-push,button2,button2-base,button2-push,buttonCap1,buttonCap1-cap,buttonCap1-clearance,buttonCap2,buttonCap2-cap,buttonCap2-clearance,button-connector,button-connector-clearance,standoff
|
|
60
|
-
*
|
|
61
|
-
* 
|
|
62
|
-
* @function activeCoolingFan
|
|
63
|
-
*/
|
|
64
4
|
export default function activeCoolingFan() {
|
|
65
5
|
var g = Group('ActiveCoolingFan');
|
|
66
6
|
|
|
@@ -75,86 +15,7 @@ export default function activeCoolingFan() {
|
|
|
75
15
|
|
|
76
16
|
g.add(board, 'board');
|
|
77
17
|
|
|
78
|
-
// g.add(
|
|
79
|
-
// Parts.Cube([31, 18, 2])
|
|
80
|
-
// .color('white')
|
|
81
|
-
// .snap(board, 'x', 'inside+')
|
|
82
|
-
// .snap(board, 'y', 'inside-')
|
|
83
|
-
// .snap(board, 'z', 'outside-'),
|
|
84
|
-
// 'screen'
|
|
85
|
-
// );
|
|
86
|
-
|
|
87
|
-
// g.add(
|
|
88
|
-
// Parts.Cube([util.inch(0.98), util.inch(0.58), 2.01])
|
|
89
|
-
// .color('black')
|
|
90
|
-
// .snap(board, 'x', 'inside-', util.inch(0.34))
|
|
91
|
-
// .snap(board, 'y', 'inside+', -util.inch(0.32))
|
|
92
|
-
// .snap(board, 'z', 'outside-'),
|
|
93
|
-
// 'display'
|
|
94
|
-
// );
|
|
95
|
-
|
|
96
|
-
// g.add(
|
|
97
|
-
// g.parts.display
|
|
98
|
-
// .stretch('z', 5)
|
|
99
|
-
// .chamfer(-5, 'z+')
|
|
100
|
-
// .align(g.parts.display, 'xy')
|
|
101
|
-
// .color('red'),
|
|
102
|
-
// 'display-clearance',
|
|
103
|
-
// true
|
|
104
|
-
// );
|
|
105
|
-
|
|
106
|
-
// g.add(
|
|
107
|
-
// boardButton('button1', board, util.inch(0.53)),
|
|
108
|
-
// 'button1',
|
|
109
|
-
// false,
|
|
110
|
-
// 'button1-'
|
|
111
|
-
// );
|
|
112
|
-
|
|
113
|
-
// g.add(
|
|
114
|
-
// boardButton('button2', board, util.inch(0.18)),
|
|
115
|
-
// 'button2',
|
|
116
|
-
// false,
|
|
117
|
-
// 'button2-'
|
|
118
|
-
// );
|
|
119
|
-
|
|
120
|
-
// g.add(
|
|
121
|
-
// buttonCap('buttonCap1', g.parts.button1),
|
|
122
|
-
// 'buttonCap1',
|
|
123
|
-
// true,
|
|
124
|
-
// 'buttonCap1-'
|
|
125
|
-
// );
|
|
126
|
-
// g.add(
|
|
127
|
-
// buttonCap('buttonCap2', g.parts.button2),
|
|
128
|
-
// 'buttonCap2',
|
|
129
|
-
// true,
|
|
130
|
-
// 'buttonCap2-'
|
|
131
|
-
// );
|
|
132
|
-
|
|
133
|
-
// g.add(
|
|
134
|
-
// Parts.Cube([1, 5, 0.5])
|
|
135
|
-
// .color('blue')
|
|
136
|
-
// .align(g.parts.buttonCap1, 'x')
|
|
137
|
-
// .snap(g.parts.buttonCap1, 'y', 'outside+', 1)
|
|
138
|
-
// .snap(g.parts.buttonCap1, 'z', 'inside-'),
|
|
139
|
-
// 'button-connector',
|
|
140
|
-
// true
|
|
141
|
-
// );
|
|
142
|
-
|
|
143
|
-
// g.add(
|
|
144
|
-
// g.parts['button-connector'].enlarge(0.5, 0.5, 0.5).color('red'),
|
|
145
|
-
// 'button-connector-clearance',
|
|
146
|
-
// true
|
|
147
|
-
// );
|
|
148
18
|
|
|
149
|
-
// g.add(
|
|
150
|
-
// Parts.Tube(7, 3, 7.5)
|
|
151
|
-
// .snap(board, 'x', 'inside-')
|
|
152
|
-
// .snap(board, 'y', 'inside+')
|
|
153
|
-
// .snap(board, 'z', 'outside+')
|
|
154
|
-
// .color('yellow'),
|
|
155
|
-
// 'standoff',
|
|
156
|
-
// true
|
|
157
|
-
// );
|
|
158
19
|
|
|
159
20
|
return g;
|
|
160
21
|
}
|
package/src/boardutils.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { util, array } from '@jwc/jscad-utils';
|
|
2
1
|
import jsCadCSG from '@jscad/csg';
|
|
3
|
-
const { CSG } = jsCadCSG;
|
|
4
2
|
import scadApi from '@jscad/scad-api';
|
|
3
|
+
import { array, util } from '@jwc/jscad-utils';
|
|
4
|
+
const { CSG } = jsCadCSG;
|
|
5
5
|
const { union } = scadApi.booleanOps;
|
|
6
6
|
|
|
7
7
|
export function CornerHole(r, size, center) {
|
|
@@ -62,13 +62,20 @@ export function CornerHoles(hole_r, boardinfo) {
|
|
|
62
62
|
return util.mirrored4(CornerHole(hole_r, boardinfo.size, 3.5));
|
|
63
63
|
}
|
|
64
64
|
|
|
65
|
-
|
|
65
|
+
/**
|
|
66
|
+
* @function RightSide
|
|
67
|
+
* @param {CSG} o A csg object to be placed on the right side of the motherboard}
|
|
68
|
+
* @param {CSG} mb A csg motherboard object
|
|
69
|
+
* @param {Array<number>} [offset=[2, 0, 0]] An offset to apply after positioning ex. [2,0,0]
|
|
70
|
+
* @return {CSG} The translated CSG object
|
|
71
|
+
*/
|
|
72
|
+
export function RightSide(o, mb, offset = [2, 0, 0]) {
|
|
66
73
|
return o.translate(
|
|
67
74
|
array.add(
|
|
68
75
|
o.calcSnap(mb, 'z', 'outside-'),
|
|
69
76
|
o.calcSnap(mb, 'x', 'inside+'),
|
|
70
77
|
o.calcSnap(mb, 'y', 'inside-'),
|
|
71
|
-
|
|
78
|
+
offset
|
|
72
79
|
)
|
|
73
80
|
);
|
|
74
81
|
}
|
package/src/bplus.js
CHANGED
|
@@ -4,15 +4,16 @@ import * as BPlusMounting from './bplus-mounting';
|
|
|
4
4
|
import * as RPiParts from './rpi-parts';
|
|
5
5
|
const debug = Debug('jscadRPi:BPlus');
|
|
6
6
|
|
|
7
|
-
|
|
8
7
|
function pi4(group, clearance, mb) {
|
|
9
8
|
/**
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
* Model 4
|
|
10
|
+
*/
|
|
12
11
|
group.add(
|
|
13
|
-
RightSide(
|
|
14
|
-
.
|
|
15
|
-
|
|
12
|
+
RightSide(
|
|
13
|
+
Parts.Cube([21.5, 16.5, 13.5]).color('lightgray'),
|
|
14
|
+
mb,
|
|
15
|
+
[3, 0, 0]
|
|
16
|
+
).midlineTo('y', 45.75),
|
|
16
17
|
'ethernet'
|
|
17
18
|
);
|
|
18
19
|
|
|
@@ -196,30 +197,42 @@ function pi4(group, clearance, mb) {
|
|
|
196
197
|
);
|
|
197
198
|
}
|
|
198
199
|
|
|
199
|
-
|
|
200
200
|
function pi5(group, clearance, mb) {
|
|
201
201
|
/**
|
|
202
202
|
* Model 5
|
|
203
203
|
*/
|
|
204
204
|
|
|
205
205
|
group.add(
|
|
206
|
-
Parts.Cube([
|
|
207
|
-
.
|
|
206
|
+
Parts.Cube([17, 17, 3])
|
|
207
|
+
.color('lightgray')
|
|
208
|
+
.translate([0, 15, 0])
|
|
209
|
+
.midlineTo('x', 29 + 3.5)
|
|
210
|
+
.snap(group.parts.mb, 'z', 'outside-'),
|
|
208
211
|
'cpu'
|
|
209
212
|
);
|
|
210
213
|
|
|
211
214
|
group.add(
|
|
212
|
-
Parts.Cube([
|
|
213
|
-
.
|
|
215
|
+
Parts.Cube([17, 17, clearance])
|
|
216
|
+
.color('red')
|
|
217
|
+
.align(group.parts.cpu, 'xy')
|
|
218
|
+
.snap(group.parts.cpu, 'z', 'outside-'),
|
|
214
219
|
'clearance-cpu',
|
|
215
220
|
true,
|
|
216
221
|
'clearance'
|
|
217
222
|
);
|
|
218
223
|
|
|
224
|
+
// group.add(Parts.Cube([1, 1, 15.1 - 1.46]).snap(mb, 'x', 'inside+')
|
|
225
|
+
// .snap(mb, 'y', 'inside-').snap(mb, 'z', 'outside-'), 'dimcheck1');
|
|
226
|
+
|
|
227
|
+
// group.add(Parts.Cube([3.06, 1, 1]).snap(mb, 'x', 'outside-')
|
|
228
|
+
// .snap(mb, 'y', 'inside-').align(mb, 'z'), 'dimcheck2');
|
|
229
|
+
|
|
219
230
|
group.add(
|
|
220
|
-
RightSide(
|
|
221
|
-
.
|
|
222
|
-
|
|
231
|
+
RightSide(
|
|
232
|
+
Parts.Cube([21.5, 16.5, 13.5]).color('lightgray'),
|
|
233
|
+
mb,
|
|
234
|
+
[3, 0, 0]
|
|
235
|
+
).midlineTo('y', 10.2),
|
|
223
236
|
'ethernet'
|
|
224
237
|
);
|
|
225
238
|
|
|
@@ -233,17 +246,23 @@ function pi5(group, clearance, mb) {
|
|
|
233
246
|
'clearance'
|
|
234
247
|
);
|
|
235
248
|
|
|
249
|
+
// group.add(Parts.Cube([1, 1, 17.5 - 1.46]).snap(mb, 'x', 'inside+')
|
|
250
|
+
// .snap(mb, 'y', 'inside+').snap(mb, 'z', 'outside-'), 'dimcheck3');
|
|
251
|
+
|
|
252
|
+
// group.add(Parts.Cube([3, 1, 1]).snap(mb, 'x', 'outside-')
|
|
253
|
+
// .snap(mb, 'y', 'inside+').align(mb, 'z'), 'dimcheck4');
|
|
254
|
+
|
|
236
255
|
var usb = Group();
|
|
237
256
|
usb.add(
|
|
238
257
|
Parts.Cube([17, 13.1, 15])
|
|
239
258
|
.snap(group.parts.ethernet, 'x', 'inside+', -1)
|
|
240
|
-
.snap(mb, 'z', 'outside-',
|
|
259
|
+
.snap(mb, 'z', 'outside-', 0.5)
|
|
241
260
|
.color('lightgray'),
|
|
242
261
|
'body'
|
|
243
262
|
);
|
|
244
263
|
|
|
245
264
|
usb.add(
|
|
246
|
-
Parts.Cube([1, 15, 16])
|
|
265
|
+
Parts.Cube([1, 15, 16.5])
|
|
247
266
|
.snap(usb.parts.body, 'x', 'outside-')
|
|
248
267
|
.align(usb.parts.body, 'yz')
|
|
249
268
|
.color('lightgray'),
|
|
@@ -255,14 +274,14 @@ function pi5(group, clearance, mb) {
|
|
|
255
274
|
.clone()
|
|
256
275
|
// .translate(usbTranslation)
|
|
257
276
|
|
|
258
|
-
.translate(util.calcmidlineTo(usb.parts.body, 'y', 29.
|
|
277
|
+
.translate(util.calcmidlineTo(usb.parts.body, 'y', 29.1)),
|
|
259
278
|
'usb1',
|
|
260
279
|
false,
|
|
261
280
|
'usb1'
|
|
262
281
|
);
|
|
263
282
|
|
|
264
283
|
group.add(
|
|
265
|
-
Parts.Cube([clearance, 15, 16])
|
|
284
|
+
Parts.Cube([clearance, 15, 16.5])
|
|
266
285
|
.align(group.parts.usb1, 'yz')
|
|
267
286
|
.snap(group.parts.usb1, 'x', 'outside-')
|
|
268
287
|
.color('red'),
|
|
@@ -293,7 +312,7 @@ function pi5(group, clearance, mb) {
|
|
|
293
312
|
Parts.Cube([10, 7.5, 3.2])
|
|
294
313
|
.snap(usb.parts.body, 'y', 'inside-', -1)
|
|
295
314
|
.snap(mb, 'z', 'outside-')
|
|
296
|
-
.midlineTo('x',
|
|
315
|
+
.midlineTo('x', 11.2)
|
|
297
316
|
.color('lightgray'),
|
|
298
317
|
'usbc'
|
|
299
318
|
);
|
|
@@ -311,7 +330,7 @@ function pi5(group, clearance, mb) {
|
|
|
311
330
|
Parts.Cube([7, 7.5, 3])
|
|
312
331
|
.snap(usb.parts.body, 'y', 'inside-', -1)
|
|
313
332
|
.snap(mb, 'z', 'outside-')
|
|
314
|
-
.midlineTo('x',
|
|
333
|
+
.midlineTo('x', 25.8)
|
|
315
334
|
.color('lightgray'),
|
|
316
335
|
'hdmi1'
|
|
317
336
|
);
|
|
@@ -329,7 +348,7 @@ function pi5(group, clearance, mb) {
|
|
|
329
348
|
Parts.Cube([7, 7.5, 3])
|
|
330
349
|
.snap(usb.parts.body, 'y', 'inside-', -1)
|
|
331
350
|
.snap(mb, 'z', 'outside-')
|
|
332
|
-
.midlineTo('x',
|
|
351
|
+
.midlineTo('x', 39.2)
|
|
333
352
|
.color('lightgray'),
|
|
334
353
|
'hdmi2'
|
|
335
354
|
);
|
|
@@ -344,36 +363,20 @@ function pi5(group, clearance, mb) {
|
|
|
344
363
|
);
|
|
345
364
|
|
|
346
365
|
group.add(
|
|
347
|
-
RPiParts.
|
|
348
|
-
|
|
349
|
-
.midlineTo('block', 'x', 3.5 + 7.7 + 14.8 + 13.5 + 7 + 7.5),
|
|
350
|
-
'avjack',
|
|
351
|
-
false,
|
|
352
|
-
'avjack'
|
|
353
|
-
);
|
|
354
|
-
|
|
355
|
-
group.add(
|
|
356
|
-
Parts.Cylinder(6, clearance)
|
|
357
|
-
.rotateX(90)
|
|
358
|
-
.align(group.parts.avjack, 'xz')
|
|
359
|
-
.snap(group.parts.avjack, 'y', 'outside+')
|
|
360
|
-
.color('red'),
|
|
361
|
-
'clearance-avjack',
|
|
362
|
-
true
|
|
366
|
+
RPiParts.CamDisplay().snap(mb, 'z', 'outside-').midlineTo('x', 55),
|
|
367
|
+
'camera0'
|
|
363
368
|
);
|
|
364
369
|
|
|
365
370
|
group.add(
|
|
366
|
-
RPiParts.
|
|
367
|
-
|
|
368
|
-
.midlineTo('x', 3.5 + 7.7 + 14.8 + 13.5 + 7),
|
|
369
|
-
'camera'
|
|
371
|
+
RPiParts.CamDisplay().snap(mb, 'z', 'outside-').midlineTo('x', 50),
|
|
372
|
+
'camera1'
|
|
370
373
|
);
|
|
371
374
|
|
|
372
375
|
group.add(
|
|
373
|
-
RPiParts.
|
|
376
|
+
RPiParts.PCIe()
|
|
374
377
|
.snap(mb, 'z', 'outside-')
|
|
375
|
-
.midlineTo('x',
|
|
376
|
-
.midlineTo('y',
|
|
378
|
+
.midlineTo('x', 3.5)
|
|
379
|
+
.midlineTo('y', 30),
|
|
377
380
|
'display'
|
|
378
381
|
);
|
|
379
382
|
|
|
@@ -389,20 +392,38 @@ function pi5(group, clearance, mb) {
|
|
|
389
392
|
RPiParts.BoardLed()
|
|
390
393
|
.snap(mb, 'z', 'outside-')
|
|
391
394
|
.midlineTo('x', 1.1)
|
|
392
|
-
.midlineTo('y',
|
|
395
|
+
.midlineTo('y', 13.3)
|
|
393
396
|
.color('lightgreen'),
|
|
394
|
-
'
|
|
397
|
+
'statusled'
|
|
395
398
|
);
|
|
399
|
+
|
|
396
400
|
group.add(
|
|
397
|
-
|
|
398
|
-
.
|
|
399
|
-
.
|
|
400
|
-
.
|
|
401
|
+
Parts.Cylinder(2, clearance)
|
|
402
|
+
.rotateY(90)
|
|
403
|
+
.align(group.parts.statusled, 'yz')
|
|
404
|
+
.snap(mb, 'x', 'outside+')
|
|
401
405
|
.color('red'),
|
|
402
|
-
'
|
|
406
|
+
'clearance-statusled',
|
|
407
|
+
true
|
|
403
408
|
);
|
|
404
409
|
|
|
410
|
+
group.add(
|
|
411
|
+
RPiParts.PSW()
|
|
412
|
+
.snap('block', mb, 'z', 'outside-')
|
|
413
|
+
.snap('block', mb, 'x', 'inside-')
|
|
414
|
+
.midlineTo('block', 'y', 18.4),
|
|
415
|
+
'powerswitch'
|
|
416
|
+
);
|
|
405
417
|
|
|
418
|
+
group.add(
|
|
419
|
+
Parts.Cylinder(3, clearance)
|
|
420
|
+
.rotateY(90)
|
|
421
|
+
.align(group.parts.powerswitch, 'yz')
|
|
422
|
+
.snap(group.parts.powerswitch, 'x', 'outside+')
|
|
423
|
+
.color('red'),
|
|
424
|
+
'clearance-powerswitch',
|
|
425
|
+
true
|
|
426
|
+
);
|
|
406
427
|
}
|
|
407
428
|
|
|
408
429
|
/**
|
|
@@ -570,7 +591,6 @@ export default function BPlus(model = 2, options) {
|
|
|
570
591
|
}
|
|
571
592
|
} else if (model == 4) {
|
|
572
593
|
pi4(group, clearance, mb);
|
|
573
|
-
|
|
574
594
|
} else {
|
|
575
595
|
pi5(group, clearance, mb);
|
|
576
596
|
}
|
|
@@ -593,21 +613,41 @@ export default function BPlus(model = 2, options) {
|
|
|
593
613
|
|
|
594
614
|
/** Add fan mounting holes for PI 5 */
|
|
595
615
|
if (model >= 5) {
|
|
596
|
-
group.holes.push(
|
|
597
|
-
.
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
616
|
+
group.holes.push(
|
|
617
|
+
RPiParts.MountingHole(3.25, 1.32)
|
|
618
|
+
.snap(mb, 'xy', 'inside-')
|
|
619
|
+
.align(mb, 'z')
|
|
620
|
+
.midlineTo('x', 3.5)
|
|
621
|
+
.midlineTo('y', 6 + 3.5)
|
|
622
|
+
);
|
|
601
623
|
|
|
602
624
|
group.add(group.holes[4], 'fan1hole', true);
|
|
603
625
|
|
|
604
|
-
group.holes.push(
|
|
605
|
-
.
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
626
|
+
group.holes.push(
|
|
627
|
+
RPiParts.MountingHole(3.25, 1.32)
|
|
628
|
+
.snap(mb, 'xy', 'inside-')
|
|
629
|
+
.align(mb, 'z')
|
|
630
|
+
.midlineTo('x', 3.5 + 58)
|
|
631
|
+
.midlineTo('y', 52.5 - 6)
|
|
632
|
+
);
|
|
609
633
|
|
|
610
634
|
group.add(group.holes[5], 'fan2hole', true);
|
|
635
|
+
|
|
636
|
+
const fanClearance = Parts.Cylinder(4.5, 4)
|
|
637
|
+
.color('red')
|
|
638
|
+
.align(group.parts.fan1hole, 'xy')
|
|
639
|
+
.snap(group.parts.mb, 'z', 'outside+');
|
|
640
|
+
|
|
641
|
+
group.add(fanClearance, 'clearance-fan1', true, 'clearance');
|
|
642
|
+
|
|
643
|
+
group.add(
|
|
644
|
+
fanClearance
|
|
645
|
+
.align(group.parts.fan2hole, 'xy')
|
|
646
|
+
.snap(group.parts.mb, 'z', 'outside+'),
|
|
647
|
+
'clearance-fan2',
|
|
648
|
+
true,
|
|
649
|
+
'clearance'
|
|
650
|
+
);
|
|
611
651
|
}
|
|
612
652
|
|
|
613
653
|
return group;
|
package/src/hq_camera-module.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { Group, parts as Parts } from '@jwc/jscad-utils';
|
|
1
|
+
import { Debug, Group, parts as Parts } from '@jwc/jscad-utils';
|
|
2
|
+
const debug = Debug('jscadRPi:HQCameraModule');
|
|
2
3
|
|
|
3
|
-
/** @typedef {
|
|
4
|
+
/** @typedef {import("@jwc/jscad-utils/src/group").JsCadUtilsGroup} JsCadUtilsGroup */
|
|
4
5
|
|
|
5
6
|
/**
|
|
6
7
|
* Returns a Raspberry Pi HQ camera JsCadUtilsGroup object.
|
|
@@ -34,19 +35,20 @@ import { Group, parts as Parts } from '@jwc/jscad-utils';
|
|
|
34
35
|
* ]
|
|
35
36
|
*
|
|
36
37
|
* @function CameraModuleV2
|
|
38
|
+
* @param {boolean} [flipTripodMount=false] - Flip the tripod mount to the other side of the board.
|
|
37
39
|
* @return {JsCadUtilsGroup} {description}
|
|
38
40
|
*/
|
|
39
|
-
export default function HQCameraModule() {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
41
|
+
export default function HQCameraModule(flipTripodMount = false) {
|
|
42
|
+
const t = 1.1;
|
|
43
|
+
const height = { sensor: 4 - t, board: t };
|
|
44
|
+
const camera = Group();
|
|
43
45
|
|
|
44
46
|
camera.add(
|
|
45
47
|
Parts.RoundedCube(38, 38, t, 1.4).Center().color('green', 0.75),
|
|
46
48
|
'board'
|
|
47
49
|
);
|
|
48
50
|
|
|
49
|
-
|
|
51
|
+
const hole = Parts.Cylinder(3.25, 10)
|
|
50
52
|
.snap(camera.parts.board, 'xy', 'inside+', 1.25)
|
|
51
53
|
.translate([-4, -4, -5])
|
|
52
54
|
|
|
@@ -57,18 +59,18 @@ export default function HQCameraModule() {
|
|
|
57
59
|
camera.add(hole.rotateZ(-90), 'hole4', true);
|
|
58
60
|
camera.holes.push(...camera.array('hole1,hole2,hole3,hole4'));
|
|
59
61
|
|
|
60
|
-
|
|
62
|
+
const sensor = Parts.Cube([8.5, 8.5, 1])
|
|
61
63
|
.snap(camera.parts.board, 'z', 'outside-')
|
|
62
64
|
.align(camera.parts.board, 'xy')
|
|
63
65
|
.color('white');
|
|
64
66
|
camera.add(sensor, 'sensor');
|
|
65
67
|
|
|
66
|
-
|
|
68
|
+
const mount = Parts.Cylinder(36, 10.2)
|
|
67
69
|
.snap(camera.parts.board, 'z', 'outside-')
|
|
68
70
|
.align(camera.parts.board, 'xy')
|
|
69
71
|
.color('black');
|
|
70
72
|
|
|
71
|
-
|
|
73
|
+
const mountInside = Parts.Cylinder(30.75, 10.2)
|
|
72
74
|
.snap(camera.parts.board, 'z', 'outside-')
|
|
73
75
|
.align(camera.parts.board, 'xy')
|
|
74
76
|
.color('black');
|
|
@@ -76,21 +78,21 @@ export default function HQCameraModule() {
|
|
|
76
78
|
|
|
77
79
|
camera.add(mount, 'mount-clearance', true);
|
|
78
80
|
|
|
79
|
-
|
|
81
|
+
const tripodMountBase = Parts.Cube([24.5, 10, 7.62])
|
|
80
82
|
.snap(mount, 'z', 'inside+')
|
|
81
|
-
.snap(camera.parts.board, 'y', '
|
|
83
|
+
.snap(camera.parts.board, 'y', 'inside-', -1)
|
|
84
|
+
.align(mount, 'x')
|
|
85
|
+
.color('darkgray')
|
|
86
|
+
.subtract(mountInside)
|
|
87
|
+
|
|
88
|
+
const tripodMount = Parts.Cube([14, 11.5, 11.5])
|
|
89
|
+
.snap(tripodMountBase, 'z', flipTripodMount ? 'inside-' : 'inside+')
|
|
90
|
+
.snap(tripodMountBase, 'y', 'outside+')
|
|
82
91
|
.align(mount, 'x')
|
|
83
92
|
.color('gray');
|
|
84
93
|
|
|
85
94
|
camera.add(
|
|
86
|
-
|
|
87
|
-
Parts.Cube([24.5, 10, 7.62])
|
|
88
|
-
.snap(mount, 'z', 'inside+')
|
|
89
|
-
.snap(tripodMount, 'y', 'outside-')
|
|
90
|
-
.align(mount, 'x')
|
|
91
|
-
.color('darkgray')
|
|
92
|
-
.subtract(mountInside)
|
|
93
|
-
),
|
|
95
|
+
tripodMountBase.union(tripodMount),
|
|
94
96
|
'tripodMount'
|
|
95
97
|
);
|
|
96
98
|
|
|
@@ -110,5 +112,7 @@ export default function HQCameraModule() {
|
|
|
110
112
|
'ribbon-nogo'
|
|
111
113
|
);
|
|
112
114
|
|
|
115
|
+
debug("camera parts", camera.parts);
|
|
116
|
+
|
|
113
117
|
return camera;
|
|
114
118
|
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { booleanOps } from '@jscad/scad-api';
|
|
2
|
+
import { Debug, Group, parts as Parts } from '@jwc/jscad-utils';
|
|
3
|
+
import { Mountingpad } from './rpi-parts';
|
|
4
|
+
|
|
5
|
+
const { union } = booleanOps;
|
|
6
|
+
const debug = Debug('jscadRPi:HyperPixel4Rectangular');
|
|
7
|
+
|
|
8
|
+
/** @typedef {typeof import("@jwc/jscad-utils/src/group").JsCadUtilsGroup} JsCadUtilsGroup */
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
export default function HyperPixel4Rectangular(pi) {
|
|
12
|
+
const group = Group();
|
|
13
|
+
|
|
14
|
+
const board = Parts.Cube([97.85, 58.14, 1.65]).Center();
|
|
15
|
+
const notch = Parts.RoundedCube(10.1, 58.14 - (4.57 * 2), 1.65, 1.5).align(board, 'y').snap(board, 'x', 'inside-').snap(board, 'x', 'inside+').translate([2, 0, 0]);
|
|
16
|
+
|
|
17
|
+
group.add(board.subtract(notch).color('green', 0.75), 'mb');
|
|
18
|
+
|
|
19
|
+
const lcd = Parts.Cube([97.1, 58.44, 6.84 - 1.65]).color('black');
|
|
20
|
+
group.add(
|
|
21
|
+
lcd
|
|
22
|
+
.align(board, 'xy')
|
|
23
|
+
.translate(lcd.calcSnap(board, 'z', 'outside-'))
|
|
24
|
+
.translate([0, 0, 0.5]),
|
|
25
|
+
'lcd'
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
// group.add(Parts.Cube([15.35, 1, 10]).snap(board, 'x', 'inside+').snap(board, 'y', 'outside+').snap(board, 'z', 'outside+'), 'connector1');
|
|
29
|
+
|
|
30
|
+
// group.add(Parts.Cube([1, 1, 1.36]).snap(board, 'x', 'inside-').snap(board, 'y', 'inside-').snap(board, 'z', 'outside+'), 'dimcheck2');
|
|
31
|
+
|
|
32
|
+
// group.add(Parts.Cube([1, 1, 17.04]).snap(board, 'x', 'inside-').snap(board, 'y', 'inside+').snap(board, 'z', 'outside+'), 'dimcheck3');
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
const pad = Mountingpad(5.5, 22.78 - 5.8)
|
|
36
|
+
.snap(board, 'z', 'outside+')
|
|
37
|
+
.snap(board, 'xy', 'inside+').translate([-15.35 + (5.5 - 2), -4.57 + (5.5 - 2), 0]);
|
|
38
|
+
|
|
39
|
+
const pads = [
|
|
40
|
+
pad,
|
|
41
|
+
pad.translate([-58, 0, 0]),
|
|
42
|
+
pad.translate([0, -49, 0]),
|
|
43
|
+
pad.translate([-58, -49, 0]),
|
|
44
|
+
];
|
|
45
|
+
|
|
46
|
+
group.add(pads[0], 'pad1');
|
|
47
|
+
group.add(pads[1], 'pad2');
|
|
48
|
+
group.add(pads[2], 'pad3');
|
|
49
|
+
group.add(pads[3], 'pad4');
|
|
50
|
+
|
|
51
|
+
group.rotate('mb', 'z', 180);
|
|
52
|
+
debug('pi.parts', pi ? pi.parts : null);
|
|
53
|
+
debug('group.parts', group.parts);
|
|
54
|
+
if (pi) {
|
|
55
|
+
group.align('pad1', pi.parts.hole1, 'xy').snap('pad1', pi.parts.mb, 'z', 'outside-');
|
|
56
|
+
}
|
|
57
|
+
return group;
|
|
58
|
+
}
|
package/src/index.js
CHANGED
|
@@ -5,6 +5,7 @@ import CameraModuleV2 from './camera-module-v2';
|
|
|
5
5
|
import Hat from './hat';
|
|
6
6
|
import HatStandoff from './hat-standoff';
|
|
7
7
|
import HQCameraModule from './hq_camera-module';
|
|
8
|
+
import HyperPixel4Rectangular from './hyper-pixel-4-rectangular';
|
|
8
9
|
import MiniPiTFT from './miniPiTFT';
|
|
9
10
|
import PiTFT22 from './pi-tft22';
|
|
10
11
|
import PiTFT24 from './pi-tft24';
|
|
@@ -14,7 +15,7 @@ export {
|
|
|
14
15
|
ActiveCoolingFan, BPlus,
|
|
15
16
|
CameraModuleV1,
|
|
16
17
|
CameraModuleV2, Hat,
|
|
17
|
-
HatStandoff, HQCameraModule, MiniPiTFT, PiTFT22,
|
|
18
|
+
HatStandoff, HQCameraModule, HyperPixel4Rectangular, MiniPiTFT, PiTFT22,
|
|
18
19
|
PiTFT24, Spacer
|
|
19
20
|
};
|
|
20
21
|
|