1
0
mirror of https://github.com/nophead/NopSCADlib.git synced 2025-09-04 20:56:07 +02:00

Compare commits

...

4 Commits

Author SHA1 Message Date
Chris Palmer
2a2b7d8bd6 Added a second example project. 2022-02-09 21:57:56 +00:00
Chris Palmer
055b4e7102 Added SOT23 and SOT223 SMD packages.
smd_capacitors can now have a value.
Wire links can now have zero length to create a vertical wire.
2022-02-09 21:50:10 +00:00
Chris Palmer
00d6efc315 Added veroboard constructor.
Documented solder_meniscus and made it parametric.
2022-02-09 21:42:20 +00:00
Chris Palmer
985b6c08d2 Updated changelog. 2022-02-08 19:19:17 +00:00
74 changed files with 141352 additions and 29 deletions

View File

@@ -3,6 +3,12 @@
This changelog is generated by `changelog.py` using manually added semantic version tags to classify commits as breaking changes, additions or fixes.
### [v19.7.0](https://github.com/nophead/NopSCADlib/releases/tag/v19.7.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v19.6.0...v19.7.0 "diff with v19.6.0")
* 2022-02-08 [`1f55097`](https://github.com/nophead/NopSCADlib/commit/1f55097bdd3e4d0164a48dd7ebb3fc5370250ac4 "show commit") [C.P.](# "Chris Palmer") Support for twisted cables.
Sweep now distbutes twists in proportion to segments lengths.
Added `spiral_paths(),` `segmented_path()` and `rounded_path_vertices()` functions.
Added `show_path(path)` module.
### [v19.6.0](https://github.com/nophead/NopSCADlib/releases/tag/v19.6.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v19.5.1...v19.6.0 "diff with v19.5.1")
* 2022-02-06 [`225ea9b`](https://github.com/nophead/NopSCADlib/commit/225ea9b45160195bdf316e7ffdb383a63f898d3c "show commit") [C.P.](# "Chris Palmer") Added `rounded_path()` function to `sweep.scad`.

Binary file not shown.

After

Width:  |  Height:  |  Size: 203 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 265 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 326 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 336 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 202 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 249 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 125 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 187 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 236 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 229 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 130 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 219 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

View File

@@ -0,0 +1,5 @@
RPI_assembly:
Vitamins:
1 Micro SD card
1 Raspberry Pi Zero
1 Pin header 20 x 2 right_angle

View File

@@ -0,0 +1,7 @@
RPI_case_assembly:
Vitamins:
2 Screw M2.5 pan x 6.4mm
Assemblies:
1 RPI_assembly
1 enviro_case_assembly

View File

@@ -0,0 +1,8 @@
back_assembly:
Vitamins:
1 Fan 17mm x 8mm
1 PMS5003 particle detector
Printed:
1 enviro_plus_case_base.stl
1 fan_duct.stl

View File

@@ -0,0 +1,21 @@
'Micro SD card', 1
'Fan 17mm x 8mm', 1
'Heatfit insert M2', 4
'Nut M2.5 x 2.2mm nyloc', 4
'Enviro+', 1
'Raspberry Pi Zero', 1
'Pin header 20 x 2 right_angle', 1
'PMS5003 particle detector', 1
'Screw M2 cap x 6mm', 4
'Screw M2.5 pan x 6.4mm', 2
'Screw M2.5 pan x 8mm', 4
'Screw M3 pan x 6mm', 3
'SMD capacitor 1206 10uF', 1
'SMD resistor 0805 3K3 0.125W', 1
'SOT223 package FZT851', 1
'Veroboard 6 holes x 6strips', 1
'Washer M2 x 5mm x 0.3mm', 4
'Washer M2.5 x 5.9mm x 0.5mm', 4
'Washer M3 x 7mm x 0.5mm', 3
'Wire link 0.8mm x 6.5mm', 3
'Wire link 0.8mm x 0.4"', 1
Can't render this file because it contains an unexpected character in line 21 and column 23.

View File

@@ -0,0 +1,194 @@
[
{
"name": "back_assembly",
"big": null,
"ngb": false,
"zoomed": 0,
"count": 1,
"assemblies": {},
"vitamins": {
"pms5003(): PMS5003 particle detector": {
"count": 1
},
"fan(fan17x8): Fan 17mm x 8mm": {
"count": 1
}
},
"printed": {
"fan_duct.stl": {
"count": 1,
"colour": "darkorange"
},
"enviro_plus_case_base.stl": {
"count": 1,
"colour": "grey"
}
},
"routed": {}
},
{
"name": "RPI_assembly",
"big": null,
"ngb": false,
"zoomed": 0,
"count": 1,
"assemblies": {},
"vitamins": {
"pcb(RPI0): Raspberry Pi Zero": {
"count": 1
},
": Micro SD card": {
"count": 1
},
"pin_header(2p54header, 20, 2, right_angle = true): Pin header 20 x 2 right_angle": {
"count": 1
}
},
"printed": {},
"routed": {}
},
{
"name": "fan_controller_assembly",
"big": null,
"ngb": false,
"zoomed": 0,
"count": 1,
"assemblies": {},
"vitamins": {
"veroboard(fan_vb): Veroboard 6 holes x 6strips": {
"count": 1
},
"wire_link(0.8, 10.16, tail = 2.5): Wire link 0.8mm x 0.4\"": {
"count": 1
},
"wire_link(0.8, 0, h = 4, tail = 2.5): Wire link 0.8mm x 6.5mm": {
"count": 3
},
"smd_resistor(RES0805, 3K3): SMD resistor 0805 3K3 0.125W": {
"count": 1
},
"smd_capacitor(CAP1206): SMD capacitor 1206 10uF": {
"count": 1
},
"smd_sot(SOT223): SOT223 package FZT851": {
"count": 1
}
},
"printed": {},
"routed": {}
},
{
"name": "enviro_assembly",
"big": null,
"ngb": false,
"zoomed": 0,
"count": 1,
"assemblies": {
"fan_controller_assembly": 1
},
"vitamins": {
"pcb(EnviroPlus): Enviro+": {
"count": 1
}
},
"printed": {},
"routed": {}
},
{
"name": "case_assembly",
"big": null,
"ngb": false,
"zoomed": 0,
"count": 1,
"assemblies": {},
"vitamins": {
"insert(F1BM2): Heatfit insert M2": {
"count": 4
},
"washer(M3_washer): Washer M3 x 7mm x 0.5mm": {
"count": 3
},
"screw(M3_pan_screw, 6): Screw M3 pan x 6mm": {
"count": 3
}
},
"printed": {
"enviro_plus_case.stl": {
"count": 1,
"colour": "grey"
},
"bulkhead.stl": {
"count": 1,
"colour": "[0.862745, 0.0784314, 0.235294]"
},
"foot.stl": {
"count": 3,
"colour": "darkorange"
}
},
"routed": {}
},
{
"name": "enviro_case_assembly",
"big": null,
"ngb": false,
"zoomed": 0,
"count": 1,
"assemblies": {
"case_assembly": 1,
"enviro_assembly": 1
},
"vitamins": {
"screw(M2p5_pan_screw, 8): Screw M2.5 pan x 8mm": {
"count": 4
},
"washer(M2p5_washer): Washer M2.5 x 5.9mm x 0.5mm": {
"count": 4
},
"nut(M2p5_nut, nyloc = true): Nut M2.5 x 2.2mm nyloc": {
"count": 4
}
},
"printed": {},
"routed": {}
},
{
"name": "RPI_case_assembly",
"big": null,
"ngb": false,
"zoomed": 0,
"count": 1,
"assemblies": {
"enviro_case_assembly": 1,
"RPI_assembly": 1
},
"vitamins": {
"screw(M2p5_pan_screw, 6.4): Screw M2.5 pan x 6.4mm": {
"count": 2
}
},
"printed": {},
"routed": {}
},
{
"name": "main_assembly",
"big": null,
"ngb": false,
"zoomed": 0,
"count": 1,
"assemblies": {
"RPI_case_assembly": 1,
"back_assembly": 1
},
"vitamins": {
"washer(M2_washer): Washer M2 x 5mm x 0.3mm": {
"count": 4
},
"screw(M2_cap_screw, 6): Screw M2 cap x 6mm": {
"count": 4
}
},
"printed": {},
"routed": {}
}
]

View File

@@ -0,0 +1,53 @@
Vitamins:
F
a
n
E
n c
v o
R i n
p r t
i E o r
n o
c B C v c l M
R a a a i a l a
p s c s r s e i
i e k e o e r n
1| | | | | | | | 1 Micro SD card
| | 1| | | | | | 1 Fan 17mm x 8mm
| | | 4| | | | | 4 Heatfit insert M2
| | | | | 4| | | 4 Nut M2.5 x 2.2mm nyloc
| | | | 1| | | | 1 Enviro+
1| | | | | | | | 1 Raspberry Pi Zero
1| | | | | | | | 1 Pin header 20 x 2 right_angle
| | 1| | | | | | 1 PMS5003 particle detector
| | | | | | | 4| 4 Screw M2 cap x 6mm
| 2| | | | | | | 2 Screw M2.5 pan x 6.4mm
| | | | | 4| | | 4 Screw M2.5 pan x 8mm
| | | 3| | | | | 3 Screw M3 pan x 6mm
| | | | | | 1| | 1 SMD capacitor 1206 10uF
| | | | | | 1| | 1 SMD resistor 0805 3K3 0.125W
| | | | | | 1| | 1 SOT223 package FZT851
| | | | | | 1| | 1 Veroboard 6 holes x 6strips
| | | | | | | 4| 4 Washer M2 x 5mm x 0.3mm
| | | | | 4| | | 4 Washer M2.5 x 5.9mm x 0.5mm
| | | 3| | | | | 3 Washer M3 x 7mm x 0.5mm
| | | | | | 3| | 3 Wire link 0.8mm x 6.5mm
| | | | | | 1| | 1 Wire link 0.8mm x 0.4"
Printed:
| | | 1| | | | | 1 bulkhead.stl
| | | 1| | | | | 1 enviro_plus_case.stl
| | 1| | | | | | 1 enviro_plus_case_base.stl
| | 1| | | | | | 1 fan_duct.stl
| | | 3| | | | | 3 foot.stl
Assemblies:
1 RPI_assembly
1 RPI_case_assembly
1 back_assembly
1 case_assembly
1 enviro_assembly
1 enviro_case_assembly
1 fan_controller_assembly
1 main_assembly

View File

@@ -0,0 +1,10 @@
case_assembly:
Vitamins:
4 Heatfit insert M2
3 Screw M3 pan x 6mm
3 Washer M3 x 7mm x 0.5mm
Printed:
1 bulkhead.stl
1 enviro_plus_case.stl
3 foot.stl

View File

@@ -0,0 +1,6 @@
enviro_assembly:
Vitamins:
1 Enviro+
Assemblies:
1 fan_controller_assembly

View File

@@ -0,0 +1,9 @@
enviro_case_assembly:
Vitamins:
4 Nut M2.5 x 2.2mm nyloc
4 Screw M2.5 pan x 8mm
4 Washer M2.5 x 5.9mm x 0.5mm
Assemblies:
1 case_assembly
1 enviro_assembly

View File

@@ -0,0 +1,8 @@
fan_controller_assembly:
Vitamins:
1 SMD capacitor 1206 10uF
1 SMD resistor 0805 3K3 0.125W
1 SOT223 package FZT851
1 Veroboard 6 holes x 6strips
3 Wire link 0.8mm x 6.5mm
1 Wire link 0.8mm x 0.4"

View File

@@ -0,0 +1,8 @@
main_assembly:
Vitamins:
4 Screw M2 cap x 6mm
4 Washer M2 x 5mm x 0.3mm
Assemblies:
1 RPI_case_assembly
1 back_assembly

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 498 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 164 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 129 KiB

View File

@@ -0,0 +1,298 @@
<a name="TOP"></a>
# EnviroPlus
Environmental monitor using Enviro+ sensor board and a Raspberry Pi Zero.
![Main Assembly](assemblies/main_assembled.png)
<span></span>
---
## Table of Contents
1. [Parts list](#Parts_list)
1. [Back Assembly](#back_assembly)
1. [RPI Assembly](#RPI_assembly)
1. [Fan Controller Assembly](#fan_controller_assembly)
1. [Enviro Assembly](#enviro_assembly)
1. [Case Assembly](#case_assembly)
1. [Enviro Case Assembly](#enviro_case_assembly)
1. [RPI Case Assembly](#RPI_case_assembly)
1. [Main Assembly](#main_assembly)
<span></span>
[Top](#TOP)
---
<a name="Parts_list"></a>
## Parts list
| <span style="writing-mode: vertical-rl; text-orientation: mixed;">Back</span> | <span style="writing-mode: vertical-rl; text-orientation: mixed;">RPI</span> | <span style="writing-mode: vertical-rl; text-orientation: mixed;">Fan&nbsp;Controller</span> | <span style="writing-mode: vertical-rl; text-orientation: mixed;">Enviro</span> | <span style="writing-mode: vertical-rl; text-orientation: mixed;">Case</span> | <span style="writing-mode: vertical-rl; text-orientation: mixed;">Enviro&nbsp;Case</span> | <span style="writing-mode: vertical-rl; text-orientation: mixed;">RPI&nbsp;Case</span> | <span style="writing-mode: vertical-rl; text-orientation: mixed;">Main</span> | <span style="writing-mode: vertical-rl; text-orientation: mixed;">TOTALS</span> | |
|---:|---:|---:|---:|---:|---:|---:|---:|---:|:---|
| | | | | | | | | | **Vitamins** |
| &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;1&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;1&nbsp; | &nbsp;&nbsp; Enviro+ |
| &nbsp;&nbsp;1&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;1&nbsp; | &nbsp;&nbsp; Fan 17mm x 8mm |
| &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;4&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;4&nbsp; | &nbsp;&nbsp; Heatfit insert M2 |
| &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;1&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;1&nbsp; | &nbsp;&nbsp; Micro SD card |
| &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;4&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;4&nbsp; | &nbsp;&nbsp; Nut M2.5 x 2.2mm nyloc |
| &nbsp;&nbsp;1&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;1&nbsp; | &nbsp;&nbsp; PMS5003 particle detector |
| &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;1&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;1&nbsp; | &nbsp;&nbsp; Pin header 20 x 2 right_angle |
| &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;1&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;1&nbsp; | &nbsp;&nbsp; Raspberry Pi Zero |
| &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;1&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;1&nbsp; | &nbsp;&nbsp; SMD capacitor 1206 10uF |
| &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;1&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;1&nbsp; | &nbsp;&nbsp; SMD resistor 0805 3K3 0.125W |
| &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;1&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;1&nbsp; | &nbsp;&nbsp; SOT223 package FZT851 |
| &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;4&nbsp; | &nbsp;&nbsp;4&nbsp; | &nbsp;&nbsp; Screw M2 cap x 6mm |
| &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;2&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;2&nbsp; | &nbsp;&nbsp; Screw M2.5 pan x 6.4mm |
| &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;4&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;4&nbsp; | &nbsp;&nbsp; Screw M2.5 pan x 8mm |
| &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;3&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;3&nbsp; | &nbsp;&nbsp; Screw M3 pan x 6mm |
| &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;1&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;1&nbsp; | &nbsp;&nbsp; Veroboard 6 holes x 6strips |
| &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;4&nbsp; | &nbsp;&nbsp;4&nbsp; | &nbsp;&nbsp; Washer M2 x 5mm x 0.3mm |
| &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;4&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;4&nbsp; | &nbsp;&nbsp; Washer M2.5 x 5.9mm x 0.5mm |
| &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;3&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;3&nbsp; | &nbsp;&nbsp; Washer M3 x 7mm x 0.5mm |
| &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;1&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;1&nbsp; | &nbsp;&nbsp; Wire link 0.8mm x 0.4" |
| &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;3&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;3&nbsp; | &nbsp;&nbsp; Wire link 0.8mm x 6.5mm |
| &nbsp;&nbsp;2&nbsp; | &nbsp;&nbsp;3&nbsp; | &nbsp;&nbsp;8&nbsp; | &nbsp;&nbsp;1&nbsp; | &nbsp;&nbsp;10&nbsp; | &nbsp;&nbsp;12&nbsp; | &nbsp;&nbsp;2&nbsp; | &nbsp;&nbsp;8&nbsp; | &nbsp;&nbsp;46&nbsp; | &nbsp;&nbsp;Total vitamins count |
| | | | | | | | | | **3D printed parts** |
| &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;1&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;1&nbsp; | &nbsp;&nbsp;bulkhead.stl |
| &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;1&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;1&nbsp; | &nbsp;&nbsp;enviro_plus_case.stl |
| &nbsp;&nbsp;1&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;1&nbsp; | &nbsp;&nbsp;enviro_plus_case_base.stl |
| &nbsp;&nbsp;1&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;1&nbsp; | &nbsp;&nbsp;fan_duct.stl |
| &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;3&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;3&nbsp; | &nbsp;&nbsp;foot.stl |
| &nbsp;&nbsp;2&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;5&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;7&nbsp; | &nbsp;&nbsp;Total 3D printed parts count |
<span></span>
[Top](#TOP)
---
<a name="back_assembly"></a>
## Back Assembly
### Vitamins
|Qty|Description|
|---:|:----------|
|1| Fan 17mm x 8mm|
|1| PMS5003 particle detector|
### 3D Printed parts
| 1 x enviro_plus_case_base.stl | 1 x fan_duct.stl |
|---|---|
| ![enviro_plus_case_base.stl](stls/enviro_plus_case_base.png) | ![fan_duct.stl](stls/fan_duct.png)
### Assembly instructions
![back_assembly](assemblies/back_assembly.png)
1. Print the fan duct in flexible TPE with low infill.
1. Slide the pms5003 into the printed receptacle with the fan to the outside. Secure with tape if it is loose.
1. Slide the fan into the fan duct.
1. Slide the fan duct into the printed recepacle.
![back_assembled](assemblies/back_assembled.png)
<span></span>
[Top](#TOP)
---
<a name="RPI_assembly"></a>
## RPI Assembly
### Vitamins
|Qty|Description|
|---:|:----------|
|1| Micro SD card|
|1| Pin header 20 x 2 right_angle|
|1| Raspberry Pi Zero|
### Assembly instructions
![RPI_assembly](assemblies/RPI_assembly_tn.png)
* Solder a right angle connector to the Raspberry Pi Zero.
![RPI_assembled](assemblies/RPI_assembled_tn.png)
<span></span>
[Top](#TOP)
---
<a name="fan_controller_assembly"></a>
## Fan Controller Assembly
### Vitamins
|Qty|Description|
|---:|:----------|
|1| SMD capacitor 1206 10uF|
|1| SMD resistor 0805 3K3 0.125W|
|1| SOT223 package FZT851|
|1| Veroboard 6 holes x 6strips|
|1| Wire link 0.8mm x 0.4"|
|3| Wire link 0.8mm x 6.5mm|
### Assembly instructions
![fan_controller_assembly](assemblies/fan_controller_assembly_tn.png)
The fan controller is a single transistor wired as a Miller integrator that effectively multiplies the capacitor value by the gain of the transistor.
It converts the PWM signal on GPI4 to a stead DC voltage so that the fan doesn't whine, or stutter.
![Schematic](docs/fan_controller.jpg)
***
* Make two track cuts as shown, one wide and the other narrow.
![TrackCuts](docs/cuts.jpg)
1. Add the SMT compeonents and then the wire links.
1. Add more solder around the transistor to act as a heatsink.
![SMT](docs/smt.jpg)
![fan_controller_assembled](assemblies/fan_controller_assembled_tn.png)
<span></span>
[Top](#TOP)
---
<a name="enviro_assembly"></a>
## Enviro Assembly
### Vitamins
|Qty|Description|
|---:|:----------|
|1| Enviro+|
### Sub-assemblies
| 1 x fan_controller_assembly |
|---|
| ![fan_controller_assembled](assemblies/fan_controller_assembled_tn.png)
### Assembly instructions
![enviro_assembly](assemblies/enviro_assembly_tn.png)
* Solder the fan_controller to the Enviro+ expansion connector at the 5V, GND and #4 pins.
![enviro_assembled](assemblies/enviro_assembled_tn.png)
<span></span>
[Top](#TOP)
---
<a name="case_assembly"></a>
## Case Assembly
### Vitamins
|Qty|Description|
|---:|:----------|
|4| Heatfit insert M2|
|3| Screw M3 pan x 6mm|
|3| Washer M3 x 7mm x 0.5mm|
### 3D Printed parts
| 1 x bulkhead.stl | 1 x enviro_plus_case.stl | 3 x foot.stl |
|---|---|---|
| ![bulkhead.stl](stls/bulkhead.png) | ![enviro_plus_case.stl](stls/enviro_plus_case.png) | ![foot.stl](stls/foot.png)
### Assembly instructions
![case_assembly](assemblies/case_assembly.png)
1. Solvent weld or glue the bulkhead into the recess in the bottom of the case.
1. Fit the heatfit inserts with a soldering iron with a conical bit heated to about 200&deg;C.
1. Tap the three holes for the feet with an M3 tap.
1. Screw on the three feet with M3 x 6mm pan screws and washers.
![case_assembled](assemblies/case_assembled.png)
<span></span>
[Top](#TOP)
---
<a name="enviro_case_assembly"></a>
## Enviro Case Assembly
### Vitamins
|Qty|Description|
|---:|:----------|
|4| Nut M2.5 x 2.2mm nyloc|
|4| Screw M2.5 pan x 8mm|
|4| Washer M2.5 x 5.9mm x 0.5mm|
### Sub-assemblies
| 1 x case_assembly | 1 x enviro_assembly |
|---|---|
| ![case_assembled](assemblies/case_assembled_tn.png) | ![enviro_assembled](assemblies/enviro_assembled_tn.png)
### Assembly instructions
![enviro_case_assembly](assemblies/enviro_case_assembly.png)
* Screw the Enviro+ PCB to the front of the case using M2.5 x 8mm pan screws with washer and nuts on the inside.
![enviro_case_assembled](assemblies/enviro_case_assembled.png)
<span></span>
[Top](#TOP)
---
<a name="RPI_case_assembly"></a>
## RPI Case Assembly
### Vitamins
|Qty|Description|
|---:|:----------|
|2| Screw M2.5 pan x 6.4mm|
### Sub-assemblies
| 1 x RPI_assembly | 1 x enviro_case_assembly |
|---|---|
| ![RPI_assembled](assemblies/RPI_assembled_tn.png) | ![enviro_case_assembled](assemblies/enviro_case_assembled_tn.png)
### Assembly instructions
![RPI_case_assembly](assemblies/RPI_case_assembly.png)
* Plug the RPi into the Enviro+ socket and secure with two screws self tapped into the bosses in the case.
![RPI_case_assembled](assemblies/RPI_case_assembled.png)
<span></span>
[Top](#TOP)
---
<a name="main_assembly"></a>
## Main Assembly
### Vitamins
|Qty|Description|
|---:|:----------|
|4| Screw M2 cap x 6mm|
|4| Washer M2 x 5mm x 0.3mm|
### Sub-assemblies
| 1 x RPI_case_assembly | 1 x back_assembly |
|---|---|
| ![RPI_case_assembled](assemblies/RPI_case_assembled_tn.png) | ![back_assembled](assemblies/back_assembled_tn.png)
### Assembly instructions
![main_assembly](assemblies/main_assembly.png)
* Solder the fan wires to the veroboard assembly
![FanWires](docs/fan_connection.jpg)
* Slide the back assembly into the case and secure with four M2 x 6mm cap screws and washers.
![main_assembled](assemblies/main_assembled.png)
<span></span>
[Top](#TOP)

View File

@@ -0,0 +1,45 @@
//
//! Environmental monitor using Enviro+ sensor board and a Raspberry Pi Zero.
//
// GNU GPL v2
// nop.head@gmail.com
// hydraraptor.blogspot.com
//
// Top level model
//
include <NopSCADlib/core.scad>
use <NopSCADlib/vitamins/veroboard.scad>
include <NopSCADlib/vitamins/smds.scad>
fan_vb = vero("fan_vb", "fan_controller", 6, 6, breaks = [[2, 1], [2 + eps, 5]],
components = [
[5, 3, 90, "link", inch(0.4), undef, undef, 2.5],
[0, 5, 0, "link", 0, 4, undef, 2.5],
[0, 1, 0, "link", 0, 4, undef, 2.5],
[0, 0, 0, "link", 0, 4, undef, 2.5],
[2, 5, 0, "-smd_res", RES0805, "3K3"],
[4, 4.7, 90, "-smd_cap", CAP1206, 1.2, "10uF"],
[2, 2.5, 180, "-smd_sot", SOT223, "FZT851"],
],
joints = [[5, 1], [5, 5], [0, [0, 1, 5]]]
);
//! The fan controller is a single transistor wired as a Miller integrator that effectively multiplies the capacitor value by the gain of the transistor.
//! It converts the PWM signal on GPI4 to a stead DC voltage so that the fan doesn't whine, or stutter.
//!
//! ![Schematic](docs/fan_controller.jpg)
//!
//! ***
//! * Make two track cuts as shown, one wide and the other narrow.
//!
//! ![TrackCuts](docs/cuts.jpg)
//!
//! 1. Add the SMT compeonents and then the wire links.
//! 1. Add more solder around the transistor to act as a heatsink.
//!
//! ![SMT](docs/smt.jpg)
//!
module fan_controller_assembly() rotate(90) vflip(!exploded()) veroboard_assembly(fan_vb, -vero_thickness(fan_vb) - 1.4, 0);
fan_controller_assembly();

View File

@@ -0,0 +1,518 @@
//
//! Environmental monitor using Enviro+ sensor board and a Raspberry Pi Zero.
//
// GNU GPL v2
// nop.head@gmail.com
// hydraraptor.blogspot.com
//
// Top level model
//
$explode = 0; // [0, 1]
assembly = "main"; // [main, back, RPI, case, enviro_case, RPI_case]
/* [Hidden] */
show_box = true;
show_enviroplus = true;
$pp1_colour = "grey";
$extrusion_width = 0.5;
include <NopSCADlib/core.scad>
include <NopSCADlib/vitamins/pin_headers.scad>
include <NopSCADlib/vitamins/pcbs.scad>
include <NopSCADlib/vitamins/fans.scad>
use <NopSCADlib/vitamins/insert.scad>
use <NopSCADlib/vitamins/veroboard.scad>
use <NopSCADlib/utils/round.scad>
use <NopSCADlib/printed/foot.scad>
use <NopSCADlib/printed/printed_box.scad>
use <fan_controller.scad>
rpi = RPI0;
pcb = EnviroPlus;
fan = fan17x8;
foot = Foot(d = 13, h = 5, t = 2, r = 1, screw = M3_pan_screw);
module foot_stl() foot(foot);
rpi_offset = [0, -pcb_width(pcb) / 2 + 0.5, pcb_width(rpi) / 2 + 8.6];
rpi_holes = [0, 1];
wall = 2;
top_thickness = 2;
base_thickness = 2;
case_inner_rad = 8;
width = pcb_length(pcb) + 9 + 10;
pcb_x = -(width - pcb_length(pcb) - 9) / 2;
depth = pcb_width(pcb) + 9;
height = pcb_width(rpi) / 2 + rpi_offset.z + 9;
bulkhead_outset = 2;
bulkhead_inset = 0.5;
bulkhead_t = 2;
clearance = 0.1;
pcb_screw = alternate_screw(hs_pan, pcb_screw(pcb));
box = pbox(name = "enviro_plus_case", wall = wall, top_t = top_thickness, base_t = base_thickness, screw = M2_cap_screw, radius = case_inner_rad, ridges = [8, 1],
size = [width, depth, height]);
pms5003 = [50, 38, 21];
pms5003_wall = 1;
pms5003_pos = [width / 2 - pms5003.x / 2 - pms5003_wall - pbox_screw_inset(box) - insert_boss_radius(screw_insert(pbox_screw(box)), wall) - 0.5,
depth / 2 - pms5003.z / 2 - wall - 1,
height + top_thickness - pms5003.y / 2];
fan_duct_t = 1.7;
foam_t = 0;
fan_pos = [pms5003_pos.x - pms5003.x / 2 - pms5003_wall - fan_width(fan) / 2 - fan_duct_t, 1 + foam_t, 12 + top_thickness + fan_depth(fan) / 2];
fan_socket = 8;
module fan_shape() {
w = fan_width(fan);
p = fan_hole_pitch(fan);
r = w / 2 - p;
rounded_square([w, w], r);
}
module fan_duct_stl() {
module frame(z, offset, y = -fan_pos.y)
translate([0, y, z])
linear_extrude(height = eps)
offset(offset)
fan_shape();
z = height + top_thickness - fan_pos.z + fan_depth(fan) / 2 - fan_socket;
translate([0, -fan_pos.y, z])
linear_extrude(height = fan_socket)
difference() {
fan_shape();
round(1)
offset(-fan_duct_t)
fan_shape();
}
stl("fan_duct") union() {
difference() {
hull() {
frame(z, 0);
frame(fan_depth(fan), fan_duct_t + foam_t, 0);
}
hull() {
frame(z, -fan_duct_t);
frame(fan_depth(fan), foam_t -extrusion_width / 2, 0);
}
}
linear_extrude(height = fan_depth(fan))
difference() {
offset(fan_duct_t + foam_t)
fan_shape();
offset(foam_t)
fan_shape();
}
}
}
module pms5003() {
vitamin("pms5003(): PMS5003 particle detector");
w = pms5003.x;
d = pms5003.y;
h = pms5003.z;
t = 0.1;
color("silver")
difference() {
linear_extrude(height = h, center = true)
difference() {
square([w, d], center = true);
for(x = [-1, 1], y = [-1, 1])
translate([x * w / 2, y * d / 2])
square(2, center = true);
}
cube([w + 2 * eps, d + 2 * eps, t * 2], center = true);
}
color("black")
rounded_rectangle([w - 2 * t, d - 2 * t, h - 2 * t], r = 1, center = true);
}
module pcb_shape(offset)
rounded_square([pcb_length(pcb) + 2 * offset, pcb_width(pcb) + 2 * offset], pcb_radius(pcb) + offset);
module gap() {
gap = pcb_component_position(pcb, "-chip");
translate([gap.x, -gap.y])
square([17.5, 20], center = true);
}
module rpi_holes()
for(i = rpi_holes) {
hole = pcb_coord(rpi, pcb_holes(rpi)[i]);
translate([hole.x, rpi_offset.y, -hole.y + rpi_offset.z + top_thickness])
rotate([90, 0, 0])
children();
}
module feet_positions() {
clearance = 2;
foot_r = foot_diameter(foot) / 2;
x_inset = case_inner_rad + foot_r - pbox_ridges(box).y;
z_inset = foot_r + clearance;
h = height + base_thickness;
for(p = [[-1, -1], [1, -1], [0, 1]])
translate([p.x * (width / 2 - x_inset), depth / 2 + wall + pbox_ridges(box).y, top_thickness + h / 2 + p.y * (h / 2 - z_inset)])
rotate([90, 0, 0])
children();
}
module slots(h = 10, expand = 0) {
for(comp = [["uSD", 2, 11, 0.7], ["flat_flex", 1, 12, 0.5]]) {
p = pcb_component_position(rpi, comp[0]);
translate([sign(p.x) * (width / 2 + wall / 2 + pbox_ridges(box).y / 2), rpi_offset.y + pcb_thickness(rpi) + comp[3], top_thickness + rpi_offset.z - p.y])
rotate([90, 0, 90])
hull() {
vertical_tearslot(r = comp[1] + expand, l = comp[2], h = h);
if(expand)
vertical_tearslot(r = comp[1] + expand + h / 2, l = comp[2], h = eps);
}
}
}
module box_internal_additions() {
translate([pcb_x, 0]) {
linear_extrude(height = top_thickness + bulkhead_t)
difference() {
pcb_shape(bulkhead_outset + wall + pbox_ridges(box).y + eps);
gap();
pcb_shape(bulkhead_outset + clearance);
}
rpi_holes()
hull() {
wall = 1.8;
r = screw_radius(pcb_screw) + wall;
z = depth / 2 + rpi_offset.y + pbox_ridges(box).y + eps;
offset = max(r, z);
cylinder(r =r, h = z);
translate([0, -offset - r, z])
cube(eps);
}
}
d = washer_diameter(screw_washer(foot_screw(foot))) + 1;
h = pbox_ridges(box).y;
feet_positions()
translate_z(wall - eps)
cylinder(d2 = d, d1 = d + 2 * h, h = h);
slots(wall + pbox_ridges(box).y + eps, 1);
}
module box_external_additions() {
amp = pbox_ridges(box).y + eps;
d = foot_diameter(foot) + 1;
feet_positions()
cylinder(d1 = d, d2 = d + 2 * amp, h = amp);
slots(wall + pbox_ridges(box).y + eps, 1);
}
module box_holes() {
translate([pcb_x, 0]) {
linear_extrude(height = top_thickness + eps)
pcb_shape(clearance);
rpi_holes()
teardrop_plus(r = screw_pilot_hole(pcb_screw), h = 7 - 1.6, center = false);
}
feet_positions()
teardrop(r = screw_pilot_hole(foot_screw(foot)), h = 10, center = true);
grills = 7;
bar = 1.6;
x = pcb_x + pcb_length(pcb) / 2 + 2 * wall + pbox_ridges(box).y + 2 * eps;
w = width / 2 - x;
d = depth - case_inner_rad;
pitch = d / (grills - 1);
for(i = [0 : grills -1])
let(w = i == 0 || i == grills -1 ? w - 1 : w)
translate([x + w / 2, -d / 2 + i * pitch])
rounded_rectangle([w, pitch - bar, 10], 1);
slots();
}
module bulkhead_stl() {
holes = pcb_holes(pcb);
pitch = max([for(h = holes) pcb_coord(pcb, h).x]) - min([for(h = holes) pcb_coord(pcb, h).x]);
boss_r = (pitch - 51.4) / 2;
stl("bulkhead")
linear_extrude(height = bulkhead_t)
difference() {
pcb_shape(bulkhead_outset);
gap();
difference() {
pcb_shape(-bulkhead_inset);
pcb_screw_positions(pcb)
rotate($i * 90)
hull() {
circle(boss_r);
translate([boss_r - eps, -boss_r])
square([eps, boss_r]);
translate([-boss_r, boss_r - eps])
square([boss_r, eps]);
translate([-boss_r, -boss_r])
square(eps);
}
}
pcb_screw_positions(pcb)
poly_circle(screw_clearance_radius(pcb_screw));
}
}
module enviro_plus_case_stl() {
pbox(box) {
box_internal_additions();
box_holes();
box_external_additions();
}
}
module base_additions() {
w = pms5003.x + clearance;
d = pms5003.z + clearance;
wall = pms5003_wall;
translate([pms5003_pos.x, -pms5003_pos.y])
linear_extrude(height = base_thickness + pms5003.y)
difference() {
square([w + 2 * wall, d + 2 * wall], center = true);
square([w, d], center = true);
}
translate([fan_pos.x, 0])
linear_extrude(height = top_thickness + fan_socket)
difference() {
offset(wall)
fan_shape();
fan_shape();
}
}
module base_holes() {
for(i = [0 : 1]) {
p = pcb_component_position(rpi, "usb_uA", i);
translate([p.x + pcb_x, -rpi_offset.y - pcb_thickness(rpi) - 1.3])
rounded_rectangle([11,7, 100], 0.5, true);
}
translate([pms5003_pos.x, -pms5003_pos.y])
rounded_rectangle([pms5003.x - 2 ,pms5003.z - 2, 100], 2, true);
translate([fan_pos.x, 0])
linear_extrude(height = 2 * base_thickness + eps, center = true)
round(1)
offset(-fan_duct_t)
fan_shape();
}
module enviro_plus_case_base_stl()
pbox_base(box) {
base_additions();
base_holes();
}
//! * Solder a right angle connector to the Raspberry Pi Zero.
module RPI_assembly()
assembly("RPI") {
pcb(rpi);
pcb_grid(rpi, 9.5, 0.5, -0.6)
rotate(180)
explode(20)
pin_header(2p54header, 20, 2, right_angle = true);
}
//! 1. Solvent weld or glue the bulkhead into the recess in the bottom of the case.
//! 1. Fit the heatfit inserts with a soldering iron with a conical bit heated to about 200&deg;C.
//! 1. Tap the three holes for the feet with an M3 tap.
//! 1. Screw on the three feet with M3 x 6mm pan screws and washers.
module case_assembly() pose([ 29.60, 0.00, 158.00 ], exploded = true) pose([ 198.00, 0.00, 352.80 ], exploded = false)
assembly("case") {
if(show_box)
stl_colour(pp1_colour) render() enviro_plus_case_stl();
else
render() difference() {
enviro_plus_case_stl();
translate_z(height / 2)
cube([100, 100, height - 20], center = true);
}
pbox_inserts(box);
translate([pcb_x, 0, top_thickness])
explode(20)
stl_colour(pp2_colour) render() bulkhead_stl();
feet_positions() {
foot_assembly(0, foot);
vflip()
explode(20, explode_children = true)
translate_z(foot_thickness(foot))
screw_and_washer(foot_screw(foot), 6);
}
}
//! * Solder the fan_controller to the Enviro+ expansion connector at the 5V, GND and #4 pins.
module enviro_assembly() hflip(exploded())
assembly("enviro") {
if(show_enviroplus)
pcb(pcb);
pcb_grid(pcb, 5.5, 2.5, -pcb_thickness(pcb)) {
hflip()
explode(15)
fan_controller_assembly();
}
if(!exploded())
for(x = [8, 7, 3])
pcb_grid(pcb, x, 0, 0.05)
solder_meniscus(pcb, 0.39, 1);
}
//! * Screw the Enviro+ PCB to the front of the case using M2.5 x 8mm pan screws with washer and nuts on the inside.
module enviro_case_assembly() pose([ 231.40, 0.00, 1.20 ])
assembly("enviro_case") {
case_assembly();
translate([pcb_x, 0, top_thickness])
vflip() explode(20, explode_children = true) {
t = pcb_thickness(pcb);
nut = screw_nut(pcb_screw);
washer = screw_washer(pcb_screw);
no_explode() enviro_assembly();
pcb_screw_positions(pcb) {
translate_z(t)
screw(pcb_screw, screw_longer_than(t + bulkhead_t + nut_thickness(nut, true) + washer_thickness(washer)));
translate_z(-bulkhead_t)
vflip()
explode(20, explode_children = true)
nut_and_washer(nut, true);
}
}
}
//! * Plug the RPi into the Enviro+ socket and secure with two screws self tapped into the bosses in the case.
module RPI_case_assembly() pose([ 20.50, 0.00, 153.30 ])
assembly("RPI_case") {
enviro_case_assembly();
translate([pcb_x, 0]) {
translate_z(top_thickness) {
translate(rpi_offset)
rotate([-90, 0, 0])
RPI_assembly();
}
rpi_holes()
vflip()
translate_z(pcb_thickness(rpi))
screw(pcb_screw, 6.4);
}
}
//! 1. Print the fan duct in flexible TPE with low infill.
//! 1. Slide the pms5003 into the printed receptacle with the fan to the outside. Secure with tape if it is loose.
//! 1. Slide the fan into the fan duct.
//! 1. Slide the fan duct into the printed recepacle.
module back_assembly() pose([ 228.60, 0.00, 24.30 ])
assembly("back") {
translate(pms5003_pos)
explode(-50)
rotate([90, 0, 0])
pms5003();
explode(-20, explode_children = true)
translate(fan_pos) {
explode(-20)
fan(fan);
translate_z(-fan_depth(fan) / 2)
stl_colour(pp4_colour)
render()
fan_duct_stl();
}
translate_z(height + top_thickness + base_thickness + eps) vflip()
stl_colour(show_box ? pp1_colour : pp2_colour) render() enviro_plus_case_base_stl();
}
//! * Solder the fan wires to the veroboard assembly
//!
//! ![FanWires](docs/fan_connection.jpg)
//!
//! * Slide the back assembly into the case and secure with four M2 x 6mm cap screws and washers.
module main_assembly() pose([170, 335, 0], exploded = false) pose([ 42.20, 0.00, 159.60 ], exploded = true)
assembly("main") {
RPI_case_assembly();
explode(20, explode_children = true) {
pbox_base_screws(box);
back_assembly();
}
}
if($preview) {
if(assembly == "main")
main_assembly();
else if(assembly == "case")
case_assembly();
else if(assembly == "back")
back_assembly();
else if(assembly == "RPI")
RPI_assembly();
else if(assembly == "RPI_case")
RPI_case_assembly();
else if(assembly == "enviro_case")
enviro_case_assembly();
}
else {
gap = 5;
enviro_plus_case_stl();
translate([0, -depth - gap])
enviro_plus_case_base_stl();
translate([0, -2 * (depth + gap)])
bulkhead_stl();
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

File diff suppressed because it is too large Load Diff

View File

@@ -108,7 +108,7 @@ Axial components for PCBs.
| Module | Description |
|:--- |:--- |
| `ax_res(type, value, tol = 5, pitch = 0)` | Through hole axial resistor. If `pitch` is zero the minimum is used. If below the minimum the resistor is placed vertical. |
| `wire_link(d, l, h = 1, tail = 3)` | Draw a wire jumper link. |
| `wire_link(d, l, h = 1, tail = 3)` | Draw a wire jumper link. If `l` is zero then a vertical wire is drawn. |
![axials](tests/png/axials.png)
@@ -123,6 +123,7 @@ Axial components for PCBs.
| 1 | `ax_res(res1_2, 8200)` | Resistor 8200 Ohms 5% 0.5W |
| 1 | `ax_res(res1_2, 8250, tol = 1)` | Resistor 8250 Ohms 1% 0.5W |
| 1 | `wire_link(0.8, 10.16)` | Wire link 0.8mm x 0.4" |
| 1 | `wire_link(0.8, 0, h = 5)` | Wire link 0.8mm x 8mm |
<a href="#top">Top</a>
@@ -2441,6 +2442,8 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
| 1 | `smd_resistor(RES0603, 1K)` | SMD resistor 0603 1K 0.1W |
| 1 | `smd_resistor(RES0805, 1K)` | SMD resistor 0805 1K 0.125W |
| 1 | `smd_resistor(RES1206, 1K)` | SMD resistor 1206 1K 0.25W |
| 1 | `smd_sot(SOT223)` | SOT223 package LM117 |
| 1 | `smd_sot(SOT23)` | SOT23 package 2N7000 |
| 1 | `square_button(button_4p5mm)` | Square button 4.5mm |
| 1 | `square_button(button_6mm)` | Square button 6mm |
| 1 | `pcb(TMC2130)` | TMC2130 |
@@ -2457,6 +2460,7 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
| 2 | `vero_pin()` | Vero board pin |
| 1 | `wire_link(0.8, 5.08, h = 10.16)` | Wire link 0.8mm x 0.2" |
| 1 | `wire_link(0.8, 10.16)` | Wire link 0.8mm x 0.4" |
| 1 | `wire_link(0.8, 0, h = 5)` | Wire link 0.8mm x 8mm |
<a href="#top">Top</a>
@@ -3634,6 +3638,13 @@ Surface mount components for PCBs.
| `smd_res_end_cap(type)` | End cap width |
| `smd_res_power(type)` | Power rating in Watts |
| `smd_res_size(type)` | Body length, width and height |
| `smd_sot_lead_pitch(type)` | Lead pitch |
| `smd_sot_lead_size(type)` | Lead width, foot depth, lead thickness |
| `smd_sot_lead_span(type)` | Total span of leads |
| `smd_sot_lead_z(type)` | Top of lead frame from top |
| `smd_sot_size(type)` | Body length, width and height |
| `smd_sot_tab_width(type)` | The wide lead at the top |
| `smd_sot_z(type)` | Height above PCB surface |
### Functions
| Function | Description |
@@ -3645,9 +3656,10 @@ Surface mount components for PCBs.
### Modules
| Module | Description |
|:--- |:--- |
| `smd_capacitor(type, height)` | Draw an SMD capacitor with specified height |
| `smd_capacitor(type, height, value = undef)` | Draw an SMD capacitor with specified height |
| `smd_led(type, colour, cutout)` | Draw an SMD LED with specified `colour` |
| `smd_resistor(type, value)` | Draw an SMD resistor with specified value |
| `smd_sot(type, value)` | Draw an SMD transistor |
![smds](tests/png/smds.png)
@@ -3662,6 +3674,8 @@ Surface mount components for PCBs.
| 1 | `smd_resistor(RES0603, 1R0)` | SMD resistor 0603 1R0 0.1W |
| 1 | `smd_resistor(RES0805, 10M)` | SMD resistor 0805 10M 0.125W |
| 1 | `smd_resistor(RES1206, 100K)` | SMD resistor 1206 100K 0.25W |
| 1 | `smd_sot(SOT223)` | SOT223 package FZT851 |
| 1 | `smd_sot(SOT23)` | SOT23 package 2N7000 |
<a href="#top">Top</a>
@@ -4227,6 +4241,7 @@ Veroboard with mounting holes, track breaks, removed tracks, solder points and c
### Functions
| Function | Description |
|:--- |:--- |
| `vero(name, assembly, holes, strips, pitch = inch(0.1)` | Constructor |
| `vero_length(type)` | Length of the board |
| `vero_size(type)` | Board size |
| `vero_thickness(type)` | Thickness of the substrate |
@@ -4237,6 +4252,7 @@ Veroboard with mounting holes, track breaks, removed tracks, solder points and c
### Modules
| Module | Description |
|:--- |:--- |
| `solder_meniscus(type, ir = 0.3, r = undef)` | Draw a solder meniscus |
| `vero_cutouts(type, angle = undef)` | Make cutouts to clear components |
| `vero_grid_pos(type, x, y)` | Convert grid position to offset from the centre |
| `vero_mounting_hole_positions(type)` | Positions children at the mounting holes |

View File

@@ -59,7 +59,7 @@ test_pcb = ["test_pcb", "Test PCB",
[ [3, 3], [3, -3], [-3, 3], [-3, -3] ],
// components
[
[ 20, -5, 180, "trimpot10"],
[ 20, -5, 180, "trimpot10"],
[ 20, -15, 90, "trimpot10", true],
[ 10, 2, 90, "smd_led", LED0805, "red"],
[ 13, 2, 90, "smd_led", LED0603, "orange"],
@@ -69,6 +69,8 @@ test_pcb = ["test_pcb", "Test PCB",
[ 25, 2, 90, "smd_cap", CAP1206, 1.5],
[ 28, 2, 90, "smd_cap", CAP0805, 1.0],
[ 31, 2, 90, "smd_cap", CAP0603, 0.7],
[ 16, 6, -90, "smd_sot", SOT23, "2N7000"],
[ 28, 20, -90, "smd_sot", SOT223, "LM117"],
[ 10, 10, 0, "2p54header", 4, 1],
[ 25, 10, 0, "2p54header", 5, 1, false, "blue" ],
@@ -99,6 +101,7 @@ test_pcb = ["test_pcb", "Test PCB",
[ 65, 22, 0, "ax_res", res1_2, 100000],
[ 55, 22, 0, "vero_pin"],
[ 55, 17, 0, "vero_pin", true],
[ 55, 9, 0, "link", 0, 5],
[ 80, 9, 0, "link", inch(0.2), inch(0.4)],
[ 80, 12, 0, "ax_res", res1_8, 1000000, 1, inch(0.1)],

View File

@@ -33,6 +33,11 @@ module smds() {
layout([for(c = smd_capacitors) smd_cap_size(c).x], 1)
let(c = smd_capacitors[$i])
smd_capacitor(c, smd_cap_size(c).y * 0.8);
translate([0, 12])
layout([for(s = smd_sots) smd_sot_size(s).x], 1)
let(s = smd_sots[$i])
smd_sot(s, ["2N7000", "FZT851"][$i]);
}
if($preview)

View File

@@ -28,6 +28,9 @@ module axials() {
rotate(90)
wire_link(0.8, inch(0.4));
pcb_grid(pcb, 0, 7)
wire_link(0.8, 0, 5);
for(i = [0 : len(ax_resistors) - 1]) {
pcb_grid(pcb, 2 * i + 2, 1 + [0, 0.5, 1.5][i])
rotate(90)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 276 KiB

After

Width:  |  Height:  |  Size: 276 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 180 KiB

After

Width:  |  Height:  |  Size: 182 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 88 KiB

After

Width:  |  Height:  |  Size: 113 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 149 KiB

After

Width:  |  Height:  |  Size: 150 KiB

View File

@@ -23,27 +23,31 @@
include <../utils/core/core.scad>
include <../utils/round.scad>
module wire_link(d, l, h = 1, tail = 3) { //! Draw a wire jumper link.
vitamin(str("wire_link(", d, ", ", l, arg(h, 1, "h"), arg(tail, 3, "tail"), "): Wire link ", d, "mm x ", l / inch(1), "\""));
module wire_link(d, l, h = 1, tail = 3) { //! Draw a wire jumper link. If `l` is zero then a vertical wire is drawn.
vitamin(str("wire_link(", d, ", ", l, arg(h, 1, "h"), arg(tail, 3, "tail"), "): Wire link ", d, "mm x ", l ? str(l / inch(1), "\"") : str(h + tail,"mm")));
r = d;
$fn = 32;
color("silver") {
for(side = [-1, 1]) {
translate([side * l / 2, 0, -tail])
cylinder(d = d, h = tail + h - r);
color("silver")
if(l) {
for(side = [-1, 1]) {
translate([side * l / 2, 0, -tail])
cylinder(d = d, h = tail + h - r);
translate([side * (l / 2 - r), 0, h - r])
rotate([90, 0, side * 90 - 90])
rotate_extrude(angle = 90)
translate([r, 0])
circle(d = d);
translate([side * (l / 2 - r), 0, h - r])
rotate([90, 0, side * 90 - 90])
rotate_extrude(angle = 90)
translate([r, 0])
circle(d = d);
}
translate_z(h)
rotate([0, 90, 0])
cylinder(d = d, h = l - 2 * r, center = true);
}
translate_z(h)
rotate([0, 90, 0])
cylinder(d = d, h = l - 2 * r, center = true);
}
else
translate_z(-tail)
cylinder(d = d, h = tail + h);
}
function ax_res_wattage(type) = type[1]; //! Power rating

View File

@@ -1032,7 +1032,7 @@ module block(size, colour, makes_cutout, cutouts) //! Draw a coloured cube to re
module pcb_component(comp, cutouts = false, angle = undef) { //! Draw pcb component from description
function show(comp, part) = (comp[3] == part || comp[3] == str("-",part)) && (!cutouts || angle == undef || angle == comp.z);
function param(n, default = 0) = len(comp) > n ? comp[n] : default;
function param(n, default = 0) = len(comp) > n && !is_undef(comp[n]) ? comp[n] : default;
rotate(comp.z) {
// Components that have a cutout parameter go in this section
if(show(comp, "2p54header")) let($show_plugs = show_plugs && param(9, true))
@@ -1087,7 +1087,8 @@ module pcb_component(comp, cutouts = false, angle = undef) { //! Draw pcb compon
if(show(comp, "potentiometer")) let(pot = param(4, BTT_encoder)) translate_z(pot_size(pot).z) vflip() potentiometer(pot, shaft_length = param(5, undef));
if(show(comp, "buzzer")) buzzer(param(4, 9), param(5, 12), param(6, grey(20)));
if(show(comp, "smd_res")) smd_resistor(comp[4], comp[5]);
if(show(comp, "smd_cap")) smd_capacitor(comp[4], comp[5]);
if(show(comp, "smd_cap")) smd_capacitor(comp[4], comp[5], param(6, undef));
if(show(comp, "smd_sot")) smd_sot(comp[4], comp[5]);
if(show(comp, "vero_pin")) vero_pin(param(4, false));
if(show(comp, "terminal")) terminal_block(comp[5], comp[4]);
}

View File

@@ -23,6 +23,7 @@
include <../utils/core/core.scad>
use <../utils/tube.scad>
use <../utils/sweep.scad>
function smd_led_size(type) = type[1]; //! Body length, width and height
function smd_led_lens(type) = type[2]; //! Lens length width and height
@@ -104,7 +105,7 @@ module smd_resistor(type, value) { //! Draw an SMD resistor with specified value
cube([cap, size.y - 2 * eps, size.z], center = true);
color("white")
translate([0, 0, size.z])
translate_z(size.z)
linear_extrude(eps)
resize([(size.x - 2 * cap) * 0.75, size.y / 2])
text(value, halign = "center", valign = "center");
@@ -113,9 +114,9 @@ module smd_resistor(type, value) { //! Draw an SMD resistor with specified value
function smd_cap_size(type) = type[1]; //! Body length, width
function smd_cap_end_cap(type) = type[2]; //! End cap width
module smd_capacitor(type, height) { //! Draw an SMD capacitor with specified height
module smd_capacitor(type, height, value = undef) { //! Draw an SMD capacitor with specified height
size = smd_cap_size(type);
vitamin(str("smd_capacitor(", type[0], "): SMD capacitor ", smd_size(size)));
vitamin(str("smd_capacitor(", type[0], "): SMD capacitor ", smd_size(size), !is_undef(value) ? str(" ", value) : ""));
cap = smd_cap_end_cap(type);
@@ -129,3 +130,51 @@ module smd_capacitor(type, height) { //! Draw an SMD capacitor with specified he
translate([end * (size.x / 2 - cap / 2), 0, height / 2])
cube([cap, size.y - 2 * eps, height], center = true);
}
function smd_sot_size(type) = type[1]; //! Body length, width and height
function smd_sot_z(type) = type[2]; //! Height above PCB surface
function smd_sot_lead_z(type) = type[3]; //! Top of lead frame from top
function smd_sot_lead_pitch(type) = type[4]; //! Lead pitch
function smd_sot_lead_span(type) = type[5]; //! Total span of leads
function smd_sot_lead_size(type) = type[6]; //! Lead width, foot depth, lead thickness
function smd_sot_tab_width(type) = type[7]; //! The wide lead at the top
module smd_sot(type, value) { //! Draw an SMD transistor
vitamin(str("smd_sot(", type[0], "): ", type[0], " package ", value));
size = smd_sot_size(type);
z0 = smd_sot_z(type);
z2 = z0 + size.z;
z1 = z2 - smd_sot_lead_z(type);
slant = 7; //! 7 degree body draft angle
pitch = smd_sot_lead_pitch(type);
span = smd_sot_lead_span(type);
leads = floor(size.x / pitch) + 1;
ls = smd_sot_lead_size(type);
r = ls.z;
gullwing = rounded_path([[0, 0, ls.z / 2], [0, ls.y - ls.z, ls.z / 2], r, [0, ls.y -ls.z + z1 - ls.z, z1 - ls.z / 2], r, [0, span / 2, z1 - ls.z / 2]]);
color(grey(20))
hull()
for(z = [z0, z1, z2], inset = abs(z - z1) * tan(slant))
translate_z(z)
cube([size.x - 2 * inset, size.y - 2 * inset, eps], center = true);
color(silver) {
for(i = [0 : leads - 1])
translate([i * pitch - size.x / 2 + (size.x - (leads - 1) * pitch) / 2, -span / 2])
sweep(gullwing, rectangle_points(ls.x, ls.z));
rotate(180)
translate([0, -span / 2])
sweep(gullwing, rectangle_points(smd_sot_tab_width(type), ls.z));
}
color("white")
translate_z(z0 + size.z)
linear_extrude(eps)
resize([size.x - 4 * (z2 - z1) * tan(slant), size.y / 2])
text(value, halign = "center", valign = "center");
}

View File

@@ -38,4 +38,9 @@ CAP1206 = ["CAP1206", [3.1, 1.6], 0.5];
smd_capacitors = [CAP0603, CAP0805, CAP1206];
SOT23 = ["SOT23", [3, 1.4, 1.0], 0.05, 0.66, 1.9, 2.6, [0.4, 0.45, 0.15], 0.4];
SOT223 = ["SOT223", [6.5, 3.5, 1.6], 0.05, 0.89, 2.3, 7.0, [0.7, 0.95, 0.25], 3];
smd_sots = [SOT23, SOT223];
use <smd.scad>

View File

@@ -41,19 +41,22 @@ function vero_track_width(type) = vero_pitch(type) * 0.8; //! The width of th
function vero_length(type) = vero_holes(type) * vero_pitch(type); //! Length of the board
function vero_width(type) = vero_strips(type) * vero_pitch(type); //! Width of the board
function vero(name, assembly, holes, strips, pitch = inch(0.1), fr4 = false, screw = M3_cap_screw, mounting_holes = [], breaks = [], no_tracks = [], components = [], joints = []) = //! Constructor
[ name, assembly, holes, strips, pitch, fr4, screw, mounting_holes, breaks, no_tracks, components, joints ];
function vero_size(type) = [vero_length(type), vero_width(type), vero_thickness(type)]; //! Board size
module solder_meniscus(type) {
h = 1;
r = vero_track_width(type) / 2;
module solder_meniscus(type, ir = 0.3, r = undef) { //! Draw a solder meniscus
h = 0.7;
r = is_undef(r) ? vero_track_width(type) / 2 : r;
translate_z(vero_track_thickness(type))
color("silver") rotate_extrude()
difference() {
square([r, h]);
translate([r - eps, h + eps])
ellipse(r , h);
translate([r + eps, h + eps])
ellipse(r - ir , h, $fn = 64);
}
}