148 lines
6.2 KiB
OpenSCAD
148 lines
6.2 KiB
OpenSCAD
// 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-Markierungen als Kreise, Durchführungen für die Kabel, Richtungspfeil).
|
|
// Das LED-Raster ist identisch mit wortfolie.scad, damit LEDs und Buchstaben passen.
|
|
//
|
|
// 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]
|
|
|
|
// Welcher Teil soll ausgegeben werden?
|
|
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_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
|
|
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 = 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;
|
|
polygon([[-h + fase, h], [h, h], [h, -h], [-h, -h], [-h, h - fase]]);
|
|
}
|
|
|
|
// Kabeldurchführungen: die LED-Reihen laufen im Zickzack,
|
|
// Zeile 0 von links nach rechts, Zeile 1 zurück usw.
|
|
module schlitze() {
|
|
for (z = [0 : zeilen - 2])
|
|
translate([zx(z % 2 == 0 ? spalten - 1 : 0), (zy(z) + zy(z + 1)) / 2])
|
|
square([schlitz_b, schlitz_h], center = true);
|
|
}
|
|
|
|
// 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);
|
|
}
|
|
}
|
|
|
|
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() {
|
|
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.
|
|
module ausgabe_2d() {
|
|
if (teil == "schneiden") schnitt();
|
|
else if (teil == "gravur") gravur();
|
|
else difference() { schnitt(); gravur(); }
|
|
}
|
|
|
|
if (dicke_mm > 0) {
|
|
linear_extrude(dicke_mm) schnitt();
|
|
if (teil != "schneiden") translate([0, 0, dicke_mm]) linear_extrude(0.2) gravur();
|
|
} else ausgabe_2d();
|
|
|
|
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)));
|