Мебель с применением 3д печати: фантазии vs реальность

Стандартная мебель часто разочаровывает, а заказы частникам дороги. Мои поиски привели к находке: проекту модульной гексагональной полки с 3D-печатными соединителями. Это был шанс не только решить нетривиальную задачу, но и попробовать геометрический компилятор OpenSCAD – ведь тогда умных чат-ботов еще не было, и разбираться пришлось самому. Если заинтересовало — добро пожаловать под кат!
Мебель прошла долгий путь исторического развития, от камней в пещере до современных дизайнерских изысков в комфортабельных пентхаусах. И все же, в утилитарном смысле современная мебель не блещет. Трудно найти подходящий дизайн и организовать пространство на готовых изделиях, а заказывать проект у специализированных фирм достаточно затратно (особенно для моих запросов). А я ведь и сам в каком-то смысле проектировщик…

С такими мыслями я вышел в интернет и случайно наткнулся там на проект модульной гексагональной полки с 3д печатными соединителями.

Тут стоит упомянуть, что я не столяр, а вот с 3D печатью дружу довольно давно, потому и решил взяться. В то время мне нужна была небольшая полка для книг, так что исходный проект я доработал под свои нужды, поскольку прочность исходных соединителей мне доверия не внушала, да и не хотел я штробить стену для ее крепления.
Задача стояла достаточно интересная, потому что 3D модель поставлялась в формате… OpenScad. Кто не знает, это фактически компилятор 3D модели на основе геометрического кода. То есть модель задается программно геометрическими примитивами. Дело осложнялось тем, что это было ДО бума LLM (умных чат-ботов), а значит разбираться пришлось самому. Потому я этот проект и выбрал, интересно было на это посмотреть.

Открываем проект и видим… А что мы видим?
Достаточно занятный скрипт, в котором полно комментариев на функции, да и некоторые функции сами закомментированы. Его ключевые параметры:
Основные функции:
В основании используется равносторонний треугольник, высота которого вычисляется через sqrt() и tan(30) — это важно для точного шестигранного позиционирования.
Мне необходимо было немного подправить код, чтобы подогнать размер пазов под мои дощечки. Кстати о них:

Обычная сантиметровая фанера. Автор скрипта использовал потоньше. Да и сама полка у него хлипенькая, под фигурки. Не годится! Кроме того, я задумал специфическое крепление, для которого требовалось убрать с модели «ушки». Пришлось немного повозиться с углами и добавить колпачки (для красоты). Параметры стенок и длина меняются в параметрах. Колпачки легко добавляются функцией.
Эту функцию надо вставить вместо bracket(), и она будет закрывать соответствующие лепестки крепления. После печати наступил процесс сборки.

Собирается достаточно быстро. После сборки нужно завинтить саморезы в боковые отверстия и просто поставить…

А можно, используя круговую обвязку тросов и 3 крепления зафиксировать полку в подвешенном состоянии!

Как видите, я еще немного повыжигал по дереву, чтобы получить красивые задники. Кроме того прилепил на стену в середину зеркало (иногда полезно в него смотреть). Да, кстати, крепления делаются из дешевого троса и затяжек для него. Но для чего тут шишка? Оставим эту загадку потомкам…

Три крепления обеспечивают надежную фиксацию. Достаточно надежную, чтобы удерживать примерно такую нагрузку на всех полках (в течение пары лет). За счет кругового обхвата троса конструкция стягивает себя вовнутрь тем больше, чем больше веса на нее положить. Спасибо советским энциклопедиям за предоставленный гранит науки!

Что касается надежности, висит уже пару лет. Особенно ничего с ней не сталось. Такую полку можно поставить и на пол (для обуви), прикрепить к стене (фигурки, вещи), сделав сложную форму, налепить сзади адресную ленту для подсветки… Очень много всего можно интересного придумать! А в эпоху языковых моделей даже морочиться не надо с разработкой подобных деталей — нейросеть сама составит любую форму, толщину и концигурацию. Не нравится шестиугольные — можно четырех, пяти, семи, восьмиугольные. В общем — простор для творчества. Думаю, в ближайшее время как-нибудь прокачаю свою с помощью умного дома. Ну а пока — всем пока!
Мебель прошла долгий путь исторического развития, от камней в пещере до современных дизайнерских изысков в комфортабельных пентхаусах. И все же, в утилитарном смысле современная мебель не блещет. Трудно найти подходящий дизайн и организовать пространство на готовых изделиях, а заказывать проект у специализированных фирм достаточно затратно (особенно для моих запросов). А я ведь и сам в каком-то смысле проектировщик…

