Простое применение 3D принтера в аквариумистике. Часть 2.
10.12.2017
Разделы: Техника
DIY (самоделки)
Автор: Борис Крамер       

В первой части мы разобрали печать самого простого изделия, которое может потребоваться аквариумисту – переходник на заборную решетку помпы. Во второй части мы создадим гораздо более сложный элемент – держатель для датчиков.

В продаже есть большое количество различных держателей, но большинство из них так или иначе имеют ряд серьезных недостатков. И они не универсальны.

Например, возьмем вот такой держатель для электродов.

IMG_6480.jpg

Удобная и красивая вещь. Конструкция даже предусматривает крепление как на стенку с отбортовкой, так и без. Однако можно видеть, что электроды находятся в воде только самой нижней частью. Если бы у меня уровень воды в этом отсеке был бы ниже, то данный держатель применить не удалось, так как у него нет регулировке по высоте.

Гораздо более универсальны сборные держатели Tunze.

IMG_6481.jpg

Однако и у него куча недостатков. Регулировка по высоте происходит ступенчато, что не всегда удобно. Система крепления устроена таким образом, что он сильно торчит на стенке с отбортовкой. Крепление не очень прочное, несколько раз сбивал его рукой. Чтобы отрегулировать высоту датчиков необходимо лезть рукой в воду. Можно повесить только датчики, предусмотренные производителем держателя.

Есть еще магнитные крепления для датчиков. Они намного более универсальны и удобны, хотя тоже не лишены недостатков.

По сути, когда нам надо закрепить что-то в аквариуме, приходится подбирать что-то наиболее похожее на правду и дорабатывать напильников. При этом мы получаем требуемый результат, но любое изменение наших хотелок снова приводит к работе напильником.

Поэтому в рамках данной статьи мы рассмотрим создание универсального держателя для чего угодно, лишенного большинства описанных выше недостатков.


Начнем с системы регулировки высоты. Желательно, чтобы на нашем держателе могло бы находится несколько датчиков с возможностью независимого произвольного изменения высоты каждого.

Этап 1. Направляющая.
В системах движения в промышленности часто применяются линейные направляющие и каретки.

aaabbb.jpg  karetka-1853_1.JPG

Направляющая крепится к какому-либо основанию – стенке или профилю. На каретку крепится перемещаемый объект. Такая конструкция достаточно универсальна и удобна. Имеет смысл ее воспроизвести. Повторить форму и конструкцию направляющей и каретки один в один конечно не требуется. Это технически возможно, но требует очень качественного принтера. Тем более что каретка представляет из себя линейный подшипник с шариками. Нам же требуется сделать конструкцию, которая может печататься на самых дешевых принтерах. Соответственно – она должна быть лишена каких-то нависающих элементов и учитывать неточности печати.

Берем ручку и быстро рисуем на бумаге что-то похожее.

IMG_6482.jpg

Как-то так. Много параметров задавать не будем, чтобы не усложнять себе жизнь. Параметры «C» (ширина) и «D» (высота) задают типоразмер направляющей, а параметры «A» и «B» типоразмер основания. Отверстия в направляющей делать не будем, так как через них направляющая крепится к основанию. У нас же есть возможность напечатать основание вместе с направляющей как единое целое. Можно печатать направляющую и без основания, однако основание увеличивает прочность конструкции и дает удобные возможности крепления к стенке аквариума, например, приклеивание.

Теперь возьмем еще раз ручку и напишем координаты X и Y всех узлов сечения линейной направляющей, взяв за 0 левый нижний угол.

IMG_6483.jpg

Чтобы избежать длинных записей введем еще два названия:    
A1 = (A-C) /2    половинка основания направляющей
D1 = D/5            высоту направляющей разделим на 5, сделав все части равными

Теперь откроем OpenSCAD, внесем в него значения наших размеров (размеры для наглядности пока задаем примерно, как на бумаге рисовали) и воспользовавшись примитивом «polygon», перечислим в нем все узловые точки начиная с 0,0 против часовой стрелки.

