Files
wordclock/cad/openscad/rueckwand.scad
T

125 lines
5.4 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, hier zusätzlich unten rechts,
// 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.
// Die Steckschlitze nehmen die Füße der Trennwände aus trennwaende.scad auf.
// 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, hier zusätzlich unten rechts,
// 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.
include <gemeinsam.scad> // Rahmengröße (rahmen_cm), Wortliste, Fußpositionen
// ---------- Einstellungen ----------
// Welcher Teil soll ausgegeben werden?
teil = "beide"; // ["beide" (Vorschau), "schneiden", "gravur"]
fase_mm = 10; // abgeschrägte Ecken oben links und unten rechts (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)
dicke_mm = 0; // 0 = flache 2D-Ausgabe (für Laser/DXF), >0 = 3D-Vorschau
fase = fase_mm;
// 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 + fase], [h - fase, -h], [-h, -h], [-h, h - fase]]);
}
// Steckschlitze für die Füße der Trennwände (siehe trennwaende.scad):
// drei je Wand, Position nur für genau diese Wand passend.
module schlitze() {
for (n = [1 : zeilen - 1], c = fuss_spalten[n - 1])
translate([zx(c), wand_y(n)])
square([schlitz_b, mdf_mm + toleranz], center = true);
}
// Nummer der Trennwand (von oben nach unten) im linken Rand neben ihrem Schlitz
module wandnummern() {
for (n = [1 : zeilen - 1])
translate([-platte / 2 + rand_mm / 2, wand_y(n)])
text(str(n), size = 4 * mass, font = "Liberation Sans:style=Bold",
halign = "center", valign = "center");
}
// 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 = 7 * mass;
r = z % 2 == 0 ? 1 : -1;
x0 = r > 0 ? zx(0) - raster_a / 2 + 2 : zx(spalten - 1) + raster_a / 2 - 2;
// unter der Trennwand (Mitte der Lücke), damit sie nicht verdeckt wird
translate([x0, zy(z) - raster_a / 2 - (mdf_mm / 2 + 0.3 + l * 0.18)]) {
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 = 2.2 * 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);
wandnummern();
}
// "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)));