КулЛиб - Классная библиотека! Скачать книги бесплатно 

3D модель небольшого трансформатора (в LibreCAD, OpenSCAD, Meshlab) [al_fuhrmann al_fuhrmann] (fb2) читать онлайн


 [Настройки текста]  [Cбросить фильтры]
  [Оглавление]

al_fuhrmann 3D МОДЕЛЬ НЕБОЛЬШОГО ТРАНСФОРМАТОРА

Поскольку заказчики теперь очень приветствуют не только необходимые схемы/платы/исходники прошивок, но и 3D модели, то приходится заниматься ими. Конструкторам легче затолкать/вписать такой модуль в устройство. Но библиотеки, даже в платных альтиумах и менторах не всегда содержат то, что нужно. Приходится допиливать недостающее. В прошлом посте на эту тему мы занимались моделью транзистора. Это была простая задача, теперь чуть посложнее.

Это модель небольшого импульсного трансформатора для преобразователя напряжения (источника питания) 220/5V. Казалось бы, такая ерунда, а нет нигде. Она была сделана в AutoCAD и MeshLab. В автокаде делалась вся геометрия, модель по «деталям», причем понятие детали тут имеет свой смысл — это группа тел, имеющая одинаковый цвет. Затем каждая «деталь» из сборки экспортировалась в файл STL, ничего другого подходящего в наших условиях автокад предложить не может.

STL по одному открываются в MeshLab специально для окраски, затем экспортируются в файлы VMRL. Наконец, все VRML собираются в одну модель, причем некоторые части приходится перемещать в MeshLab'е снова, — он валит все в кучу. Это конечно, не гарантирует идеального совпадения с исходной сборкой в автокаде, поскольку мешлаб — это программа для дизигинеров. А им, как известно, точность до лампочки.

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

Этот способ был специально опробован для сравнения. Не вижу никаких преимуществ — даже уверенные навыки работы в автокаде не уменьшают работы мышкой и кнопками. Разве что написать скрипт на AutoLISP…

Конечно, SolidWorks делает все куда быстрее и удобнее, но его еще надо купить… и он опять для Windows. Впрочем, и автокад не бесплатный. О пользовании ворованным софтом я предпочитаю не писать, по крайней мере, без крайней необходимости. Интернет большой и кто хочет, найдет любую информацию и без моего участия.

FreeCAD еще тоже сырой, неизвестно, когда его допилят. Так что будем честно использовать доступные и бесплатные инструменты. Ими, для стоящих задач, тоже можно пользоваться с немалым успехом.

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

Эскизы

Эскизы — это плоские чертежи, которые будут выдавливаться. Мы сделаем их в плоской рисовалке LibreCAD. Это практически тот же автокад, только 2D и с гораздо более простым интерфейсом. Все, что надо и ничего лишнего.

Модель трансформатора состоит из четырех «деталей»:

• щечки (темно-серый);

• обмотка и обечайка сердечника (желтый);

• сердечник (темновато-серый);

• луженые выводы (белесые как припой).

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

Эскиз первой щечки начинаем делать с ее контура. Это несложно. Размеры в миллиметрах.


Command: line (line)

0,0

0,4.5

@3,0

@0,9.5

@11,0

@0,-9.5

@3,0

@0,-4.5

@-1.5,0

@0,1.5

@-14,0

@0,-1.5

close


Добавляем скругления радиусом 0.5 наверху щечек. Получается такая картина:


Рис. 1.

Слой бирюзового цвета (размеры) отдельно от чертежа. Размеры проставлены просто для контроля, так как мы не собираемся печатать чертежи. Нужны только эскизы. Полученную часть сделаем блоком и сохраним как p1. Это, будем считать, плоскость XY.

В плоскости ZY проекция щечки будет выглядеть по-другому (показана справа):


Рис. 2.

На основе этого вида можно сделать «инструмент», который показан на следующей паре картинок.


Рис. 3.

Рис. 4.

Мы делаем копию, дорисовываем недостающие лини (Рис. 3.) и убираем лишние (Рис. 4.). Как это работает, мы еще увидим. Штриховка показана без каких-либо целей. Из этой фигуры тоже делаем блок и сохраняем ее как f1.

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


Рис. 5.

Этот блок сохраняем как p2.

Экспорт блоков в отдельные файлы

