Compare commits
13 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
5a06f79466 | ||
|
98e17080d8 | ||
|
d3f308a45e | ||
|
fe454884e0 | ||
|
c019448dd3 | ||
|
eadc541e8f | ||
|
02791c40ac | ||
|
85b8ffbbc3 | ||
|
dd5d3869ad | ||
|
b84eb3cf31 | ||
|
0ec7aabcfb | ||
|
baa737c4d8 | ||
|
70b13d2f27 |
@@ -52,7 +52,7 @@ iec = IEC_inlet_atx;
|
||||
socket = Contactum;
|
||||
|
||||
|
||||
foot = [20, 8, 3, 1, M3_dome_screw, 10];
|
||||
foot = Foot(d = 20, h = 8, t = 3, r = 1, screw = M3_dome_screw);
|
||||
|
||||
module foot_stl() foot(foot);
|
||||
|
||||
|
Before Width: | Height: | Size: 179 KiB After Width: | Height: | Size: 166 KiB |
Before Width: | Height: | Size: 169 KiB After Width: | Height: | Size: 168 KiB |
Before Width: | Height: | Size: 280 KiB After Width: | Height: | Size: 290 KiB |
Before Width: | Height: | Size: 291 KiB After Width: | Height: | Size: 293 KiB |
Before Width: | Height: | Size: 232 KiB After Width: | Height: | Size: 236 KiB |
Before Width: | Height: | Size: 173 KiB After Width: | Height: | Size: 178 KiB |
BIN
libtest.png
Before Width: | Height: | Size: 794 KiB After Width: | Height: | Size: 797 KiB |
@@ -52,6 +52,9 @@ function box_width(type) = type[6]; //! Internal width
|
||||
function box_depth(type) = type[7]; //! Internal depth
|
||||
function box_height(type) = type[8]; //! Internal height
|
||||
|
||||
function box(screw, wall, sheets, top_sheet, base_sheet, size, feet = false) = //! Construct a property list for a box.
|
||||
concat([screw, wall, sheets, top_sheet, base_sheet, feet], size);
|
||||
|
||||
function box_bezel_clearance(type) = bezel_clearance;
|
||||
|
||||
function box_corner_gap(type) = 3; //! Gap between box_sheets at the corners to connect inside and outside profiles
|
||||
|
@@ -50,6 +50,9 @@ function bbox_name(type) = type[8] ? type[8] : "bbox"; //! Optional name i
|
||||
function bbox_skip_blocks(type)= type[9] ? type[9] : []; //! List of fixing blocks to skip, used to allow a hinged panel for example
|
||||
function star_washers(type) = type[10] ? type[10] : is_undef(type[10]); //! Set to false to remove star washers.
|
||||
|
||||
function bbox(screw, sheets, base_sheet, top_sheet, span, size, name = "bbox", skip_blocks = [], star_washers = true) = //! Construct the property list for a butt_box
|
||||
[ screw, sheets, base_sheet, top_sheet, span, size.x, size.y, size.z, name, skip_blocks, star_washers ];
|
||||
|
||||
function bbox_volume(type) = bbox_width(type) * bbox_depth(type) * bbox_height(type) / 1000000; //! Internal volume in litres
|
||||
function bbox_area(type) = let(w = bbox_width(type), d = bbox_depth(type), h = bbox_height(type)) //! Internal surdface area in m^2
|
||||
2 * (w * d + w * h + d * h) / 1000000;
|
||||
|
@@ -42,6 +42,9 @@ function hinge_screws(type) = type[8]; //! How many screws
|
||||
function hinge_clearance(type) = type[9]; //! Clearance between knuckles
|
||||
function hinge_margin(type) = type[10]; //! How far to keep the screws from the knuckes
|
||||
|
||||
function flat_hinge(name, size, pin_d, knuckle_d, knuckles, screw, screws, clearance, margin) = //! Construct the property list for a flat hinge.
|
||||
[name, size.x, size.y, size.z, pin_d, knuckle_d, knuckles, screw, screws, clearance, margin];
|
||||
|
||||
function hinge_radius(type) = washer_radius(screw_washer(hinge_screw(type))) + 1;
|
||||
|
||||
module hinge_screw_positions(type) { //! Place children at the screw positions
|
||||
|
@@ -24,8 +24,10 @@
|
||||
include <../core.scad>
|
||||
use <../vitamins/insert.scad>
|
||||
|
||||
foot = [25, 12, 3, 2, M4_cap_screw, 10];
|
||||
insert_foot = [20, 10, 0, 2, M3_cap_screw, 10];
|
||||
function Foot(d, h, t, r, screw, slant = 10) = [d, h, t, r, screw, slant]; //! Construct a foot property list
|
||||
|
||||
foot = Foot(25, 12, 3, 2, M4_cap_screw);
|
||||
insert_foot = Foot(20, 10, 0, 2, M3_cap_screw);
|
||||
|
||||
function insert_foot() = insert_foot; //! Default foot with insert
|
||||
|
||||
|
@@ -30,6 +30,9 @@ include <../core.scad>
|
||||
use <../vitamins/insert.scad>
|
||||
use <foot.scad>
|
||||
|
||||
function pbox(name, wall, top_t, base_t, radius, size, foot = false, screw = false, ridges = [0, 0]) //! Construct a printed box property list
|
||||
= concat([name, wall, top_t, base_t, foot, screw, radius, ridges], size);
|
||||
|
||||
function pbox_name(type) = type[0]; //! Name to allow more than one box in a project
|
||||
function pbox_wall(type) = type[1]; //! Wall thickness
|
||||
function pbox_top(type) = type[2]; //! Top thickness
|
||||
@@ -75,7 +78,7 @@ function pbox_screw_inset(type) = //! How far the base screws are inset
|
||||
R = pbox_radius(type)
|
||||
) max(r, R - (R - r) / sqrt(2));
|
||||
|
||||
module pbox_screw_positions(type) {
|
||||
module pbox_screw_positions(type) { //! Place children at base screw positions
|
||||
foot = pbox_foot(type);
|
||||
inset = pbox_screw_inset(type);
|
||||
for(x = [-1, 1], y = [-1, 1])
|
||||
@@ -124,6 +127,9 @@ module pbox_inner_shape(type) {
|
||||
rounded_square([w, d], rad, center = true);
|
||||
}
|
||||
|
||||
module pbox_outer_shape(type) //! 2D outer shape of the box
|
||||
offset(pbox_wall(type) / 2) pbox_mid_shape(type);
|
||||
|
||||
module pbox_base(type) { //! Generate the STL for the base
|
||||
stl(str(pbox_name(type),"_base"));
|
||||
t = pbox_base(type);
|
||||
@@ -158,7 +164,7 @@ module pbox(type) { //! Generate the STL for the main case
|
||||
difference() {
|
||||
union() {
|
||||
linear_extrude(total_height)
|
||||
offset(wall / 2) pbox_mid_shape(type);
|
||||
pbox_outer_shape(type);
|
||||
|
||||
if($children > 2)
|
||||
children(2);
|
||||
|
@@ -24,8 +24,7 @@
|
||||
include <../core.scad>
|
||||
use <../vitamins/insert.scad>
|
||||
|
||||
strap = [18, 2, M3_pan_screw, 3, 25];
|
||||
function strap() = strap;
|
||||
strap = strap();
|
||||
|
||||
wall = 2;
|
||||
clearance = 0.5;
|
||||
@@ -40,6 +39,10 @@ function strap_screw(type = strap) = type[2]; //! Screw type
|
||||
function strap_panel(type = strap) = type[3]; //! Panel thickness
|
||||
function strap_extension(type = strap) = type[4]; //! How much length of the strap that can pull out
|
||||
|
||||
|
||||
function strap(width = 18, thickness = 2, screw = M3_pan_screw, panel_thickness = 3, extension = 25) = //! Construct a property list for a strap
|
||||
[ width, thickness, screw, panel_thickness, extension ];
|
||||
|
||||
function strap_insert(type) = screw_insert(strap_screw(type)); //! The insert type
|
||||
function strap_key(type) = strap_panel(type) - panel_clearance;
|
||||
function strap_height(type) = wall + max(insert_length(strap_insert(type)) - strap_key(type), strap_thickness(type) + clearance); //! Height of the ends
|
||||
|
38
readme.md
@@ -1433,7 +1433,7 @@ The 7 SEGMENT.TTF font from the [docs](docs) directory needs to be installed to
|
||||
| ```meter_lug_size(type)``` | Lug length and width |
|
||||
| ```meter_offset(type)``` | Display position, 0 = center, +1 = top |
|
||||
| ```meter_pcb_size(type)``` | PCB size excluding lugs |
|
||||
| ```meter_shunt(type)``` | Ampmeter shunt wire |
|
||||
| ```meter_shunt(type)``` | Ammeter shunt wire |
|
||||
| ```meter_size(type)``` | Size of display |
|
||||
|
||||
### Functions
|
||||
@@ -1443,6 +1443,7 @@ The 7 SEGMENT.TTF font from the [docs](docs) directory needs to be installed to
|
||||
| ```meter_bezel_rad(type)``` | Printed bezel corner radius |
|
||||
| ```meter_bezel_wall(type)``` | Printed bezel wall thickness |
|
||||
| ```meter_bezel_width(type)``` | Printed bezel width |
|
||||
| ```meter_shunt_y(type)``` | Shunt y coordinate |
|
||||
|
||||
### Modules
|
||||
| Module | Description |
|
||||
@@ -1970,10 +1971,18 @@ Notes on the DSN_VC288:
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| ```pmeter_aperture(type)``` | Aperture length, width and bevel |
|
||||
| ```pmeter_bevel(type)``` | Bezel bevel inset and start height |
|
||||
| ```pmeter_bevel(type)``` | Bezel bevel inset and start height or a radius |
|
||||
| ```pmeter_bezel(type)``` | Bezel size |
|
||||
| ```pmeter_bezel_r(type)``` | Bezel radius |
|
||||
| ```pmeter_button_colour(type)``` | Button colour |
|
||||
| ```pmeter_button_pos(type)``` | Button position |
|
||||
| ```pmeter_button_r(type)``` | Button radius |
|
||||
| ```pmeter_button_size(type)``` | Button size |
|
||||
| ```pmeter_buttons(type)``` | List of buttons |
|
||||
| ```pmeter_inner_ap(type)``` | Inner aperture |
|
||||
| ```pmeter_inner_ap_o(type)``` | Inner aperture offset |
|
||||
| ```pmeter_pcb(type)``` | Optional PCB for open types |
|
||||
| ```pmeter_pcb_h(type)``` | Component height from the front |
|
||||
| ```pmeter_pcb_z(type)``` | Distance of PCB from the back |
|
||||
| ```pmeter_size(type)``` | Body size including bezel height |
|
||||
| ```pmeter_tab(type)``` | Tab size |
|
||||
@@ -1989,6 +1998,7 @@ Notes on the DSN_VC288:
|
||||
| Module | Description |
|
||||
|:--- |:--- |
|
||||
| ```panel_meter(type)``` | Draw panel mounted LCD meter module |
|
||||
| ```panel_meter_button(type)``` | Draw panel meter button |
|
||||
| ```panel_meter_cutout(type, h = 0)``` | Make panel cutout |
|
||||
|
||||

|
||||
@@ -1999,6 +2009,7 @@ Notes on the DSN_VC288:
|
||||
| 1 | ```panel_meter(DSN_VC288)``` | DSN-VC288 DC 100V 10A Voltmeter ammeter |
|
||||
| 1 | ```panel_meter(PZEM001)``` | Peacefair PZEM-001 AC digital multi-function meter |
|
||||
| 1 | ```panel_meter(PZEM021)``` | Peacefair PZEM-021 AC digital multi-function meter |
|
||||
| 1 | ```panel_meter(DSP5005)``` | Ruideng DSP5005 Power supply module |
|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
@@ -2084,7 +2095,7 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
||||
### Vitamins
|
||||
| Qty | Module call | BOM entry |
|
||||
| ---:|:--- |:---|
|
||||
| 1 | ```box_header(2p54header, 4, 2, smt = 0)``` | Box header 4 x 2 |
|
||||
| 1 | ```box_header(2p54header, 4, 2)``` | Box header 4 x 2 |
|
||||
| 1 | ```d_plug(DCONN9, pcb = true)``` | D-type 9 way PCB mount plug |
|
||||
| 1 | ```dil_socket(12, 15.24)``` | DIL socket 24 x 0.6" |
|
||||
| 1 | ```hdmi(hdmi_full)``` | HDMI socket |
|
||||
@@ -2097,12 +2108,11 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
||||
| 1 | ```microswitch(small_microswitch)``` | Microswitch DM1-00P-110-3 |
|
||||
| 1 | ```hdmi(hdmi_mini)``` | Mini HDMI socket |
|
||||
| 1 | ```molex_254(2)``` | Molex KK header 2 way |
|
||||
| 1 | ```pin_header(2p54header, 4, 1, smt = 0)``` | Pin header 4 x 1 |
|
||||
| 1 | ```pin_header(2p54header, 5, 1, smt = undef)``` | Pin header 5 x 1 |
|
||||
| 1 | ```pin_socket(2p54header, 4, 1, right_angle = undef, height = undef, smt = undef)``` | Pin socket 4 x 1 |
|
||||
| 1 | ```pin_header(2p54header, 4, 1)``` | Pin header 4 x 1 |
|
||||
| 1 | ```pin_header(2p54header, 5, 1)``` | Pin header 5 x 1 |
|
||||
| 1 | ```pin_socket(2p54header, 4, 1)``` | Pin socket 4 x 1 |
|
||||
| 1 | ```pin_socket(2p54header, 6, 1)``` | Pin socket 6 x 1 |
|
||||
| 1 | ```pin_socket(2p54header, 8, 1)``` | Pin socket 8 x 1 |
|
||||
| 1 | ```pin_socket(2p54header, 8, 1, right_angle = undef, height = undef, smt = undef)``` | Pin socket 8 x 1 |
|
||||
| 2 | ```pin_socket(2p54header, 8, 1)``` | Pin socket 8 x 1 |
|
||||
| 1 | ```ax_res(res1_2, 10, tol = 10)``` | Resistor 10 Ohms 10% 0.5W |
|
||||
| 1 | ```ax_res(res1_4, 100, tol = 2)``` | Resistor 100 Ohms 2% 0.25W |
|
||||
| 1 | ```ax_res(res1_8, 1000)``` | Resistor 1000 Ohms 5% 0.125W |
|
||||
@@ -3863,6 +3873,7 @@ Normally the side sheets are the same type but they can be overridden individual
|
||||
### Functions
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| ```box(screw, wall, sheets, top_sheet, base_sheet, size, feet = false)``` | Construct a property list for a box. |
|
||||
| ```box_bezel_height(type, bottom)``` | Bezel height for top or bottom |
|
||||
| ```box_corner_gap(type)``` | Gap between box_sheets at the corners to connect inside and outside profiles |
|
||||
| ```box_inset(type)``` | How much the bezel intrudes on the specified width and length, away from the corners |
|
||||
@@ -3974,6 +3985,7 @@ Uses [fixing blocks](#fixing_block) and [corner blocks](#corner_block).
|
||||
### Functions
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| ```bbox(screw, sheets, base_sheet, top_sheet, span, size, name = "bbox", skip_blocks = [], star_washers = true)``` | Construct the property list for a butt_box |
|
||||
| ```bbox_area(type)``` | Internal surdface area in m^2 |
|
||||
| ```bbox_volume(type)``` | Internal volume in litres |
|
||||
|
||||
@@ -4441,6 +4453,11 @@ This allows the hinges and one set of screws to belong to one assembly and the o
|
||||
| ```hinge_thickness(type)``` | Thickness of the leaves |
|
||||
| ```hinge_width(type)``` | Width |
|
||||
|
||||
### Functions
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| ```flat_hinge(name, size, pin_d, knuckle_d, knuckles, screw, screws, clearance, margin)``` | Construct the property list for a flat hinge. |
|
||||
|
||||
### Modules
|
||||
| Module | Description |
|
||||
|:--- |:--- |
|
||||
@@ -4502,6 +4519,7 @@ inserts don't grip well in rubber.
|
||||
### Functions
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| ```Foot(d, h, t, r, screw, slant = 10)``` | Construct a foot property list |
|
||||
| ```insert_foot()``` | Default foot with insert |
|
||||
|
||||
### Modules
|
||||
@@ -4672,6 +4690,7 @@ It can also have printed feet on the base with the screws doubling up to hold th
|
||||
### Functions
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| ```pbox(name, wall, top_t, base_t, radius, size, foot = false, screw = false, ridges = [0, 0])``` | Construct a printed box property list |
|
||||
| ```pbox_inclusion(type)``` | How far the ledge for the base extends inwards |
|
||||
| ```pbox_insert(type)``` | The insert for the base screws |
|
||||
| ```pbox_screw(type)``` | Foot screw if got feet else base_screw |
|
||||
@@ -4687,6 +4706,8 @@ It can also have printed feet on the base with the screws doubling up to hold th
|
||||
| ```pbox_base(type)``` | Generate the STL for the base |
|
||||
| ```pbox_base_screws(type, thickness = 0)``` | Place the screws and feet |
|
||||
| ```pbox_inserts(type)``` | Place the inserts for the base screws |
|
||||
| ```pbox_outer_shape(type)``` | 2D outer shape of the box |
|
||||
| ```pbox_screw_positions(type)``` | Place children at base screw positions |
|
||||
|
||||

|
||||
|
||||
@@ -4999,6 +5020,7 @@ be fully customised by passing a list of properties.
|
||||
### Functions
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| ```strap(width = 18, thickness = 2, screw = M3_pan_screw, panel_thickness = 3, extension = 25)``` | Construct a property list for a strap |
|
||||
| ```strap_end_width(type = strap)``` | Width of the ends |
|
||||
| ```strap_height(type)``` | Height of the ends |
|
||||
| ```strap_insert(type)``` | The insert type |
|
||||
|
@@ -61,10 +61,10 @@ test_pcb = ["TestPCB", "Test PCB",
|
||||
[ 20, -15, 0, "trimpot10", true],
|
||||
[ 10, 2, 0, "smd_led", LED0805, "red"],
|
||||
[ 10, 10, 0, "2p54header", 4, 1],
|
||||
[ 25, 10, 0, "2p54header", 5, 1, undef, "blue" ],
|
||||
[ 25, 10, 0, "2p54header", 5, 1, false, "blue" ],
|
||||
[ 10, 20, 0, "2p54boxhdr", 4, 2],
|
||||
[ 10, 30, 0, "2p54socket", 6, 1],
|
||||
[ 25, 30, 0, "2p54socket", 4, 1, undef, undef, undef, "red" ],
|
||||
[ 25, 30, 0, "2p54socket", 4, 1, false, 0, false, "red" ],
|
||||
[ 10, 40, 0, "chip", 10, 5, 1, grey20],
|
||||
[ 5, 50, 0, "led", LED3mm, "red"],
|
||||
[ 12, 50, 0, "led", LED5mm, "orange"],
|
||||
@@ -119,7 +119,7 @@ test_pcb = ["TestPCB", "Test PCB",
|
||||
[ 80, 200, 0, "pdip", 24, "27C32", true, inch(0.6) ],
|
||||
[ 80, 170, 0, "pdip", 8, "NE555" ],
|
||||
[ 52, 206, 0, "2p54socket", 8, 1 ],
|
||||
[ 52, 194, 0, "2p54socket", 8, 1, undef, undef, undef, "red" ],
|
||||
[ 52, 194, 0, "2p54socket", 8, 1, false, 0, false, "red" ],
|
||||
[ 50, 220, 0, "standoff", 5, 4.5, 12.5, 2.54],
|
||||
[ 50, 240, 0, "potentiometer"],
|
||||
[ 75, 240, 0, "potentiometer", 7, 8],
|
||||
|
@@ -23,7 +23,7 @@ use <../vitamins/insert.scad>
|
||||
|
||||
use <../printed/box.scad>
|
||||
|
||||
box = [M3_dome_screw, 3, DiBond, PMMA3, DiBond6, true, 150, 100, 70];
|
||||
box = box(screw = M3_dome_screw, wall = 3, sheets = DiBond, top_sheet = PMMA3, base_sheet = DiBond6, feet = true, size = [150, 100, 70]);
|
||||
|
||||
include <../printed/box_assembly.scad>
|
||||
|
||||
|
@@ -25,7 +25,7 @@ include <../printed/butt_box.scad>
|
||||
|
||||
$explode = 0;
|
||||
|
||||
box = [M3_dome_screw, DiBond, DiBond6, PMMA3, 250, 400, 300, 120];
|
||||
box = bbox(screw = M3_dome_screw, sheets = DiBond, base_sheet = DiBond6, top_sheet = PMMA3, span = 250, size = [400, 300, 120]);
|
||||
|
||||
module bbox_assembly() _bbox_assembly(box);
|
||||
|
||||
|
@@ -32,8 +32,8 @@ clearance = 0.2;
|
||||
|
||||
angle = 0; // [-90 : 180]
|
||||
|
||||
big_hinge = ["big", width, depth, thickness, pin_diameter, knuckle_diameter, knuckles, M3_dome_screw, screws, clearance, margin];
|
||||
small_hinge = ["small", 20, 16, 2, 2.85, 7, 3, M3_dome_screw, 2, 0.2, 0];
|
||||
big_hinge = flat_hinge(name = "big", size = [width, depth, thickness], pin_d = pin_diameter, knuckle_d = knuckle_diameter, knuckles = knuckles, screw = M3_dome_screw, screws = screws, clearance = clearance, margin = margin);
|
||||
small_hinge = flat_hinge(name = "small", size =[ 20, 16, 2], pin_d = 2.85, knuckle_d = 7, knuckles = 3, screw = M3_dome_screw, screws = 2, clearance = 0.2, margin = 0);
|
||||
|
||||
hinges = [small_hinge, big_hinge];
|
||||
|
||||
|
@@ -22,7 +22,7 @@ use <../utils/layout.scad>
|
||||
include <../vitamins/panel_meters.scad>
|
||||
|
||||
module panel_meters()
|
||||
layout([for(p = panel_meters) pmeter_size(p).x], 20)
|
||||
layout([for(p = panel_meters) pmeter_bezel(p).x], 10)
|
||||
panel_meter(panel_meters[$i]);
|
||||
|
||||
if($preview)
|
||||
|
Before Width: | Height: | Size: 6.5 KiB After Width: | Height: | Size: 6.5 KiB |
Before Width: | Height: | Size: 251 KiB |
Before Width: | Height: | Size: 84 KiB After Width: | Height: | Size: 84 KiB |
Before Width: | Height: | Size: 61 KiB After Width: | Height: | Size: 61 KiB |
Before Width: | Height: | Size: 95 KiB After Width: | Height: | Size: 95 KiB |
Before Width: | Height: | Size: 109 KiB |
Before Width: | Height: | Size: 55 KiB After Width: | Height: | Size: 64 KiB |
Before Width: | Height: | Size: 41 KiB After Width: | Height: | Size: 41 KiB |
Before Width: | Height: | Size: 60 KiB |
@@ -21,25 +21,25 @@ include <../core.scad>
|
||||
use <../printed/foot.scad>
|
||||
use <../printed/printed_box.scad>
|
||||
|
||||
foot = [13, 5, 2, 1, M3_pan_screw, 10];
|
||||
foot = Foot(d = 13, h = 5, t = 2, r = 1, screw = M3_pan_screw);
|
||||
module foot_stl() foot(foot);
|
||||
|
||||
wall = 2;
|
||||
top_thickness = 2;
|
||||
base_thickness = 2;
|
||||
case_inner_rad = 8;
|
||||
inner_rad = 8;
|
||||
|
||||
width = 80;
|
||||
depth = 45;
|
||||
height = 40;
|
||||
|
||||
box1 = ["box1", wall, top_thickness, base_thickness, false, M2_cap_screw, case_inner_rad, [8, 1], width, depth, height];
|
||||
box2 = ["smooth_box", wall, top_thickness, base_thickness, foot, false, case_inner_rad, [0, 0], width, depth, height];
|
||||
box1 = pbox(name = "box1", wall = wall, top_t = top_thickness, base_t = base_thickness, radius = inner_rad, size = [width, depth, height], screw = M2_cap_screw, ridges = [8, 1]);
|
||||
box2 = pbox(name = "smooth_box", wall = wall, top_t = top_thickness, base_t = base_thickness, radius = inner_rad, size = [width, depth, height], foot = foot);
|
||||
|
||||
module box1_feet_positions() {
|
||||
clearance = 2;
|
||||
foot_r = foot_diameter(foot) / 2;
|
||||
x_inset = case_inner_rad + foot_r - pbox_ridges(box1).y;
|
||||
x_inset = inner_rad + foot_r - pbox_ridges(box1).y;
|
||||
z_inset = foot_r + clearance;
|
||||
h = height + base_thickness;
|
||||
|
||||
|
@@ -34,7 +34,7 @@ function meter_lug_size(type) = type[4]; //! Lug length and width
|
||||
function meter_lug_offset(type) = type[5]; //! Lug position, 0 = center, +1 = top
|
||||
function meter_hole_pitch(type) = type[6]; //! Lug hole pitch
|
||||
function meter_hole_radius(type) = type[7]; //! Lug hole radius
|
||||
function meter_shunt(type) = type[8]; //! Ampmeter shunt wire
|
||||
function meter_shunt(type) = type[8]; //! Ammeter shunt wire
|
||||
|
||||
function meter_pos(type) = (meter_pcb_size(type).y - meter_size(type).y) * meter_offset(type) / 2;
|
||||
function meter_lug_pos(type) = (meter_pcb_size(type).y - meter_lug_size(type).y) * meter_lug_offset(type) / 2;
|
||||
@@ -44,6 +44,8 @@ module meter_hole_positions(type) //! Position children over the holes
|
||||
translate([side * meter_hole_pitch(type) / 2, meter_lug_pos(type)])
|
||||
children();
|
||||
|
||||
function meter_shunt_y(type) = meter_pos(type) - meter_pcb_size(type).y / 2; //! Shunt y coordinate
|
||||
|
||||
module meter(type, colour = "red", value = "888", display_colour = false) //! Draw a meter with optional colour and display value
|
||||
{
|
||||
vitamin(str("meter(", type[0], arg(colour, "red", "colour"), "): LED ", meter_shunt(type) ? "am" : "volt", "meter ", colour));
|
||||
@@ -80,7 +82,7 @@ module meter(type, colour = "red", value = "888", display_colour = false) //! Dr
|
||||
|
||||
shunt = meter_shunt(type);
|
||||
if(shunt)
|
||||
translate([0, -meter_pcb_size(type).y / 2 + meter_pos(type), size.z])
|
||||
translate([0, meter_shunt_y(type), size.z])
|
||||
vflip()
|
||||
color("#b87333")
|
||||
wire_link(shunt.y, shunt.x, shunt.z, tail = 2);
|
||||
|
@@ -28,21 +28,42 @@
|
||||
include <../utils/core/core.scad>
|
||||
|
||||
use <../utils/dogbones.scad>
|
||||
use <../utils/rounded_cylinder.scad>
|
||||
use <pcb.scad>
|
||||
|
||||
function pmeter_size(type) = type[2]; //! Body size including bezel height
|
||||
function pmeter_bezel(type) = type[3]; //! Bezel size
|
||||
function pmeter_bezel_r(type) = type[4]; //! Bezel radius
|
||||
function pmeter_bevel(type) = type[5]; //! Bezel bevel inset and start height
|
||||
function pmeter_aperture(type) = type[6]; //! Aperture length, width and bevel
|
||||
function pmeter_tab(type) = type[7]; //! Tab size
|
||||
function pmeter_tab_z(type) = type[8]; //! Tab vertical position
|
||||
function pmeter_thickness(type) = type[9]; //! Wall thickness if not closed
|
||||
function pmeter_pcb(type) = type[10]; //! Optional PCB for open types
|
||||
function pmeter_pcb_z(type) = type[11]; //! Distance of PCB from the back
|
||||
function pmeter_size(type) = type[2]; //! Body size including bezel height
|
||||
function pmeter_bezel(type) = type[3]; //! Bezel size
|
||||
function pmeter_bezel_r(type) = type[4]; //! Bezel radius
|
||||
function pmeter_bevel(type) = type[5]; //! Bezel bevel inset and start height or a radius
|
||||
function pmeter_aperture(type) = type[6]; //! Aperture length, width and bevel
|
||||
function pmeter_tab(type) = type[7]; //! Tab size
|
||||
function pmeter_tab_z(type) = type[8]; //! Tab vertical position
|
||||
function pmeter_thickness(type) = type[9]; //! Wall thickness if not closed
|
||||
function pmeter_inner_ap(type) = type[10]; //! Inner aperture
|
||||
function pmeter_inner_ap_o(type) = type[11]; //! Inner aperture offset
|
||||
function pmeter_pcb(type) = type[12]; //! Optional PCB for open types
|
||||
function pmeter_pcb_z(type) = type[13]; //! Distance of PCB from the back
|
||||
function pmeter_pcb_h(type) = type[14]; //! Component height from the front
|
||||
function pmeter_buttons(type) = type[15]; //! List of buttons
|
||||
|
||||
function pmeter_button_pos(type) = type[0]; //! Button position
|
||||
function pmeter_button_size(type) = type[1]; //! Button size
|
||||
function pmeter_button_r(type) = type[2]; //! Button radius
|
||||
function pmeter_button_colour(type) = type[3]; //! Button colour
|
||||
|
||||
function pmeter_depth(type) = pmeter_size(type).z - pmeter_bezel(type).z; //! Depth below bezel
|
||||
|
||||
module panel_meter_button(type) { //! Draw panel meter button
|
||||
size = pmeter_button_size(type);
|
||||
r = pmeter_button_r(type);
|
||||
color(pmeter_button_colour(type))
|
||||
translate(pmeter_button_pos(type))
|
||||
if(size.x)
|
||||
rounded_rectangle(pmeter_button_size(type), r, center = false);
|
||||
else
|
||||
cylinder(r = r, h = size.z);
|
||||
}
|
||||
|
||||
module panel_meter(type) { //! Draw panel mounted LCD meter module
|
||||
vitamin(str("panel_meter(", type[0], "): ", type[1]));
|
||||
size = pmeter_size(type);
|
||||
@@ -51,29 +72,52 @@ module panel_meter(type) { //! Draw panel mounted LCD meter module
|
||||
t = pmeter_thickness(type);
|
||||
r = pmeter_bezel_r(type);
|
||||
h = size.z - bezel.z;
|
||||
app = pmeter_aperture(type);
|
||||
ap = pmeter_aperture(type);
|
||||
tab = pmeter_tab(type);
|
||||
tab_z = pmeter_tab_z(type);
|
||||
pcb = pmeter_pcb(type);
|
||||
ap2 = pmeter_inner_ap(type);
|
||||
pcb_h = pmeter_pcb_h(type) - bezel.z;
|
||||
buttons = pmeter_buttons(type);
|
||||
|
||||
color("#94A7AB")
|
||||
cube([app.x, app.y, 3 * eps], center = true);
|
||||
cube([ap.x, ap.y, 3 * eps], center = true);
|
||||
|
||||
module corner(x, y)
|
||||
translate([x * (bezel.x / 2 - bevel), y * (bezel.y / 2 - bevel)])
|
||||
rounded_cylinder(r = r, r2 = bevel, h = bezel.z);
|
||||
|
||||
color(grey30) union() {
|
||||
//
|
||||
// Bezel and aperture
|
||||
//
|
||||
difference() {
|
||||
hull() {
|
||||
rounded_rectangle([bezel.x - 2 * bevel.x, bezel.y - 2 * bevel.x, bezel.z], r - bevel.x, center = false);
|
||||
rounded_rectangle([bezel.x, bezel.y, bevel[1]],r, center = false);
|
||||
}
|
||||
hull() {
|
||||
translate_z(bezel.z + eps) {
|
||||
cube([app.x + app.z, app.y + app.z, eps], center = true);
|
||||
|
||||
cube([app.x, app.y, bezel.z * 2], center = true);
|
||||
if(is_list(bevel))
|
||||
hull() {
|
||||
rounded_rectangle([bezel.x - 2 * bevel.x, bezel.y - 2 * bevel.x, bezel.z], r - bevel.x, center = false);
|
||||
rounded_rectangle([bezel.x, bezel.y, bevel[1]], r, center = false);
|
||||
}
|
||||
else
|
||||
hull() {
|
||||
corner(-1, -1);
|
||||
corner(-1, 1);
|
||||
corner( 1, -1);
|
||||
corner( 1, 1);
|
||||
}
|
||||
|
||||
hull() {
|
||||
r = max(0, -ap.z);
|
||||
if(ap.z > 0)
|
||||
translate_z(bezel.z + eps)
|
||||
cube([ap.x + ap.z, ap.y + ap.z, eps], center = true);
|
||||
|
||||
translate_z(bezel.z + eps)
|
||||
rounded_rectangle([ap.x, ap.y, bezel.z * 2], r, center = true);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Body
|
||||
//
|
||||
translate_z(-h)
|
||||
linear_extrude(h)
|
||||
difference() {
|
||||
@@ -82,7 +126,9 @@ module panel_meter(type) { //! Draw panel mounted LCD meter module
|
||||
if(t)
|
||||
square([size.x - 2 * t, size.y - 2 * t], center = true);
|
||||
}
|
||||
|
||||
//
|
||||
// tabs
|
||||
//
|
||||
if(tab)
|
||||
for(end = [-1, 1])
|
||||
translate([end * (size.x / 2 + tab.x / 2), 0, -size.z + tab_z])
|
||||
@@ -91,10 +137,27 @@ module panel_meter(type) { //! Draw panel mounted LCD meter module
|
||||
cube([tab.x, tab.y, tab.z], center = true);
|
||||
|
||||
}
|
||||
if(ap2)
|
||||
color("grey")
|
||||
linear_extrude(ap2.z)
|
||||
difference() {
|
||||
square([ap.x, ap.y], center = true);
|
||||
|
||||
translate(pmeter_inner_ap_o(type))
|
||||
square([ap2.x, ap2.y], center = true);
|
||||
}
|
||||
if(pcb)
|
||||
vflip()
|
||||
translate_z(h - pcb_thickness(pcb) - pmeter_pcb_z(type))
|
||||
pcb(pcb);
|
||||
|
||||
if(pcb_h > 0)
|
||||
%translate_z(-pcb_h / 2 - eps)
|
||||
cube([size.x - 2 * t - eps, size.y - 2 * t - eps, pcb_h], center = true);
|
||||
|
||||
if(buttons)
|
||||
for(b = buttons)
|
||||
panel_meter_button(b);
|
||||
}
|
||||
|
||||
module panel_meter_cutout(type, h = 0) { //! Make panel cutout
|
||||
|
@@ -20,19 +20,32 @@
|
||||
//
|
||||
//! Panel mounted digital meter modules
|
||||
//
|
||||
// body size bezel size, radius, bevel aperture tab tab_z t
|
||||
// inner aperture offset pcb pcb z h
|
||||
PZEM021 = ["PZEM021", "Peacefair PZEM-021 AC digital multi-function meter", [84.6, 44.7, 24.4], [89.6, 49.6, 2.3], 1.5, [1, 1], [51, 30, 5], [1.3, 10, 6], 15.5, 0];
|
||||
PZEM001 = ["PZEM001", "Peacefair PZEM-001 AC digital multi-function meter", [62 , 52.5, 24.4], [67, 57.5, 2.0], 2.0, [1, 1], [61, 46,-3], [1.2, 10, 6], 15.5, 0,
|
||||
[36, 36, 1.9], [0, 0], false, 0, 0, [
|
||||
[[25, 8, 0], [0, 0, 2], 4, grey90],
|
||||
[[25, -8, 0], [0, 0, 2], 4, grey90],
|
||||
|
||||
PZEM021 = ["PZEM021", "Peacefair PZEM-021 AC digital multi-function meter", [84.6, 44.7, 24.4], [89.6, 49.6, 2.3], 1.5, [1, 1], [51, 30, 5], [1.3, 10, 6], 15.5, 0];
|
||||
PZEM001 = ["PZEM001", "Peacefair PZEM-001 AC digital multi-function meter", [62 , 52.5, 24.4], [67, 57.5, 2.0], 1.5, [1, 1], [36, 36, 0], [1.2, 10, 6], 15.5, 0];
|
||||
]];
|
||||
|
||||
DSN_VC288PCB = ["", "", 41, 21, 1, 0, 0, 0, "green", false, [],
|
||||
[ [ 5, -3, 0, "jst_xh", 3],
|
||||
DSP5004PCB = ["", "", 68, 36, 1.6, 0, 0, 0, "green", false, [], [], []];
|
||||
DSP5005 = ["DSP5005", "Ruideng DSP5005 Power supply module", [71.6, 39.8, 25.0], [79, 43.0, 2.3], 2.0, 1, [67, 32,-1], [2.0, 12, 9], 13.5, 1.5,
|
||||
[28, 27, 0.7], [-4.5, 0], DSP5004PCB, 10, 36, [
|
||||
[[ 22, 4, 2], [ 0, 0, 11], 6, "silver"],
|
||||
[[ 22, 4, 5], [ 0, 0, 6], 6.5, "silver"],
|
||||
[[ 22, -9, 0], [ 8, 6, 1], 2.99, "yellow"],
|
||||
[[-25, -9, 0], [ 6.5, 4.5, 1], 0.5, "yellow"],
|
||||
[[-25, 0, 0], [ 6.5, 4.5, 1], 0.5, "yellow"],
|
||||
[[-25, 9, 0], [ 6.5, 4.5, 1], 0.5, "yellow"],
|
||||
]];
|
||||
|
||||
],
|
||||
[]];
|
||||
DSN_VC288PCB = ["", "", 41, 21, 1, 0, 0, 0, "green", false, [], [[ 5, -3, 0, "jst_xh", 3], ], []];
|
||||
|
||||
DSN_VC288 = ["DSN_VC288","DSN-VC288 DC 100V 10A Voltmeter ammeter", [45.3, 26, 17.4], [47.8, 28.8, 2.5], 0, [1, 1.8], [36, 18, 2.5], [], 0, 2,
|
||||
DSN_VC288PCB, 5];
|
||||
[], 0, DSN_VC288PCB, 5];
|
||||
|
||||
panel_meters = [DSN_VC288, PZEM021, PZEM001];
|
||||
panel_meters = [DSN_VC288, PZEM021, PZEM001, DSP5005];
|
||||
|
||||
use <panel_meter.scad>
|
||||
|
@@ -883,9 +883,9 @@ module pcb_component(comp, cutouts = false, angle = undef) { //! Draw pcb compon
|
||||
function param(n, default = 0) = len(comp) > n ? comp[n] : default;
|
||||
rotate(comp.z) {
|
||||
// Components that have a cutout parameter go in this section
|
||||
if(show(comp, "2p54header")) pin_header(2p54header, comp[4], comp[5], param(6), false, cutouts, colour = param(7, undef));
|
||||
if(show(comp, "2p54boxhdr")) box_header(2p54header, comp[4], comp[5], param(6), cutouts);
|
||||
if(show(comp, "2p54socket")) pin_socket(2p54header, comp[4], comp[5], param(6, false), param(7), param(8, false), cutouts, param(9, undef));
|
||||
if(show(comp, "2p54header")) pin_header(2p54header, comp[4], comp[5], param(6, false), false, cutouts, colour = param(7, undef));
|
||||
if(show(comp, "2p54boxhdr")) box_header(2p54header, comp[4], comp[5], param(6, false), cutouts);
|
||||
if(show(comp, "2p54socket")) pin_socket(2p54header, comp[4], comp[5], param(6, false), param(7, 0), param(8, false), cutouts, param(9, undef));
|
||||
if(show(comp, "chip")) chip(comp[4], comp[5], comp[6], param(7, grey30), cutouts);
|
||||
if(show(comp, "rj45")) rj45(cutouts);
|
||||
if(show(comp, "usb_A")) usb_Ax1(cutouts);
|
||||
|
@@ -259,22 +259,28 @@ module screw_countersink(type) { //! Countersink shape
|
||||
|
||||
module screw_and_washer(type, length, star = false, penny = false) { //! Screw with a washer which can be standard or penny and an optional star washer on top
|
||||
washer = screw_washer(type);
|
||||
head_type = screw_head_type(type);
|
||||
|
||||
translate_z(exploded() * 6)
|
||||
if(penny)
|
||||
penny_washer(washer);
|
||||
else
|
||||
washer(washer);
|
||||
if(head_type != hs_cs && head_type != hs_cs_cap) {
|
||||
translate_z(exploded() * 6)
|
||||
if(penny)
|
||||
penny_washer(washer);
|
||||
else
|
||||
washer(washer);
|
||||
|
||||
translate_z(washer_thickness(washer)) {
|
||||
if(star) {
|
||||
translate_z(exploded() * 8)
|
||||
star_washer(washer);
|
||||
translate_z(washer_thickness(washer)) {
|
||||
if(star) {
|
||||
translate_z(exploded() * 8)
|
||||
star_washer(washer);
|
||||
|
||||
translate_z(washer_thickness(washer))
|
||||
translate_z(washer_thickness(washer))
|
||||
screw(type, length);
|
||||
}
|
||||
else
|
||||
screw(type, length);
|
||||
}
|
||||
else
|
||||
screw(type, length);
|
||||
}
|
||||
else
|
||||
translate_z(eps)
|
||||
screw(type, length);
|
||||
}
|
||||
|