Recommended resources
The freely available resources this lesson will direct you to.
Здравствуйте!
В предыдущем уроке мы завершили проектирование двух механизмов соединения корпуса: на винтах и на защёлках. Мы создали ответные элементы — отверстия под винты и пазы для защёлок, используя фиксированные значения для зазоров, например, snap_slot_clearance = 0.3.
Сегодня мы перейдём от "магических чисел" к системному подходу. Любой, кто занимался 3D-печатью, сталкивался с ситуацией, когда идеально спроектированные на компьютере детали в реальности не стыкуются. Это происходит из-за физических особенностей процесса FDM-печати.
Цель этого урока — научиться учитывать допуски (tolerances), чтобы гарантировать правильную сборку напечатанных деталей. Мы разберёмся, почему возникают неточности, как определить правильные зазоры для вашего принтера и материала, и как внедрить эти знания в наш проект корпуса. Это последний и ключевой шаг в проектировании механики соединения.
1. Почему детали не стыкуются: Физика FDM-печати
Основная причина, по которой детали, спроектированные с одинаковыми размерами (например, вал диаметром 10 мм и отверстие диаметром 10 мм), не соединяются, кроется в самой природе FDM-технологии.
Why your 3d printed stuff doesn't fit together and how to fix it!
Давайте начнём с короткого видео, которое наглядно объясняет фундаментальную проблему.
Посмотрите два фрагмента. Сначала с 00:32 по 01:23, где объясняется, почему экструзия пластика не создаёт идеальных прямых углов. Затем посмотрите с 03:59 по 04:29, где подчёркивается необходимость зазора (clearance).
Как вы увидели, ключевые моменты таковы:
- Форма экструдируемой нити: Пластик выдавливается через круглое сопло и укладывается в виде "валика" (bead) с закруглёнными краями. Внешний край детали оказывается чуть больше, чем заложено в модели.
- Тепловая усадка: Пластик при остывании сжимается, что также вносит погрешности в конечные размеры.
- Необходимость зазора (Clearance): Чтобы одна деталь вошла в другую, между ними должен быть запланированный зазор. Отверстие должно быть немного больше, чем вал.
Ваш опыт в физике подсказывает, что идеализированные модели (как CAD-модель) часто требуют поправок при переходе к реальному физическому процессу. FDM-печать — яркий тому пример.
Более того, допуски в 3D-печати отличаются от допусков в традиционной механической обработке, которые описываются стандартами вроде ISO.

