diff options
Diffstat (limited to 'content/posts/2025-08-05-lets-code-3d')
| -rw-r--r-- | content/posts/2025-08-05-lets-code-3d/1.jpg | bin | 0 -> 86020 bytes | |||
| -rw-r--r-- | content/posts/2025-08-05-lets-code-3d/2.jpg | bin | 0 -> 58451 bytes | |||
| -rw-r--r-- | content/posts/2025-08-05-lets-code-3d/3.png | bin | 0 -> 108360 bytes | |||
| -rw-r--r-- | content/posts/2025-08-05-lets-code-3d/4.jpg | bin | 0 -> 75461 bytes | |||
| -rw-r--r-- | content/posts/2025-08-05-lets-code-3d/index.md | 154 | ||||
| -rw-r--r-- | content/posts/2025-08-05-lets-code-3d/lets-code-3d_result.stl | bin | 0 -> 3684 bytes | |||
| -rw-r--r-- | content/posts/2025-08-05-lets-code-3d/lets-code-3d_source.scad | 66 |
7 files changed, 220 insertions, 0 deletions
diff --git a/content/posts/2025-08-05-lets-code-3d/1.jpg b/content/posts/2025-08-05-lets-code-3d/1.jpg Binary files differnew file mode 100644 index 0000000..87f41e7 --- /dev/null +++ b/content/posts/2025-08-05-lets-code-3d/1.jpg diff --git a/content/posts/2025-08-05-lets-code-3d/2.jpg b/content/posts/2025-08-05-lets-code-3d/2.jpg Binary files differnew file mode 100644 index 0000000..db14947 --- /dev/null +++ b/content/posts/2025-08-05-lets-code-3d/2.jpg diff --git a/content/posts/2025-08-05-lets-code-3d/3.png b/content/posts/2025-08-05-lets-code-3d/3.png Binary files differnew file mode 100644 index 0000000..9887043 --- /dev/null +++ b/content/posts/2025-08-05-lets-code-3d/3.png diff --git a/content/posts/2025-08-05-lets-code-3d/4.jpg b/content/posts/2025-08-05-lets-code-3d/4.jpg Binary files differnew file mode 100644 index 0000000..4e7ebc7 --- /dev/null +++ b/content/posts/2025-08-05-lets-code-3d/4.jpg diff --git a/content/posts/2025-08-05-lets-code-3d/index.md b/content/posts/2025-08-05-lets-code-3d/index.md new file mode 100644 index 0000000..700c666 --- /dev/null +++ b/content/posts/2025-08-05-lets-code-3d/index.md @@ -0,0 +1,154 @@ +--- +cover: /posts/2025-08-05-lets-code-3d/4.jpg +date: "2025-08-05T20:00:00+03:00" +tags: + - 3D печать + - гиковское +title: Давай запрограммируем деталь? +--- + +Некоторое время назад я по глупости запорол свои бокорезы, так, что для +откусывания ножек радио деталей они больше не годятся. К счастью, стоят они +совершенно не дорого, и тем же днём были заказанные новые в небезызвестном +сервисе, который в девичестве содержал в себе название моего родного города. При +получении я немного огорчился тем, что в комплекте к ним не шёл колпачок, +который был у предыдущих, хотя выглядят они идентично. + +Штош. Я решил восполнить этот недостаток с интересом для себя и решил этот +колпачок самостоятельно спроектировать и напечатать на 3D принтере, который есть +у меня на хозяйстве. + +<!--more--> + + Бокорезы и +колпачок + +## Проектирование + +Обычно, детали для печати проектируются в CAD программах твердотельного +моделирования. Но я в них совершенно не умею, хотя и сын +инженеров-конструкторов. Но зато, к счастью, я программист. И вроде, не самый +худший! Посему, я решил воспользоваться свободной программой для твердотельного +моделирования [OpenSCAD](https://openscad.org/). К счастью, в репозитории +любимого дистрибутива (как, в прочем, и в большинстве других репозиториев) он +присутствовал. Что же в нём необычного? А необычное в нём то, что деталь в нём +не _рисуется_, а именно что _программируется_. Для понимания, приведу простой +пример: + +```openscad +cube([25,35,55]); / Нарисовать куб размерами 25мм х 25мм х 55мм +``` + +Просто? Очень! А учитывая что язык полноценный, с циклами и условиями +«напрограммировать» в нём можно многое. + +## Первая версия + +Вот и я не стал долго думать, открыл [мануал с +оффсайта](https://openscad.org/documentation.html), обмерил штангенциркулем +оригинальный колпачок и пошёл <del>проектировать</del> программировать. На всё +про всё у меня ушло где-то с полчаса. И у меня получилась первая версия +колпачка. Максимально простая и дубовая. Первая куцая версия: + + + +## Вторая версия + +В принципе, на этом можно было и остановиться, ведь свою функцию он выполняет. +Но у меня сработал мой перфекционист и я подумал, что было бы неплохо вырезы в +корпусе сделать один под другим, а не на одной линии, чтобы бокорез сидел ровно, +а не под углом. Потом пришла мысль, что было бы неплохо ещё и параметризировать +модель, чтобы было легко менять её размеры, а не хардкодить их. И вот получилась +вторая, и на текущий момент окончательная версия: + + + +И результат «в железе», то есть в пластике :) + + + +А сам код, думаю, он достаточно понятен ([исходники](/posts/2025-08-05-lets-code-3d/source.scad) и +[STL модель](/posts/2025-08-05-lets-code-3d/result.stl) я прикладываю к этому посту): + +```openscad +/ Толщина стенки +wall = 2; + +/ Высота внешняя +height = 12; + +/ Длина основной части (внутренняя) +l1 = 15; + +/ Длина носика (внутренняя) +l2 = 20; + +/ Ширина у основания (внутренняя) +w = 15; + +/ Толщина метала бокорезов +toolWidth = 2.1; + +/ Нижняя крышка +cover(0); + +/ Верхняя крышка +cover(height - wall); + +/ Корпус +difference() { + linear_extrude(height) + polygon( + [ / Полигон идёт против часовой стрелки + [0, 0], + [wall, 0], + [wall, l1], + [w / 2 + wall, l1 + l2], / Внутренний кончик носика + [w + wall, l1], + [w + wall, 0], + [w + wall * 2, 0], + [w + wall * 2, l1], + [w / 2 + wall / 2 + wall, l1 + l2 + wall], / Внешний кончик носика + [w / 2 - wall / 2 + wall, l1 + l2 + wall], + [0, l1], + ] + ); + + / Вырезы + translate([w + wall, 0, height / 2 - toolWidth]) / Правый вырез чуть ниже середины + cube([wall, l1 / 2, toolWidth]); + translate([0, 0, height / 2]) / Левый вырез чуть выше середины + cube([wall, l1 / 2, toolWidth]); +} + + +/ Крышка +module cover(z) { + translate([0, 0, z]) + linear_extrude(wall) + polygon( + [ / Полигон идёт против часовой стрелки + [0, 0], + [w + wall * 2, 0], + [w + wall * 2, l1], + [w / 2 + wall / 2 + wall, l1 + l2 + wall], + [w / 2 - wall / 2 + wall, l1 + l2 + wall], + [0, l1], + ] + ); +} +``` + +Надеюсь, я кому-то показал что даже без специального конструкторского +образования, но умея программировать - можно получать не только эфимерные +программки, но и вполне себе физические предметы, которые пригождаются в быту. +И если интересно, подбиваю экономику: напечатано 2 колпачка (1 и 2 версия), +каждый весом по 4 грамма, то есть примерно по 4₽ за штуку. Печатал пластиком +PLA, как моим самым любимым. + +## Ссылки + +- Сайт OpenSCAD - https://openscad.org/ +- Документация - https://openscad.org/documentation.html +- Шпаргала по функциям - https://openscad.org/cheatsheet/index.html +- Библиотеки - https://openscad.org/libraries.html diff --git a/content/posts/2025-08-05-lets-code-3d/lets-code-3d_result.stl b/content/posts/2025-08-05-lets-code-3d/lets-code-3d_result.stl Binary files differnew file mode 100644 index 0000000..fdd4d19 --- /dev/null +++ b/content/posts/2025-08-05-lets-code-3d/lets-code-3d_result.stl diff --git a/content/posts/2025-08-05-lets-code-3d/lets-code-3d_source.scad b/content/posts/2025-08-05-lets-code-3d/lets-code-3d_source.scad new file mode 100644 index 0000000..b651cb3 --- /dev/null +++ b/content/posts/2025-08-05-lets-code-3d/lets-code-3d_source.scad @@ -0,0 +1,66 @@ +// Толщина стенки +wall = 2; + +// Высота внешняя +height = 12; + +// Длина основной части (внутренняя) +l1 = 15; + +// Длина носика (внутренняя) +l2 = 20; + +// Ширина у основания (внутренняя) +w = 15; + +// Толщина метала бокорезов +toolWidth = 2.1; + +// Нижняя крышка +cover(0); + +// Верхняя крышка +cover(height - wall); + +// Корпус +difference() { + linear_extrude(height) + polygon( + [ // Полигон идёт против часовой стрелки + [0, 0], + [wall, 0], + [wall, l1], + [w / 2 + wall, l1 + l2], // Внутренний кончик носика + [w + wall, l1], + [w + wall, 0], + [w + wall * 2, 0], + [w + wall * 2, l1], + [w / 2 + wall / 2 + wall, l1 + l2 + wall], // Внешний кончик носика + [w / 2 - wall / 2 + wall, l1 + l2 + wall], + [0, l1], + ] + ); + + // Вырезы + translate([w + wall, 0, height / 2 - toolWidth]) // Правый вырез чуть ниже середины + cube([wall, l1 / 2, toolWidth]); + translate([0, 0, height / 2]) // Левый вырез чуть выше середины + cube([wall, l1 / 2, toolWidth]); +} + + +// Крышка +module cover(z) { + translate([0, 0, z]) + linear_extrude(wall) + polygon( + [ // Полигон идёт против часовой стрелки + [0, 0], + [w + wall * 2, 0], + [w + wall * 2, l1], + [w / 2 + wall / 2 + wall, l1 + l2 + wall], + [w / 2 - wall / 2 + wall, l1 + l2 + wall], + [0, l1], + ] + ); +} |
