Звезда для новогодней ёлки на 3D-принтере

  • Цена: 691.42 rub

Новый Год – время украшать ёлку. И если у вас, как и у меня, в последний момент оказалось, что для ёлки есть гирлянда, 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
Планирую купить +7 Добавить в избранное +81 +99
+
avatar
+1
Здорово… Я бы немного покрасил снаружи, чтоб днем была хотя бы розовая… Без подсветки.
+
avatar
  • Skylab
  • 30 декабря 2022, 17:34
+4
Или распылить чуток блесток. Например, на гранях или кончиках звезды.
+
avatar
+5
Вот это как раз хотим сделать :) Как только купим блестки.
+
avatar
0
Сначала думал допечатать что-нибудь к ней красным прозрачным пластиком (например, вырезанные лучи) и приклеить, но потом отказался от этой идеи из-за нехватки времени.

Покрасить, думаю, можно, только PETG не так легко красится.
+
avatar
  • Ci7
  • 30 декабря 2022, 22:05
+5
+
avatar
  • ZeRNoVoz
  • 30 декабря 2022, 22:12
0
Букин в рекламе зел.марки на минималках
пс за кадром Рома выполняет остальные пункты
+
avatar
  • Zhenya88
  • 30 декабря 2022, 17:26
0
Спасибо.
А моделька в stl формате где-то будет выложена или нет?
Не у всех есть ваш 3d редактор, некоторые только готовые печатать умеют :)
С наступающим!
+
avatar
+1
А моделька в stl формате где-то будет выложена или нет?
Спасибо, не подумал. Чуть позже выложу.
+
avatar
+13
+
avatar
+1
Успел. До Нового года.
Теперь желающим повторить успеть бы…
+
avatar
0
За вечер можно, при желании :)
+
avatar
  • sybman
  • 30 декабря 2022, 17:52
+4
Честно?
по бокам от основания в звезде есть два отверстия для пропускания гирлянды – «вход» и «выход»"
я бы эти отверстия сделал максимально незаметными, приблизив их вплотную к центральной трубе (основанию), или вообще убрал, пустив провода через нее (трубу/основание).
+
avatar
0
Ваше право) Можете изменить модель по своему желанию.
пустив провода через нее (трубу/основание).
Это можно и сейчас, я не стал так делать, чтобы при надевании на верхушку ёлки на гирлянду не создавалось дополнительного натяжения.
+
avatar
  • woddy
  • 30 декабря 2022, 18:40
+8
Дополнительная информация
+
avatar
  • Jachick
  • 30 декабря 2022, 20:02
+5
Дополнительная информация
+
avatar
  • ZeRNoVoz
  • 30 декабря 2022, 22:17
0
неверно, это из обзора)
ссылку щас добавят)
+
avatar
  • Cucumber
  • 30 декабря 2022, 23:13
+1
Я в прошлом году такую повесил, год был попаболь. В это ни за что
+
avatar
  • iraa
  • 30 декабря 2022, 18:52
+3
Я похожую в www.tinkercad.com нарисовал. Без циферек, заморочек, за 20 минут. И сразу в stl.
Вот основа. Дальше просто мышкой доводите до ума.

+
avatar
0
У вас форма неправильная :) Линии непараллельные.

Но, вообще, я сказал сразу — кто умеет работать в классических КАДах сделают такую задачу быстрее.
+
avatar
  • Naevus
  • 31 декабря 2022, 13:38
+3
Мне лет в 7 подарили книжку Анатолий Маркуша «Мужчинам до 16 лет». Там есть целый совет, как циркулем и линейкой разделить окружность на 5 частей… дальше дело техники… как то, лет 25 назад, я оказался в той же ситуации что и автор… Только до ближайшего 3д принтера мне было лет 15… Но вспомнив тот совет из книжки — взял 2 листа плотной бумаги, циркуль и линейку — вуаля — через 10 минут у меня была звезда (выпуклая! Ну кто в детстве с бумагой работал — знает). Сверху оклеил ее фольгой от шоколадок. И еще поверх — «насыпал» конфети (купленные по случаю на прошлые НГ) в виде звездочек… Эта звезда до сих пор у нас на елке используется. Пообтрепалась, не такая объемная как была, но блин — менять ее не хочется. А пару лет назад увидели с женой такую то ли в рекламе. то ли в фильме каком — как модную и дорогую… посмеялись
+
avatar
  • djdff
  • 30 декабря 2022, 20:16
-2
прикольно люди еще звезды на елки вешают, ничего против звезд на елках не имею, но както уже отошли многие от этого уже, наследие ссср не самое плохое наследие, но звезды както не встречаю последнее время. улыбнуло.
+
avatar
+6
Звезда была задолго до СССР, как и свастика до Гитлера. На надо на этом зацикливаться.
+
avatar
  • djdff
  • 30 декабря 2022, 20:42
-5
+
avatar
  • Sintetik
  • 30 декабря 2022, 21:00
-3
Солярных знаков очень много.
+
avatar
  • mmasco
  • 30 декабря 2022, 22:44
+12
вы хотите сказать при царе в россии массово ставили звезды на елку?
Конечно, традиция украшать макушку елки Вифлеемской звездой идет наверное с момента празднования рождества. Правда обычно она была восьмиконечной (более реалистичной с художественной точки зрения) но и упрощенные варианты в 5, в 6 лучей (без отсылки к могендовиду) или в 7 также были. Т.е. количество лучей не нормировалось, лишь бы было на звезду похоже.

Вообще это был практически стандарт на украшение елки, на макушке звезда, внизу у ствола вертеп.
+
avatar
  • Corvair
  • 31 декабря 2022, 08:57
0
Самая классическая ёлочная верхушка и по сей день одна из самых популярных.
+
avatar
  • djdff
  • 31 декабря 2022, 09:02
0
я же не спорю, но лично я встречаю редко последнее время, потому и «улыбнуло»
+
avatar
  • Onegin45
  • 30 декабря 2022, 21:47
+1
В обычном CAD это сложно. Но, тут вообще за гранью понимания обычного человека, если он не программист…
+
avatar
0
Ну, для OpenSCAD пространственное мышление необходимо, это да. В остальном, постепенно разобраться можно :) Если нужно, конечно. А если просто повторить хочется, можно готовые *.stl файлы взять и напечатать. Общий масштаб в слайсере подправить, если что.
+
avatar
  • Cucumber
  • 30 декабря 2022, 23:26
0
Плюс только за OpenSCAD.
Попробуйте отредактировать код, чтобы «Open in Customizer» на www.thingiverse.com заработал
+
avatar
  • woddy
  • 31 декабря 2022, 00:48
0
говорят кустомайзер там давно поломан. я не смог, честно пытался. в итоге выучил опенскад
+
avatar
  • Elifenok
  • 31 декабря 2022, 14:22
0
Прикольная звезда, жалко, что не у каждого есть принтер.
+
avatar
  • sim31r
  • 01 января 2023, 18:27
+1
На ЧПУ фрезере не хуже делается из алюминия или меди. Фрезерный станок по металлу у вас хотя бы есть?