Эта диаграмма наглядно показывает, почему простой дизайн "размер в размер" обречён на провал. Нам нужен способ количественно оценить, какой именно зазор требуется.
2. Как определить правильный зазор: Тестовая печать
Величина необходимого зазора — это не константа. Она зависит от:
- Вашего принтера: его калибровки и механики.
- Материала: разные пластики (PLA, PETG, ABS) имеют разную усадку и вязкость.
- Настроек слайсера: температура, скорость печати, толщина слоя.
- Желаемого типа посадки: деталь должна входить плотно или свободно?
Самый надёжный способ определить правильный зазор — это напечатать калибровочную модель (tolerance test).
What is Fit Tolerance - 3D Printing
В этом видео демонстрируется один из вариантов такого теста и объясняется, как его использовать для определения нужного зазора.
Посмотрите фрагмент с 01:13 по 02:58. Обратите внимание, как разные значения зазоров (от 0.05 мм до 0.5 мм) влияют на то, насколько легко или туго вращаются детали.
Идея проста: мы создаём одну деталь с набором отверстий, диаметр которых немного увеличивается, и вторую деталь — "пробник" (peg) эталонного размера. Напечатав их, мы физически проверяем, какое отверстие обеспечивает наилучшее соединение.
2.1. Проектирование собственного теста допусков в build123d
Давайте создадим свой собственный, простой, но эффективный тест. Это будет брусок с несколькими отверстиями и отдельный цилиндрический "пробник".
Откройте новый файл, например tolerance_test.py, и напишите следующий код:
from build123d import *
# ================== ПАРАМЕТРЫ ТЕСТА ==================
peg_diameter = 10.0 # Номинальный диаметр "пробника"
clearances = [0.1, 0.2, 0.3, 0.4, 0.5] # Список зазоров для теста в мм
label_font_size = 2.0
# ================== СОЗДАНИЕ ДЕТАЛЕЙ ==================
# --- Создание пробника (peg) ---
with BuildPart() as peg:
Cylinder(radius=peg_diameter / 2, height=15)
# Добавляем фаску для удобства вставки
fillet(peg.edges().filter_by(Axis.Z).sort_by(SortBy.Z)[-1], radius=0.5)
# --- Создание тестового блока с отверстиями ---
block_width = (peg_diameter + 10) * len(clearances)
block_height = peg_diameter + 20
block_thickness = 10
with BuildPart() as test_block:
Box(block_width, block_height, block_thickness, align=(Align.CENTER, Align.CENTER, Align.MIN))
# Создаём плоскость для текста
with BuildSketch(Plane.XY.offset(block_thickness)) as labels:
# Создаём плоскость для отверстий
with BuildSketch(Plane.XY) as holes:
# Располагаем отверстия в ряд
with GridLocations(x_spacing=peg_diameter + 10, y_spacing=0, x_count=len(clearances), y_count=1):
for clearance in clearances:
# Отверстие с учётом зазора
Circle(radius=(peg_diameter + clearance) / 2)
# Текстовая метка над отверстием
Text(
txt=f"{clearance}",
font_size=label_font_size,
align=(Align.CENTER, Align.MIN)
).locate(Location(Vector(0, peg_diameter/2 + 2)))
extrude(amount=-block_thickness, mode=Mode.SUBTRACT) # Вырезаем отверстия
extrude(amount=0.5) # Выдавливаем текст
# ================== ВИЗУАЛИЗАЦИЯ ==================
if "show_object" in locals():
show_object(peg, name="peg")
show_object(test_block, name="test_block", options={"alpha": 0.8})
# Для экспорта в STL
# peg.part.export_stl("peg.stl")
# test_block.part.export_stl("test_block.stl")
Ваша задача:
- Напечатайте обе детали (
peg.stlиtest_block.stl) с вашими типичными настройками (материал, толщина слоя и т.д.). - Попробуйте вставить пробник в каждое отверстие.
- Определите, какой зазор обеспечивает нужный тип посадки.
2.2. Типы посадок
Обычно выделяют три основных типа посадки, которые вы можете выбрать в зависимости от задачи:
- Посадка с зазором (Loose/Clearance Fit): Детали легко соединяются и имеют заметный люфт. Подходит для шарниров, крышек, которые должны легко сниматься.
- Типичный зазор: 0.3 – 0.5 мм.
- Переходная посадка (Snug/Transition Fit): Детали соединяются с небольшим усилием, люфт минимален или отсутствует. Идеально для точного позиционирования, например, платы на стойках.
- Типичный зазор: 0.15 – 0.25 мм.
- Посадка с натягом (Interference/Press Fit): Детали соединяются со значительным усилием (иногда с помощью инструмента) и держатся за счёт трения. В FDM-печати труднодостижима и редко используется.
- Типичный зазор: 0 – 0.1 мм (или даже отрицательный).