A = 100;
B = 25;
C = 50;
D = 50;

A1 = (A-C)/2;
D1 = D/5;

polygon(points=[[0,0],
[A,0],
[A,B],
[A-A1,B],
[A-A1,B+D1],
[A-A1-D1,B+2*D1],
[A-A1-D1,B+3*D1],
[A-A1,B+4*D1],
[A-A1,B+D],
[A1,B+D],
[A1,B+4*D1],
[A1+D1,B+3*D1],
[A1+D1,B+2*D1],
[A1,B+D1],
[A1,B],
[0,B]]);

Нажмем F6.

openscad1.jpg

Вот мы получили на экране двумерный профиль нашей направляющей. Осталось только задать ему длину и вытянуть.

Для этого зададим длину L и воспользуемся еще одним примитивом «linear_extrude» - линейное вытягивание.

Заключим в него наш профиль

linear_extrude(height = L, center = false)
{
polygon(points=[[0,0],
[A,0],
[A,B],
[A-A1,B],
[A-A1,B+D1],
[A-A1-D1,B+2*D1],
[A-A1-D1,B+3*D1],
[A-A1,B+4*D1],
[A-A1,B+D],
[A1,B+D],
[A1,B+4*D1],
[A1+D1,B+3*D1],
[A1+D1,B+2*D1],
[A1,B+D1],
[A1,B],
[0,B]]);
};

openscad2.jpg

Линейная направляющая в первом приближении готова, печатаем.

IMG_6927.jpg

IMG_6928.jpg


Этап 2. Каретка.
Теперь займемся кареткой. Каретка по сути повторяет профиль направляющей (без основания) с небольшим зазором для обеспечения свободы движения. Этот зазор мы назовем Gap и зададим его пока 0,2мм. Его значение не зависит от размера линейной направляющей и ограничивается технологическими возможностями принтера и используемого материала. Величина зазора чем меньше – тем лучше, каретка будет более остойчиво сидеть на направляющей. Но она не должна застревать. То есть зазор должен учитывать, как погрешность печати принтера, так и возможную усадку материала, которая у всех материалов разная. В принципе 0,5мм должно быть достаточно всегда. Можно попытаться сделать меньше. Давайте пока зададим 0,2мм и посмотрим.

Возьмем наш профиль направляющей, нарисуем поверх нее каретку.

IMG_6482.jpg

Зададим толщины стенок каретки TW и верха каретки TT. Верх каретки сделаем заметно толще стенок, так как нам в него потом гайки креплений прятать придется. Заодно удалим нижнюю часть каретки, просто чтобы узловых точек было поменьше. Проставим координаты.

image_scan_075.jpg

Сложного в проставлении координат ничего нет, но 10 минут на это потратить придется. И желательно закрыть дверь в комнату, чтобы никто не мешал. Этот момент работы требует внимательности. Лучше это делать карандашом, а не ручкой, чтобы удобно было исправлять ошибки.

Далее полностью повторим блок линейной направляющей, только поставим туда координаты каретки.

linear_extrude(height = L, center = false)
{
polygon(points=[[A1-G-TW,B+D1],
[A1-G,B+D1],
[A1+D1-G,B+2*D1],
[A1+D1-G,B+3*D1],
[A1-G,B+4*D1],
[A1-G,B+D+G],
[A-A1+G,B+D+G],
[A-A1+G,B+4*D1],
[A-A1-D1+G,B+3*D1],
[A-A1-D1+G,B+2*D1],
[A-A1+G,B+D1],
[A-A1+G+TW,B+D1],
[A-A1+G+TW,B+D+TT],
[A1-G-TW,B+D+TT]]);
;};

Строим модель:

openscad3.jpg

Вроде все хорошо. Видим каретку, нарисованную поверх линейной направляющей. Чтобы дополнительно убедиться, что все хорошо, можно временно закомментировать команды linear_extrude, чтобы увидеть не целиком изделия, а только их двумерные профили. В этом случае мы четко увидим зазоры между направляющей и кареткой.

