Skip to main content

Someone wanted to learn this too, so Grasp built them a personal learning path.

You can keep exploring this one or create your own

Допуски для сборки 3D-деталей

Здравствуйте!

В предыдущем уроке мы завершили проектирование двух механизмов соединения корпуса: на винтах и на защёлках. Мы создали ответные элементы — отверстия под винты и пазы для защёлок, используя фиксированные значения для зазоров, например, 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.

Сравнение допусков ISO 286 и FDM 3D-печати
Сравнение стандартных допусков по ISO 286 и типичных допусков для FDM-печати. Видно, что отклонения от номинального размера для FDM асимметричны: отверстия имеют тенденцию быть меньше, а валы — больше. Источник: MDPI.

Эта диаграмма наглядно показывает, почему простой дизайн "размер в размер" обречён на провал. Нам нужен способ количественно оценить, какой именно зазор требуется.

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")

Ваша задача:

  1. Напечатайте обе детали (peg.stl и test_block.stl) с вашими типичными настройками (материал, толщина слоя и т.д.).
  2. Попробуйте вставить пробник в каждое отверстие.
  3. Определите, какой зазор обеспечивает нужный тип посадки.

2.2. Типы посадок

Обычно выделяют три основных типа посадки, которые вы можете выбрать в зависимости от задачи:

  • Посадка с зазором (Loose/Clearance Fit): Детали легко соединяются и имеют заметный люфт. Подходит для шарниров, крышек, которые должны легко сниматься.
    • Типичный зазор: 0.3 – 0.5 мм.
  • Переходная посадка (Snug/Transition Fit): Детали соединяются с небольшим усилием, люфт минимален или отсутствует. Идеально для точного позиционирования, например, платы на стойках.
    • Типичный зазор: 0.15 – 0.25 мм.
  • Посадка с натягом (Interference/Press Fit): Детали соединяются со значительным усилием (иногда с помощью инструмента) и держатся за счёт трения. В FDM-печати труднодостижима и редко используется.
    • Типичный зазор: 0 – 0.1 мм (или даже отрицательный).
3D Printing Design Guidelines and Tolerances
Таблица с общими рекомендациями по проектированию для 3D-печати. Обратите внимание на раздел 'Clearance', где указаны типичные значения для плотной (0.2 мм) и свободной (0.4 мм) посадки. Источник: UNSW Makerspace.

Проведя тест, вы получите свои собственные, 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-портов, разъёмов питания, светодиодов и вентиляционных решёток. Благодаря знаниям о допусках, мы сможем делать это с высокой точностью.

Can't find a good explanation? Sign up and we'll make it for you

Sign up