From 4944aa24cea4834791f360181715e20e98deb9bc Mon Sep 17 00:00:00 2001 From: Claude Code Date: Sat, 17 Oct 2026 12:10:15 +0200 Subject: [PATCH] Rueckwand: LED-Streifen je Wort, S von EINS einzeln, DATA-Pfeile pro Zeile, Raster unabhaengig von Software Co-Authored-By: Claude Sonnet 5.5 --- cad/openscad/rueckwand.scad | 93 +++++++++++++++++++++++++++++++------ 1 file changed, 79 insertions(+), 14 deletions(-) diff --git a/cad/openscad/rueckwand.scad b/cad/openscad/rueckwand.scad index 7ad08e2..90fd70e 100644 --- a/cad/openscad/rueckwand.scad +++ b/cad/openscad/rueckwand.scad @@ -6,6 +6,19 @@ // Export als 2D: F6 rendern, dann Datei -> Export -> als DXF / SVG. // Für den Laser: erst teil = "schneiden", dann teil = "gravur" exportieren. +// Rückwand der Wortuhr (Trägerplatte für die LEDs) für IKEA SANNAHED +// Vorlage: cad/ALT/Rueckwand-mit-Gravuren.dxf (abgeschrägte Ecke oben links, +// LED-Streifen als Rechtecke, LED-Markierungen als Kreise, Richtungspfeile). +// Das Buchstabenraster ist identisch mit wortfolie.scad, damit die Streifen unter +// den Wörtern sitzen. Die Wortliste unten ist unabhängig von der Software. +// +// Pro Wort wird ein Stück LED-Streifen (60 LED/m = 16,67 mm Abstand) am Stück +// aufgeklebt. Passt es nicht in die Wortbreite, wird eine LED weggekürzt. Die Lücken +// zwischen den Streifenstücken werden mit Kabel (+5V, GND, DATA) überbrückt. +// +// Export als 2D: F6 rendern, dann Datei -> Export -> als DXF / SVG. +// Für den Laser: erst teil = "schneiden", dann teil = "gravur" exportieren. + // ---------- Einstellungen ---------- // Rahmengröße (Bildfläche des SANNAHED): 25, 35 oder 50 (cm) rahmen_cm = 25; // [25, 35, 50] @@ -15,26 +28,49 @@ teil = "beide"; // ["beide" (Vorschau), "schneiden", "gravur"] spiel_mm = 1; // Luft pro Seite zwischen Platte und Rahmen-Innenmaß rand_mm = 15; // wie in wortfolie.scad (muss gleich bleiben!) -fase_anteil = 0.087; // abgeschrägte Ecke oben links, relativ zur Plattenkante +fase_mm = 10; // abgeschrägte Ecke oben links (klein genug für den Minutenpunkt) +led_pitch = 1000 / 60; // LED-Abstand des Streifens (60 LED/m) +streifen_b = 10; // Breite des LED-Streifens (WS2812) led_marke_d = 5; // Ø der LED-Markierungen (Gravur) schlitz_b = 10; // Kabeldurchführung zwischen den Zeilen (Breite) schlitz_h = 3.5; // und Höhe -pfeil_l = 12; // Länge des Richtungspfeils (Gravur) +minutenpunkte = true; // 4 einzelne LEDs in den Ecken (wie in wortfolie.scad) dicke_mm = 0; // 0 = flache 2D-Ausgabe (für Laser/DXF), >0 = 3D-Vorschau // ---------- Raster ---------- spalten = 11; zeilen = 10; +// Wörter mit LED-Streifen: [Zeile, erste Spalte, Anzahl Buchstaben, Name] +// Zeile 0 = oben, Spalte 0 = links. Das "S" von EINS ist ein eigener Streifen, +// damit es bei "ein Uhr" (EIN) aus und bei "viertel vor eins" (EINS) an sein kann. +woerter = [ + [0, 0, 2, "ES"], [0, 3, 3, "IST"], [0, 7, 4, "FÜNF"], + [1, 0, 7, "ZWANZIG"], [1, 7, 4, "ZEHN"], + [2, 0, 7, "VIERTEL"], [2, 8, 3, "VOR"], + [3, 0, 4, "HALB"], [3, 7, 4, "NACH"], + [4, 0, 4, "NEUN"], [4, 7, 4, "FÜNF"], + [5, 0, 4, "ZWEI"], [5, 7, 3, "EIN"], [5, 10, 1, "S"], + [6, 0, 4, "DREI"], [6, 7, 4, "VIER"], + [7, 0, 4, "ACHT"], [7, 6, 5, "SECHS"], + [8, 0, 6, "SIEBEN"], [8, 6, 5, "ZWÖLF"], + [9, 0, 3, "UHR"], [9, 4, 3, "ELF"], [9, 7, 4, "ZEHN"] +]; + platte = rahmen_cm * 10 - 2 * spiel_mm; feld = platte - 2 * rand_mm; raster_a = feld / spalten; -fase = platte * fase_anteil; +fase = fase_mm; +mass = raster_a / 19.8; // Skalierung der Beschriftung // Zellenmitte (Spalte s, Zeile z), Ursprung = Plattenmitte, y nach oben function zx(s) = (s - (spalten - 1) / 2) * raster_a; function zy(z) = ((zeilen - 1) / 2 - z) * raster_a; +// Anzahl LEDs, die am Stück in die Wortbreite passen (höchstens eine je Buchstabe) +function led_anzahl(w) = min(w[2], floor(w[2] * raster_a / led_pitch)); +function streifen_x(w) = (zx(w[1]) + zx(w[1] + w[2] - 1)) / 2; // Mitte des Wortes + // ---------- Teile ---------- module umriss() { h = platte / 2; @@ -49,22 +85,48 @@ module schlitze() { square([schlitz_b, schlitz_h], center = true); } -module led_marken() { - for (z = [0 : zeilen - 1], s = [0 : spalten - 1]) - translate([zx(s), zy(z)]) circle(d = led_marke_d, $fn = 32); +// Ein Streifenstück je Wort: Umriss + LED-Markierungen, mittig unter dem Wort +module streifen(w) { + k = led_anzahl(w); + translate([streifen_x(w), zy(w[0])]) { + difference() { + square([k * led_pitch, streifen_b], center = true); + square([k * led_pitch - 0.6, streifen_b - 0.6], center = true); + } + for (i = [0 : k - 1]) + translate([(i - (k - 1) / 2) * led_pitch, 0]) circle(d = led_marke_d, $fn = 32); + } } -// Pfeil in Laufrichtung der ersten Zeile (nach rechts), über Zeile 0 -module pfeil() { - translate([zx(0), zy(0) + raster_a * 0.75]) { - translate([0, -pfeil_l * 0.07]) square([pfeil_l * 0.6, pfeil_l * 0.14]); - translate([pfeil_l * 0.6, 0]) - polygon([[0, -pfeil_l * 0.18], [pfeil_l * 0.4, 0], [0, pfeil_l * 0.18]]); +module minuten_marken() { + if (minutenpunkte) + for (sx = [-1, 1], sy = [-1, 1]) + translate([sx * (platte / 2 - rand_mm / 2), sy * (platte / 2 - rand_mm / 2)]) + circle(d = led_marke_d, $fn = 32); +} + +// Pfeil mit Beschriftung DATA unter jeder Zeile, am Zeilenanfang. +// Die Reihen laufen im Zickzack: gerade Zeilen nach rechts, ungerade nach links. +module pfeil(z) { + l = 12 * mass; + r = z % 2 == 0 ? 1 : -1; + x0 = r > 0 ? zx(0) - raster_a / 2 + 2 : zx(spalten - 1) + raster_a / 2 - 2; + translate([x0, zy(z) - raster_a / 2]) { + translate([r > 0 ? 0 : -l * 0.6, -l * 0.07]) square([l * 0.6, l * 0.14]); + translate([r * l * 0.6, 0]) + polygon([[0, -l * 0.18], [r * l * 0.4, 0], [0, l * 0.18]]); + translate([r * (l + 2 * mass), 0]) + text("DATA", size = 3 * mass, font = "Liberation Sans", + halign = r > 0 ? "left" : "right", valign = "center"); } } module schnitt() { difference() { umriss(); schlitze(); } } -module gravur() { led_marken(); pfeil(); } +module gravur() { + for (w = woerter) streifen(w); + minuten_marken(); + for (z = [0 : zeilen - 1]) pfeil(z); +} // "beide" ist nur eine Vorschau: die Gravur erscheint als Aussparung in der Platte. // Zum Lasern teil = "schneiden" und teil = "gravur" getrennt exportieren. @@ -79,4 +141,7 @@ if (dicke_mm > 0) { if (teil != "schneiden") translate([0, 0, dicke_mm]) linear_extrude(0.2) gravur(); } else ausgabe_2d(); -echo(str("Platte ", platte, " x ", platte, " mm, Zellenabstand ", raster_a, " mm")); +for (w = woerter) + echo(str(w[3], ": ", led_anzahl(w), " LEDs", led_anzahl(w) < w[2] ? " (gekürzt!)" : "")); +echo(str("Platte ", platte, " x ", platte, " mm, Zellenabstand ", raster_a, " mm, LEDs gesamt: ", + len([for (w = woerter) for (i = [1 : led_anzahl(w)]) 1]) + (minutenpunkte ? 4 : 0)));