openscad3-1.jpg

Если зазор примерно одинаковый везде, значит все правильно нарисовали. Теперь вернем обратно команду linear_extrude и введем длину каретки. Сейчас у нас длина каретки равна длине направляющей, что особого смысла не имеет. Поэтому введем еще одну переменную – длину каретки LC. Пока зададим ее 30, поставим в команду linear_extrude для каретки и перерисуем результат.

linear_extrude(height = LC, center = false)
{
polygon(points=[[A1-G-TW,B+D1],
[A1-G,B+D1],
[A1+D1-G,B+2*D1],
[A1+D1-G,B+3*D1],
[A1-G,B+4*D1],
[A1-G,B+D+G],
[A-A1+G,B+D+G],
[A-A1+G,B+4*D1],
[A-A1-D1+G,B+3*D1],
[A-A1-D1+G,B+2*D1],
[A-A1+G,B+D1],
[A-A1+G+TW,B+D1],
[A-A1+G+TW,B+D+TT],
[A1-G-TW,B+D+TT]]);
;};

openscad3-3.jpg
Имеем каретку заданной длины.

Теперь временно закомментируем саму направляющую, так как она нам пока не нужна – будем работать с кареткой. Вместо комментариев можно использовать команду запрета конкретной операции, но о ней расскажем немного позже.

openscad4.jpg

Напечатаем ее, для проверки.

Img4.jpg

IMG_6929.jpg


Примерим:

IMG_6931.jpg

Сидит очень плотно, под своим весом не падает. Это плохо, будет тяжело и неудобно двигать. Переоценили возможности принтера. Зазор 0,2мм ему явно не удался. Поставим 0,5мм.

Заодно оценим достаточность длины каретки. Нам надо будет разместить на ней как минимум два винта с гайками. Один будет крепить держатель для датчика, второй прижимать каретку к направляющей.

IMG_6932.jpg

В принципе помещаются, но можно и увеличить длину на 5мм до 35мм. Заодно неплохо было бы прокомментировать все переменные, иначе через месяц не вспомнить что они означают.

A = 35; // ширина основания направляющей
B = 6; // толщина основания направляющей
C = 20; // ширина полозьев направляющей
D = 15; // высота полозьев направляющей
L = 200; // длина линейной направляющей
G = 0.5; // зазор между направляющей и кареткой
LC = 35; // длина каретки
TW = 6; // толщина стенок каретки
TT = 10; // толщина верха каретки

Следующим этапом необходимо сделать внутри каретки углубления для гаек.

Возможно у многих возникает вопрос – зачем использовать гайки, если можно напечатать резьбу прямо на самой каретке. Смысл в использовании гаек очень прост. Не надо переоценивать возможности 3D-принтера. Немного выше мы увидели, что даже достаточно большой (с точки зрения механики) зазор в 0,2мм принтеру не удалось воспроизвести нормально из-за набегающих суммарных погрешностей. При печати на принтере резьбу придется делать нестандартную с достаточно большим шагом и большого диаметра. Соответственно придется еще рисовать и печатать винт. Также прочность резьбы будет значительно меньше, чем на обычных пластиковых винтах. С другой стороны полиамидные винты и гайки продаются в любом инет-магазине крепежа и довольно бессмысленно печатать то, что можно легко купить и использовать.

В принципе углубление для стандартной гайки представляет собой классический полигон из 6 точек. Но так как задавать координаты точек лень, можно воспользоваться другой возможностью. Как мы видели в первой части статьи, при рисовании цилиндра есть возможность задать количество граней в цилиндре. Давайте воспользуемся этой возможностью.
Измерим гайку штангенциркулем. Получаем для конкретной имеющейся гайки: высота 5мм, диаметр описанной окружности 11мм.

Рисуем цилиндр с измеренными размерами и 6-ю гранями:

cylinder(h=5,r=11,$fn=6);

openscad5.jpg

