summaryrefslogtreecommitdiff
path: root/content/posts/2025-08-05-lets-code-3d/index.md
diff options
context:
space:
mode:
Diffstat (limited to 'content/posts/2025-08-05-lets-code-3d/index.md')
-rw-r--r--content/posts/2025-08-05-lets-code-3d/index.md154
1 files changed, 154 insertions, 0 deletions
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-->
+
+![Бокорез и родной колпачок](/posts/2025-08-05-lets-code-3d/1.jpg) Бокорезы и
+колпачок
+
+## Проектирование
+
+Обычно, детали для печати проектируются в CAD программах твердотельного
+моделирования. Но я в них совершенно не умею, хотя и сын
+инженеров-конструкторов. Но зато, к счастью, я программист. И вроде, не самый
+худший! Посему, я решил воспользоваться свободной программой для твердотельного
+моделирования [OpenSCAD](https://openscad.org/). К счастью, в репозитории
+любимого дистрибутива (как, в прочем, и в большинстве других репозиториев) он
+присутствовал. Что же в нём необычного? А необычное в нём то, что деталь в нём
+не _рисуется_, а именно что _программируется_. Для понимания, приведу простой
+пример:
+
+```openscad
+cube([25,35,55]); / Нарисовать куб размерами 25мм х 25мм х 55мм
+```
+
+Просто? Очень! А учитывая что язык полноценный, с циклами и условиями
+«напрограммировать» в нём можно многое.
+
+## Первая версия
+
+Вот и я не стал долго думать, открыл [мануал с
+оффсайта](https://openscad.org/documentation.html), обмерил штангенциркулем
+оригинальный колпачок и пошёл <del>проектировать</del> программировать. На всё
+про всё у меня ушло где-то с полчаса. И у меня получилась первая версия
+колпачка. Максимально простая и дубовая. Первая куцая версия:
+
+![Колпачок v1](/posts/2025-08-05-lets-code-3d/2.jpg)
+
+## Вторая версия
+
+В принципе, на этом можно было и остановиться, ведь свою функцию он выполняет.
+Но у меня сработал мой перфекционист и я подумал, что было бы неплохо вырезы в
+корпусе сделать один под другим, а не на одной линии, чтобы бокорез сидел ровно,
+а не под углом. Потом пришла мысль, что было бы неплохо ещё и параметризировать
+модель, чтобы было легко менять её размеры, а не хардкодить их. И вот получилась
+вторая, и на текущий момент окончательная версия:
+
+![Колпачок v2 код](/posts/2025-08-05-lets-code-3d/3.png)
+
+И результат «в железе», то есть в пластике :)
+
+![Колпачок v2 результат](/posts/2025-08-05-lets-code-3d/4.jpg)
+
+А сам код, думаю, он достаточно понятен ([исходники](/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