Подвешиваем CD-диск, или практический пример моделирования на базе OpenSCAD для 3д печати

  • Tutorial


В данной статье я бы хотел поделиться опытом использования бесплатной программы OpenSCAD, для 3д моделирования предоставленной на картинке фигурки.

Будет показан пошагово весь путь моделирования и готовая, напечатанная 3д деталька в конце.

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

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

Суть программы на языке OpenSCAD достаточно простая — в ней мы даем команды на рисование геометрических примитивов, над которыми мы можем выполнять операции вращения, перемещения, масштабирования. И плюсом к этому можем осуществлять «арифметические» команды над фигурами, например, сложение, вычитание.

Простая иллюстрация идеи:
нарисовать куб со стороной 10 мм
нарисовать сферу радиусом 10 мм
вычесть из куба сферу


И мы получим такой результат:




Установка OpenSCAD



Для установки — скачиваем версию для вашей ОС с официального сайта (http://www.openscad.org/). В данный момент версия от 03.2014.

После старта программы мы увидим 2 области:



Cлева — для ввода программы на языке OpenSCAD,
Cправа — результат отрисовки.

Для отрисовки программы надо нажать F5, для полноценного рендеринга — F6.

Отмечу, что при открытии файла — его не обязательно редактировать в среде OpenSCAD, вы можете его редактировать в вашем любимом текстовом редакторе, для отрисовки в опенскад при редактировании внешним редактором — необходимо нажимать F4.

Hello World



Попробуем нарисовать куб: cube();

Пишем в левой, текстовой зоне (10 — это сторона куба):

cube(10);


Обратим внимание, что каждая строчка в программе заканчивается точкой с запятой.

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



И попробуем нарисовать сферу, команда: sphere(10)

cube(10);
sphere(10);


Просматриваем результат F5:



Теперь добавим команда вычитания:

difference() { OBJ1; OBJ2;}.

Команды пишутся как вызов функции, если параметров нет, то пустые скобки, и далее те объекты или объект к которым надо применить эту функцию.

Вот как будет выглядеть вычитание

difference(){
  cube(10);
  sphere(10);
}


И вот результат:



Основы думаю понятны.

Теперь вернемся к нашей основной задаче.

Моделирование подвеса



Чтобы CD-диск висел на нити, в горизонтальном положении:

  1. Должно быть что-то куда можно закрепить нить
  2. Диск должен на что-то опираться
  3. Точка крепления нити должна быть по центру диска, при взгляде сверху, и должна быть выше плоскости при взгляде сбоку


Начнем с точки крепления нити, а точнее того, что находится между ней и основанием диска.

Моделирование крестовины



Я решил выполнить этот фрагмент в виде крестовины, которая вверх идет как усеченная пирамида.

Ок, в начале делаем крестовину.

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

Примечание: для простоты текста — буду называть «прямоугольный параллелепипеда» — «кубоид», то есть это вариация куба.

При рисовании фигур, по умолчанию они идут от центра, в положительные стороны осей X, Y, Z. Это можно увидеть в нашем первом примере — и куб был нарисован в положительной зоне (тогда как сфера изначально рисуется в центре координат).

Но есть вариант, когда центр нарисованной фигуры будет находиться в центре координат. Для этого надо использовать атрибут,
center = true.

Настал момент задуматься о размерах. Диаметр внутреннего отверстия CD-диска — 15 мм. Значит крестовина внизу должна быть не более 15 мм, для запаса возьмем 14 мм.

Первая часть крестовины:
cube([14,1,15], center=true);


Получилось:


Если мы указываем каждую стенки «куба», то мы должны использовать запись [x, y, z], вторым параметром (center=true) мы указали что «кубоид» будет нарисован в центре координат.

Мы указали:
14 — это ширина «кубоида» — оно должно быть не больше 15 мм — внутреннего отверстия CD-ROM диска.
1 — толщина стенки,
15 — это высота «кубоида», т.к. он по центру Z, то в верхней части будет 15/2 = 7.5 мм — это будет высота до точки крепления.

Далее нам нужна вторая часть крестовины, для этого нам нужно тот же «кубоид» повернуть на 90 градусов, относительно оси Z.

Функция поворота выглядит как: rotate(a = deg, v = [x, y, z]) { ... }

Где в параметрах функции указывается угол поворота (a), и вектор (v) относительно которого поворот совершается.

Вот так будет выглядеть программа:
cube([14,1,15], center=true);
rotate(a=90, v=[0,0,1]){
  cube([14,1,15], center=true);
}


И результат


Теперь нам надо убрать лишнюю часть, что находится под нулевой плоскостью (внизу).

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

Команда перемещения выглядит так: translate(v = [x, y, z]) { ... }

Где в параметрах указывается вектор (v) на который необходимо сдвинуть объект (указанный в теле функции).

Куб рисуем со стороной 15 мм, и сдвигаем вниз на 15/2 мм (да можно указывать математические операции) — он оказывается полностью под плоскостью.

Вот обновленный код:
cube([14,1,15], center=true);
rotate(a=90, v=[0,0,1]){
  cube([14,1,15], center=true);
}
translate(v=[0,0,-15/2]){
  cube(15, center=true);
}


И вот результат:


Теперь применяем уже известную нам команду вычитания — нам надо вычесть из крестовины, куб. Но проблема — для вычитания нужно два объекта — у нас три — два «кубоида» (крестовина), и куб.

Для этого используем команду объединения: union(){ OBJ1; OBJ2; ... }.

Получается следующий код (с объединением и вычитанием):
difference(){
  union(){
    cube([14,1,15], center=true);
    rotate(a=90, v=[0,0,1]){
      cube([14,1,15], center=true);
    }
  }
  translate(v=[0,0,-15/2]){
    cube(15, center=true);
  }
}


Результат


Крестовина получилась, теперь надо сделать ее пирамидальной.

Для этой цели нам бы подошел конус, и операция «пересечения» когда остается лишь та часть фигур, которая совпадает у обоих фигур.

Но команды для рисования конуса нет в OpenSCAD.

Зато есть команда рисования цилиндра: cylinder(h = 10, r = 10, [r2 = 20,]);

где кроме базовых двух параметров (для получения цилиндра) — радиус основания [r] и высоты [f] есть третий [r2] — радиус вершины, с помощью которого можно нарисовать конус, если выставить в 0. Или усеченный конус — если выставить значение не равное радиусу основания.

Это то, что нам нужно.

Определимся с размерами, основание конуса в диаметре должно быть 14, то есть радиус 7. Высота 15/2 мм. Радиус верхнего основания пусть будет 1мм, сам размер будет 2мм, на нем мы разместим ушко для нити.

Мы будем рисовать конус в центре координат, поэтому надо будет поднять вверх на половину высоты (15/4).

Фрагмент:
translate(v=[0,0,7/2]){
  cylinder(h=7, r=7, r2=2, center=true);
}


Вот как он выглядит:



Результирующий код:
difference(){
  union(){
    cube([14,1,15], center=true);
    rotate(a=90, v=[0,0,1]){
      cube([14,1,15], center=true);
    }
  }
  translate(v=[0,0,-15/2]){
    cube(15, center=true);
  }
}
translate(v=[0,0,15/4]){
  cylinder(h=15/2, r=7, r2=2, center=true);
}


И результат:


Обратим внимание, что из-за нарисованного конуса мы не видим, что внутри. В OpenSCAD, можно для режима просмотра делать выбранные фигуры полупрозрачные, для этого надо в начале строки, перед командой добавить "%".

Вот код:
difference(){
  union(){
    cube([14,1,15], center=true);
    rotate(a=90, v=[0,0,1]){
      cube([14,1,15], center=true);
    }
  }
  translate(v=[0,0,-15/2]){
    cube(15, center=true);
  }
}
%translate(v=[0,0,15/4]){
  cylinder(h=15/2, r=7, r2=2, center=true);
}


И что получается:


Ок, теперь нам надо получить пересечение нашей крестовины и конуса.

Команда пересечения фигур: intersection() { OBJ1; OBJ2; ...}

Добавляем в наш код:
intersection(){
  difference(){
    union(){
      cube([14,1,15], center=true);
      rotate(a=90, v=[0,0,1]){
        cube([14,1,15], center=true);
      }
    }
    translate(v=[0,0,-15/2]){
      cube(15, center=true);
    }
  }
  translate(v=[0,0,15/4]){
    cylinder(h=15/2, r=7, r2=2, center=true);
  }
}


И получаем результат:


Стойка для крепления нити готова.

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

Моделирование ушка для нити



Ушко — это будет маленькое колечко. Мы его создадим с помощью вычитания плоских цилиндров.

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

Вот этот фрагмент кода:
translate(v=[0,0,15/2]){
  rotate(a=90, v=[1,0,0]){
    difference(){
      cylinder(h=1, r=2, center=true);
      cylinder(h=1, r=1, center=true);
    }
  }
}


И результат


Вот это в коде нашей программы:
intersection(){
  difference(){
    union(){
      cube([14,1,15], center=true);
      rotate(a=90, v=[0,0,1]){
        cube([14,1,15], center=true);
      }
    }
    translate(v=[0,0,-15/2]){
      cube(15, center=true);
    }
  }
  translate(v=[0,0,15/4]){
    cylinder(h=15/2, r=7, r2=2, center=true);
  }
}

translate(v=[0,0,15/2]){
  rotate(a=90, v=[1,0,0]){
    difference(){
      cylinder(h=1, r=2, center=true);
      cylinder(h=1, r=1, center=true);
    }
  }
}


И вот результат:


То есть крепление для нити есть, теперь надо сделать основание для сд диска.

Основание для диска



Мы поступим хитро — мы не будем его рисовать. Мы воспользуемся Рафтом.

Что такое Рафт?



Рафт (raft) это техническая подложка, которую генерирует программа для 3д печати, это способ повышения прилипания печатаемой 3д фигурки.

Вот так выглядит Рафт, по сути это сеточка внизу:


Рафт автоматически вычисляется согласно контуру основания фигуры, и делается отступ вокруг, как правило 5мм.

Нам как раз это и надо — подложка, слой под нашей фигуркой обеспечит опору для CD-диска.

Кольцо в основании



Единственная тонкость — Рафт будет в форме крестовины, но это легко исправить — нарисуем тонкое кольцо внизу.

Рисуем два цилиндра, высотой 0.5 мм, внешний диаметром 14мм, то есть радиус 7 мм, внутренний радиусом 6.5 мм, и вычитаем — получим кольцо, поднимаем вверх на 0.25 (так как рисовали в центре координат).

Вот код фрагмента:
translate(v=[0,0,0.25]){
  difference(){
    cylinder(h=0.5, r=7, center=true);
    cylinder(h=0.5, r=6.5, center=true);
  }
}

Результат:


И вот финальный код для рисования:
intersection(){
  difference(){
    union(){
      cube([14,1,15], center=true);
      rotate(a=90, v=[0,0,1]){
        cube([14,1,15], center=true);
      }
    }
    translate(v=[0,0,-15/2]){
      cube(15, center=true);
    }
  }
  translate(v=[0,0,15/4]){
    cylinder(h=15/2, r=7, r2=2, center=true);
  }
}

translate(v=[0,0,15/2]){
  rotate(a=90, v=[1,0,0]){
    difference(){
      cylinder(h=1, r=2, center=true);
      cylinder(h=1, r=1, center=true);
    }
  }
}

translate(v=[0,0,0.25]){
  difference(){
    cylinder(h=0.5, r=7, center=true);
    cylinder(h=0.5, r=6.5, center=true);
  }
}


Системные переменные



Возможно отметили — что окружности получаются «угловатые», для увеличения количества сегментов для рисования окружностей, можно выставить параметр (в самом начале кода):

$fn=30;


Тогда получится более красиво:


Генерация СТЛ



Наконец то!

Теперь, не забываем нажать F6, для рендеринга. И в меню File -> Export -> Export as STL..., сохраняется STL файл.

Печать



Теперь загружаем полученный STL в программу 3д печати, не забываем выставить опцию Raft в настройках (5 мм).

Так это выглядит в программе Cura:


И стартуем на печать.

Результат



Вот деталька в действии:



А вот наш Рафт:



В качестве заключения



Это конечно самые базовые возможности OpenSCAD (не были рассмотрены возможности создания своих функций, использование переменных), но даже их достаточно, чтобы относительно быстро сделать 3д модель.

Если вы не знаете где выполнить 3д печать в вашем городе, то можно сделать:

  1. поиск по хакспейсам в вашем городе, как правило там есть 3д принтеры, и они доступны для небольших заказов
  2. можете поискать фаблаб, там 3д принтер так же должен быть
  3. поискать сервис 3д печати (в вашем городе)


Скачать модель



Модельку и код можно скачать с Thingiverse.
MakeItLab
Company
AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 20

    0
    Здорово! Сам сейчас в процессе использования OpenScad :)
      +2
      не проще ли для получения крестовины сделать так?
      translate(v=[0,0,15/4]){
      cube([14,1,15/2], center=true);
      cube([1,14,15/2], center=true);
      }
      //если я не ошибся
        0
        Да, спасибо, конечно так проще )
        +1
        Как активный пользователь OpenSCAD хочу приложить к этой статье замечательную библиотеку элементов, которая будет очень полезна, в том числе и как библиотека примеров.

        Клик
          +1
          Спасибо за статью! Тоже решил поучиться и сделал переходник с байонета фотоаппарата на тубус микроскопа.
          Получилось так
            0
            Ух ты! Здорово! Подошёл? Люфтит? Какие фотки получаются? Статья будет?
              0
              Не спешите! Я же только ночью сделал модель, когда напечатаю — напишу тут или статью с другими дополнениями) Хотя предполагаю что должен немного люфтить, но в данном случае это не очень страшно. К сожаления. я не нашёл точное описание байонета, правда fujifilm вроде не открыл доступ к документации кроме Zeiss. Я немного не продумал крепление к тубусу микроскопа, не знаю насколько возможно просверлить сбоку отверстие и вкрутить винт. Но главное чтобы байонет держался — там небольшие выступы-дуги сечением 1х1мм, выдержат ли они?
              Кстати, если вы знаете где в Москве дёшево напечатать, напишите мне пожалуйста!
                +1
                Распечатал) Люфтит, но в целом очень хорошо. А если учесть что это был реверсинжениринг байонета, то вообще удачно! В следующей модели учту. Сейчас начал писать статью, но там будет ещё и про телескоп, так что надо ещё сделать для него. Фотографии вроде получаются, но пока только попробовал, какие там особенности пока не знаю.
                  +1
                  Для точности советую учесть, что деталь после остывания немного усаживается (опытные люди говорят, что примерно на 2%).
                    0
                    Мне такая точность пока не требуется, но спасибо за совет, я учту!
                      0
                      2% это очень много, коэффициент усадки ABS пластика от 0,5% до 0,9%
                  0
                  Рад, что мой опыт пригодился. Ваш артефакт, конечно более полезный чем у меня :)

                  Кстати, можете выкладывать (stl, scad) на www.thingiverse.com/ — сервис бесплатных 3д моделек.
                  0
                  Вот только не sphera, а sphere
                    0
                    Спасибо, поправил.
                    +1
                    А еще многослойный рафт используется для компенсации неточной калибровки печатного стола.
                      +1
                      OpenScad отличная программа для моделирования!

                      В данном случае советую использовать функцию hull() для рисования крепления.
                      И не забывать про параметр $fn — он поможет избежать угловатости малых колец.
                      То есть код может выглядеть вот так.
                      $fn = 50;

                      difference() {
                      hull() {
                      translate([0, 0, 20]) rotate([90, 0, 0]) cylinder(r = 5, h = 3, center = true);
                      cube([20, 4, 1], center = true);
                      }
                      translate([0, 0, 20]) rotate([90, 0, 0]) cylinder(r = 1.5, h = 3+1, center = true);
                      }

                      hull() {
                      cube([5, 20, 1], center = true);
                      translate([0, 0, 10]) cube([2, 3, 1], center = true);
                      }

                      difference() {
                      cylinder(r = 11, h = 1, center = true);
                      cylinder(r = 10, h = 2, center = true);
                      }



                      OpenScad позволяет применять к созданию деталей различные практики программирования (контроль версий, совместная разработка и т.д.), что дает возможность быстро разрабатывать и совершенствовать различные сложные объекты.

                      Примеры


                        +1
                        CD-диск — это тавтология (Compact Disk-диск), не пишите так, пожалуйста.
                        В остальном круто. Всегда любил статьи, раскрывающие тот или иной программный инструмент через решение одной несложной задачи.
                          +1
                          Попробовал нарисовать губку Менгера.
                          Код
                          module menger_spounge(s, n)
                          {
                              s3 = s / 3;
                          
                              for(xi = [0 : 2])
                              {
                                  for(yi = [0 : 2])
                                  {
                                      for(zi = [0 : 2])
                                      {
                                          if(
                                              ((xi != 1) || (yi != 1)) &&
                                              ((xi != 1) || (zi != 1)) &&
                                              ((yi != 1) || (zi != 1))
                                              )
                                          {
                                              translate([xi*s3, yi*s3, zi*s3])
                                              {
                                                  if(n > 0)
                                                  {	
                                                      menger_spounge(s3, n-1);
                                                  }
                                                  else
                                                  {
                                                      cube(s3);
                                                  }
                                              }
                                          }
                                      }
                                  }
                              }
                          }
                          
                          menger_spounge(1, 2);

                          Нарисовало, но уж очень медленно. Compile and render (который по F6), вообще не дождался. А вообще крутая штука.
                          +1
                          Я так считаю, для труъ программиста — освоить OpenSCAD гораздо проще чем другие программы 3Д моделирования. Пару лет назад я перепробовал несколько бесплатных (и не только) прог, но так и не смог их освоить. Как только наткнулся на OpenSCAD — сразу понял это то что мне надо. А самое классное в oscad — вы можете хранить историю модели в svn/git :)))

                          Only users with full accounts can post comments. Log in, please.