Отлично. Получили 6-ти угольник. Теперь необходимо вынести его размеры в переменные – так как гайки могут быть разные. Затем требуется расположить полученный шестиугольник в двух экземплярах с внутренней части каретки.

Для начала повернем его.
Для этого воспользуемся оператором rotate. Этот оператор позволяет повернуть фигуру вокруг оси системы координат или вокруг произвольной оси. В самом примитивном виде он выглядит так:

rotate([deg_x, deg_y, deg_z]) { ... }

Задаем значения поворотов вокруг трех осей и в фигурных скобках ставим что нам надо повернуть.

Поворачиваем вокруг оси X:

rotate([90, 0, 0]) {
cylinder(h=5,r=11,$fn=6);
};

openscad6.jpg

Теперь надо переместить объект на его место. Так как он окажется внутри каретки, то его после перемещения не будет видно, и сложно будет понять там ли он оказался где нам надо. Поэтому временно сделаем его полупрозрачным.

Это делается с помощью оператора %, поставленного перед объектом.

openscad333.png

Следует учесть, что полупрозрачные объекты не будут печататься или как-то участвовать в построении фигуры. Поэтому потом надо не забыть убрать знак %.
Не забываем размеры гайки убрать в переменные, так как гайки бывают разные.

NutH = 5; // высота гайки
NutD = 11; // диаметр описанной вокруг гайки окружности

Само перемещение делается с помощью оператора translate.

translate([x,у,z]) { ... }

Кстати, фигурные скобки часто можно и не ставить. Каждый оператор действует на следующий до завершения цепочки знаком ‘;’.

Теперь определимся куда ее перемещать.
Собственно – это часто одна из самых сложных операций. Когда мы рисуем что-нибудь в визуальном редакторе, у нас нет никаких проблем. Перетаскиваем объект мышкой. Редактор даже нам услужливо подсказывает где середина. При работе в OpenSCAD нам придется немного думать и задавать параметры перемещения вручную. Причем, если бы мы рисовали только каретку – то мы бы ее отцентровали относительно начала координат для удобства. Но так как мы рисуем по сути сборку. То задавать перемещение придется через переменные, определяющие размеры остальных компонентов. Однако все эти неудобства окупаются дальнейшем, когда мы захотим изменить размеры конечной сборки. Чтобы мы не делали, и какие-бы размеры не меняли – все автоматически будет правильно.

Давайте раскоментируем и сделаем полупрозрачной саму линейную направляющую и посмотрим куда нам надо переместить отверстие для гайки.

openscad7.jpg

openscad8.jpg

Вспомним, что основание направляющей имеет ширину «А». Сейчас центр отверстия находится на начале координат. Соответственно, чтобы отверстие оказалось посередине направляющей (и каретки) по оси Х надо ее сдвинуть вправо на «A/2».

Двигаем:

translate([A/2,0,0])
rotate([90, 0, 0])
%cylinder(h=NutH,r=NutD,$fn=6);

openscad9.jpg

Теперь вставляем ее в каретку перемещая по оси Y. Нам надо ее сместить на толщину основания направляющей «B» плюс высоту полозьев направляющей «D» плюс высоту самой гайки NutH. И не забыть добавить ширину зазора между кареткой и направляющей G.

Пробуем:

translate([A/2,B+D+G+NutH,0])
rotate([90, 0, 0])
%cylinder(h=NutH,r=NutD,$fn=6);

openscad10.jpg

openscad11.jpg

Отлично, даже зазор можно рассмотреть.

Заодно подумал, что погрешность самой гайки плюс погрешность принтера могут привести к тому, что гайка будет торчать из каретки. Лучше ее углубить немного сильнее. Например, на величину зазора G. Для этого надо увеличить высоту отверстия для гайки на G и на эту же величину сместить ее дальше по оси Y.

Изменим программу:

translate([A/2,B+D+G+NutH+G,0])
rotate([90, 0, 0])
%cylinder(h=NutH+G,r=NutD,$fn=6);

Теперь нам осталась ось Z. По этой оси положение гайки на каретке достаточно произвольно. При длине каретки 35 можно, например, сделать расстояния от краев каретки до центра гайки равному диаметру гайки NutD.