Каждый блок экспортируем в отдельный файл с таким же именем. Перед экспортом нужно убедиться, что блок не замусорен лишними фрагментами наложившихся друг на друга линий и поддается штриховке, то есть, не разорван. Можно использовать полилинию. Преобразовать эскиз (замкнутый контур!) в полилинию можно в меню Draw | Polyline | Create polyline from Existed Segments. Однако нужно помнить, что если в эскизе есть дуги, то операция превращения контура в полилинию превратит эти дуги просто в фаски.

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

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

Создание модели в OpenSCAD

Запустим OpenSCAD:


Рис. 6.

Программа трехмерного моделирования твердых тел для программистов. Между прочим, работать в ней куда проще, чем в автокаде, компасе и солидворкс. Достаточно заглядывать по ссылке в шпаргалку: http://www.openscad.org/cheatsheet/index.html брать оттуда необходимые сведения.

Создадим новый проект и сохраним его пока как cheeks.scad. Загрузим эскиз, написав такой текст в редакторе openscad:


module ch1() {

    linear_extrude(3) import("p1.dxf", $fn=60);

    //$fn — число отрезков дуг

}

ch1();


Нажмем F6 и программа сделает рендер модели:


Рис. 7.

Как видим, сохранен масштаб, openscad это не рисовалка для стульев в офисе, которыми пользуются дизигинеры, а точная программа. Эскиз выдавлен на три единицы. Теперь не помешает загрузить «фрезер», а чтобы он не смущал, сразу сдвинуть его по оси X на 30 единиц вправо:


Рис. 8.

module ch1() {

    linear_extrude(3) import("p1.dxf", $fn=60);

    color("Silver") {

        translate([30,0,0]) linear_extrude(20) import("f1.dxf");

    }

}

ch1();


Те, кто привык к процедурным языкам, должны привыкнуть к функциональному языку openscad. Сначала мы говорим, в какой цвет должен быть окрашен объект, затем смещаем его на вектор, затем выдавливаем, и наконец, импортируем сами данные для этого. Можно объявлять переменные, присваивать им значения, но потом уже нельзя их изменить. А пока получается такая картина:


Рис. 8.

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

Теперь этот второй серый предмет повернем относительно оси Y на 90 градусов, т. е. по часовой стрелке (в математике положительный угол отсчитывается против часовой стрелки, а тут наоборот.). Сделаем это перед выдавливанием и после переноса:


module ch1() {

    linear_extrude(3) import("p1.dxf", $fn=60);

    color("Silver", 0.5) { translate([-2,0,0]) rotate(90, [0,1,0])

        linear_extrude(20) import("f1.dxf");

    }

}

ch1();


Значение переноса теперь меняется. Серый “предмет” сдвигается влево на -2 по оси X, после того, как был повернут по оси Y на 90 градусов. Кроме того, мы делаем его полупрозрачным (Хакеры пусть гадают, как. Я все время подглядываю в шпаргалку, остальное мне заменяет понимание общих принципов).

Картина получается такой:


Рис. 9.

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

Теперь можно попробовать «фрезерование». Это просто булева операция вычитания. Вставляется она, как уже нетрудно догадаться, перед translate:


module ch1() {

    difference() {

        linear_extrude(3) import("p1.dxf", $fn=60);

        color("Silver", 0.5) {

            translate([-2,0,0]) rotate(90, [0,1,0])

            linear_extrude(20) import("f1.dxf");

        }

    }

}

ch1();


Получается почти готовая щечка:


Рис. 10.

«Отфрезерованная» поверхность показана зеленой.

Осталось сделать небольшую бобышку, обозначающую первый вывод. Для этого нужно знать ее координаты и радиус. Радиус пусть будет 0.6, высота тоже 0.6, сделаем небольшую фаску 0.2 сверху и объединим со щечкой. Координаты лучше уточнить в проекции на оригинальном чертеже. Можно взять 4, 13, 1.5 относительно точки привязки.

Сделать бобышку можно прямо в исходнике openscad (как можно было бы сделать и щечку). Для этого нужно сделать два цилиндра, и перенести один из них. Затем объединить оба цилиндра, перенести его в точку с уточненными координатами и объединить бобышку со щечкой. Можно продолжать делать все в модуле ch1, но можно показать, как один модуль можно вложить в другой.


module ch1() {

    difference() {

        linear_extrude(3)

        import("p1.dxf", $fn=60);

        color("Silver", 0.5) {

            translate([-2,0,0]) rotate(90, [0,1,0])

            linear_extrude(20) import("f1.dxf");

        }

    } 

}

//ch1(); не показываем, деталь


module knob() {

    union() {

        cylinder(0.6,0.6,0.6,$fn=60);

        translate([0,0,0.6]) cylinder(0.2,0.6,0.4,$fn=60);

    }

}

