Авторизация
Регистрация

Напомнить пароль

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

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

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


С такими мыслями я вышел в интернет и случайно наткнулся там на проект модульной гексагональной полки с 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()
Создаёт одну вертикальную стенку клипсы. Имеет:
  1. скруглённый корпус (roundedBox);
  2. отверстие под винт (цилиндр вырезается через difference);
  3. дополнительную небольшую перемычку снизу (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 крепления зафиксировать полку в подвешенном состоянии!


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


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


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

Добавить в избранное
+24 +28
свернутьразвернуть
Комментарии (39)
RSS
+
avatar
+23
Теперь Икеа точно не вернется.
+
avatar
+2
Рыночек порешает
+
avatar
+2
Рыночек порешили…
+
avatar
+1
  • yurok
  • 25 июня 2025, 12:15
переживаю за других производителей мебели…

хочется увидеть иные виды мебели от автора
+
avatar
+4
Если у кого с кодом совсем никак, можно попробовать закинуть openscad код в copilot.microsoft.com или аналоги (но аналоги особо не пробовал), и просто сказать что хочешь чтобы поменялось в модели. Ну и с нуля он может набросать модельки по описанию. А где затупливает с ее улучшением, уже самому можно дорабатывать.

А вообще, мне вполне понравилось ковыряться в openscad (делал недавно несколько моделек, руками, в copilot потом уже другой прототип пробовал). Такой подход дает много преимуществ по сравнению если работать только визуально с помощью мыши.
Как видите, я еще немного повыжигал по дереву, чтобы получить красивые задники.

Да, кстати, крепления делаются из дешевого троса ...
Мне кажется что эти два пункта не очень хорошо сочетаются в одном изделии. Ну «красивое» и визуально заметные тросы.
+
avatar
+1
Мне кажется что эти два пункта не очень хорошо сочетаются в одном изделии. Ну «красивое» и визуально заметные тросы.
О вкусах не спорят :) Сделал в стиле лофт. Я так вижу!
+
avatar
0
Тогда наверно нужно обои убрать со стен. А то лофт получается незавершенным. Под такую полку вместо обоев нужен необработанный бетон или изношенный кирпич.
+
avatar
+23
  • Landed
  • 25 июня 2025, 11:25
Я всегда обеими руками за DIY, но это колхоз как он есть. Для книг не подходит от слова совсем. Креление самой полки выглядит ужасно. Эстетика «голой» фанеры так себе, я бы по крайней мере покрасил. Но, впрочем, это лишь мое оценочное суждение. Вполне возможно, что кому-то это исполнение и приглянется.
+
avatar
0
А мне нравится :)
+
avatar
+4
  • Landed
  • 25 июня 2025, 11:36
А мне нравится :)
Мы уже догадались, судя по тому, что изделие висит «в течение пары лет» :)
+
avatar
0
+, мне тоже.
+
avatar
+3
  • Mr_KIS
  • 25 июня 2025, 11:50
Не понял, зачем использовать OpenSCAD? Крепления простые, не проще сразу модели сделать в Компасе или Солиде?
+
avatar
0
Зачем компас или солид, когда есть LLM-интерпретируемый геометрический компилятор? Сложные модели, наоборот, проще сделать в солиде.
+
avatar
+3
  • vlo
  • 25 июня 2025, 12:05
странная цель — это полка для декоративных инсталяций, но никак не книжек, странный способ создания, который для отдельных мелких и простых деталюшек не дает никаких преимуществ, и не менее странный результат. максимум на что все это годно — занять чем-то руки.
+
avatar
0
Со всем согласен, кроме последнего пункта
+
avatar
+1
Лютый лофт!
+
avatar
+1
  • yurok
  • 25 июня 2025, 12:12
«я еще немного повыжигал по дереву, чтобы получить красивые задники» У меня дочка примерно так объясняла в 3 года фломастер на обоях…
вся поделка как минимум спорна, способ крепления трудно придумать более неудачный