Заодно, чтобы увидеть куда она сместилась саму линейную направляющую, вообще убираем. Это делается с помощью замены префикса % перед рисованием направляющей на префикс *, который запрещает конкретный элемент.

Запрещаем направляющую:

*linear_extrude(height = L, center = false)
{
polygon(points=[[0,0],
[A,0],
[A,B],
[A-A1,B],
[A-A1,B+D1],
[A-A1-D1,B+2*D1],
[A-A1-D1,B+3*D1],
[A-A1,B+4*D1],
[A-A1,B+D],
[A1,B+D],
[A1,B+4*D1],
[A1+D1,B+3*D1],
[A1+D1,B+2*D1],
[A1,B+D1],
[A1,B],
[0,B]]);
;};


Смещаем отверстие для гайки:

translate([A/2,B+D+G+NutH+G,NutD])
rotate([90, 0, 0])
%cylinder(h=NutH+G,r=NutD,$fn=6);

openscad12.jpg

Что-то отверстие какое-то слишком большое получилась. Смотрим где ошиблись.

Ага, вместо диаметра указали радиус.

translate([A/2,B+D+G+NutH+G,NutD])
rotate([90, 0, 0])
%cylinder(h=NutH+G,r=NutD,$fn=6);

Меняем «r» на «d».

translate([A/2,B+D+G+NutH+G,NutD])
rotate([90, 0, 0])
%cylinder(h=NutH+G,d=NutD,$fn=6);

Теперь все хорошо:

openscad13.jpg

Вспоминаем, что отверстия нам нужно два. И второе отверстие по оси Z надо сместить симметрично первой – то есть на длину каретки минус диаметр отверстия.

translate([A/2,B+D+G+NutH+G,LC-NutD])
rotate([90, 0, 0])
%cylinder(h=NutH+G,d=NutD,$fn=6);

openscad14.jpg


Когда отверстий много, можно их рисование выделить в виде модуля, но при такой простой программе это необязательно.

Теперь надо вспомнить, что пока это не отверстие а просто многоугольник, который мы сделали полупрозрачным. Чтобы он реально стал отверстием, а точнее углублением, нам надо воспользоваться примитивом difference чтобы вычесть его из каретки.

Знаки % перед отверстиями уберем, так как нам надо чтобы они реально присутствовали в модели. Заменим их на знаки #. Это очень удобный знак при вырезании. Он показывает розовым цветом что вырезается из модели. Цвет присутствует только на визуализации и в отличии от знака % никакого влияния на полученную модель не оказывает.

difference() {
linear_extrude(height = LC, center = false)
{
polygon(points=[[A1-G-TW,B+D1],
[A1-G,B+D1],
[A1+D1-G,B+2*D1],
[A1+D1-G,B+3*D1],
[A1-G,B+4*D1],
[A1-G,B+D+G],
[A-A1+G,B+D+G],
[A-A1+G,B+4*D1],
[A-A1-D1+G,B+3*D1],
[A-A1-D1+G,B+2*D1],
[A-A1+G,B+D1],
[A-A1+G+TW,B+D1],
[A-A1+G+TW,B+D+TT],
[A1-G-TW,B+D+TT]]);

;};

translate([A/2,B+D+G+NutH+G,NutD])
rotate([90, 0, 0])
#cylinder(h=NutH+G,d=NutD,$fn=6);

translate([A/2,B+D+G+NutH+G,LC-NutD])
rotate([90, 0, 0])
#cylinder(h=NutH+G,d=NutD,$fn=6);
};

openscad444.png

Теперь вернем нашу направляющую и посмотрим на результат:

openscad15.jpg

Нам осталось только нарисовать в каретке отверстия для винтов и какое-нибудь углубление для установки уголка для датчика, чтобы он не крутился и плотно сидел.

