Compare commits
20 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
cc82cf2a6c | ||
|
61fc194995 | ||
|
f8af61568a | ||
|
05d16841c4 | ||
|
61f1dcc509 | ||
|
5fc70e19ac | ||
|
07e7eb77f7 | ||
|
1c5d9a8ef5 | ||
|
d3f0bfc17f | ||
|
81f3b084ab | ||
|
62bd2b5597 | ||
|
18cd33c663 | ||
|
e899306a13 | ||
|
ebfb330ac6 | ||
|
07da7d8dc7 | ||
|
38b52d13ee | ||
|
5a3bbf967d | ||
|
ddb2f16b99 | ||
|
c5fab08a45 | ||
|
fecc93746a |
41
CHANGELOG.md
@@ -3,6 +3,45 @@
|
||||
This changelog is generated by `changelog.py` using manually added semantic version tags to classify commits as breaking changes, additions or fixes.
|
||||
|
||||
|
||||
### [v21.1.0](https://github.com/nophead/NopSCADlib/releases/tag/v21.1.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v21.0.1...v21.1.0 "diff with v21.0.1")
|
||||
* 2023-03-11 [`18cd33c`](https://github.com/nophead/NopSCADlib/commit/18cd33c66388d4d4e7be664c0f883cff0854524b "show commit") [C.](# "Chris") Fixed typos, corrected vitamin call, added boilerplate, updated images and readme.
|
||||
|
||||
* 2023-03-11 [`ebfb330`](https://github.com/nophead/NopSCADlib/commit/ebfb330ac69f4e90de84ecffea94ce067d041031 "show commit") [D.K.](# "Dirkjan Krijnders") Added comments and make holes a `linear_extrude` result
|
||||
|
||||
* 2023-03-08 [`c5fab08`](https://github.com/nophead/NopSCADlib/commit/c5fab08a454383b295be2b151fd715ee79b85db3 "show commit") [D.K.](# "Dirkjan Krijnders") Added `photo_interrupter` to the test
|
||||
|
||||
* 2023-03-08 [`fecc937`](https://github.com/nophead/NopSCADlib/commit/fecc93746ab80ad1fc74f0fe3465de92ffee7b36 "show commit") [D.K.](# "Dirkjan Krijnders") Added vitamins for photo interrupters
|
||||
|
||||
#### [v21.0.1](https://github.com/nophead/NopSCADlib/releases/tag/v21.0.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v21.0.0...v21.0.1 "diff with v21.0.0")
|
||||
* 2023-03-11 [`07da7d8`](https://github.com/nophead/NopSCADlib/commit/07da7d8dc7d3fb769e57a6b9ca86465357007b6c "show commit") [C.](# "Chris") Removed `Python2.7` from `usage.md` as no longer works.
|
||||
|
||||
* 2023-03-10 [`5a3bbf9`](https://github.com/nophead/NopSCADlib/commit/5a3bbf967dc967eca4726af517382e7eb875dde1 "show commit") [C.](# "Chris") Fixed broken cover image.
|
||||
|
||||
## [v21.0.0](https://github.com/nophead/NopSCADlib/releases/tag/v21.0.0 "show release") Breaking Changes [...](https://github.com/nophead/NopSCADlib/compare/v20.24.0...v21.0.0 "diff with v20.24.0")
|
||||
* 2023-03-10 [`9d4d5ab`](https://github.com/nophead/NopSCADlib/commit/9d4d5aba17974e7b5911e723d48d7b9403a4bcb4 "show commit") [C.](# "Chris") `veroboard_assembly()` renamed `veroboard_fastened_assembly()`.
|
||||
`veroboard_assembly()` now doesn't include the fasteners.
|
||||
|
||||
### [v20.24.0](https://github.com/nophead/NopSCADlib/releases/tag/v20.24.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v20.23.0...v20.24.0 "diff with v20.23.0")
|
||||
* 2023-03-10 [`d939401`](https://github.com/nophead/NopSCADlib/commit/d939401183d12af3452e17aa5b020dab50f8edb0 "show commit") [C.](# "Chris") Added `vero_grid_pos()` function.
|
||||
|
||||
* 2023-03-10 [`584542f`](https://github.com/nophead/NopSCADlib/commit/584542f87a27efe06ff3ba597dbaff1f3c32c4fd "show commit") [C.](# "Chris") Added fastons.
|
||||
|
||||
* 2023-03-10 [`62372a0`](https://github.com/nophead/NopSCADlib/commit/62372a049b9ac7a0fecebfd3618df91ff6ffa87a "show commit") [C.](# "Chris") The `wire()` module can now draw wires if a path is specified.
|
||||
|
||||
* 2023-03-10 [`14698e5`](https://github.com/nophead/NopSCADlib/commit/14698e5203e1e860230ddb3729816730e221f49c "show commit") [C.](# "Chris") Added PTFE heatshrink sleeving.
|
||||
|
||||
* 2023-03-10 [`14f6bb5`](https://github.com/nophead/NopSCADlib/commit/14f6bb533a3dcc1d36b2b764906cdca7d8d24484 "show commit") [C.](# "Chris") Added `sleeving_length` to `al_clad_resistor_assembly()`.
|
||||
|
||||
* 2023-03-10 [`01e9aae`](https://github.com/nophead/NopSCADlib/commit/01e9aae698f57bac6046d1a04aaa11b0c88006b5 "show commit") [C.](# "Chris") Added `TO220_size()` and `TO220_lead_pos(i,` l).
|
||||
|
||||
* 2023-02-04 [`27f9b24`](https://github.com/nophead/NopSCADlib/commit/27f9b242f250c0083344a05527055bb2fbb56f91 "show commit") [C.P.](# "Chris Palmer") Added crystal, transistors, diode and LEDs to Arduino Uno.
|
||||
|
||||
* 2023-02-03 [`f07fda7`](https://github.com/nophead/NopSCADlib/commit/f07fda70cdfc743cd2462636fcc1eb13a092f9e4 "show commit") [C.P.](# "Chris Palmer") Wire links can now be sleeved.
|
||||
|
||||
* 2023-02-01 [`abf1f1a`](https://github.com/nophead/NopSCADlib/commit/abf1f1ab3f3eddc2f274df649e8481a4117901eb "show commit") [C.P.](# "Chris Palmer") PCB blocks can now have rounded edges for more realistic cans.
|
||||
|
||||
* 2023-02-01 [`df06d1f`](https://github.com/nophead/NopSCADlib/commit/df06d1f57fff64cd6da20684f8371da204f69a82 "show commit") [C.P.](# "Chris Palmer") Updated changelog.
|
||||
|
||||
### [v20.23.0](https://github.com/nophead/NopSCADlib/releases/tag/v20.23.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v20.22.0...v20.23.0 "diff with v20.22.0")
|
||||
* 2023-02-01 [`470d6d6`](https://github.com/nophead/NopSCADlib/commit/470d6d6216b1cef8ce6cafd4b14300edb62eac4a "show commit") [C.P.](# "Chris Palmer") Started radial components with crystals.
|
||||
|
||||
@@ -44,7 +83,7 @@ This changelog is generated by `changelog.py` using manually added semantic vers
|
||||
* 2023-01-24 [`77e948f`](https://github.com/nophead/NopSCADlib/commit/77e948f43c911442211bcbf6d1b1520184d2c70b "show commit") [C.P.](# "Chris Palmer") Added can bus connectors to OpenGrab model.
|
||||
Tweaked some PCB component positions.
|
||||
|
||||
* 2023-01-24 [`543cdb4`](https://github.com/nophead/NopSCADlib/commit/543cdb4e01d38308a06d4368ebabadb85c696567 "show commit") [C.P.](# "Chris Palmer") Incresed the clearance of holes made for pin header.
|
||||
* 2023-01-24 [`543cdb4`](https://github.com/nophead/NopSCADlib/commit/543cdb4e01d38308a06d4368ebabadb85c696567 "show commit") [C.P.](# "Chris Palmer") Increased the clearance of holes made for pin header.
|
||||
|
||||
### [v20.19.0](https://github.com/nophead/NopSCADlib/releases/tag/v20.19.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v20.18.1...v20.19.0 "diff with v20.18.1")
|
||||
* 2023-01-12 [`ebd50ba`](https://github.com/nophead/NopSCADlib/commit/ebd50bae535283b94b310ee74c9b98b2e3b7f8be "show commit") [C.P.](# "Chris Palmer") Added SMD diodes, inductors and potentiometers.
|
||||
|
@@ -2,7 +2,7 @@
|
||||
|
||||
## Requirements
|
||||
1. OpenSCAD 2021.01 or later, download it from here: https://www.openscad.org/downloads.html
|
||||
1. Python 2.7+ or 3.6+ from https://www.python.org/downloads/
|
||||
1. Python 3.6+ from https://www.python.org/downloads/
|
||||
1. ImageMagick 7 www.imagemagick.org
|
||||
|
||||
These are all cross platform tools so NopSCADlib should work on any platform that supports them, although it has currently only been tested on Win7.
|
||||
|
2
lib.scad
@@ -49,6 +49,7 @@ include <vitamins/magnets.scad>
|
||||
include <vitamins/mains_sockets.scad>
|
||||
include <vitamins/modules.scad>
|
||||
include <vitamins/panel_meters.scad>
|
||||
include <vitamins/photo_interrupters.scad>
|
||||
include <vitamins/pillars.scad>
|
||||
include <vitamins/pillow_blocks.scad>
|
||||
include <vitamins/pin_headers.scad>
|
||||
@@ -100,3 +101,4 @@ use <utils/round.scad>
|
||||
use <utils/offset.scad>
|
||||
use <utils/sector.scad>
|
||||
use <utils/thread.scad>
|
||||
use <vitamins/photo_interrupter.scad>
|
BIN
libtest.png
Before Width: | Height: | Size: 0 B After Width: | Height: | Size: 970 KiB |
16
libtest.scad
@@ -85,6 +85,7 @@ use <tests/o_ring.scad>
|
||||
use <tests/opengrab.scad>
|
||||
use <tests/panel_meters.scad>
|
||||
use <tests/PCBs.scad>
|
||||
use <tests/photo_interrupters.scad>
|
||||
use <tests/pillars.scad>
|
||||
use <tests/pillow_blocks.scad>
|
||||
use <tests/potentiometers.scad>
|
||||
@@ -224,7 +225,7 @@ inserts_y = 0;
|
||||
nuts_y = inserts_y + 20;
|
||||
washers_y = nuts_y + 120;
|
||||
screws_y = washers_y + 120;
|
||||
circlips_y = screws_y + 160;
|
||||
circlips_y = screws_y + 180;
|
||||
springs_y = circlips_y + 20;
|
||||
o_rings_y = springs_y;
|
||||
sealing_strip_y = springs_y + 20;
|
||||
@@ -401,21 +402,21 @@ extrusions_y = panel_meters_y + 80;
|
||||
translate([x3, veroboard_y])
|
||||
veroboard_test();
|
||||
|
||||
translate([x3 + 60, veroboard_y + 20])
|
||||
translate([x3 + 50, veroboard_y + 20])
|
||||
geared_steppers();
|
||||
|
||||
translate([x3 + 160, ssrs_y])
|
||||
pcb_mounts();
|
||||
|
||||
translate([x3 + 170, veroboard_y + 16])
|
||||
translate([x3 + 145, veroboard_y + 16])
|
||||
cameras();
|
||||
|
||||
translate([x3 + 145, d_connectors_y - 10])
|
||||
camera_housings();
|
||||
|
||||
translate([x3, d_connectors_y])
|
||||
d_connectors();
|
||||
|
||||
translate([x3 + 170, d_connectors_y - 10])
|
||||
camera_housings();
|
||||
|
||||
translate([x3, iecs_y])
|
||||
iecs();
|
||||
|
||||
@@ -428,6 +429,9 @@ translate([x3 + 60, modules_y])
|
||||
translate([x3 + 90, modules_y])
|
||||
modules();
|
||||
|
||||
translate([x3 + 150, modules_y])
|
||||
photo_interrupters();
|
||||
|
||||
translate([x3, ssrs_y]) {
|
||||
ssrs();
|
||||
|
||||
|
106
readme.md
@@ -42,12 +42,12 @@ A list of changes classified as breaking, additions or fixes is maintained in [C
|
||||
<tr><td> <a href = "#Extrusion_brackets">Extrusion_brackets</a> </td><td> <a href = "#PCBs">PCBs</a> </td><td> <a href = "#Terminals">Terminals</a> </td><td> <a href = "#PSU_shroud">PSU_shroud</a> </td><td> <a href = "#Sweep">Sweep</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Extrusions">Extrusions</a> </td><td> <a href = "#PSUs">PSUs</a> </td><td> <a href = "#Toggles">Toggles</a> </td><td> <a href = "#Pocket_handle">Pocket_handle</a> </td><td> <a href = "#Thread">Thread</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Fans">Fans</a> </td><td> <a href = "#Panel_meters">Panel_meters</a> </td><td> <a href = "#Transformers">Transformers</a> </td><td> <a href = "#Press_fit">Press_fit</a> </td><td> <a href = "#Tube">Tube</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Fastons">Fastons</a> </td><td> <a href = "#Pillars">Pillars</a> </td><td> <a href = "#Tubings">Tubings</a> </td><td> <a href = "#Printed_box">Printed_box</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Fuseholder">Fuseholder</a> </td><td> <a href = "#Pillow_blocks">Pillow_blocks</a> </td><td> <a href = "#Variacs">Variacs</a> </td><td> <a href = "#Printed_pulleys">Printed_pulleys</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Geared_steppers">Geared_steppers</a> </td><td> <a href = "#Pin_headers">Pin_headers</a> </td><td> <a href = "#Veroboard">Veroboard</a> </td><td> <a href = "#Ribbon_clamp">Ribbon_clamp</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Green_terminals">Green_terminals</a> </td><td> <a href = "#Potentiometers">Potentiometers</a> </td><td> <a href = "#Washers">Washers</a> </td><td> <a href = "#SSR_shroud">SSR_shroud</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Hot_ends">Hot_ends</a> </td><td> <a href = "#Pulleys">Pulleys</a> </td><td> <a href = "#Wire">Wire</a> </td><td> <a href = "#Screw_knob">Screw_knob</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Hygrometer">Hygrometer</a> </td><td></td><td> <a href = "#Zipties">Zipties</a> </td><td> <a href = "#Socket_box">Socket_box</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Fastons">Fastons</a> </td><td> <a href = "#Photo_interrupters">Photo_interrupters</a> </td><td> <a href = "#Tubings">Tubings</a> </td><td> <a href = "#Printed_box">Printed_box</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Fuseholder">Fuseholder</a> </td><td> <a href = "#Pillars">Pillars</a> </td><td> <a href = "#Variacs">Variacs</a> </td><td> <a href = "#Printed_pulleys">Printed_pulleys</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Geared_steppers">Geared_steppers</a> </td><td> <a href = "#Pillow_blocks">Pillow_blocks</a> </td><td> <a href = "#Veroboard">Veroboard</a> </td><td> <a href = "#Ribbon_clamp">Ribbon_clamp</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Green_terminals">Green_terminals</a> </td><td> <a href = "#Pin_headers">Pin_headers</a> </td><td> <a href = "#Washers">Washers</a> </td><td> <a href = "#SSR_shroud">SSR_shroud</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Hot_ends">Hot_ends</a> </td><td> <a href = "#Potentiometers">Potentiometers</a> </td><td> <a href = "#Wire">Wire</a> </td><td> <a href = "#Screw_knob">Screw_knob</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Hygrometer">Hygrometer</a> </td><td> <a href = "#Pulleys">Pulleys</a> </td><td> <a href = "#Zipties">Zipties</a> </td><td> <a href = "#Socket_box">Socket_box</a> </td><td></td><td></td></tr>
|
||||
<tr><td></td><td></td><td></td><td> <a href = "#Strap_handle">Strap_handle</a> </td><td></td><td></td></tr>
|
||||
</table>
|
||||
|
||||
@@ -828,7 +828,7 @@ Various electronic components used in hot ends and heated beds.
|
||||
| `panel_USBA()` | Draw a panel mount USBA connector |
|
||||
| `panel_USBA_hole_positions()` | Place children at hole positions |
|
||||
| `panel_USBA_holes(h = 100)` | Make holes for USBA connector |
|
||||
| `resistor(type)` | Draw specified type of resitor |
|
||||
| `resistor(type)` | Draw specified type of resistor |
|
||||
| `sleeved_resistor(type, sleeving, bare = 5, heatshrink = false)` | Draw a resistor with sleeved leads and option heatshrink |
|
||||
| `thermal_cutout(type)` | Draw specified thermal cutout |
|
||||
| `thermal_cutout_hole_positions(type)` | Place children at hole positions |
|
||||
@@ -2526,12 +2526,19 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
||||
| 1 | `smd_led(LED0603, orange)` | SMD LED 0603 orange |
|
||||
| 1 | `smd_led(LED0805, red)` | SMD LED 0805 red |
|
||||
| 1 | `smd_led(LED1206, blue)` | SMD LED 1306 blue |
|
||||
| 1 | `smd_tant(TANT_A)` | SMD Tantalum capacitor package A ,1uF, 2.5V |
|
||||
| 1 | `smd_tant(TANT_B)` | SMD Tantalum capacitor package B ,10uF, 10V |
|
||||
| 1 | `smd_tant(TANT_C)` | SMD Tantalum capacitor package C ,100uF, 16V |
|
||||
| 1 | `smd_capacitor(CAP0402)` | SMD capacitor 0402 10nF |
|
||||
| 1 | `smd_capacitor(CAP0502)` | SMD capacitor 0502 10nF |
|
||||
| 1 | `smd_capacitor(CAP0603)` | SMD capacitor 0603 10nF |
|
||||
| 1 | `smd_capacitor(CAP0805)` | SMD capacitor 0805 100nF |
|
||||
| 1 | `smd_capacitor(CAP1206)` | SMD capacitor 1206 1uF |
|
||||
| 1 | `smd_resistor(RES0603, 1K)` | SMD resistor 0603 1K 0.1W |
|
||||
| 1 | `smd_resistor(RES0402, 1)` | SMD resistor 0402 1 0.0625W |
|
||||
| 1 | `smd_resistor(RES0502, 10)` | SMD resistor 0502 10 0.05W |
|
||||
| 1 | `smd_resistor(RES0603, 100)` | SMD resistor 0603 100 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_resistor(RES1206, 1M)` | SMD resistor 1206 1M 0.25W |
|
||||
| 1 | `smd_soic(SOIC14)` | SOIC14 package 74HC00 |
|
||||
| 1 | `smd_soic(SOIC16)` | SOIC16 package ICL323 |
|
||||
| 1 | `smd_soic(SOIC18)` | SOIC18 package PIC18F88 |
|
||||
@@ -2754,6 +2761,49 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
||||
| 4 | pcb_spacer4090.stl |
|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
|
||||
---
|
||||
<a name="Photo_interrupters"></a>
|
||||
## Photo_interrupters
|
||||
Photo interrupter modules popular in robot kits and from China.
|
||||
|
||||
[vitamins/photo_interrupters.scad](vitamins/photo_interrupters.scad) Object definitions.
|
||||
|
||||
[vitamins/photo_interrupter.scad](vitamins/photo_interrupter.scad) Implementation.
|
||||
|
||||
[tests/photo_interrupters.scad](tests/photo_interrupters.scad) Code for this example.
|
||||
|
||||
### Properties
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| `pi_base_height(type)` | Height of the base |
|
||||
| `pi_base_length(type)` | Length of the base |
|
||||
| `pi_base_width(type)` | Width of the base |
|
||||
| `pi_color(type)` | Color of photo interrupter |
|
||||
| `pi_gap_height(type)` | Height of the gap where the light can be interrupted |
|
||||
| `pi_gap_width(type)` | Width of the gap |
|
||||
| `pi_hole_diameter(type)` | Diameter of the mounting holes |
|
||||
| `pi_pcb(type)` | Parameter for the support PCB, created with pi_pcb |
|
||||
| `pi_stem_width(type)` | Width of the stems |
|
||||
|
||||
### Modules
|
||||
| Module | Description |
|
||||
|:--- |:--- |
|
||||
| `photo_interrupter(type)` | Draw the photo interrupter, with PCB |
|
||||
| `pi_cutout(type)` | Shape to subtract for fitting a photo interrupter |
|
||||
| `pi_hole_locations(type)` | Locations of photo interrupter mounting holes |
|
||||
| `pi_pcb(type)` | Draw the support PCB |
|
||||
| `pi_pcb_hole_locations(pcb)` | Locations of the PCB holes |
|
||||
|
||||

|
||||
|
||||
### Vitamins
|
||||
| Qty | Module call | BOM entry |
|
||||
| ---:|:--- |:---|
|
||||
| 1 | `photo_interrupter(PH1)` | PH1 Photo interrupter |
|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
|
||||
---
|
||||
@@ -3434,6 +3484,7 @@ For an explanation of `screw_polysink()` see <https://hydraraptor.blogspot.com/2
|
||||
| `screw_radius(type)` | Nominal radius |
|
||||
| `screw_socket_af(type)` | Socket across flats |
|
||||
| `screw_socket_depth(type)` | Socket or slot depth |
|
||||
| `screw_thread_diameter(type)` | Thread diameter, if different from nominal diamter |
|
||||
| `screw_washer(type)` | Default washer |
|
||||
|
||||
### Functions
|
||||
@@ -3476,12 +3527,14 @@ For an explanation of `screw_polysink()` see <https://hydraraptor.blogspot.com/2
|
||||
| 1 | `screw(M3_hex_screw, 10)` | Screw M3 hex x 10mm |
|
||||
| 1 | `screw(M3_low_cap_screw, 10)` | Screw M3 low cap x 10mm |
|
||||
| 1 | `screw(M3_pan_screw, 10)` | Screw M3 pan x 10mm |
|
||||
| 1 | `screw(M3_shoulder_screw, 12)` | Screw M3 shoulder x 12mm |
|
||||
| 1 | `screw(M4_cap_screw, 25)` | Screw M4 cap x 25mm |
|
||||
| 1 | `screw(M4_cs_cap_screw, 25)` | Screw M4 cs cap x 25mm |
|
||||
| 1 | `screw(M4_dome_screw, 25)` | Screw M4 dome x 25mm |
|
||||
| 1 | `screw(M4_grub_screw, 8)` | Screw M4 grub x 8mm |
|
||||
| 1 | `screw(M4_hex_screw, 30)` | Screw M4 hex x 30mm |
|
||||
| 1 | `screw(M4_pan_screw, 30)` | Screw M4 pan x 30mm |
|
||||
| 1 | `screw(M4_shoulder_screw, 16)` | Screw M4 shoulder x 16mm |
|
||||
| 1 | `screw(M5_cap_screw, 30)` | Screw M5 cap x 30mm |
|
||||
| 1 | `screw(M5_cs_cap_screw, 30)` | Screw M5 cs cap x 30mm |
|
||||
| 1 | `screw(M5_dome_screw, 30)` | Screw M5 dome x 30mm |
|
||||
@@ -3769,6 +3822,21 @@ SK shaft support brackets
|
||||
## SMDs
|
||||
Surface mount components for PCBs.
|
||||
|
||||
Note that the value string for tantalum capacitors is the the capacitance in pico farads expressed as two digits plus an exponent plus a single letter voltage code.
|
||||
E.g. 475A is 4.7uF 10V on the parts list.
|
||||
|
||||
| Code | Voltage |
|
||||
| ---- | ------- |
|
||||
| e | 2.5 |
|
||||
| G | 4 |
|
||||
| J | 6.3 |
|
||||
| A | 10 |
|
||||
| C | 16 |
|
||||
| D | 20 |
|
||||
| E | 25 |
|
||||
| V | 35 |
|
||||
| H | 50 |
|
||||
|
||||
[vitamins/smds.scad](vitamins/smds.scad) Object definitions.
|
||||
|
||||
[vitamins/smd.scad](vitamins/smd.scad) Implementation.
|
||||
@@ -3780,6 +3848,7 @@ Surface mount components for PCBs.
|
||||
|:--- |:--- |
|
||||
| `smd_cap_end_cap(type)` | End cap width |
|
||||
| `smd_cap_size(type)` | Body length, width |
|
||||
| `smd_diode_colour(type)` | Body colour |
|
||||
| `smd_diode_lead_z(type)` | Top of lead frame from top |
|
||||
| `smd_diode_leads(type)` | Lead extent in x, width, thickness and gap |
|
||||
| `smd_diode_size(type)` | Body length, width and height |
|
||||
@@ -3812,6 +3881,11 @@ Surface mount components for PCBs.
|
||||
| `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 |
|
||||
| `smd_tant_colours(type)` | Colours of body and stripe |
|
||||
| `smd_tant_lead_z(type)` | Top of lead frame from top |
|
||||
| `smd_tant_leads(type)` | Lead extent in x, width, thickness and gap |
|
||||
| `smd_tant_size(type)` | Body length, width and height |
|
||||
| `smd_tant_z(type)` | Height above PCB surface |
|
||||
|
||||
### Functions
|
||||
| Function | Description |
|
||||
@@ -3831,6 +3905,7 @@ Surface mount components for PCBs.
|
||||
| `smd_resistor(type, value)` | Draw an SMD resistor with specified value |
|
||||
| `smd_soic(type, value)` | Draw an SMD SOIC |
|
||||
| `smd_sot(type, value)` | Draw an SMD transistor |
|
||||
| `smd_tant(type, value)` | Draw an SMD tantalum capacitor |
|
||||
|
||||

|
||||
|
||||
@@ -3842,10 +3917,17 @@ Surface mount components for PCBs.
|
||||
| 1 | `smd_led(LED0603, green)` | SMD LED 0603 green |
|
||||
| 1 | `smd_led(LED0805, blue)` | SMD LED 0805 blue |
|
||||
| 1 | `smd_led(LED1206, red)` | SMD LED 1306 red |
|
||||
| 1 | `smd_tant(TANT_A)` | SMD Tantalum capacitor package A ,1uF, 2.5V |
|
||||
| 1 | `smd_tant(TANT_B)` | SMD Tantalum capacitor package B ,10uF, 6.3V |
|
||||
| 1 | `smd_tant(TANT_C)` | SMD Tantalum capacitor package C ,100uF, 10V |
|
||||
| 1 | `smd_capacitor(CAP0402)` | SMD capacitor 0402 |
|
||||
| 1 | `smd_capacitor(CAP0502)` | SMD capacitor 0502 |
|
||||
| 1 | `smd_capacitor(CAP0603)` | SMD capacitor 0603 |
|
||||
| 1 | `smd_capacitor(CAP0805)` | SMD capacitor 0805 |
|
||||
| 1 | `smd_capacitor(CAP1206)` | SMD capacitor 1206 |
|
||||
| 1 | `smd_resistor(RES0603, 1R0)` | SMD resistor 0603 1R0 0.1W |
|
||||
| 1 | `smd_resistor(RES0402, 1R0)` | SMD resistor 0402 1R0 0.0625W |
|
||||
| 1 | `smd_resistor(RES0502, 10)` | SMD resistor 0502 10 0.05W |
|
||||
| 1 | `smd_resistor(RES0603, 100)` | SMD resistor 0603 100 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_soic(SOIC14)` | SOIC14 package SOIC14 |
|
||||
@@ -6707,7 +6789,6 @@ Maths utilities for manipulating vectors and matrices.
|
||||
| `argcoth(x)` | inverse hyperbolic cotangent |
|
||||
| `argsinh(x)` | inverse hyperbolic sine |
|
||||
| `argtanh(x)` | inverse hyperbolic tangent |
|
||||
| `augment(m)` | Augment a matrix by adding an identity matrix to the right |
|
||||
| `circle_intersect(c1, r1, c2, r2)` | Calculate one point where two circles in the X-Z plane intersect, clockwise around c1 |
|
||||
| `cosh(x)` | hyperbolic cosine |
|
||||
| `coth(x)` | hyperbolic cotangent |
|
||||
@@ -6727,11 +6808,8 @@ Maths utilities for manipulating vectors and matrices.
|
||||
| `rot2_z(a)` | Generate a 2x2 matrix to rotate around z |
|
||||
| `rot3_z(a)` | Generate a 3x3 matrix to rotate around z |
|
||||
| `rotate(a, v)` | Generate a 4x4 rotation matrix, `a` can be a vector of three angles or a single angle around `z`, or around axis `v` |
|
||||
| `rowswap(m, i, j)` | Swap two rows of a matrix |
|
||||
| `scale(v)` | Generate a 4x4 matrix that scales by `v`, which can be a vector of xyz factors or a scalar to scale all axes equally |
|
||||
| `sinh(x)` | hyperbolic sine |
|
||||
| `solve(m, i = 0, j = 0)` | Solve each row ensuring diagonal is not zero |
|
||||
| `solve_row(m, i)` | Make diagonal one by dividing the row by it and subtract from other rows to make column zero |
|
||||
| `sqr(x)` | Square x |
|
||||
| `sumv(v)` | sum a vector of values that can be added with "+" |
|
||||
| `tanh(x)` | hyperbolic tangent |
|
||||
|
@@ -62,19 +62,26 @@ test_pcb = ["test_pcb", "Test PCB",
|
||||
[
|
||||
[ 20, -5, 180, "trimpot10"],
|
||||
[ 20, -15, 90, "trimpot10", true],
|
||||
[ 7, 2, 90, "smd_led", LED1206, "blue"],
|
||||
[ 10, 2, 90, "smd_led", LED0805, "red"],
|
||||
[ 19, 2, 90, "smd_led", LED1206, "blue"],
|
||||
[ 16, 2, 90, "smd_led", LED0805, "red"],
|
||||
[ 13, 2, 90, "smd_led", LED0603, "orange"],
|
||||
[ 16, 2, 90, "smd_res", RES1206, "1K"],
|
||||
[ 19, 2, 90, "smd_res", RES0805, "1K"],
|
||||
[ 22, 2, 90, "smd_res", RES0603, "1K"],
|
||||
[ 25, 2, 90, "smd_cap", CAP1206, 1.5, "1uF"],
|
||||
[ 28, 2, 90, "smd_cap", CAP0805, 1.0, "100nF"],
|
||||
[ 31, 2, 90, "smd_cap", CAP0603, 0.7, "10nF"],
|
||||
[ 34, 3, 90, "smd_diode",DO241AC, "SS34"],
|
||||
[ 21, 6, -90, "smd_pot", TC33X1, "10K"],
|
||||
[ 16, 6, -90, "smd_sot", SOT23, "2N7000"],
|
||||
[ 28, 8, -90, "smd_sot", SOT223, "LM117"],
|
||||
[ 19, 6, -90, "smd_res", RES1206, "1M"],
|
||||
[ 16, 6, -90, "smd_res", RES0805, "1K"],
|
||||
[ 13, 6, -90, "smd_res", RES0603, "100"],
|
||||
[ 10, 6, -90, "smd_res", RES0502, "10"],
|
||||
[ 7, 6, -90, "smd_res", RES0402, "1"],
|
||||
[ 19, 10, 90, "smd_cap", CAP1206, 1.5, "1uF"],
|
||||
[ 16, 10, 90, "smd_cap", CAP0805, 1.0, "100nF"],
|
||||
[ 13, 10, 90, "smd_cap", CAP0603, 0.7, "10nF"],
|
||||
[ 10, 10, 90, "smd_cap", CAP0502, 0.6, "10nF"],
|
||||
[ 7, 10, 90, "smd_cap", CAP0402, 0.5, "10nF"],
|
||||
[ 19, 16, -90, "smd_tant", TANT_C, "107C"],
|
||||
[ 13, 16, -90, "smd_tant", TANT_B, "106A"],
|
||||
[ 7, 16, -90, "smd_tant", TANT_A, "105e"],
|
||||
[ 32, 3, -90, "smd_diode",DO241AC, "SS34"],
|
||||
[ 26, 2, -90, "smd_pot", TC33X1, "10K"],
|
||||
[ 28, 6, -90, "smd_sot", SOT23, "2N7000"],
|
||||
[ 28, 12, -90, "smd_sot", SOT223, "LM117"],
|
||||
|
||||
[ 45, 35, 0, "2p54header", 4, 1],
|
||||
[ 60, 35, 0, "2p54header", 5, 1, false, "blue" ],
|
||||
|
@@ -23,7 +23,7 @@ include <../vitamins/smds.scad>
|
||||
|
||||
module smds() {
|
||||
layout([for(r = smd_resistors) smd_res_size(r).x], 1)
|
||||
smd_resistor(smd_resistors[$i], ["1R0", "10M", "100K"][$i % 3]);
|
||||
smd_resistor(smd_resistors[$i], ["1R0", "10", "100", "10M", "100K"][$i % 5]);
|
||||
|
||||
translate([0, 3])
|
||||
layout([for(l = smd_leds) smd_led_size(l).x], 1)
|
||||
@@ -35,27 +35,32 @@ module smds() {
|
||||
smd_capacitor(c, smd_cap_size(c).y * 0.8);
|
||||
|
||||
translate([0, 9])
|
||||
layout([for(d = smd_diodes) smd_diode_size(d).x], 1)
|
||||
layout([for(t = smd_tants) smd_tant_leads(t).x], 1)
|
||||
let(t = smd_tants[$i])
|
||||
smd_tant(t, ["105e","106J", "107A"][$i]);
|
||||
|
||||
translate([0, 12.5])
|
||||
layout([for(d = smd_diodes) smd_diode_leads(d).x], 1)
|
||||
let(d = smd_diodes[$i])
|
||||
smd_diode(d, ["SS34"][$i]);
|
||||
|
||||
translate([0, 15])
|
||||
translate([0, 24])
|
||||
layout([for(s = smd_sots) smd_sot_size(s).x], 1)
|
||||
let(s = smd_sots[$i])
|
||||
smd_sot(s, ["2N7000", "FZT851"][$i]);
|
||||
|
||||
translate([0, 21])
|
||||
translate([0, 18])
|
||||
layout([for(p = smd_pots) smd_pot_size(p).x], 1)
|
||||
let(p = smd_pots[$i])
|
||||
smd_pot(p, "10K");
|
||||
|
||||
translate([0, 28])
|
||||
translate([0, 31])
|
||||
layout([for(s = smd_soics) smd_soic_size(s).x], 1)
|
||||
let(s = smd_soics[$i])
|
||||
smd_soic(s, s[0]);
|
||||
|
||||
translate([0, 36])
|
||||
layout([for(i = smd_inductors) smd_inductor_size(i).x], 1)
|
||||
translate([0, 39])
|
||||
layout([for(i = smd_inductors) smd_inductor_leads(i).x], 1)
|
||||
let(i = smd_inductors[$i])
|
||||
smd_inductor(i, "4R7");
|
||||
}
|
||||
|
28
tests/photo_interrupters.scad
Normal file
@@ -0,0 +1,28 @@
|
||||
//
|
||||
// NopSCADlib Copyright Chris Palmer 2023
|
||||
// nop.head@gmail.com
|
||||
// hydraraptor.blogspot.com
|
||||
//
|
||||
// This file is part of NopSCADlib.
|
||||
//
|
||||
// NopSCADlib is free software: you can redistribute it and/or modify it under the terms of the
|
||||
// GNU General Public License as published by the Free Software Foundation, either version 3 of
|
||||
// the License, or (at your option) any later version.
|
||||
//
|
||||
// NopSCADlib is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
||||
// without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
// See the GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
||||
// If not, see <https://www.gnu.org/licenses/>.
|
||||
//
|
||||
include <../utils/core/core.scad>
|
||||
include <../vitamins/photo_interrupters.scad>
|
||||
|
||||
use <../utils/layout.scad>
|
||||
|
||||
module photo_interrupters()
|
||||
layout([for(l = photo_interrupters) pi_base_length(l)], 5, true)
|
||||
photo_interrupter(photo_interrupters[$i]);
|
||||
|
||||
photo_interrupters();
|
Before Width: | Height: | Size: 185 KiB After Width: | Height: | Size: 190 KiB |
BIN
tests/png/photo_interrupters.png
Normal file
After Width: | Height: | Size: 50 KiB |
Before Width: | Height: | Size: 176 KiB After Width: | Height: | Size: 162 KiB |
Before Width: | Height: | Size: 169 KiB After Width: | Height: | Size: 180 KiB |
@@ -56,7 +56,7 @@ module screws() {
|
||||
screw(screw, length);
|
||||
}
|
||||
}
|
||||
translate([20, 40, -15])
|
||||
translate([20, 60, -15])
|
||||
polysink_stl();
|
||||
}
|
||||
|
||||
|
@@ -118,24 +118,24 @@ module position_children(list, t) //! Position children if they are on the Z = 0
|
||||
|
||||
// Matrix inversion: https://www.mathsisfun.com/algebra/matrix-inverse-row-operations-gauss-jordan.html
|
||||
|
||||
function augment(m) = let(l = len(m), n = identity(l)) [ //! Augment a matrix by adding an identity matrix to the right
|
||||
function augment(m) = let(l = len(m), n = identity(l)) [ // Augment a matrix by adding an identity matrix to the right
|
||||
for(i = [0 : l - 1])
|
||||
concat(m[i], n[i])
|
||||
];
|
||||
|
||||
function rowswap(m, i, j) = [ //! Swap two rows of a matrix
|
||||
function rowswap(m, i, j) = [ // Swap two rows of a matrix
|
||||
for(k = [0 : len(m) - 1])
|
||||
k == i ? m[j] : k == j ? m[i] : m[k]
|
||||
];
|
||||
|
||||
function solve_row(m, i) = let(diag = m[i][i]) [ //! Make diagonal one by dividing the row by it and subtract from other rows to make column zero
|
||||
function solve_row(m, i) = let(diag = m[i][i]) [ // Make diagonal one by dividing the row by it and subtract from other rows to make column zero
|
||||
for(j = [0 : len(m) - 1])
|
||||
i == j ? m[j] / diag : m[j] - m[i] * m[j][i] / diag
|
||||
];
|
||||
|
||||
function nearly_zero(x) = abs(x) < 1e-5; //! True if x is close to zero
|
||||
|
||||
function solve(m, i = 0, j = 0) = //! Solve each row ensuring diagonal is not zero
|
||||
function solve(m, i = 0, j = 0) = // Solve each row ensuring diagonal is not zero
|
||||
i < len(m) ?
|
||||
assert(i + j < len(m), "matrix is singular")
|
||||
solve(!nearly_zero(m[i + j][i]) ? solve_row(j ? rowswap(m, i, i + j) : m, i) : solve(m, i, j + 1), i + 1)
|
||||
|
@@ -41,7 +41,7 @@ function resistor_sleeved(type) = type[9]; //! Are the leads sleeved
|
||||
|
||||
splay_angle = 2; // radial lead splay angle
|
||||
|
||||
module resistor(type) { //! Draw specified type of resitor
|
||||
module resistor(type) { //! Draw specified type of resistor
|
||||
length = resistor_length(type);
|
||||
dia = resistor_diameter(type);
|
||||
|
||||
|
@@ -1146,6 +1146,7 @@ module pcb_component(comp, cutouts = false, angle = undef) { //! Draw pcb compon
|
||||
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], param(6, undef));
|
||||
if(show(comp, "smd_tant")) smd_tant(comp[4], param(5, undef));
|
||||
if(show(comp, "smd_sot")) smd_sot(comp[4], comp[5]);
|
||||
if(show(comp, "smd_soic")) smd_soic(comp[4], comp[5]);
|
||||
if(show(comp, "smd_diode")) smd_diode(comp[4], comp[5]);
|
||||
|
103
vitamins/photo_interrupter.scad
Normal file
@@ -0,0 +1,103 @@
|
||||
//
|
||||
// NopSCADlib Copyright Chris Palmer 2023
|
||||
// nop.head@gmail.com
|
||||
// hydraraptor.blogspot.com
|
||||
//
|
||||
// This file is part of NopSCADlib.
|
||||
//
|
||||
// NopSCADlib is free software: you can redistribute it and/or modify it under the terms of the
|
||||
// GNU General Public License as published by the Free Software Foundation, either version 3 of
|
||||
// the License, or (at your option) any later version.
|
||||
//
|
||||
// NopSCADlib is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
||||
// without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
// See the GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
||||
// If not, see <https://www.gnu.org/licenses/>.
|
||||
//
|
||||
|
||||
//
|
||||
//! Photo interrupter modules popular in robot kits and from China.
|
||||
//
|
||||
include <../utils/core/core.scad>
|
||||
include <../utils/rounded_polygon.scad>
|
||||
|
||||
function pi_base_width(type) = type[1]; //! Width of the base
|
||||
function pi_base_length(type) = type[2]; //! Length of the base
|
||||
function pi_base_height(type) = type[3]; //! Height of the base
|
||||
function pi_gap_height(type) = type[4]; //! Height of the gap where the light can be interrupted
|
||||
function pi_gap_width(type) = type[6]; //! Width of the gap
|
||||
function pi_stem_width(type) = type[5]; //! Width of the stems
|
||||
function pi_hole_diameter(type) = type[7]; //! Diameter of the mounting holes
|
||||
function pi_color(type) = type[8]; //! Color of photo interrupter
|
||||
function pi_pcb(type) = type[9]; //! Parameter for the support PCB, created with pi_pcb
|
||||
|
||||
module pi_hole_locations(type) { //! Locations of photo interrupter mounting holes
|
||||
translate([0, -(pi_base_length(type) - pi_base_width(type)) / 2, 0])
|
||||
children();
|
||||
translate([0, (pi_base_length(type) - pi_base_width(type)) / 2, 0])
|
||||
children();
|
||||
}
|
||||
|
||||
module pi_pcb_hole_locations(pcb) { //! Locations of the PCB holes
|
||||
for (xy = pcb[7]) {
|
||||
translate([xy[0], xy[1], 0])
|
||||
children();
|
||||
}
|
||||
}
|
||||
|
||||
module pi_pcb(type) { //! Draw the support PCB
|
||||
pcb = pi_pcb(type);
|
||||
color(pcb[6]) {
|
||||
translate([0, 0, -pcb[2]]) {
|
||||
linear_extrude(pcb[2]) {
|
||||
difference() {
|
||||
rounded_polygon([[0, -(pi_base_length(type) - pi_base_width(type)) / 2, -pi_base_width(type) / 2],
|
||||
[pi_base_width(type) / 2, -pcb[1]/2, eps],
|
||||
[pcb[0]+1, -pcb[1]/2, eps],
|
||||
[pcb[0]+1, pcb[1]/2, eps],
|
||||
[pi_base_width(type) / 2, pcb[1]/2, eps],
|
||||
[0, (pi_base_length(type) - pi_base_width(type)) / 2, -pi_base_width(type) / 2]
|
||||
]);
|
||||
pi_pcb_hole_locations(pcb)
|
||||
circle(d = pcb[8]);
|
||||
pi_hole_locations(type)
|
||||
circle(d=pi_hole_diameter(type));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module photo_interrupter(type) { //! Draw the photo interrupter, with PCB
|
||||
vitamin(str("photo_interrupter(", type[0], "): ", type[0], " Photo interrupter"));
|
||||
color(pi_color(type)) {
|
||||
linear_extrude(pi_base_height(type)) {
|
||||
difference() {
|
||||
hull() {
|
||||
pi_hole_locations(type)
|
||||
circle(d = pi_base_width(type));
|
||||
}
|
||||
pi_hole_locations(type)
|
||||
circle(d = pi_hole_diameter(type));
|
||||
}
|
||||
}
|
||||
translate([-pi_base_width(type)/2, -(pi_gap_width(type)/2 + pi_stem_width(type)), 0])
|
||||
cube([pi_base_width(type), pi_stem_width(type), pi_gap_height(type) + pi_base_height(type)]);
|
||||
translate([-pi_base_width(type)/2, pi_gap_width(type)/2, 0])
|
||||
cube([pi_base_width(type), pi_stem_width(type), pi_gap_height(type) + pi_base_height(type)]);
|
||||
}
|
||||
pi_pcb(type);
|
||||
}
|
||||
|
||||
module pi_cutout(type) { //! Shape to subtract for fitting a photo interrupter
|
||||
hull() {
|
||||
pi_hole_locations(type)
|
||||
cylinder(h = pi_base_height(type), d = pi_base_width(type));
|
||||
}
|
||||
translate([-pi_base_width(type)/2, -(pi_gap_width(type)/2 + pi_stem_width(type)), 0])
|
||||
cube([pi_base_width(type), pi_stem_width(type), pi_gap_height(type) + pi_base_height(type)]);
|
||||
translate([-pi_base_width(type)/2, pi_gap_width(type)/2, 0])
|
||||
cube([pi_base_width(type), pi_stem_width(type), pi_gap_height(type) + pi_base_height(type)]);
|
||||
};
|
23
vitamins/photo_interrupters.scad
Normal file
@@ -0,0 +1,23 @@
|
||||
//
|
||||
// NopSCADlib Copyright Chris Palmer 2023
|
||||
// nop.head@gmail.com
|
||||
// hydraraptor.blogspot.com
|
||||
//
|
||||
// This file is part of NopSCADlib.
|
||||
//
|
||||
// NopSCADlib is free software: you can redistribute it and/or modify it under the terms of the
|
||||
// GNU General Public License as published by the Free Software Foundation, either version 3 of
|
||||
// the License, or (at your option) any later version.
|
||||
//
|
||||
// NopSCADlib is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
||||
// without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
// See the GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
||||
// If not, see <https://www.gnu.org/licenses/>.
|
||||
//
|
||||
PH1 = ["PH1", 6.4, 25.9 , 3.5, 8.6, 4.1, 5.9, 3, grey(20), [22, 20, 1.6, true, 11-3.2, 0, "blue",[[8.3, -7.5], [8.3, 7.5]], 3]];
|
||||
|
||||
photo_interrupters = [PH1];
|
||||
|
||||
use <photo_interrupter.scad>
|
@@ -41,6 +41,7 @@ function screw_washer(type) = type[9]; //! Default washer
|
||||
function screw_nut(type) = type[10]; //! Default nut
|
||||
function screw_pilot_hole(type) = type[11]; //! Pilot hole radius for wood screws, tap radius for machine screws
|
||||
function screw_clearance_radius(type) = type[12]; //! Clearance hole radius
|
||||
function screw_thread_diameter(type) = type[13]; //! Thread diameter, if different from nominal diamter
|
||||
function screw_nut_radius(type) = screw_nut(type) ? nut_radius(screw_nut(type)) : 0; //! Radius of matching nut
|
||||
function screw_boss_diameter(type) = max(washer_diameter(screw_washer(type)) + 1, 2 * (screw_nut_radius(type) + 3 * extrusion_width)); //! Boss big enough for nut trap and washer
|
||||
function screw_head_depth(type, d = 0) = //! How far a counter sink head will go into a straight hole diameter d
|
||||
@@ -87,47 +88,50 @@ module screw(type, length, hob_point = 0, nylon = false) { //! Draw specified sc
|
||||
vitamin(str("screw(", type[0], "_screw, ", length, arg(hob_point, 0, "hob_point"), arg(nylon, false, "nylon"), "): ", description));
|
||||
|
||||
head_type = screw_head_type(type);
|
||||
rad = screw_radius(type) - eps;
|
||||
shaft_rad = screw_radius(type) - eps;
|
||||
head_rad = screw_head_radius(type);
|
||||
head_height = screw_head_height(type);
|
||||
socket_af = screw_socket_af(type);
|
||||
socket_depth= screw_socket_depth(type);
|
||||
socket_rad = socket_af / cos(30) / 2;
|
||||
max_thread = screw_max_thread(type);
|
||||
has_shoulder = !is_undef(screw_thread_diameter(type));
|
||||
thread_rad = has_shoulder ? screw_thread_diameter(type) / 2 : screw_radius(type);
|
||||
thread = max_thread ? length >= max_thread + 5 ? max_thread
|
||||
: length
|
||||
: length;
|
||||
d = 2 * screw_radius(type);
|
||||
pitch = metric_coarse_pitch(d);
|
||||
thread_offset = has_shoulder ? thread : 0;
|
||||
thread_d = 2 * thread_rad;
|
||||
pitch = metric_coarse_pitch(thread_d);
|
||||
colour = nylon || head_type == hs_grub ? grey(40) : grey(80);
|
||||
|
||||
module shaft(socket = 0, headless = false) {
|
||||
point = screw_nut(type) ? 0 : 3 * rad;
|
||||
shank = length - thread - socket;
|
||||
point = screw_nut(type) ? 0 : 3 * shaft_rad;
|
||||
shank = length - socket - (has_shoulder ? 0 : thread);
|
||||
|
||||
if(show_threads && !point && pitch)
|
||||
translate_z(-length)
|
||||
male_metric_thread(d, pitch, thread - (shank > 0 || headless ? 0 : socket), false, top = headless ? -1 : 0, solid = !headless, colour = colour);
|
||||
translate_z(-length - thread_offset)
|
||||
male_metric_thread(thread_d, pitch, thread - (shank > 0 || headless ? 0 : socket), false, top = headless ? -1 : 0, solid = !headless, colour = colour);
|
||||
else
|
||||
color(colour * 0.9)
|
||||
rotate_extrude() {
|
||||
translate([0, -length + point])
|
||||
square([rad, length - socket - point]);
|
||||
translate([0, -length + point - thread_offset])
|
||||
square([thread_rad - eps, length - socket - point]);
|
||||
|
||||
if(point)
|
||||
polygon([
|
||||
[0.4, -length], [0, point - length], [rad, point - length]
|
||||
[0.4, -length], [0, point - length], [shaft_rad, point - length]
|
||||
]);
|
||||
}
|
||||
|
||||
if(shank > 0)
|
||||
color(colour)
|
||||
translate_z(-shank - socket)
|
||||
cylinder(r = rad + eps, h = shank);
|
||||
cylinder(r = shaft_rad + eps, h = shank);
|
||||
}
|
||||
|
||||
module cs_head(socket_rad, socket_depth) {
|
||||
head_t = rad / 5;
|
||||
head_t = shaft_rad / 5;
|
||||
head_height = head_rad + head_t;
|
||||
|
||||
color(colour) {
|
||||
@@ -173,7 +177,7 @@ module screw(type, length, hob_point = 0, nylon = false) { //! Draw specified sc
|
||||
}
|
||||
if(head_type == hs_grub) {
|
||||
color(colour) {
|
||||
r = show_threads ? rad - pitch / 2 : rad;
|
||||
r = show_threads ? shaft_rad - pitch / 2 : shaft_rad;
|
||||
translate_z(-socket_depth)
|
||||
linear_extrude(socket_depth)
|
||||
difference() {
|
||||
|
@@ -103,6 +103,9 @@ M8_hex_screw = ["M8_hex", "M8 hex", hs_hex, 8, 15, 5.65, 0, 0
|
||||
|
||||
M3_low_cap_screw = ["M3_low_cap", "M3 low cap", hs_cap, 3, 5.5, 2, 1.5, 2.0, 18, M3_washer, M3_nut, M3_tap_radius, M3_clearance_radius];
|
||||
|
||||
M3_shoulder_screw= ["M3_shoulder", "M3 shoulder",hs_cap, 4, 7.0, 2.4, 1.5, 3.0, 6, M4_washer, M3_nut, M3_tap_radius, 2, 3];
|
||||
M4_shoulder_screw= ["M4_shoulder", "M4 shoulder",hs_cap, 5, 9.0, 2.4, 1.5, 3.0, 8, M5_washer, M4_nut, M4_tap_radius, 2.5, 4];
|
||||
|
||||
M3_grub_screw = ["M3_grub", "M3 grub", hs_grub, 3, 0, 0, 2.5, 1.5, 0, M3_washer, M3_nut, M3_tap_radius, M3_clearance_radius];
|
||||
M4_grub_screw = ["M4_grub", "M4 grub", hs_grub, 4, 0, 0, 2.4, 2.0, 0, M4_washer, M4_nut, M4_tap_radius, M4_clearance_radius];
|
||||
M5_grub_screw = ["M5_grub", "M5 grub", hs_grub, 5, 0, 0, 2.4, 2.5, 0, M5_washer, M5_nut, M5_tap_radius, M5_clearance_radius];
|
||||
@@ -117,6 +120,7 @@ No8_screw = ["No8", "No8 pan wood", hs_pan, 4.2, 8.2, 3.05, 0, 0
|
||||
screw_lists = [
|
||||
[ M2_cap_screw, M2p5_cap_screw, M3_cap_screw, M4_cap_screw, M5_cap_screw, M6_cap_screw, M8_cap_screw],
|
||||
[ 0, 0, M3_low_cap_screw],
|
||||
[ 0, 0, M3_shoulder_screw, M4_shoulder_screw],
|
||||
[ M2_cs_cap_screw, 0, M3_cs_cap_screw, M4_cs_cap_screw, M5_cs_cap_screw, M6_cs_cap_screw, M8_cs_cap_screw],
|
||||
[ M2_dome_screw, M2p5_dome_screw,M3_dome_screw, M4_dome_screw, M5_dome_screw],
|
||||
[ 0, 0, M3_hex_screw, M4_hex_screw, M5_hex_screw, M6_hex_screw, M8_hex_screw],
|
||||
|
@@ -19,6 +19,21 @@
|
||||
|
||||
//
|
||||
//! Surface mount components for PCBs.
|
||||
//!
|
||||
//! Note that the value string for tantalum capacitors is the the capacitance in pico farads expressed as two digits plus an exponent plus a single letter voltage code.
|
||||
//! E.g. 475A is 4.7uF 10V on the parts list.
|
||||
//!
|
||||
//! | Code | Voltage |
|
||||
//! | ---- | ------- |
|
||||
//! | e | 2.5 |
|
||||
//! | G | 4 |
|
||||
//! | J | 6.3 |
|
||||
//! | A | 10 |
|
||||
//! | C | 16 |
|
||||
//! | D | 20 |
|
||||
//! | E | 25 |
|
||||
//! | V | 35 |
|
||||
//! | H | 50 |
|
||||
//
|
||||
include <../utils/core/core.scad>
|
||||
|
||||
@@ -234,6 +249,7 @@ function smd_diode_size(type) = type[1]; //! Body length, width and height
|
||||
function smd_diode_z(type) = type[2]; //! Height above PCB surface
|
||||
function smd_diode_lead_z(type) = type[3]; //! Top of lead frame from top
|
||||
function smd_diode_leads(type) = type[4]; //! Lead extent in x, width, thickness and gap
|
||||
function smd_diode_colour(type) = type[5]; //! Body colour
|
||||
|
||||
module smd_diode(type, value) { //! Draw an SMD diode
|
||||
vitamin(str("smd_diode(", type[0], "): ", type[0], " package ", value));
|
||||
@@ -248,7 +264,7 @@ module smd_diode(type, value) { //! Draw an SMD diode
|
||||
gap = leads[3];
|
||||
gap2 = gap - leads.z * 2;
|
||||
|
||||
color(grey(20))
|
||||
color(smd_diode_colour(type))
|
||||
difference() {
|
||||
hull()
|
||||
for(z = [z0, z1, z2], inset = abs(z - z1) * tan(slant))
|
||||
@@ -287,6 +303,75 @@ module smd_diode(type, value) { //! Draw an SMD diode
|
||||
|
||||
}
|
||||
|
||||
function smd_tant_size(type) = type[1]; //! Body length, width and height
|
||||
function smd_tant_z(type) = type[2]; //! Height above PCB surface
|
||||
function smd_tant_lead_z(type) = type[3]; //! Top of lead frame from top
|
||||
function smd_tant_leads(type) = type[4]; //! Lead extent in x, width, thickness and gap
|
||||
function smd_tant_colours(type)= type[5]; //! Colours of body and stripe
|
||||
|
||||
module smd_tant(type, value) { //! Draw an SMD tantalum capacitor
|
||||
function dig(c) = let(x = ord(c) - ord("0")) assert(x >= 0 && x <= 9, "expected value in the form 475A for 4.7uF 10V") x;
|
||||
uF = is_undef(value) ? "" : str(" ,", (dig(value[0]) * 10 + dig(value[1])) * 10 ^ dig(value[2]) / 10^6, "uF");
|
||||
codes = "eGJACDEVH";
|
||||
voltages = [2.5, 4, 6.3, 10, 16, 20, 25, 35, 50];
|
||||
volts = is_undef(value) ? "" : let(c = value[3])
|
||||
assert(in(codes, c), str("expected the 4th character of value to be a voltage code: ", codes, ", got ", c))
|
||||
str(", ", voltages[search(c, codes)[0]], "V");
|
||||
vitamin(str("smd_tant(", type[0], "): SMD Tantalum capacitor package ", type[0][len(type[0]) -1], uF, volts));
|
||||
|
||||
size = smd_tant_size(type);
|
||||
slant = 5; //! 5 degree body draft angle
|
||||
z0 = smd_tant_z(type);
|
||||
z2 = z0 + size.z;
|
||||
z1 = z2 - smd_tant_lead_z(type);
|
||||
stripe = size.x / 5;
|
||||
leads = smd_tant_leads(type);
|
||||
gap = leads[3];
|
||||
gap2 = gap - leads.z * 2;
|
||||
colours = smd_tant_colours(type);
|
||||
inset = (z2 - z1) * tan(slant);
|
||||
|
||||
color(colours[0])
|
||||
difference() {
|
||||
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);
|
||||
|
||||
for(side = [-1, 1])
|
||||
translate([side * (size.x / 2 - (size.x - gap2) / 4), 0, eps])
|
||||
cube([(size.x - gap2) / 2, size.y, 3 * leads.z], center = true);
|
||||
}
|
||||
|
||||
color("white") {
|
||||
w = 0.9 * (size.x - stripe - inset);
|
||||
translate([-size.x / 2 + inset + stripe + w / 2, 0, z2])
|
||||
linear_extrude(eps)
|
||||
resize([w, size.y / 2])
|
||||
text(value, halign = "center", valign = "center");
|
||||
}
|
||||
|
||||
color(colours[1]) {
|
||||
translate([-size.x / 2 + stripe * 0.2, -size.y / 2 + inset, z2])
|
||||
cube([(stripe - inset) * 0.8, size.y - 2 * inset, eps]);
|
||||
}
|
||||
|
||||
color(silver)
|
||||
translate_z(z1 / 2)
|
||||
rotate([90, 0, 0])
|
||||
linear_extrude(leads.y, center = true, convexity = 3) let($fn = 32)
|
||||
difference() {
|
||||
rounded_square([leads.x, z1], 2 * leads.z);
|
||||
|
||||
rounded_square([leads.x - 2 * leads.z, z1 - 2 * leads.z], leads.z);
|
||||
|
||||
translate([0, - z1 / 2])
|
||||
square([gap, leads.z * 2 + eps], center = true);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
function smd_inductor_size(type) = type[1]; //! Body length, width and height
|
||||
function smd_inductor_z(type) = type[2]; //! Height above PCB surface
|
||||
function smd_inductor_lead_z(type) = type[3]; //! Top of lead frame from top
|
||||
|
@@ -27,34 +27,44 @@ LED1206 = ["LED1206", [3.2, 1.6, 0.5], [2.0, 1.6, .6]];
|
||||
|
||||
smd_leds = [LED0603, LED0805, LED1206];
|
||||
|
||||
RES0402 = ["RES0402", [1.0, 0.5, 0.35], 0.2, 1/16];
|
||||
RES0502 = ["RES0502", [1.3, 0.6, 0.38], 0.2, 1/20];
|
||||
RES0603 = ["RES0603", [1.6, 0.8, 0.45], 0.3, 1/10];
|
||||
RES0805 = ["RES0805", [2.0, 1.2, 0.45], 0.4, 1/8];
|
||||
RES1206 = ["RES1206", [3.1, 1.6, 0.6], 0.5, 1/4];
|
||||
|
||||
smd_resistors = [RES0603, RES0805, RES1206];
|
||||
smd_resistors = [RES0402, RES0502, RES0603, RES0805, RES1206];
|
||||
|
||||
CAP0402 = ["CAP0402", [1.0, 0.5], 0.2];
|
||||
CAP0502 = ["CAP0502", [1.3, 0.6], 0.2];
|
||||
CAP0603 = ["CAP0603", [1.6, 0.8], 0.3];
|
||||
CAP0805 = ["CAP0805", [2.0, 1.2], 0.4];
|
||||
CAP1206 = ["CAP1206", [3.1, 1.6], 0.5];
|
||||
|
||||
smd_capacitors = [CAP0603, CAP0805, CAP1206];
|
||||
smd_capacitors = [CAP0402, CAP0502, 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];
|
||||
|
||||
SOIC8 = ["SOIC8", [4.90, 3.90, 1.25], 0.10, 0.66, 1.27, 6.00, [0.31, .50, 0.20]];
|
||||
SOIC14 = ["SOIC14", [8.70, 3.90, 1.25], 0.10, 0.66, 1.27, 6.00, [0.31, .50, 0.20]];
|
||||
SOIC16 = ["SOIC16", [9.90, 3.90, 1.25], 0.10, 0.66, 1.27, 6.00, [0.31, .50, 0.20]];
|
||||
SOIC8 = ["SOIC8", [4.90, 3.90, 1.25], 0.10, 0.66, 1.27, 6.00, [0.31, .50, 0.20]];
|
||||
SOIC14 = ["SOIC14", [8.70, 3.90, 1.25], 0.10, 0.66, 1.27, 6.00, [0.31, .50, 0.20]];
|
||||
SOIC16 = ["SOIC16", [9.90, 3.90, 1.25], 0.10, 0.66, 1.27, 6.00, [0.31, .50, 0.20]];
|
||||
SOIC18 = ["SOIC18", [11.40,7.50, 2.00], 0.10, 1.20, 1.27, 10.30, [0.31, .50, 0.20]];
|
||||
|
||||
smd_soics = [SOIC8, SOIC14, SOIC16, SOIC18];
|
||||
|
||||
DO241AC = ["DO241AC", [4.0, 2.5, 2.0], 0.1, 1, [4.8, 1.2, 0.15, 2]];
|
||||
DO241AC = ["DO241AC", [4.0, 2.5, 2.0], 0.1, 1, [4.8, 1.2, 0.15, 2], grey(20)];
|
||||
|
||||
smd_diodes = [DO241AC];
|
||||
|
||||
TANT_A = ["TANT_A", [3.0, 1.6, 1.6], 0.1, 0.8, [3.2, 1.2, 0.08, 1.1], ["#E9D769", "#E9B44A"]];
|
||||
TANT_B = ["TANT_B", [3.3, 2.8, 1.9], 0.1, 0.95, [3.5, 2.2, 0.08, 1.4], ["#E9D769", "#E9B44A"]];
|
||||
TANT_C = ["TANT_C", [5.8, 3.2, 2.6], 0.1, 1.3, [6.0, 2.2, 0.08, 2.9], ["#E9D769", "#E9B44A"]];
|
||||
|
||||
smd_tants = [TANT_A, TANT_B, TANT_C];
|
||||
|
||||
IND2525 = ["IND2525", [6.75, 6.75, 2], 0.1, 1.75, [7.24, 3.2, 0.15, 4.4], grey(50)];
|
||||
|
||||
smd_inductors = [IND2525];
|
||||
|