
Если вы разрабатываете электронику и искали подходящее свободное ПО, наверняка вы уже знакомы с проектом KiCAD. Он предназначен для проектирования электрических схем и печатных плат. Меня он покорил своей кроссплатформенностью, лёгкостью в освоении и стабильностью работы. Одной из отличительных свойств этого проекта является поддержжка 3D моделей компонентов, а это даёт замечательную возможность посмотреть, как ваша плата будет выглядеть после сборки. К сожалению, многие считают создание 3D моделей сложной задачей. Кроме того, KiCAD поддерживает только модели, созданные в Wings3D. Нарисовать там что-то для начинающего довольно сложно. К счастью, есть более красивые пути. Один из них мы сегодня и рассмотрим. Речь пойдёт об OpenSCAD.
В качестве примера для написания этой статьи я решил взять корпус SSOP28. Почему? Да просто потому, что он понадобился в одном из моих проектов. Кстати, в процессе создания модели мы параметризуем все размеры и сможем путём изменения нескольких параметров сгенерировать любой корпус от µSOP до LFQP.
Итак, наша модель будет представлять собой условно говоря, прямоугольный параллелепипед с массивами выводов по сторонам и небольшой выемкой около первого вывода, поэтому создание модели можно выполнить в следующем порядке:
- Создание вывода
- Создание корпуса
- Создание массива выводов
- Создание выемки в корпусе
- Компоновка массивов выводов вокруг корпуса
Итак, начнём с вывода. Выводы, как правило, не очень хорошо описаны в справочной документации на компоненты, и могут слегка отличаться для одной и той же модели корпуса у разных производителей. Поэтому наша задача - создать приблизительно похожий профиль, но с чётко заданными шириной, длиной и высотой.
Нарисуем вывод в виде полигона. Здесь можно пойти двумя путями: вручную прописать координаты всех восьми точек, либо задать несколько размеров и считать остальные точки автоматически. Первый путь проще для эксперимента, но гораздо сложнее, если потребуется что-то изменить, поэтому мы пойдём правильным путём и зададим следующие размеры:

Учитывая, что толщина пина - величина постоянная, вычислим координаты всех точек и создадим пин:
// Bended pin // _L - whole pin length // _l - length of bottom part // _H - whole pin height // _th - pin thickness // _a - bending angle // _W - pin width module pin(_L,_l,_H,_th,_a,_W) { // Internal variables _d1 = _th*sin(_a) / (1-cos(_a)); _d2 = (_th-_H)*cos(_a) / sin(_a); rotate([90,0,90]) // Extrude the following polygon linear_extrude(height = _W, center = true, convexity = 10, twist = 0) polygon([[0,0], [_l,0], [_l+_d2,_H-_th], [_L,_H-_th], [_L,_H], [_l+_d2-_d1,_H], [_l-_d1,_th], [0,_th]]); } // Example of usage pin(2,1,1,0.2,115,0.5);
В этом коде вы можете увидеть создание полигона по заданным точкам (команда polygon), экструзию (linear_extrude) полигона, и поворот получившейся фигуры в нужную позицию.
В итоге должно получиться следующее:

Созданный нами модуль может быть использован сколько угодно и где угодно, в том числе и в других компонентах.
Массив выводов делается гораздо проще:
// Array of pins // _cnt - number of pins // _distance - distance between pin centres module pins_array(_cnt, _distance) { if (_cnt>0) { for (_i = [0:_cnt-1]) { translate([_distance*_i,0,0]) pin(pin_L,pin_l,pin_H,pin_th,pin_a,pin_W); } } }
Осталось совсем немного. Мы не будем заморачиваться над фасками корпуса, а просто сделаем прямоугольный параллелепипед и вычтем из него небольшой цилиндр, чтобы создать выемку около первого вывода:
// Simple case with notch module case(){ difference() { cube([case_x,case_y,case_z]); translate([dot_radius+dot_off_x,dot_radius+dot_off_y,case_z]) cylinder(h=dot_depth*2, r = dot_radius, center= true, $fn = 10); } }
Всё, что нам осталось - это скомпоновать массивы выводов вокруг корпуса:
// Complete model union() { // Top pins translate([(side1_pins-side3_pins)*pin_distance/2,case_y+pin_L*2,0]) mirror([0,1,0]) pins_array(side3_pins, pin_distance); // Bottom pins pins_array(side1_pins, pin_distance); // Left pins translate([-(case_x-(side1_pins-1)*pin_distance)/2 - pin_L,pin_L+case_y/2-(side4_pins-1)*pin_distance/2,0]) mirror([1,0,0]) rotate([0,0,90]) pins_array(side4_pins, pin_distance); // Right pins translate([-(case_x-(side1_pins-1)*pin_distance)/2-pin_L+case_x+2*pin_L,pin_L+case_y/2-(side2_pins-1)*pin_distance/2,0]) mirror([0,1,0]) mirror([0,1,0]) rotate([0,0,90]) pins_array(side2_pins, pin_distance); // Case translate([-(case_x-(side1_pins-1)*pin_distance)/2,pin_L,0]) case(); }
Получится вот такая красота:

Заметьте, что эта модель полностью параметризуема и путём модификации параметров может быть легко превращена практически в любой SMD корпус с гибкими выводами (µSOP, SSOP, SO, TQFP,LQFP, и т.д.) При необходимости, изменив модель вывода и компоновку, можно сделать и другие корпуса, например PLCC или DIP. В такой параметризации и заключается, на мой взгляд, главнейшее преимущество OpenSCAD над любыми другими программами 3D моделирования.
В заключение, полный код модели (можете поиграться с параметрами и создать свой корпус):
Немного улучшенная модель, которую я и использую, можно скачать здесь. В отличие от нашей учебной модели она использует polyhedron вместо куба и поддерживает фаски.
Выглядит она следующим образом:

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