Проведя тест, вы получите свои собственные, empirically verified значения для LOOSE_FIT и TIGHT_FIT.
3. Применение допусков в проекте корпуса
Теперь, когда у нас есть понимание и конкретные цифры, давайте вернёмся к нашему файлу с корпусом (например, enclosure_v12.py) и применим эти знания.
Лучшая практика — вынести все значения допусков в отдельный блок параметров в начале скрипта. Это позволит легко их изменять в будущем, если вы поменяете принтер, пластик или просто захотите изменить посадку.
# enclosure_v12.py
# ... импорты ...
# ================== ГАБАРИТЫ И ОСНОВНЫЕ ПАРАМЕТРЫ ==================
# ... wall_thickness, pcb_dimensions, и т.д. ...
# ================== ПАРАМТРЫ ДОПУСКОВ (TOLERANCES) ==================
# Значения определены после печати калибровочной модели
TIGHT_FIT_CLEARANCE = 0.2 # Для плотной посадки (стойки под плату)
LOOSE_FIT_CLEARANCE = 0.4 # Для свободной посадки (фальц крышки)
SNAP_FIT_CLEARANCE = 0.3 # Зазор для защелок (можно тоже подобрать тестом)
Теперь пройдёмся по коду и заменим "магические числа" на эти переменные.
Пример 1: Фальц (Lip/Groove)
Раньше мы могли делать паз для выступа, просто вычитая сам выступ. Теперь мы сделаем паз немного больше.
# В коде, где создаётся крышка (lid)
# Создание паза в крышке
cutter_lip = Box(
lip_width + LOOSE_FIT_CLEARANCE, # Делаем паз шире
lip_depth + LOOSE_FIT_CLEARANCE, # и глубже
lip_height,
align=(Align.CENTER, Align.MIN, Align.CENTER)
)
# ... позиционируем и вычитаем cutter_lip из крышки ...
Пример 2: Стойки для платы (Standoffs)
Отверстия в печатной плате имеют определённый диаметр. Чтобы плата плотно села на позиционирующие штыри на стойках, эти штыри должны быть чуть тоньше.
# В коде, где создаются стойки (standoffs)
pcb_hole_diameter = 2.5 # Пример
# Создаём позиционирующий штырь
Cylinder(
radius=(pcb_hole_diameter - TIGHT_FIT_CLEARANCE) / 2, # Штырь меньше отверстия
height=1.0
)
Пример 3: Отверстия под винты (bd_warehouse)
Напоминаю из прошлого урока, что библиотека bd_warehouse элегантно решает эту проблему за нас с помощью параметра fit.
from bd_warehouse.fastener import ClearanceHole, Fit
# ...
ClearanceHole(
fastener=fastener_screw,
fit=Fit.NORMAL # Можно выбрать Fit.CLOSE, Fit.NORMAL или Fit.LOOSE
)
Это ещё одна причина использовать готовые библиотеки для стандартных компонентов — они часто уже инкапсулируют лучшие практики, включая работу с допусками.
Проверьте себя!
Вы проектируете паз для защёлки. Переменная snap_hook_depth равна 1.0 мм и описывает глубину крючка защёлки. Вы хотите, чтобы защёлка входила в паз с минимальным усилием. Как вы определите глубину "режущего инструмента" (cutter_depth) для создания паза, используя ваши новые параметрические допуски?
Показать ответ
Для лёгкого защёлкивания нужна свободная посадка. Следовательно, правильный код будет:cutter_depth = snap_hook_depth + LOOSE_FIT_CLEARANCE
Это создаст паз, который немного глубже, чем крючок, обеспечивая необходимый зазор.
Ключевые выводы
- Размеры напечатанных на FDM-принтере деталей всегда отклоняются от цифровой модели из-за физики процесса экструзии и усадки материала.
- Для обеспечения сборки необходимо проектировать зазоры (clearances) между сопрягаемыми деталями.
- Величина зазора зависит от множества факторов, и самый надёжный способ её определить — напечатать и протестировать калибровочную модель.
- В зависимости от задачи выбирают разные типы посадок: свободную (loose), плотную (tight/snug) или с натягом (interference).
- В коде проекта следует определять допуски как именованные переменные (например,
TIGHT_FIT_CLEARANCE), а не использовать "магические числа". Это делает проект параметрическим и легко адаптируемым.
Что дальше?
Мы завершили модуль, посвящённый механике соединения и сборки. Теперь наш корпус не только имеет форму, но и продуманную конструкцию: он разделяется на части, которые надёжно соединяются друг с другом, а печатная плата точно позиционируется внутри.
В следующем модуле мы перейдём к функциональным элементам: начнём вырезать в стенках корпуса точные отверстия для USB-портов, разъёмов питания, светодиодов и вентиляционных решёток. Благодаря знаниям о допусках, мы сможем делать это с высокой точностью.