u23-gameconsole-body/buttons.scad

250 lines
6.3 KiB
OpenSCAD
Raw Normal View History

2022-06-01 08:29:44 +02:00
/*************************************************************************
* Hülle für die u23-Spielekonsole. *
* Buttons. *
* *
* Autor: Shy *
* License: CC0 *
*************************************************************************/
2024-01-22 11:40:28 +01:00
include <front.scad>;
include <lib/colors.scad>;
2022-06-01 08:29:44 +02:00
/* Maße relevanter Bauteile:
*
* Kurzhubtaster Pads:
* PTS645SL50-2 LFS
* H Taster: 5 mm
* H Gehäuse: 3.45 mm
* D Taster: 3.5 mm
*
* Kurzhubtaster unten:
* PTS645SK43SMTR92 LFS
* H Taster: 4.3 mm
* H Gehäuse: 4.3
* D Taster: 3.5 mm
*
* Schalter an der Schulter:
* D2FS-FL-N-A
* H: 5.8 mm
* B: 12.8 mm
*/
// Überstand der Buttons über die Hülle.
protrusion = 2;
// Tiefe des Zeichnungen auf den Buttons.
2022-06-04 18:11:15 +02:00
carving = 0.25;
2022-06-01 08:29:44 +02:00
// Buttons haben runde Kanten. (Rechenaufwendiger.)
beveled = true;
// Größe der Rundung.
bevel_size = 1;
// Spiel zwischen den Schulterbuttons und der Hülle.
2024-01-17 06:08:13 +01:00
button_trigger_clearance = 0.4;
2022-06-01 08:29:44 +02:00
2024-01-17 06:08:13 +01:00
// Dicke der Widerhaken der Schulterbuttons.
button_trigger_hooks = 2.75;
// Höhe der "Schienen" auf der Unterseite der Schulterbuttons.
button_trigger_rails = 0.2;
2022-06-01 08:29:44 +02:00
// Gesamthöhe der Systembuttons.
2023-12-19 15:20:12 +01:00
system_height = space - button_system_size - button_clearance + top + protrusion;
2022-06-01 08:29:44 +02:00
// Gesamthöhe der Aktionsbuttons.
2023-12-19 15:20:12 +01:00
action_height = space - button_action_size - button_clearance + top + protrusion;
2022-06-01 08:29:44 +02:00
/**************************************************************************
* Einzelteile. *
*************************************************************************/
// Aktions-Buttons.
module action_buttons() {
// Basis.
linear_extrude(height = button_action_base) {
import("./svg/buttons action base.svg");
}
difference() {
// Hauptteil.
linear_extrude(height = action_height) {
import("./svg/buttons action main.svg");
}
// Zeichnung.
translate([0, 0, action_height - carving])
linear_extrude(height = carving) {
import("./svg/buttons action carvings.svg");
}
}
}
// Schulter-Buttons.
module trigger_button() {
// Basis.
linear_extrude(height = button_trigger_hooks) {
2022-06-01 08:29:44 +02:00
import("./svg/buttons trigger lower.svg");
}
linear_extrude(height = space - button_trigger_clearance - button_trigger_rails) {
2022-06-01 08:29:44 +02:00
import("./svg/buttons trigger upper.svg");
}
linear_extrude(height = space - button_trigger_clearance) {
import("./svg/buttons trigger rails.svg");
}
2022-06-01 08:29:44 +02:00
}
// System-Buttons.
module system_button() {
// Höhe, Basis, Breite.
h = system_height;
b = button_system_base;
2022-06-07 19:13:32 +02:00
w = 3.5;
2022-06-01 08:29:44 +02:00
polyhedron(points = [
// Unterseite
[1, 0, 0],
2022-06-07 19:13:32 +02:00
[9.5, 0, 0],
[10.5, b, 0],
[8.5, b, 0],
[8.5, h, 0],
2022-06-01 08:29:44 +02:00
[2, h, 0],
[2, b, 0],
[0, b, 0],
// Oberseite
[1, 0, w],
2022-06-07 19:13:32 +02:00
[9.5, 0, w],
[10.5, b, w],
[8.5, b, w],
[8.5, h, w],
2022-06-01 08:29:44 +02:00
[2, h, w],
[2, b, w],
[0, b, w]
], faces = [
[0, 1, 2, 3, 4, 5, 6, 7],
[0, 8, 9, 1],
[1, 9, 10, 2],
[2, 10, 11, 3],
[3, 11, 12, 4],
[4, 12, 13, 5],
[5, 13, 14, 6],
[6, 14, 15, 7],
[7, 15, 8, 0],
[15, 14, 13, 12, 11, 10, 9, 8]
]);
}
// Abgerundeter Button. Nur der Hauptteil.
module beveled_button (r=1, h=1, b=1) {
union() {
cylinder(h=h - b, r=r, $fn=24);
translate([0, 0, h-b*2])
minkowski() {
cylinder(h=b, r=r-b, $fn=24);
sphere(r=b, $fn=24);
}
}
}
// Kreuz-Button.
module cross (l=12, w=4, h=2) {
translate([0, 0, h/2])
union() {
cube([l, w, h], center=true);
rotate([0, 0, 90])
cube([l, w, h], center=true);
}
}
// Kreuz-Button mit abgerundeten Kanten.
module beveled_cross (l=12, w=4, h=2, b=1) {
union() {
minkowski() {
cross(l-b*2, w-b*2, h-b*2);
cylinder(r=b, h=b, $fn=12);
}
translate([0, 0, h-b*2])
minkowski() {
cross(l-b*2, w-b*2, b);
sphere(r=b, $fn=12);
}
}
}
// Aktionsbuttons mit abgerundeten Kanten.
module beveled_action(bevel=1) {
// Basis.
linear_extrude(height = button_action_base) {
import("./svg/buttons action base.svg");
}
difference() {
union() {
// Plaztiere das Kreuz auf der Basis.
translate([12, 12, 0])
beveled_cross(l=24, w=8, h=action_height, b=bevel);
// Platziere vier Buttons auf der Basis.
for (pos = [[31, 7], [41, 17], [53, 7], [63, 17]]) {
translate([pos.x, pos.y, 0])
beveled_button(r=5, h=action_height, b=bevel);
}
}
// Die Zeichnungen auf der Oberseite.
translate([0, 0, action_height - carving])
linear_extrude(height = carving) {
import("./svg/buttons action carvings.svg");
}
}
}
/**************************************************************************
* Anordnung. *
*************************************************************************/
// Render nur die Buttons, nicht die eingebundene Datei <front.scad>.
!if(true) {
// Aktions-Buttons.
2024-01-17 01:12:52 +01:00
translate([0, 10, 0])
2022-06-01 08:29:44 +02:00
if(beveled) {
color(color_buttons)
beveled_action(bevel_size);
} else {
color(color_buttons)
action_buttons();
}
// Schulterbuttons.
color(color_buttons)
2024-01-17 01:12:52 +01:00
translate([40, 0, 0])
2022-06-01 08:29:44 +02:00
rotate([0, 0, 180])
trigger_button();
color(color_buttons)
2024-01-17 01:12:52 +01:00
translate([0, 0, 0])
2022-06-01 08:29:44 +02:00
rotate([0, 0, 180])
mirror([1, 0, 0])
trigger_button();
// Drucke drei Systembuttons nebeneinander.
color(color_buttons)
2022-06-07 19:13:32 +02:00
for (i = [0, 11.5, 23]) {
2024-01-17 01:12:52 +01:00
translate([i, 2, 0])
2022-06-01 08:29:44 +02:00
system_button();
}
// Verbinde die dreit Buttons mit einem dünnen Steg.
color(color_buttons)
2024-01-17 01:12:52 +01:00
translate([1, 2 + button_system_base / 2, 0])
2022-06-07 19:13:32 +02:00
cube([30, 1, 3.5]);
2022-06-01 08:29:44 +02:00
};