//knob(); // не показываем, деталь


module ch1k() { //щечка с бобышкой

union() {

    ch1();

    translate([4,13,1.2]) knob();

    }

}

ch1k(); //это показываем, сборка


Рис. 11.

А вот небольшая иллюстрация того, за что модели openscad называются параметрическими:

…….

module knob(s) { //параметрическая версия бобышки

scale(s) union() {

    cylinder(0.6,0.6,0.6,$fn=60);

    translate([0,0,0.6]) cylinder(0.2,0.6,0.4,$fn=60);

  }

}

//knob();

module ch1k() {


kscale = [1.5,1.5,3]; //”вектор” масштаба по всем осям


union() {

    ch1();

    translate([4,13,1.2]) knob(kscale); //применяем параметр

    }

}

ch1k();


Рис. 12.

Шишка стала в полтора раза шире и в три — выше. И с необыкновенной легкостью! (Какой, однако, тонкий французский юмор получился.)

Хорошо продуманная библиотечка параметризируемых деталей открывает широкие перспективы. Но только для «программистов»! Кавычки взяты для того, чтобы расширить смысл этого слова. «Программистом» здесь может быть не только тот, кто обучался теоретической или прикладной математике в университете, но и конструктор, и дизайнер. Требуется подходящий склад ума. Некоторые люди легко оперируют геометрическими образами и отношениями, у них хорошо развито пространственное воображение, а с алгеброй они тупят. А другие — наоборот. Я отношусь к последним.

Теперь вернем шишке исходный размер (kscale = [1,1,1]) и займемся второй щечкой. Она изготавливается аналогично, вместо эскиза p1 выдавливается эскиз p2 и на этот раз никакая бобышка не нужна:


module ch2() {

difference() {

    linear_extrude(3) import("p2.dxf", $fn=60);

    translate([-2,0,0]) rotate(90, [0,1,0])

    linear_extrude(20) import("f1.dxf");

    }

}


Только здесь мы ничего не демонстрируем, даже вид щечки. Как говорил Рабинович, раздавая чистую бумагу в качестве листовок, «А чего писать, когда все и так ясно».

Теперь осталось только правильно сориентировать щечки и объединить их. Здесь необходимо учитывать расстояние между будущими выводами, от которого зависит расстояние между торцами. Для этого лучше не спешить и вернуться в librecad, чтобы сделать проекцию сборки вдоль оси Z. Заодно мы получим все остальные эскизы для выдавливания.

Вот чертеж щечек сверху:


Рис. 13.

Он сделан в отдельном слое, и слой заморожен (замочек черный, а не серый) чтобы случайно его не испортить, так как он очень важен.

Начнем хотя бы с выводов. Они расположены в прямоугольном массиве. В каждом ряду «виртуально» расположено 5 выводов (лишние мы потом удалим), а всего таких рядов два — по одному на щечку. Расстояние между выводами 2 мм. Необходимое построение можно сделать при помощи линий и привязок. «Геометрист» так бы и сделал, но мне лень колотить по мыши и елозить ею по столу.

Я рассуждаю так: x = (17 — 2*5)/2 = 3.5; y = 1.5. Это координаты (относительные! см. Рис. 13.) первого вывода, рядом с бобышкой, которая его и маркирует в изделии. Строим по этим координатам окружность с радиусом 0.4. Это проекция вывода на плоскость XY. Затем делаем копию с относительным смещением на вектор 0,2 и в диалоговом окне указываем переключатель Multiple copy. Вводим значение 5. Затем полученные 5 выводов копируем со смещением @13.5,0. Лишние кружки убираем. Получается:


Рис. 14.

Чтобы окружности были заметнее, я придал линиям слоя чертежа толщину 0.13 мм, временно. Информацию Рис. 14. можно использовать для справки под посадочное место в электронном CAD’е. Иногда такие данные приходится добывать косвенным путем, вычислять, а то и угадывать. Даже в даташитах! Особенно китайских.

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

Вот, возможно, не самый оптимальный вариант, но рабочий:


module ch1() {

    difference() {

        linear_extrude(3) import("p1.dxf", $fn=60);

        translate([-2,0,0]) rotate(90, [0,1,0])

        linear_extrude(20) import("f1.dxf");

        }

}


module knob(s) {

    scale(s) union() {

        cylinder(0.6,0.6,0.6,$fn=60);

        translate([0,0,0.6])

        cylinder(0.2,0.6,0.4,$fn=60);

        }

}


module ch2() {