С такими мыслями я вышел в интернет и случайно наткнулся там на проект модульной гексагональной полки с 3д печатными соединителями.

Тут стоит упомянуть, что я не столяр, а вот с 3D печатью дружу довольно давно, потому и решил взяться. В то время мне нужна была небольшая полка для книг, так что исходный проект я доработал под свои нужды, поскольку прочность исходных соединителей мне доверия не внушала, да и не хотел я штробить стену для ее крепления.
Задача стояла достаточно интересная, потому что 3D модель поставлялась в формате… OpenScad. Кто не знает, это фактически компилятор 3D модели на основе геометрического кода. То есть модель задается программно геометрическими примитивами. Дело осложнялось тем, что это было ДО бума LLM (умных чат-ботов), а значит разбираться пришлось самому. Потому я этот проект и выбрал, интересно было на это посмотреть.

Открываем проект и видим… А что мы видим?
/* hexagonal shelving clips
Gian Pablo Villamil
May 2015
Clips designed to hold wooden shelves in a hexagonal array
Default to work with 3/4 inch plywood
*/
shelf_thick = 5; // 3/4 inch in mm, thickness of wood
wall_thick = 3; //thickness of bracket sides
wall_length = 25; // length of the bracket
depth = 25 ; //epth of the bracket
bracket_thick = shelf_thick+wall_thick*2;
screw_dia = 4.75; // #8 size screw is 4.75
tri_height = sqrt(pow(bracket_thick,2)-pow(bracket_thick/2,2)); // calculate the height of an equilateral triangle
centroid = tan(30) * (bracket_thick/2);
closed = false;
corner_rad = 1;
floor_thick = 3;
$fn=16;
echo(centroid);
module wall() {
translate([shelf_thick/2,0,0])
translate([0,0,0])
difference() {
//cube([wall_thick,wall_length,depth]);
union() {
translate([wall_thick/2,wall_length/2,depth/2]) roundedBox([wall_thick,wall_length,depth],corner_rad,true);
cube([wall_thick,2,depth]);
};
translate([wall_thick/2,wall_length/2,depth/2])
rotate([0,90,0])
cylinder(h=wall_thick+1,d=screw_dia,center=true,$fn=16);
}
};
module bracket() {
translate([0,centroid-0.1,0]){
wall();
mirror([1,0,0])
wall();
if (closed ) {
translate([0,wall_length/2,floor_thick/2]) roundedBox([bracket_thick,wall_length,floor_thick],corner_rad,true); }
};
};
module bracketleg() {
translate([0,centroid-0.1,0]){
union() {
wall();
translate([-depth/5+0.1,wall_length/2,depth/2])
rotate([0,270,0])
cylinder(r1=depth/2.5,r2=depth/6,h=depth/2.5);
}
mirror([1,0,0])
wall();
if (closed ) {
translate([0,wall_length/2,floor_thick/2]) roundedBox([bracket_thick,wall_length,floor_thick],corner_rad,true); }
};
};
module hanger() {
translate([0,centroid-0.1+bracket_thick/2,floor_thick/2])
difference() {
union() {
roundedBox([bracket_thick,bracket_thick,floor_thick],bracket_thick/2,true,$fn=32);
translate([0,-bracket_thick/4,0]) cube([bracket_thick,bracket_thick/2,floor_thick],center=true);
}
cylinder(h=floor_thick+1,d=screw_dia,center=true);
}
}
module hub() {
difference() {
translate([0,centroid,0])
linear_extrude(height=depth) {
polygon(points=[[-bracket_thick/2,0],[0,-tri_height],[bracket_thick/2,0]]);}
translate([0,0,-0.5]) cylinder(r=shelf_thick/4,h=depth+1);
}
}
module threewaybracket() {
union() {
hub();
bracket();
rotate([0,0,120]) bracket();
rotate([0,0,240]) bracket();
}
};
module twowaybracket() {
union() {
hub();
bracket();
rotate([0,0,120]) bracket();
}
};
module twowaybracket_leg() {
union() {
hub();
bracket();
rotate([0,0,120]) bracketleg();
}
};
module twowaybracket_hanger() {
union() {
hub();
hanger();
rotate([0,0,120]) bracket();
rotate([0,0,240]) bracket();
}
};
module twowaybracket_tensioner() {
union() {
hub();
rotate([0,0,180]) translate([0,centroid,0])
hanger();
rotate([0,0,120]) bracket();
rotate([0,0,240]) bracket();
}
};
// Library: boxes.scad
// Version: 1.0
// Author: Marius Kintel
// Copyright: 2010
// License: BSD
// roundedBox([width, height, depth], float radius, bool sidesonly);
// EXAMPLE USAGE:
// roundedBox([20, 30, 40], 5, true);
// size is a vector [w, h, d]
module roundedBox(size, radius, sidesonly)
{
rot = [ [0,0,0], [90,0,90], [90,90,0] ];
if (sidesonly) {
cube(size - [2*radius,0,0], true);
cube(size - [0,2*radius,0], true);
for (x = [radius-size[0]/2, -radius+size[0]/2],
y = [radius-size[1]/2, -radius+size[1]/2]) {
translate([x,y,0]) cylinder(r=radius, h=size[2], center=true);
}
}
else {
cube([size[0], size[1]-radius*2, size[2]-radius*2], center=true);
cube([size[0]-radius*2, size[1], size[2]-radius*2], center=true);
cube([size[0]-radius*2, size[1]-radius*2, size[2]], center=true);
for (axis = [0:2]) {
for (x = [radius-size[axis]/2, -radius+size[axis]/2],
y = [radius-size[(axis+1)%3]/2, -radius+size[(axis+1)%3]/2]) {
rotate(rot[axis])
translate([x,y,0])
cylinder(h=size[(axis+2)%3]-2*radius, r=radius, center=true);
}
}
for (x = [radius-size[0]/2, -radius+size[0]/2],
y = [radius-size[1]/2, -radius+size[1]/2],
z = [radius-size[2]/2, -radius+size[2]/2]) {
translate([x,y,z]) sphere(radius);
}
}
}
//twowaybracket();
//twowaybracket_hanger();
//twowaybracket_leg();
//
twowaybracket_tensioner();
//threewaybracket();
// bracket();
// hub();
Достаточно занятный скрипт, в котором полно комментариев на функции, да и некоторые функции сами закомментированы. Его ключевые параметры:
shelf_thick = 3; // Толщина полки (в мм), по умолчанию фанера 3/4 дюйма ≈ 19 мм
wall_thick = 2; // Толщина стенки клипсы
wall_length = 25; // Длина стенки держателя
depth = 25; // Глубина (насколько «внутрь» заходит полка)
Основные функции:
wall()
Создаёт одну вертикальную стенку клипсы. Имеет:- скруглённый корпус (roundedBox);
- отверстие под винт (цилиндр вырезается через difference);
- дополнительную небольшую перемычку снизу (cube([wall_thick,2,depth])).
bracket()
Создаёт двойную клипсу: две симметричных стенки (wall) с промежутком под полку (shelf_thick). Опционально добавляется перекрытие снизу — «пол» (closed == true).bracketleg()
Модификация bracket(), но с одной из сторон добавлена конусная ножка, что делает её удобной как опору на стол или пол. Это увеличивает устойчивость нижнего ряда полок.hanger()
Создаёт подвесной крюк, соединённый с клипсой. Имеет форму квадрата с выемкой и отверстием под винт. Может использоваться для крепления системы полок к стене или потолку.hub()
Создаёт центральный «узел» — треугольную призму, к которой крепятся клипсы. Это геометрический центр шестигранной полки. Также содержит центральное отверстие под винт или шкант.В основании используется равносторонний треугольник, высота которого вычисляется через sqrt() и tan(30) — это важно для точного шестигранного позиционирования.
Мне необходимо было немного подправить код, чтобы подогнать размер пазов под мои дощечки. Кстати о них:

