Новый Год – время украшать ёлку. И если у вас, как и у меня, в последний момент оказалось, что для ёлки есть гирлянда, 3D-принтер, немного прозрачного пластика, но нет звезды, можно попытаться сделать её самостоятельно. Именно об этом и пойдет речь ниже.
Описываемая звезда изначально задумывалась для пропускания через себя шести малогабаритных адресных светодиодов WS2812B из китайской гирлянды, ссылка на которую прикреплена к обзору. Пример её светодиода изображен ниже, и от стандартного WS2818В в корпусе 5050 он отличается, в том числе, пониженным потреблением:
Однако, ничего не мешает использовать звезду и как-нибудь иначе. Как именно – каждый сможет придумать сам, так как модель сделана в OpenSCAD, что позволит достаточно быстро поменять её размеры или конфигурацию.
Почему OpenSCAD
На муське часто возникают активные споры на тему OpenSCAD-vs-классический-CAD. Защитников обеих позиций достаточно. Почему же OpenSCAD лично для меня?
Начну с того, что я очень уважаю 3D-дизайнеров, работающих в SolidWorks или в чем-то аналогичном. Я уверен, они – профессионалы своего дела и сделают такую модель гораздо быстрее. Но, к сожалению, последний раз я работал с SolidWorks в институте. За это время все навыки забылись, да и SW, наверняка, тоже изменился. К этому добавляется отсутствие бесплатной версии (лучший вариант, что я недавно нашел, это сломанная версия, поставляющаяся как образ для VMWare вместе с операционной системой).
В OpenSCAD же я для себя вижу следующие плюсы:
• Бесплатный.
• Развивает пространственное мышление, т.к. модель желательно построить сначала «в голове».
• Для некоторых задач OpenSCAD оказывается весьма эффективен, т.к. модель получается полностью параметрической.
• Как разработчику, мне нравится подход Model-as-a-code, жалко, что язык там не императивный (традиционный, выполняемый последовательно), а функциональный. Я бы сделал совершенно иначе, но, что есть – то есть.
Внешний вид готовой модели представлен на рисунке ниже:
Звезда состоит из двух одинаковых половинок, печатающихся отдельно. Затем половинки соединяются с помощью пластиковых шпилек и скрепляются специальной крышечкой около основания (посадочного места на ёлку). Дополнительно, по бокам от основания в звезде есть два отверстия для пропускания гирлянды – «вход» и «выход».
Рассмотрим процесс создания звезды подробней. Те, кому это не интересно, могут сразу перейти в конец обзора, где будут размещены фотографии получившейся звезды и исходный код модели. Код может быть использован в любых целях без ограничений.
Отмечу, что при работе в OpenSCAD я использую библиотеку
BOSL, предоставляющую множество полезных функций и дополнительных моделей для ускорения процесса проектирования и некоторого его упрощения. В коде данной модели будут активно использоваться её функции (модули).
Я сразу решил, что звезда будет состоять из двух половинок, т.к. напечатать каким-либо другим путем без использования поддержек фигуру такой формы невозможно. Что ж, начнем с половинки звезды. Быстрое изучение вопроса показало, что стандартного модуля, создающего то, что мне нужно – нет, поэтому напишем свой. Простейший способ – это создать 3D-объект по координатам, используя функцию
polyhedron. Не проблема – всё, что нам нужно знать – это то, что угол вершины звезды составляет 36°, а его половина, соответственно, 18°. Напишем код, создающий одну вершину:
module StarVertex(r, h)
{
x = r*tan(18);
polyhedron(
points = [[0, r, 0], [-x, 0, 0], [x, 0, 0], [0, 0, h]],
faces = [[0, 3, 1], [0, 2, 3], [0, 1, 2], [1, 3, 2]]
);
}
Параметр r задает радиус описанной окружности звезды, h – высоту центральной точки по оси Z. В итоге, получаем:
Теперь осталось лишь повторить вершину 5 раз с соответствующим поворотом вокруг оси Z. Для этого воспользуемся функцией
zring(5) из библиотеки BOSL:
Отлично, звезда готова! Сложно? Не очень. Здесь хотелось бы отметить следующее – читал неоднократно жалобы, что функция polyhedron в OpenSCAD «глючная» и работает плохо. Это не так. Для этой функции важно, чтобы точки каждой поверхности перечислялись по часовой стрелке (если смотреть на поверхность извне), а не против. Если соблюдать это простое правило, функция будет работать «как часы». Это, кстати, написано в документации (но кто ж её читает).
На данный момент звезда выглядит как-то просто. Надо сделать внешнюю поверхность не гладкой, а рифленой, добавить в звезду «лучей». Это будет уже чуть посложней, код выглядит следующим образом:
module StarVertexCorrugations(r, h)
{
s18 = sin(18);
c18 = cos(18);
function crd(l) = [s18*l + 2*EPS, r - c18*l, -EPS];
function crdd(l, d) = [s18*l - c18*d, r - c18*l - s18*d, -EPS];
module ray(l1, l2, d)
{
polyhedron(
points = [crd(l1), crdd((l1 + l2)/2, d), crd(l2), [0, 0, h]],
faces = [[0, 1, 2], [0, 3, 1], [0, 2, 3], [1, 3, 2]]
);
}
module rays()
{
for (i = [0:3])
{
s = 6;
p = 8 + s*2*i;
ray(p, p + s, CD);
}
}
difference()
{
StarVertex(r, h);
rays();
xflip()
rays();
}
}
Здесь уже параметры «рифления» просто подобраны и внесены в код как числа. Если захотите подстроить под себя – придется менять по месту (или вынести в константы). Внешний вид луча:
И звезда целиком:
Что ж, на этом с внешней формой можно закончить, пора приниматься за внутренности. Прежде всего, сделаем звезду полой. Для этого вырежем из рифленой звезды гладкую, но чуть меньшего размера:
module HalfStar()
{
difference()
{
zring(n = 5)
StarVertexCorrugations(D/2, H);
down(EPS)
zring(n = 5)
StarVertex(D/2 - T/tan(18), H - T);
}
}
Здесь D – это параметр, задающий диаметр звезды (150 мм у меня), а Т – толщина (1.8 = 0.6*3 мм).
Теперь напишем вспомогательные модули – Star будет создавать звезду целиком (две половинки), SolidStar будет создавать полнотелую звезду, чтобы её можно было использовать для геометрических операций, а FullStar будет создавать итоговую модель:
module Star()
{
if (TOP)
HalfStar();
if (BOTTOM)
zflip()
HalfStar();
}
module SolidStar()
{
if (TOP)
zring(n = 5)
StarVertexCorrugations(D/2, H);
if (BOTTOM)
zflip()
zring(n = 5)
StarVertexCorrugations(D/2, H);
}
module FullStar()
{
difference()
{
union()
{
Star();
AdditionalElements();
}
AdditionalHoles();
}
}
При создании итоговой модели будем использовать два дополнительных модуля – AdditionalElements будет создавать все дополнительные элементы, а AdditionalHoles – вырезать все дополнительные полости.
Опуская дополнительные подробности описания создания внутренних элементов (исходный код модели можно будет посмотреть ниже), получаем вот такую половину звезды, готовую к печати:
Что было добавлено – втулки для шпилек, которыми будут скрепляться две половинки с дополнительными опорными кольцами толщиной 0.2 мм для лучшей адгезии к столу при печати (после печати их следует удалить), центральная часть с полостью для 6-го светодиода, ножка крепления на верхушку ёлки и два отверстия для входящего и выходящего проводов.
Печатать модель надо «вверх ногами» относительно картинки, чтобы плоскость разреза опиралась на стол. Я использовал сопло диаметром 0.6 мм, слой толщиной 0.2 мм и прозрачный PETG пластик. Печать со скоростью 50/35 мм/с заняла примерно 110 минут (на каждую половинку). Затем следует распечатать шпильки крепления и крышечку (функции Pins и Cap):
Диаметр шпилек следует подобрать экспериментально, он зависит от того, на сколько принтер зауживает внутренние отверстия. Правильно подобранные шпильки должны входить в отверстия втулок с достаточным, но не чрезмерным усилием. У меня с текущими настройками принтера диаметр получился 3.6 мм (при заданном диаметре отверстия втулки 4 мм).
После печати шпильки вклеиваются в одну половинку звезды с помощью подходящего клея. Для PETG я использую дихлорметан, он растворяет PETG и поэтому отлично склеивает. Однако, следует иметь в виду, что дихлорметан имеет 4-й класс опасности (вещества малоопасные), так что при работе с ним следует соблюдать технику безопасности. Всем известным и «любимым» дихлорэтаном пользоваться не стоит, т.к. при тех же практических свойствах его класс опасности 2-й, то есть «вещества высокоопасные». Приобрести дихлорметан можно, например, на
Озоне.
Последовательность действий после высыхания клея такая – пропустить через одну половинку звезды гирлянду со светодиодами, аккуратно совместить половинки так, чтобы шпильки попали в предназначенные для них отверстия другой половинки, после чего сжать звезду, зафиксировав шпильки за счет силы трения. При необходимости звезду можно будет впоследствии легко разобрать и снова собрать. Завершающим этапом будет надевание колпачка на ножку и размещение звезды непосредственно на ёлке. Выглядит это примерно так:
Ну, и работающая звезда выглядит следующим образом:
Итоги
Звезда получилась неплохая, свою функцию выполняет, ёлка смотрится завершенной. Немного плохо виден средний светодиод, возможно, следовало использовать меньше пластика в этом месте. А, ну и забыл сказать – перед созданием своей искал что-то подходящее на
https://www.thingiverse.com, но не нашел.
Ну что ж, дорогие читатели, надеюсь, вам понравился этот обзор, спасибо, что посмотрели. Критика, позитивные и негативные комментарии, а также вопросы по модели приветствуются.
С Наступающим Новым Годом, денежных средств, добра, любви, процветания!
Код модели
EPS = 0.001;
$fn = $preview ? 32 : 128;
GAP = 0.2;
include <BOSL/transforms.scad>
use <BOSL/shapes.scad>
H = 20;
D = 150;
T = 1.8;
CD = 0.8;
TOP = 0;
BOTTOM = 1;
module StarVertex(r, h)
{
x = r*tan(18);
polyhedron(
points = [[0, r, 0], [-x, 0, 0], [x, 0, 0], [0, 0, h]],
faces = [[0, 3, 1], [0, 2, 3], [0, 1, 2], [1, 3, 2]]
);
}
module StarVertexCorrugations(r, h)
{
s18 = sin(18);
c18 = cos(18);
function crd(l) = [s18*l + 2*EPS, r - c18*l, -EPS];
function crdd(l, d) = [s18*l - c18*d, r - c18*l - s18*d, -EPS];
module ray(l1, l2, d)
{
polyhedron(
points = [crd(l1), crdd((l1 + l2)/2, d), crd(l2), [0, 0, h]],
faces = [[0, 1, 2], [0, 3, 1], [0, 2, 3], [1, 3, 2]]
);
}
module rays()
{
for (i = [0:3])
{
s = 6;
p = 8 + s*2*i;
ray(p, p + s, CD);
}
}
difference()
{
StarVertex(r, h);
rays();
xflip()
rays();
}
}
module HalfStar()
{
difference()
{
zring(n = 5)
StarVertexCorrugations(D/2, H);
down(EPS)
zring(n = 5)
StarVertex(D/2 - T/tan(18), H - T);
}
}
// SolidStar() can be used for intersections
module SolidStar()
{
if (TOP)
zring(n = 5)
StarVertexCorrugations(D/2, H);
if (BOTTOM)
zflip()
zring(n = 5)
StarVertexCorrugations(D/2, H);
}
module Star()
{
if (TOP)
HalfStar();
if (BOTTOM)
zflip()
HalfStar();
}
module Center()
{
cyl(h = 4.2, d1 = 25, d2 = 20, align = V_TOP);
up (4)
linear_extrude(20, convexity = 10)
text("SD", size = 10, font = "Arial", halign = "center", valign = "center");
}
module AdditionalElements()
{
intersection()
{
SolidStar();
union()
{
if (TOP)
Center();
if (BOTTOM)
zflip() xflip()
Center();
zring(5)
{
back(40)
{
cyl(h = 40, d = 4 + T*2);
cyl(h = 0.4, d = 12);
}
}
}
}
// Leg
fwd(20)
cyl(h = 60, d1 = 12 + T*2, d2 = 6 + T*2, align = V_FWD, orient = ORIENT_Y);
// Wires
move([12, -30])
cyl(h = 9, d = 4 + 2.4, orient = ORIENT_Y, align = V_FWD);
move([-12, -30])
cyl(h = 9, d = 4 + 2.4, orient = ORIENT_Y, align = V_FWD);
}
module AdditionalHoles()
{
zring(5)
back(40)
cyl(h = 10, d = 4);
// Central LED
cuboid([6, 26, 6]);
// Leg
fwd(20 - EPS)
cyl(h = 60 + 2*EPS, d1 = 12, d2 = 6, align = V_FWD, orient = ORIENT_Y);
// Wire
move([12, -30 + EPS])
cyl(h = 9 + EPS*2, d = 4, orient = ORIENT_Y, align = V_FWD);
move([-12, -30 + EPS])
cyl(h = 9 + EPS*2, d = 4, orient = ORIENT_Y, align = V_FWD);
if (!TOP)
up (EPS)
cuboid([200, 200, 30], align = V_TOP);
if (!BOTTOM)
down (EPS)
cuboid([200, 200, 30], align = V_BOTTOM);
}
module FullStar()
{
difference()
{
union()
{
Star();
AdditionalElements();
}
AdditionalHoles();
}
}
module Cap()
{
D = 15 + 0.2*2;
tube(h = T, id = D - T*2, od = D + T*2, align = V_TOP);
up(T - EPS)
{
difference()
{
tube(h = 5, od1 = D + T*2, od2 = D + T*2 - 1,
id1 = D, id2 = D - 1, align = V_TOP);
cuboid([30, 5, 6], align = V_TOP);
cuboid([5, 30, 6], align = V_TOP);
}
}
}
module Pins()
{
zring(5)
left(15)
cylinder(h = 8, d = 3.6);
}
//Cap();
//Pins();
FullStar();
P.S. Вся ёлочка выглядит вот так (кадр из видео), она у нас маленькая, для большой пока не хватает места:
P.P.S. Выложил весь проект (включая *.stl) на
https://www.thingiverse.com/thing:5753705
Покрасить, думаю, можно, только PETG не так легко красится.
пс за кадром Рома выполняет остальные пункты
А моделька в stl формате где-то будет выложена или нет?
Не у всех есть ваш 3d редактор, некоторые только готовые печатать умеют :)
С наступающим!
Теперь желающим повторить успеть бы…
Это можно и сейчас, я не стал так делать, чтобы при надевании на верхушку ёлки на гирлянду не создавалось дополнительного натяжения.
ссылку щас добавят)
Вот основа. Дальше просто мышкой доводите до ума.
Но, вообще, я сказал сразу — кто умеет работать в классических КАДах сделают такую задачу быстрее.
вы хотите сказать при царе в россии массово ставили звезды на елку?
хочу уточнить, не разжигаю, не набрасываю, к звездам отношусь спокойно как к одному из приятных воспоминаний детства. но зачем вот эти глупости писать про то что это было давно, ну было и что с того? вы вот прямо не поняли о чем я написал да?
Вообще это был практически стандарт на украшение елки, на макушке звезда, внизу у ствола вертеп.
Попробуйте отредактировать код, чтобы «Open in Customizer» на www.thingiverse.com заработал
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.