    translate([0,10.5,0]) rotate(90,[1,0,0])

    translate([17,0,0]) rotate(180,[0,1,0])

    difference() {

        linear_extrude(3) import("p2.dxf", $fn=60);

        translate([-2,0,0]) rotate(90, [0,1,0])

        linear_extrude(20) import("f1.dxf");

    }

}


module ch1k() {

kscale = [1,1,1];

    rotate(90,[1,0,0])

    union() {

        ch1();

        translate([4,13,1.2]) knob(kscale);

    }

}


module ch12() {

    union() {

        ch1k();

        ch2();

    }

}

ch12(); //щечки для экспорта в STL



Рис. 15.

Первая и самая сложная деталь готова. Экспортируем ее в STL (см. предыдущий пост по теме, если что-то не получается).

Остальные части проще в «изготовлении» т. к. проще их форма. Несмотря на это, нужно уделять большое внимание деталям — это вам не компас и не солид, которые все делают за вас. В общем, в openscad игрушка должна выглядеть вот так:


Рис. 16.

Я специально показываю ее в таком виде. Чтобы избавиться от мешающих артефактов, фактически являющихся заусенцами. Вы их видите. Нужно пойти в чертеж f1.dxf и немного увеличить размеры «фрезы». Librecad у меня сейчас открыт, я беру блок f1 и подправляю размеры:


Рис. 17.

Перехожу в окно openscad и пересохраняю файл. Сразу получается другая картина:


Рис. 18.

Не очень хорошо прорисовались пазы в дальней щечке, но ведь это «приведение» еще не окончательный вид модели. Такого не произойдет, если мы будем строить контуры прямо в openscad, вместо использования внешних контуров.

……

module kern() { //сердечник

    translate([0,-3,4.5])

    linear_extrude(4.5)

    import("p4.dxf");

}


module band() { //обечайка сердечника

    translate([0,-3,4.5])

    linear_extrude(4.5)

    import("p5.dxf",$fn=60);

}


module coil() { //катушка

    translate([8.5,0,6.75])

    rotate(-90,[1,0,0])

    linear_extrude(10.5)

    import("p6.dxf",$fn=60);

}


color("gray",0.7) ch12();      //щечки part1.stl

color("lightgray",0.5) pins(); //выводы part2.stl

color("gray",0.5) kern();      //сердечник part3.stl

color("yellow",0.5) coil();    //желтое в одну деталь part4.stl

color("yellow",0.5) band();


Немного о стиле программирования в openscad. Лучше писать код, как показано в самом последнем примере. Описывая модуль, помещаем в него графический объект. Затем начинаем вставлять команды преобразования, учитывая композицию. Эти описания последовательны, но идут в обратном порядке (на то оно и функциональное программирование). Не все преобразования коммутативны: нельзя сесть плотно на горшок, а потом стаскивать штаны. Все равно, придется или встать, или …

Команды образуют узкие столбики, что очень хорошо экономит место для окна модели. Да и сам код читается легче.

Экспорт в STL

Это довольно просто. Комментируем лишние строки, делаем тонировку клавишей F6 и выбираем команду экспорта в STL. Затем переводим выходные файлы в двоичный формат (см.).

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

Раскраска частей в MeshLab

На этот раз поработаем в meshlab. Wings3D хорош, но иногда сваливается. К тому же не слишком удобен в работе. Однако, без wings не обойтись. Только он может писать исправные VRML файлы, которые открываются в meshlab. Хорошо бы написать конвертер прямо из текстовых stl, которые производит openscad, в формат vrml 2.0. Если будет время, займусь этим делом.

Мы используем wings, чтобы перечитать двоичные STL и экспортировать их в VRML. Кстати, двоичный файл stl можно получить и из meshlab. Я не знал об этом, когда писал конвертер для текстовых STL (см. предыдущий пост по теме). Делается это довольно просто: сначала импортируем stl, созданный openscad, в meshlab, затем выбираем команду “экспортировать как…”, выбираем формат целевого файла: stl, конечно, и тот же самый файл, который загрузили. Программа скажет, что файл уже существует, и попросит подтверждения его переписать. Подтверждаем. Появится окно с выбором опций и там мы увидим галочку сохранения в двоичном формате. Если она не выставлена, ставим, и сохраняем.

Теперь бинарные файлы stl (неважно, полученные из meshlab или моей утилиткой) можно пропустить через wings. Импортируем туда stl, экспортируем оттуда wrl. Всего лишь. Так мы избавляемся от заморочек, возникающих при работе wings.

