Models / Solstice lantern
Solstice lantern
Solstice: a lantern with two sun walls and two moon walls, held between a base and an open crown by tabs. For a battery LED, not a candle.
Download size: 522.8 × 307.3 mm. 7 parts on 1 sheet.
Source
// Solstice: a lantern with two sun walls and two moon walls, held between a
// base and an open crown by tabs. For a battery LED, not a candle.
/* [Lantern] */
// Wall height between base and crown
height = 170; // [160:5:210]
// Add a small test piece with three slot widths
fit_coupon = true;
// Scored rings and lines
score_detail = true;
/* [Material] */
// Sheet thickness
$thickness = 3; // [2.5:0.1:4]
// Beam width
$kerf = 0.15; // [0:0.01:0.3]
// Added to slot width and length, for a slip fit
clearance = 0.15; // [0:0.05:0.4]
/* [Hidden] */
$material = "birch plywood";
$sheet = [600, 400];
$gap = 5;
$fn = 96;
w = 94;
span = 100;
foot = 116;
tab_w = 10;
tab_x = 28;
t = $thickness;
cy = height * 0.53;
module kite(rx, ry) polygon([[0, ry], [rx, 0], [0, -ry], [-rx, 0]]);
module rosette(moon = false) {
if (moon) difference() {
circle(r = 10);
translate([4, 2]) circle(r = 9);
} else star(8, 10, 5.6);
for (a = [0:45:315]) rotate(a + (moon ? 22.5 : 0)) {
polygon([[14, 0], [19, -5], [24, 0], [19, 5]]);
polygon([[28, 0], [32, -5.8], [37, 0], [32, 5.8]]);
}
}
module wall_blank() union() {
translate([-w / 2, 0]) rect([w, height]);
for (x = [-tab_x, tab_x]) {
translate([x - tab_w / 2, -t]) rect([tab_w, t + 0.5]);
translate([x - tab_w / 2, height - 0.5]) rect([tab_w, t + 0.5]);
}
}
module wall(moon = false) {
difference() {
wall_blank();
translate([0, cy]) rosette(moon);
// A fan of five kites at the top and bottom
for (x = [-28, -14, 0, 14, 28]) {
translate([x, height - 20 - abs(x) * 0.12]) kite(3.1, 10 - abs(x) * 0.1);
translate([x, 21 + abs(x) * 0.12]) kite(3.1, 10 - abs(x) * 0.1);
}
// Pinhole stars
for (x = [-39, 39], y = [25, 45, height - 45, height - 25])
translate([x, y]) circle(d = 2.4);
}
if (score_detail) score() {
translate([-42, 6]) outline() rect([84, height - 12]);
translate([0, cy]) {
outline() circle(r = 11.8);
outline() circle(r = 26);
outline() circle(r = 39.5);
for (a = [0:45:315]) rotate(a + (moon ? 22.5 : 0)) line([10.8, 0], [39.5, 0]);
}
for (s = [-1, 1])
polyline([[-34, cy + s * 44], [-20, cy + s * 52], [0, cy + s * 45], [20, cy + s * 52], [34, cy + s * 44]]);
}
}
module sockets(extra = clearance) {
for (a = [0:90:270]) rotate(a)
for (x = [-tab_x, tab_x])
translate([x, span / 2]) rect([tab_w + extra, t + extra], center = true);
}
module plate(top = false) {
difference() {
rect([foot, foot], center = true, r = 6);
sockets();
if (top) rect([80, 80], center = true, r = 10);
}
if (score_detail) score() {
outline() rect([108, 108], center = true, r = 3);
if (top) outline() rect([86, 86], center = true, r = 12);
else {
outline() circle(d = 48);
outline() circle(d = 54);
for (a = [0:30:330]) rotate(a) line([29, 0], [34, 0]);
}
}
if (!top) engrave() {
translate([0, -37]) text("SOLSTICE", size = 5, halign = "center", valign = "center");
translate([0, 37]) text("LED ONLY", size = 3.4, halign = "center", valign = "center");
}
}
// Assembled: the walls stand in the base round the middle, sun walls facing
// each other, and the crown sits on their top tabs
function wall_at(a) = [(span / 2 - t / 2) * sin(a), -(span / 2 - t / 2) * cos(a), t];
step("Plug the four walls into the base, sun walls facing each other") {
part("Sun wall", qty = 2, at = [wall_at(0), wall_at(180)], rotate = [[90, 0, 0], [90, 0, 180]]) wall(false);
part("Moon wall", qty = 2, at = [wall_at(90), wall_at(270)], rotate = [[90, 0, 90], [90, 0, 270]]) wall(true);
part("Base", at = [0, 0, 0]) plate(false);
}
step("Lower the crown onto the top tabs and leave it loose")
part("Crown", at = [0, 0, t + height]) plate(true);
// The fit test lies on the table beside the lantern
if (fit_coupon) part("Fit test", at = [foot / 2 + 20, -foot / 2, 0]) {
difference() {
rect([68, 26], r = 3);
for (i = [0:2]) translate([13 + i * 21, 13])
rect([tab_w + clearance, t + clearance + (i - 1) * 0.1], center = true);
}
engrave() for (i = [0:2]) translate([13 + i * 21, 21])
text(str(round(100 * (t + clearance + (i - 1) * 0.1)) / 100), size = 2.8, halign = "center", valign = "center");
score() translate([34, 5]) text("SLOT WIDTH / mm", size = 2.5, halign = "center", valign = "center");
}
// Assembly: plug the four walls into the base, sun walls facing each other,
// then lower the crown onto the top tabs. Leave the crown loose so the LED
// can be reached; it sits on the scored circle in the base.