Это уже совсем быстро. Отверстия для винтов – это то же самое что и отверстия для гайки, только диаметром с винт «BoltD» плюс зазор «G», длиной в толщину верха каретки «TT», и смещением по оси Y таким, чтобы он начинался от самого верха каретки.

Вставляем описание отверстий прямо в примитив difference, который описывает нашу каретку.

difference() {
linear_extrude(height = LC, center = false)
{
polygon(points=[[A1-G-TW,B+D1],
[A1-G,B+D1],
[A1+D1-G,B+2*D1],
[A1+D1-G,B+3*D1],
[A1-G,B+4*D1],
[A1-G,B+D+G],
[A-A1+G,B+D+G],
[A-A1+G,B+4*D1],
[A-A1-D1+G,B+3*D1],
[A-A1-D1+G,B+2*D1],
[A-A1+G,B+D1],
[A-A1+G+TW,B+D1],
[A-A1+G+TW,B+D+TT],
[A1-G-TW,B+D+TT]]);

;};

translate([A/2,B+D+G+NutH+G,NutD])
rotate([90, 0, 0])
#cylinder(h=NutH+G,d=NutD,$fn=6);

translate([A/2,B+D+G+NutH+G,LC-NutD])
rotate([90, 0, 0])
#cylinder(h=NutH+G,d=NutD,$fn=6);

translate([A/2,B+D+TT,NutD])
rotate([90, 0, 0])
#cylinder(h=TT,d=BoltD+G,$fn=Smoothness);

translate([A/2,B+D+TT,LC-NutD])
rotate([90, 0, 0])
#cylinder(h=TT,d=BoltD+G,$fn=Smoothness);

};

Играемся префиксами *,%,# чтобы получить нужный рисунок (только не забыть эти префиксы правильно расставить обратно для печати).

openscad16.jpg

Углубление тоже сделать очень просто, используя примитив cube.

Введем еще две переменные описывающие наше углубление.
HollowH = 1; // высота углубления под уголок
HollowW = 0.8*LC; // ширина углубления под уголок
Глубину углубления сделаем постоянной, а ширину возьмем в 80% от ширины каретки. Это удобно, так как при изменении ширины каретки у нас все будет меняться автоматически. Длину возьмем во всю длину каретки. При рисовании не забываем добавлять зазорчики.

Рисуем его в режиме центровки true, чтобы не добавлять лишние смещения, а просто делить пополам размеры каретки.

translate([A/2,B+D+TT-(HollowH+G)/2+0.1,LC/2])
rotate([90, 0, 0])
#cube([HollowW+G,LC,HollowH+G],true);

В смещение добавили +0.1 чтобы вырезаемая часть немного торчала из каретки. Для некоторых слайсеров это очень актуально.

Вот как это выглядит при невидимой каретке.

openscad17.jpg

А вот при видимой.

openscad18.jpg

Пора напечатать каретку и посмотреть, что у нас получилось.

Запрещаем линейную направляющую, поставив перед ней *. Рендерим, смотрим результат.

openscad19.jpg

openscad20.jpg

Просматриваем программу для наглядности.

A = 35; // ширина основания направляющей
B = 6; // толщина основания направляющей
C = 20; // ширина полозьев направляющей
D = 15; // высота полозьев направляющей
L = 200; // длина линейной направляющей
G = 0.5; // зазор между направляющей и кареткой
LC = 35; // длина каретки
TW = 6; // толщина стенок каретки
TT = 10; // толщина верха каретки
NutH = 5; // высота гайки
NutD = 11; // диаметр описанной вокруг гайки окружности
BoltD = 6; // диаметр винта
HollowH = 1; // высота углубления под уголок
HollowW = 0.8*LC; // ширина углубления под уголок

Smoothness = 360; // параметр сглаживания

A1 = (A-C)/2;
D1 = D/5;

*linear_extrude(height = L, center = false)
{
polygon(points=[[0,0],
[A,0],
[A,B],
[A-A1,B],
[A-A1,B+D1],
[A-A1-D1,B+2*D1],
[A-A1-D1,B+3*D1],
[A-A1,B+4*D1],
[A-A1,B+D],
[A1,B+D],
[A1,B+4*D1],
[A1+D1,B+3*D1],
[A1+D1,B+2*D1],
[A1,B+D1],
[A1,B],
[0,B]]);
;};


