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

Печать тестовых образцов для проверки допусков

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

На прошлом уроке мы завершили проектирование нашего корпуса, создав крышку и реализовав надежный механизм винтового соединения с помощью библиотеки bd_warehouse. Теперь у нас есть два полностью готовых STL-файла: enclosure_base.stl и enclosure_lid.stl. В цифровом мире они идеально подходят друг к другу. Но сохранится ли эта идеальность в физическом воплощении?

Сегодняшний урок посвящен критически важному этапу, который отделяет профессиональное прототипирование от любительского: подготовке и печати тестовых образцов для проверки ключевых допусков. Это самый эффективный способ сэкономить время и пластик, убедившись, что самые ответственные части дизайна работают как задумано, прежде чем запускать многочасовую печать всего корпуса.

Мы с вами:

  1. Определим, что такое допуски (tolerances) и зазоры (clearances) в контексте 3D-печати.
  2. Выясним, какие калибровки принтера напрямую влияют на точность размеров.
  3. Напишем код на build123d для создания небольших, быстрых в печати тестовых моделей, изолирующих критические узлы нашего корпуса.
  4. Обсудим, как проанализировать напечатанные образцы и внести корректировки в наш основной проект.

1. Допуски, зазоры и реальность FDM-печати

В нашем коде мы задали параметр LID_LIP_CLEARANCE = 0.2. Это зазор (clearance) — целенаправленно спроектированное расстояние между двумя деталями для обеспечения их правильного взаимодействия. В нашем случае, чтобы крышка свободно, но без люфта входила в основание.

