From ce0c97b45e6e501554e66bcd4140d4dd3f532a1c Mon Sep 17 00:00:00 2001 From: Chris Palmer Date: Sat, 11 Sep 2021 11:15:39 +0100 Subject: [PATCH] 7_segment displays added as PCB component. --- readme.md | 30 +++++++++++ tests/7_segments.scad | 29 +++++++++++ tests/PCB.scad | 5 +- tests/png/7_segments.png | Bin 0 -> 38214 bytes vitamins/7_segment.scad | 107 +++++++++++++++++++++++++++++++++++++++ vitamins/7_segments.scad | 28 ++++++++++ vitamins/pcbs.scad | 2 + 7 files changed, 200 insertions(+), 1 deletion(-) create mode 100644 tests/7_segments.scad create mode 100644 tests/png/7_segments.png create mode 100644 vitamins/7_segment.scad create mode 100644 vitamins/7_segments.scad diff --git a/readme.md b/readme.md index 34e76de..616c1fb 100644 --- a/readme.md +++ b/readme.md @@ -48,6 +48,36 @@ A list of changes classified as breaking, additions or fixes is maintained in [C Hygrometer Pulleys Zipties Strap_handle +--- + +## 7_segments +7 Segment displays + +[vitamins/7_segments.scad](vitamins/7_segments.scad) Object definitions. + +[vitamins/7_segment.scad](vitamins/7_segment.scad) Implementation. + +[tests/7_segments.scad](tests/7_segments.scad) Code for this example. + +### Properties +| Function | Description | +|:--- |:--- | +| `7_segment_digit_size(type)` | Size of the actual digit and segemnt width and angle | +| `7_segment_pin_pitch(type)` | x and y pin pitches and pin diameter | +| `7_segment_pins(type)` | None | +| `7_segment_size(type)` | Size of the body | + +### Modules +| Module | Description | +|:--- |:--- | +| `7_segment_digit(type, colour = grey(95)` | Draw the specified 7 segment digit | +| `7_segment_digits(type, n, colour = grey(70)` | Draw n digits side by side | + +![7_segments](tests/png/7_segments.png) + + +Top + --- ## Axials diff --git a/tests/7_segments.scad b/tests/7_segments.scad new file mode 100644 index 0000000..d01c4f9 --- /dev/null +++ b/tests/7_segments.scad @@ -0,0 +1,29 @@ +// +// NopSCADlib Copyright Chris Palmer 2021 +// 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 . +// +include <../core.scad> +use <../utils/layout.scad> + +include <../vitamins/7_segments.scad> + +module 7_segments() + layout([for(s = 7_segments) 7_segment_size(s).x * 2], 5) let(s = 7_segments[$i]) + 7_segment_digits(s, 2); + +if($preview) + 7_segments(); diff --git a/tests/PCB.scad b/tests/PCB.scad index ee378fa..d1aef4e 100644 --- a/tests/PCB.scad +++ b/tests/PCB.scad @@ -22,6 +22,8 @@ include <../vitamins/d_connectors.scad> include <../vitamins/leds.scad> include <../vitamins/axials.scad> include <../vitamins/smds.scad> +include <../vitamins/7_segments.scad> +include <../vitamins/potentiometers.scad> use <../vitamins/pcb.scad> @@ -46,7 +48,7 @@ TMC2130 = ["TMC2130", "TMC2130", [] ]; -test_pcb = ["TestPCB", "Test PCB", +test_pcb = ["test_pcb", "Test PCB", 100, 250, 1.6, // length, width, thickness 3, // Corner radius 2.75, // Mounting hole diameter @@ -138,6 +140,7 @@ test_pcb = ["TestPCB", "Test PCB", [ 50, 220, 0, "standoff", 5, 4.5, 12.5, 2.54], [ 50, 240, 0, "potentiometer"], [ 75, 240, 0, "potentiometer", 7, 8], + [ 30, 85, -90, "7seg", WT5011BSR, 2], ], // accessories [] diff --git a/tests/png/7_segments.png b/tests/png/7_segments.png new file mode 100644 index 0000000000000000000000000000000000000000..80e1390088b44594214dd615abc62187380ab2cd GIT binary patch literal 38214 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 D08f0A literal 0 HcmV?d00001 diff --git a/vitamins/7_segment.scad b/vitamins/7_segment.scad new file mode 100644 index 0000000..2111a80 --- /dev/null +++ b/vitamins/7_segment.scad @@ -0,0 +1,107 @@ +// +// NopSCADlib Copyright Chris Palmer 2021 +// 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 . +// + +// +//! 7 Segment displays +// +include <../utils/core/core.scad> + + +function 7_segment_size(type) = type[1]; //! Size of the body +function 7_segment_digit_size(type) = type[2]; //! Size of the actual digit and segemnt width and angle +function 7_segment_pins(type) = type[3]; //! [x, y] array of pins +function 7_segment_pin_pitch(type) = type[4]; //! x and y pin pitches and pin diameter + +module 7_segment_digit(type, colour = grey(95), pin_length = 6.4) { //! Draw the specified 7 segment digit + size = 7_segment_size(type); + digit = 7_segment_digit_size(type); + pins = 7_segment_pins(type); + pin_pitch = 7_segment_pin_pitch(type); + + color(grey(95)) + linear_extrude(size.z) + square([size.x - 0.1, size.y], center = true); + + color(grey(15)) + translate_z(size.z) + cube([size.x - 0.1, size.y, eps], center = true); + + color(colour) + translate_z(size.z) + linear_extrude(2 * eps) { + t = digit[2]; + a = digit[3]; + sq = [digit.x - 2 * t, (digit.y - 3 * t) / 2]; + + multmatrix([ // Skew + [1, tan(a), 0, 0], + [0, 1, 0, 0], + [0, 0, 1, 0], + [0, 0, 0, 1] + ]) + difference() { + square([digit.x, digit.y], center = true); + + for(y = [-1, 1], x = [-1, 1]) { + translate([0, y * (t + sq.y) / 2]) + square(sq, center = true); + + + translate([x * digit.x / 2, y * digit.y / 2]) + rotate(-45 * x * y) { + square([10, t], center = true); + + square([t / 5, 10], center = true); + } + + translate([x * (digit.x - t) / 2, 0]) + rotate(45) { + square([t / 5, t * 2], center = true); + + square([t * 2, t / 5], center = true); + + translate([x * t / 2, -x * t / 2]) + square([t, t], center = true); + } + } + } + r = 1.25 * t / 2; + translate([digit.x / 2 - r + digit.y / 2 * tan(a), -digit.y / 2 + r]) + circle(r); + } + + color(silver) + translate_z(-pin_length) + linear_extrude(pin_length) + for(x = [0 : 1 : pins.x - 1], y = [0 : 1 : pins.y - 1]) + translate([(x - (pins.x - 1) / 2) * pin_pitch.x, (y - (pins.y - 1) / 2) * pin_pitch.y]) + circle(d = pin_pitch[2], $fn = 16); +} + +module 7_segment_digits(type, n, colour = grey(70), pin_length = 6.4, cutout = false) { //! Draw n digits side by side + size = 7_segment_size(type); + + if(cutout) + linear_extrude(100) + square([n * size.x, size.y], center = true); + else + for(i = [0 : 1 : n - 1]) + translate([(i - (n - 1) / 2) * size.x, 0]) + 7_segment_digit(type, colour, pin_length); +} diff --git a/vitamins/7_segments.scad b/vitamins/7_segments.scad new file mode 100644 index 0000000..3a30c3c --- /dev/null +++ b/vitamins/7_segments.scad @@ -0,0 +1,28 @@ +// +// NopSCADlib Copyright Chris Palmer 2021 +// 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 . +// + +// +//! 7 Segment displays +// + +WT5011BSR = ["WT5011BSR", [12.7, 19, 8.2], [7.2, 12.7, 1.2, 10], [5, 2], [inch(0.1), inch(0.6), 0.4]]; + +7_segments = [ WT5011BSR ]; + +use <7_segment.scad> diff --git a/vitamins/pcbs.scad b/vitamins/pcbs.scad index 90dbed1..98a1c2a 100644 --- a/vitamins/pcbs.scad +++ b/vitamins/pcbs.scad @@ -22,6 +22,8 @@ include include include include +include <7_segments.scad> +include // // l w t r h l c b h