Обычная сантиметровая фанера. Автор скрипта использовал потоньше. Да и сама полка у него хлипенькая, под фигурки. Не годится! Кроме того, я задумал специфическое крепление, для которого требовалось убрать с модели «ушки». Пришлось немного повозиться с углами и добавить колпачки (для красоты). Параметры стенок и длина меняются в параметрах. Колпачки легко добавляются функцией.
module bracket_cap() {
translate([0,centroid-0.1,0]){
wall();
mirror([1,0,0])
wall();
// Добавляем крышку сверху вместо дна
translate([0,wall_length/2,depth - floor_thick/2])
roundedBox([bracket_thick, wall_length, floor_thick], corner_rad, true);
};
}
Эту функцию надо вставить вместо bracket(), и она будет закрывать соответствующие лепестки крепления. После печати наступил процесс сборки.

Собирается достаточно быстро. После сборки нужно завинтить саморезы в боковые отверстия и просто поставить…

А можно, используя круговую обвязку тросов и 3 крепления зафиксировать полку в подвешенном состоянии!

Как видите, я еще немного повыжигал по дереву, чтобы получить красивые задники. Кроме того прилепил на стену в середину зеркало (иногда полезно в него смотреть). Да, кстати, крепления делаются из дешевого троса и затяжек для него. Но для чего тут шишка? Оставим эту загадку потомкам…