difference() {
linear_extrude(height = LC, center = false)
{
polygon(points=[[A1-G-TW,B+D1],
[A1-G,B+D1],
[A1+D1-G,B+2*D1],
[A1+D1-G,B+3*D1],
[A1-G,B+4*D1],
[A1-G,B+D+G],
[A-A1+G,B+D+G],
[A-A1+G,B+4*D1],
[A-A1-D1+G,B+3*D1],
[A-A1-D1+G,B+2*D1],
[A-A1+G,B+D1],
[A-A1+G+TW,B+D1],
[A-A1+G+TW,B+D+TT],
[A1-G-TW,B+D+TT]]);
;};

translate([A/2,B+D+NutH+G,NutD])
rotate([90, 0, 0])
#cylinder(h=NutH+G,d=NutD,$fn=6);

translate([A/2,B+D+NutH+G,LC-NutD])
rotate([90, 0, 0])
#cylinder(h=NutH+G,d=NutD,$fn=6);

translate([A/2,B+D+TT,NutD])
rotate([90, 0, 0])
#cylinder(h=TT,d=BoltD+G,$fn=Smoothness);

translate([A/2,B+D+TT,LC-NutD])
rotate([90, 0, 0])
#cylinder(h=TT,d=BoltD+G,$fn=Smoothness);

translate([A/2,B+D+TT-(HollowH+G)/2+0.1,LC/2])
rotate([90, 0, 0])
#cube([HollowW+G,LC,HollowH+G],true); };

Печатаем.

Img4.jpg

Напечатали. Примеряем. Каретка на направляющую садится замечательно. Гайки лезут в отверстия с большим трудом. Забыл добавить зазор к диаметру.

Добавляем:

translate([A/2,B+D+NutH+G,NutD])
rotate([90, 0, 0])
#cylinder(h=NutH+G,d=NutD+G,$fn=6);

translate([A/2,B+D+NutH+G,LC-NutD])
rotate([90, 0, 0])
#cylinder(h=NutH+G,d=NutD+G,$fn=6);

Заодно перемерял десяток гаек и подправил диаметр с 11 на 11,5 так как на разных гайках он значительно гуляет.

И еще важный момент. Одноэкструдерные принтеры не любят нависающие элементы. Мы печатали вот в таком положении. Видно, что горизонтальная полочка шестиугольного углубления под гайку нависает над пустым пространством. Это тоже может давать небольшой прогиб, который будет препятствовать заходу гайки. Можно развернуть посадочное место под гайку вершиной вверх.
Для этого в нашем операторе rotate([90, 0, 0]) заменим второе число на 90 градусов.
rotate([90, 90, 0])

openscad21.jpg

Отверстия встали более правильно с точки зрения печати, но почти соприкоснулись. Раздвинем их, уменьшив расстояние от края. Введем еще одну переменную DCorner, которая будет задавать расстояние от центра отверстия до края каретки. И если раньше мы поставили расстояние равное диаметру, то сейчас сделаем равным 0.8 диаметра.

DCorner = 0.8*NutD; // расстояние от края каретки до центра отверстия

Меняем описание отверстий;

translate([A/2,B+D+NutH+G,DCorner])
rotate([90, 90, 0])
#cylinder(h=NutH+G,d=NutD+G,$fn=6);

translate([A/2,B+D+NutH+G,LC-DCorner])
rotate([90, 90, 0])
#cylinder(h=NutH+G,d=NutD+G,$fn=6);

translate([A/2,B+D+TT,DCorner])
rotate([90, 0, 0])
#cylinder(h=TT,d=BoltD+G,$fn=Smoothness);

translate([A/2,B+D+TT,LC-DCorner])
rotate([90, 0, 0])
#cylinder(h=TT,d=BoltD+G,$fn=Smoothness);

Смотрим:

openscad555.png

Теперь все нормально.

Заодно увеличиваем зазор до 0,6мм чтобы легче ходила каретка. Зазор в 0,5 вроде нормально, но в каком-то месте слегка цепляет.


Перепечатываем.

IMG_6934.jpg

Вставляем гайки.

IMG_6935.jpg

Зашли просто идеально.

Одеваем на направляющую.

IMG_6936.jpg

Получили что хотели. Сейчас каретка свободно ходит по направляющей. При любом, даже небольшом подтягивании рукой любого винта каретка намертво заклинивает, так что сорвать руками почти невозможно. Один винт мы будем использовать для подклинивания в нужном положении. Второй возьмем покороче и будем использовать для крепления держателей датчиков.

В заключение второй части статьи приведем целиком описание модели:

A = 35; // ширина основания направляющей
B = 6; // толщина основания направляющей
C = 20; // ширина полозьев направляющей
D = 15; // высота полозьев направляющей
L = 200; // длина линейной направляющей
G = 0.6; // зазор между направляющей и кареткой
LC = 35; // длина каретки
TW = 6; // толщина стенок каретки
TT = 10; // толщина верха каретки
NutH = 5; // высота гайки
NutD = 11.5; // диаметр описанной вокруг гайки окружности
BoltD = 6; // диаметр винта
HollowH = 1; // высота углубления под уголок
HollowW = 0.8*LC; // ширина углубления под уголок
DCorner = 0.8*NutD; // расстояние от края каретки до центра отверстия

Smoothness = 360; // параметр сглаживания

A1 = (A-C)/2;
D1 = D/5;

linear_extrude(height = L, center = false)
{
polygon(points=[[0,0],
[A,0],
[A,B],
[A-A1,B],
[A-A1,B+D1],
[A-A1-D1,B+2*D1],
[A-A1-D1,B+3*D1],
[A-A1,B+4*D1],
[A-A1,B+D],
[A1,B+D],
[A1,B+4*D1],
[A1+D1,B+3*D1],
[A1+D1,B+2*D1],
[A1,B+D1],
[A1,B],
[0,B]]);
};


difference() {
linear_extrude(height = LC, center = false)
{
polygon(points=[[A1-G-TW,B+D1],
[A1-G,B+D1],
[A1+D1-G,B+2*D1],
[A1+D1-G,B+3*D1],
[A1-G,B+4*D1],
[A1-G,B+D+G],
[A-A1+G,B+D+G],
[A-A1+G,B+4*D1],
[A-A1-D1+G,B+3*D1],
[A-A1-D1+G,B+2*D1],
[A-A1+G,B+D1],
[A-A1+G+TW,B+D1],
[A-A1+G+TW,B+D+TT],
[A1-G-TW,B+D+TT]]);
};

translate([A/2,B+D+NutH+G,DCorner])
rotate([90, 90, 0])
#cylinder(h=NutH+G,d=NutD+G,$fn=6);

translate([A/2,B+D+NutH+G,LC-DCorner])
rotate([90, 90, 0])
#cylinder(h=NutH+G,d=NutD+G,$fn=6);

translate([A/2,B+D+TT,DCorner])
rotate([90, 0, 0])
#cylinder(h=TT,d=BoltD+G,$fn=Smoothness);

translate([A/2,B+D+TT,LC-DCorner])
rotate([90, 0, 0])
#cylinder(h=TT,d=BoltD+G,$fn=Smoothness);

translate([A/2,B+D+TT-(HollowH+G)/2+0.1,LC/2])
rotate([90, 0, 0])
#cube([HollowW+G,LC,HollowH+G],true);
};


В следующей части мы продолжим конструировать держатель и затронем такой важный моменты как стыковка деталей, для получения изделия, размеры которого превышают печатное поле принтера.


Борис Крамер специально для ReefCentral.ru
Если вы увидели этот материал на другом сайте - значит, он был украден.
Просим сообщать о замеченных фактах на info@reefcentral.ru


Количество показов статьи: 4004