из хорошего — автор провел время в творчестве и его устраивает результат,, за это респект
+
avatar
+1
Как мне это развидеть!
+
avatar
-6
+
avatar
-1
А что она будет держать? На угловых пластиковых уголках? Полки ведь нужны под вещи — книги, всякий хлам, статуэтки, фигуры. А тут после пары килограмм все рухнет (плюс фанера сама еще не легкая вообще).
+
avatar
-1
  • yurok
  • 25 июня 2025, 12:20
предметы искусства не обязательно должны быть функциональны…
+
avatar
+1
Попробуйте хотя бы картинки глянуть чтоли
+
avatar
-1
Смотрел. Все равно считаю, что самый слабый узел полки это пластиковое сочленение.
+
avatar
+4
Так трос там еще, он не только держит конструкцию на весу, но и стягивает все это чтобы не расползлось.
+
avatar
0
Точно, забыл упомянуть эту деталь! Спасибо
+
avatar
0
  • GIPER
  • 25 июня 2025, 13:45
стягивает все это чтобы не расползлось.
При том что элементы уже содержат в себе проушины для саморезов )

Х-надежность!
+
avatar
0
Я рад, что у Вас такое согласие с собой. Но реальность мне все-таки ближе
+
avatar
0
Напечатанные детали не так хрупки, как может показаться. У меня есть раскладной походный стул, которому очень много лет. За это время штатные пластиковые сочленения трубок просто рассыпались. Я спроектировал и напечатал новые из PETG, правда, сделав их чуть толще (прочнее). Закрепил все это к трубкам с помощью винтов М3 (были заклепки) — и что, уже пару лет исправно держится. В паре мест немного погнулись винты (!), но пластик держит.
+
avatar
0
Круто! За 3Д печать всегда плюс!
Кстати печатная мебель сейчас реально вышла на новый уровень. Те же модульные системы например уже не выглядят как концепт, а реально просятся на реализацию. Ну и те же соты для настенных креплений, я и себе напечатал давно.
+
avatar
0
для гаража пойдет
+
avatar
+1
Побуду занудой:
Гексагон, безусловно, на порядок красивее квадрата. Но расход материала на тот же объём полок — больше.
+
avatar
+8
  • GIPER
  • 25 июня 2025, 13:42
Слушайте, я понимаю — использовать соты для организации хранения обрезков… ну ладно, с натяжкой для сверл и резцов. Но книги, в доме, да еще и закреп в виде растяжки на тросах?! (??!!!!!111111расрасрас)

Тот самый случай, когда после этого следует возглас: «Зырьте ребза как я могу!»
+
avatar
+4
Это — не мебель, это некая арт-хаусная инсталляция в стиле «Я-художник, я так вижу!». Любому мебельщику, который попытается продать подобное «изделие» клиенту, надо ампутировать руки, чтоб больше так не делал, и член, чтобы не передал свои гены другим поколениям :)))
+
avatar
+2
  • urmal
  • 25 июня 2025, 14:49
Круто напечатанные уголки..+… ну а В целом само изделие — «вырви глаз» — цельно из дерева смотрелось бы куда красивее и эстетичнее
+
avatar
0
Дело осложнялось тем, что это было ДО бума LLM
И что? Скоро мы так дойдем, что дорогу в туалет будем прокладывать с помощью LLM? )

Детали простые, такие хоть в традиционном каде, хоть в OpenSCAD делаются за 15 минут. Причем, если делать для себя, не обязательно иметь кучу настраиваемых параметров.
+
avatar
0
Дело в том, что разобраться сейчас можно в 2 счета. И это плюс, а не минус. А про времязатраты без них просто констатация факта.
+
avatar
0
… как теперь забыть что видел ЭТО?!..
+
avatar
0
Хахахахаахах, а все!
+
avatar
0
  • kovax
  • 25 июня 2025, 15:57
1. не красиво совсем — саморезы, черные не сглаженные детали и не обработанная фанера.
2. 3Д моделирование на много проще выглядит, без каких либо кодов — надо просто выбрать нормальные редакторы…
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.