Три крепления обеспечивают надежную фиксацию. Достаточно надежную, чтобы удерживать примерно такую нагрузку на всех полках (в течение пары лет). За счет кругового обхвата троса конструкция стягивает себя вовнутрь тем больше, чем больше веса на нее положить. Спасибо советским энциклопедиям за предоставленный гранит науки!

Что касается надежности, висит уже пару лет. Особенно ничего с ней не сталось. Такую полку можно поставить и на пол (для обуви), прикрепить к стене (фигурки, вещи), сделав сложную форму, налепить сзади адресную ленту для подсветки… Очень много всего можно интересного придумать! А в эпоху языковых моделей даже морочиться не надо с разработкой подобных деталей — нейросеть сама составит любую форму, толщину и концигурацию. Не нравится шестиугольные — можно четырех, пяти, семи, восьмиугольные. В общем — простор для творчества. Думаю, в ближайшее время как-нибудь прокачаю свою с помощью умного дома. Ну а пока — всем пока!

Самые обсуждаемые обзоры
+29 |
1611
34
|
хочется увидеть иные виды мебели от автора
А вообще, мне вполне понравилось ковыряться в openscad (делал недавно несколько моделек, руками, в copilot потом уже другой прототип пробовал). Такой подход дает много преимуществ по сравнению если работать только визуально с помощью мыши.
Мне кажется что эти два пункта не очень хорошо сочетаются в одном изделии. Ну «красивое» и визуально заметные тросы.
вся поделка как минимум спорна, способ крепления трудно придумать более неудачный
из хорошего — автор провел время в творчестве и его устраивает результат,, за это респект
Х-надежность!
Кстати печатная мебель сейчас реально вышла на новый уровень. Те же модульные системы например уже не выглядят как концепт, а реально просятся на реализацию. Ну и те же соты для настенных креплений, я и себе напечатал давно.
Гексагон, безусловно, на порядок красивее квадрата. Но расход материала на тот же объём полок — больше.
Тот самый случай, когда после этого следует возглас: «Зырьте ребза как я могу!»
Детали простые, такие хоть в традиционном каде, хоть в OpenSCAD делаются за 15 минут. Причем, если делать для себя, не обязательно иметь кучу настраиваемых параметров.
2. 3Д моделирование на много проще выглядит, без каких либо кодов — надо просто выбрать нормальные редакторы…