Запустим meshlab, создадим новый пустой проект, если он еще не был создан. Импортируем сразу все четыре файла: part1.wrl, part2.wrl, part3.wrl и part4.wrl. Затем откроем диалог слоев (сделаем видимым). Все это должно выглядеть так:


Рис. 19.

Все координаты на месте. В meshlab можно выбрать для работы только один слой. Он показан желтым. Любой слой можно сделать невидимым и обратно. Выбрав слой, нажимаем кисточку, выбираем цвет, и наносим его в режиме заливки на соответствующее тело. Когда включен режим вращения (видны орбиты по осям) рисовать невозможно. Выбираем нужное тело, отключаем вращение (трекбол), продолжаем окрашивать. Не забываем вовремя переключаться между слоями, а также между вращением и окраской:


Рис. 20.

Рис. 21.

Затем сохраняем проект и ставим галочку сохранения всех файлов в диалоге. При раскраске меняются данные в структурах файлов VMRL, в списке слоев появляются звездочки. Поэтому сохраняем все части одной командой.

Закрыв проект и сделав новый, можно импортировать детали снова и убедиться, что все в порядке.

Но как собрать их вместе, в модель в одном файле? Это было некоторое время проблемой, но затем мне пришла идея (как будто Колумбу с яйцом) просто склеить все файлы командой cat. Такая мысль возникла после просмотра их содержимого. Вот что получилось.


Рис. 22.

Теперь импортируем файл trans.wrl:


Рис. 23.

Все в порядке. Модель раскрашена и содержится в одном файле. Вполне годная технология, если не использовать платных программ.

Вдогонку к предыдущему посту

Конечно, такой навороченный инструмент, как Meshlab, не может не содержать множество кнопочек и крутилок для поддержания нормального полета. Только надо уметь пользоваться ими, чтобы попадать на землю колесами, а не крышей. А все от лени. Лень изучать документацию, разбираться, хочется как побыстрее, а оказываешься лохом. Исправляя старые ошибки, решил написать, как можно пройти в открытую дверь, не ломая стену рядом.

В один прекрасный момент meshlab поздравил меня с «успешным» сотым проектом и попросил написать отзыв для разрабов. Написал: «Can't export to VRML. The app writes error messages everytime while I open a wrl, just created by Meshlab. Would be nice, if the bug fixed. Thank you. Alex.» Разработчики, должно быть, много получают таких дурацких писем от пользователей.

В OpenSCAD сделаем какой-нибудь дурацкий домик, совершенно неважно, какой:



Сделаем рендер и экспортируем файл в STL.

Откроем STL с помощью meshlab (точнее, импортируем в новый пустой проект). Это не wings, и он прекрасно читает этот меш.



Теперь экспортируем его в файл wrl, а затем попытаемся снова импортировать. Получится вот что:



и далее



Вот это самое интересное. Faces: 0

Просто нужно было прочитать написанное мелким шрифтом. И обратить внимание на диалог, который появляется при импорте файла STL. Поэтому закроем программу, удалим все, кроме исходника sample.scad, для стерильности эксперимента, и начнем сначала. Хотя нет, оставим старый sample.wrl, просто переименуем его в old-sample.wrl.



Если навести мышь на флажок Unify Duplicated Vertices, то появляется подсказка, в которой говорится, что формат STL не индексирует вершины многогранников. А в формате VRLM это есть. Поэтому число граней и было подсчитано как 0. Снимаем флажок и продолжаем.

Файл загружается исправно, смотрим внизу:



Теперь граней столько же, но вершин аж 54 точки (а не 13 как скажет любой архимед, глядя на фигуры). Подсчитаем: 18*3 = 54. Каждый треугольник сам по себе. Когда мы оставляем галочку, объединяющую совпадающие вершины, у нас получается косяк.

Теперь экспортируем в sample.wrl снова. Поскольку теперь есть и прежний блин комом, можно их сравнить:



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

Смотрим последний sample.wrl:



Это уже большой прогресс. Попробуем оптимизировать число вершин. В меню Filters | Cleaning and Repairing видим Compact vertices и Compact faces, но эта работа оказывается напрасной, для данного формата все ОК.

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



Так что, необходимость и в wings, и в моей утилитке отпадает начисто. Для моделирования хватит всего двух программ: openscad и meshlab. Ну, и еще librecad не помешает.


Оглавление

  • Эскизы
  • Экспорт блоков в отдельные файлы
  • Создание модели в OpenSCAD
  • Экспорт в STL
  • Раскраска частей в MeshLab
  • Вдогонку к предыдущему посту