Однако реальный итоговый зазор будет отличаться от проектного. Допуск (tolerance) — это допустимый диапазон отклонений реального размера детали от номинального (заданного в модели). На него влияет множество факторов:

  • Принтер: механическая точность, люфты.
  • Материал: усадка пластика при остывании (у PETG она меньше, чем у ABS).
  • Настройки слайсера: ширина экструзии, температура, скорость, компенсация "слоновьей ноги" (elephant's foot).

Ваш опыт в физике подсказывает, что это похоже на различие между теоретической моделью и результатами эксперимента, где необходимо учитывать погрешности измерительных приборов и внешние условия.

Типы инженерных посадок: Зазор, Переход и Натяг
Это классическая иллюстрация трех типов посадок. Наша цель для крышки — это **посадка с зазором (Clearance Fit)**, где детали сопрягаются свободно. Для защелок, которые мы обсуждали, может потребоваться **переходная (Transition)** или даже **посадка с натягом (Interference Fit)**, где требуется усилие для сборки.
3D Printing Design Guidelines and Tolerances
Как видите из этих рекомендаций, для сопрягаемых деталей (Connecting Parts) обычно рекомендуется зазор 0.5 мм. Мы заложили 0.2 мм — это довольно жесткое требование, которое как раз и нужно проверить на практике.

2. Основа точности: Калибровка принтера

Прежде чем тестировать допуски нашего дизайна, стоит убедиться, что наш инструмент (принтер) настроен на максимальную точность. Полная калибровка — это отдельная большая тема, но есть два параметра, которые напрямую влияют на итоговые размеры и качество сопрягаемых деталей.

3D печать с высокой точностью: калибровка с помощью OrcaSlicer

Посмотрите это видео от FabLab Moscow. Оно отлично объясняет, как с помощью современного слайсера OrcaSlicer (форка Bambu Studio) можно значительно повысить точность печати даже на бюджетном принтере. Нам не нужно выполнять все шаги, но важно понять концепции.

Сосредоточьтесь на двух разделах: Flow Rate (поток) (с 07:25 до 14:35): Поймите, почему калибровка потока важна для компенсации реального диаметра филамента и его свойств. Неправильный поток — основная причина, почему детали выходят больше или меньше, чем задумано. Pressure Advance (давление) (с 14:35 до 21:25): Эта концепция будет вам интуитивно понятна. Она компенсирует сжимаемость филамента и задержку в экструзии при изменении скорости, что критично для получения острых и точных углов. Просмотр этих фрагментов даст вам представление о том, какие параметры слайсера нужно проверить, если ваши тестовые детали не соответствуют ожиданиям по размеру.

Ключевая идея: если тестовые детали получаются слишком тугими, возможно, дело не в малом зазоре в CAD, а в завышенном Flow Rate в слайсере. И наоборот.

3. Практика: Создаем тестовые модели

Теперь самое интересное. Вместо того чтобы печатать весь корпус, мы создадим небольшие "пробники" для двух самых критичных узлов:

  1. Посадка крышки (lip/groove fit): Проверим наш зазор LID_LIP_CLEARANCE.
  2. Отверстие под термозакладную втулку: Убедимся, что втулка M3 вплавляется корректно.

Создадим новый файл test_pieces.py.

Тест №1: Посадка крышки

Мы создадим небольшой блок, имитирующий угол основания с пазом, и второй блок, имитирующий угол крышки с выступом.

# test_pieces.py

from build123d import *
from ocp_vscode import show_object

# --- Параметры из основного проекта, которые нам нужны ---
WALL_THICKNESS = 1.6
LID_LIP_CLEARANCE = 0.2
LID_HEIGHT = 10.0

# --- Код тестового образца №1 ---
def create_lip_groove_test(clearance: float) -> tuple[Part, Part]:
    """
    Создает две маленькие детали для проверки посадки выступа в паз.
    Одна имитирует стенку основания, другая - край крышки.
    """
    test_size = 20.0  # Размер тестового блока

    # 1. Блок "Основание" с пазом (groove)
    with BuildPart() as base_tester:
        Box(test_size, test_size, LID_HEIGHT)
        # Вырезаем внутреннюю полость
        with Locations(Vector(0, 0, WALL_THICKNESS)):
            Box(
                test_size - 2 * WALL_THICKNESS,
                test_size - 2 * WALL_THICKNESS,
                LID_HEIGHT,
                mode=Mode.SUBTRACT,
            )
    
    # 2. Блок "Крышка" с выступом (lip)
    lip_height = LID_HEIGHT / 2
    with BuildPart() as lid_tester:
        # Основная пластина крышки
        Box(test_size - 2 * WALL_THICKNESS, test_size - 2 * WALL_THICKNESS, WALL_THICKNESS)
        # Выступ, который входит в паз
        lip_size = test_size - 2 * WALL_THICKNESS - 2 * clearance
        with Locations(Vector(0, 0, -lip_height)):
            Box(lip_size, lip_size, lip_height)
        
        # Перемещаем для удобства визуализации и печати
        lid_tester.part.locate(Location(Vector(0, 0, lip_height)))

    return base_tester.part, lid_tester.part

# --- Код тестового образца №2 ---
# (Добавим позже)

# --- Сборка и экспорт ---
if __name__ == "__main__":
    # Создаем тестовые детали для посадки
    test_base, test_lid = create_lip_groove_test(LID_LIP_CLEARANCE)

    show_object(test_base, name="Test_Base_Groove")
    show_object(
        test_lid,
        name="Test_Lid_Lip",
        options={"alpha": 0.7, "color": (1, 0.5, 0)},
        at=Location(Vector(0, 0, WALL_THICKNESS)),
    )
    
    # Экспортируем для печати
    test_base.export_stl("test_lip_groove_base.stl")
    test_lid.export_stl("test_lip_groove_lid.stl")

Этот код создаст две маленькие детали, которые можно напечатать за 15-20 минут.

Тест №2: Отверстие под втулку

Теперь создадим модель для проверки отверстия под термозакладную втулку M3. Нам нужен просто цилиндр (имитация бобышки) с правильным отверстием внутри.

# test_pieces.py (дополняем)

from build123d import *
from ocp_vscode import show_object
# Импортируем инструменты из bd_warehouse
from bd_warehouse.fastener import HeatSetNut, InsertHole

# --- Параметры из основного проекта ---
SCREW_BOSS_DIAMETER = 8.0
SCREW_BOSS_HEIGHT = 10.0 # Произвольная высота для теста
HEAT_SET_NUT_TYPE = "M3-0.5-Standard"

# --- Код тестового образца №1 ---
# (остается без изменений)

# --- Код тестового образца №2 ---
def create_insert_hole_test(nut: HeatSetNut, boss_radius: float, boss_height: float) -> Part:
    """Создает тестовую бобышку с отверстием для термозакладной втулки."""
    with BuildPart() as boss_tester:
        Cylinder(radius=boss_radius, height=boss_height)
        # Создаем отверстие в центре верхней грани
        with Locations(boss_tester.faces().sort_by(Axis.Z)[-1].center()):
            InsertHole(fastener=nut)
    
    return boss_tester.part

# --- Сборка и экспорт ---
if __name__ == "__main__":
    # ... (код для теста №1 остается) ...
    
    # Создаем тестовую деталь для втулки
    m3_nut = HeatSetNut(size=HEAT_SET_NUT_TYPE, fastener_type="Hilitchi")
    test_boss = create_insert_hole_test(
        nut=m3_nut,
        boss_radius=SCREW_BOSS_DIAMETER / 2,
        boss_height=SCREW_BOSS_HEIGHT,
    )

    show_object(test_boss, name="Test_Boss_InsertHole")
    test_boss.export_stl("test_insert_hole.stl")

Проверьте себя!

Вы хотите создать единый тестовый блок для посадки крышки, который бы проверял сразу три варианта зазора: 0.15 мм, 0.20 мм и 0.25 мм, чтобы выбрать оптимальный за один раз. Как можно было бы модифицировать функцию create_lip_groove_test для этой цели?

Показать ответ

Можно создать один длинный блок "основания" и три отдельных блока "крышки", каждый со своим зазором. Или, что элегантнее, создать один блок основания с тремя пазами разной ширины.

Примерный подход для создания одного основания с тремя пазами:

def create_tolerance_checker(clearances: list[float]):
    # Базовый блок
    base_width = 60
    base_depth = 25
    with BuildPart() as base:
        Box(base_width, base_depth, 10)
        
        # Размещаем пазы с разными зазорами
        num_slots = len(clearances)
        slot_pitch = base_width / num_slots
        
        for i, clearance in enumerate(clearances):
            # Рассчитываем положение и размер каждого паза
            slot_x_pos = -base_width/2 + slot_pitch/2 + i*slot_pitch
            slot_width = 15 - 2 * clearance # 15 - номинальная ширина выступа
            
            with Locations(Vector(slot_x_pos, 0, 0)):
                 # Вырезаем паз
                 Box(slot_width, base_depth, 5, mode=Mode.SUBTRACT)
                 # Можно добавить текст с размером зазора
                 Text(str(clearance), font_size=3, align=(Align.CENTER, Align.MIN), at=(0, base_depth/2 + 2))
    
    # Отдельно создаем "калибр" - выступ номинального размера (15 мм)
    with BuildPart() as gauge:
        Box(15, base_depth - 2, 8)
    
    # ...

Такой подход, где один "калибр" проверяется в нескольких "отверстиях", очень распространен в инженерной практике.

4. Печать, анализ и внесение правок

Теперь у вас есть 3 STL-файла:

  • test_lip_groove_base.stl
  • test_lip_groove_lid.stl
  • test_insert_hole.stl

Действия:

  1. Нарежьте (слайсинг) и напечатайте эти детали. Используйте те же настройки (высота слоя, температура, материал), которые планируете использовать для финального корпуса. Это важно для чистоты эксперимента.
  2. Проанализируйте посадку крышки:
    • Попробуйте соединить test_lip_groove_lid и test_lip_groove_base.
    • Слишком туго? Детали не соединяются или требуют большого усилия. Это значит, что зазор 0.2 мм для вашего принтера и пластика недостаточен.
    • Слишком свободно? Крышка заметно люфтит. Зазор можно уменьшить.
    • Идеально? Соединяется с легким щелчком или плотным скольжением, без люфта.
  3. Проанализируйте отверстие под втулку:
    • Возьмите паяльник (с жалом, которое вам не жалко), нагрейте его примерно до температуры печати пластика (210-230°C для PETG).
    • Поместите втулку на отверстие и аккуратно вдавите ее паяльником. Она должна входить ровно, без значительного вытекания пластика по краям.
    • Втулка не лезет или деформирует деталь? Отверстие слишком мало. Это может быть связано с настройками Flow Rate или особенностями bd_warehouse.
    • Втулка болтается после остывания? Отверстие слишком велико.
  4. Внесите корректировки:
    • Если посадка крышки неидеальна, измените значение LID_LIP_CLEARANCE в вашем основном файле full_script.py на новое (например, 0.25 или 0.15). Можно перепечатать тестовый образец с новым значением для подтверждения.
    • Если отверстие под втулку не подошло, можно попробовать найти в документации bd_warehouse параметры для его тонкой настройки или, как крайняя мера, использовать функцию компенсации размера отверстий в слайсере (в OrcaSlicer это X-Y hole compensation).

Ключевые выводы

  • Никогда не доверяйте цифровой модели на 100%. Тестирование — обязательный шаг.
  • Маленькие, изолированные тестовые образцы экономят массу времени и ресурсов.
  • Точность печати — это функция системы "принтер + материал + слайсер". Базовая калибровка (Flow Rate, Pressure Advance) решает 90% проблем с размерами.
  • Создание параметрических тестовых моделей на build123d позволяет быстро итерировать и находить оптимальные значения допусков для вашего проекта.

Что дальше?

Поздравляю! Вы выполнили работу инженера-технолога: проверили и подтвердили технологичность вашего дизайна. Теперь, когда вы уверены в значении зазора для крышки и в том, что крепеж будет установлен правильно, мы готовы к финальному шагу. В последнем уроке мы внесем финальные правки в наш full_script.py на основе результатов сегодняшних тестов и напечатаем финальную версию корпуса.

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

Sign up