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-модель печатной платы (PCB). Это, пожалуй, самый важный шаг в проектировании кастомного корпуса. Мы не будем печатать саму плату, но её точная цифровая копия станет нашим главным ориентиром для размещения всех остальных элементов: стоек крепления, вырезов для портов и вентиляционных решёток.

1. Подход "Цифрового двойника"

В разработке ПО вы наверняка сталкивались с необходимостью создавать "моки" (mocks) или "заглушки" (stubs) для симуляции поведения внешних сервисов. В CAD-проектировании мы используем похожий подход, создавая "цифрового двойника" (digital twin) физического объекта.

Наша модель печатной платы — это и есть такой "цифровой двойник". Работая с ним, мы можем:

  • Убедиться, что плата физически помещается в корпус.
  • Использовать геометрию платы (например, центры монтажных отверстий) для автоматического позиционирования элементов корпуса.
  • Быстро адаптировать корпус под новые ревизии платы, просто изменив несколько параметров в коде.

Этот подход позволяет проектировать корпус "сверху вниз" (top-down design), отталкиваясь от ключевого компонента, который он должен вмещать.

2. Сбор необходимых размеров

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

  • Габариты платы: длина и ширина (pcb_length, pcb_width).
  • Толщина платы: pcb_thickness.
  • Монтажные отверстия:
    • Диаметр (mounting_hole_diameter).
    • Расположение центров отверстий относительно краёв платы (mounting_hole_offset). Для простоты предположим, что все отверстия расположены на одинаковом расстоянии от ближайших краёв.

Допустим, наши измерения дали следующие результаты:

  • Длина: 85 мм
  • Ширина: 56 мм
  • Толщина: 1.6 мм
  • Диаметр монтажных отверстий: 3 мм
  • Смещение центров отверстий от краёв: 3.5 мм

3. Создание модели печатной платы

Создадим новый файл pcb_model.py. В нём мы опишем нашу плату.

Шаг 1: Параметры и основа платы

Вначале определим все измеренные параметры как переменные. Затем создадим тело платы с помощью Box.

# pcb_model.py
from build123d import *

# ================== ПАРАМЕТРЫ ПЛАТЫ (PCB) ==================
pcb_length = 85.0
pcb_width = 56.0
pcb_thickness = 1.6
mounting_hole_diameter = 3.0
mounting_hole_offset = 3.5

# ================== ПРОЕКТИРОВАНИЕ ПЛАТЫ ==================
# 1. Создаем тело платы
# Мы выравниваем плату по центру, чтобы ее локальные координаты (0,0,0)
# совпадали с ее геометрическим центром. Это упростит позиционирование в будущем.
pcb_body = Box(pcb_length, pcb_width, pcb_thickness, align=(Align.CENTER,) * 3)

Шаг 2: Создание монтажных отверстий с помощью GridLocations

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

GridLocations — это инструмент, который создает сетку точек, в каждой из которых можно разместить какой-либо элемент. Это идеально подходит для наших отверстий.

  1. Определяем сетку: Нам нужна сетка 2x2. Расстояние между точками сетки по оси X будет равно длине платы минус два отступа. Аналогично для оси Y.
  2. Рисуем эскиз: Мы начнем эскиз на верхней грани платы. Внутри контекста GridLocations мы нарисуем всего один круг. build123d автоматически "размножит" этот круг по всем точкам сетки.
  3. Выдавливаем: После этого мы выдавим получившийся эскиз с четырьмя кругами в режиме вычитания.

Дополним наш файл pcb_model.py:

# ... после создания pcb_body ...

# 2. Создаем монтажные отверстия
# Вычисляем расстояние между центрами отверстий
hole_spacing_x = pcb_length - 2 * mounting_hole_offset
hole_spacing_y = pcb_width - 2 * mounting_hole_offset

# Находим верхнюю грань платы для создания эскиза
top_face = pcb_body.faces().filter_by(Axis.Z).last

# Создаем эскиз на верхней грани
with BuildSketch(top_face) as pcb_holes:
    # Создаем сетку 2x2 для расположения отверстий
    with GridLocations(hole_spacing_x, hole_spacing_y, 2, 2):
        # Рисуем один круг - он будет автоматически размещен во всех точках сетки
        Circle(mounting_hole_diameter / 2, mode=Mode.SUBTRACT)

# 3. "Просверливаем" отверстия, выдавливая эскиз через всю толщину платы
pcb_with_holes = extrude(pcb_holes.sketch, amount=-pcb_thickness, both=False)

# ================== ВИЗУАЛИЗАЦИЯ ==================
if "show_object" in locals():
    show_object(pcb_with_holes, name="PCB Model")

Запустите этот код. Вы должны увидеть аккуратную модель печатной платы с четырьмя точно расположенными отверстиями.

3D-модель печатной платы
Вот так может выглядеть параметрическая модель печатной платы, созданная в build123d.

Попробуйте изменить значения в блоке параметров (например, pcb_length или mounting_hole_offset) и запустить код снова. Модель мгновенно перестроится — в этом и заключается сила параметрического проектирования!

4. Инкапсуляция логики в функцию

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

Модифицируем pcb_model.py:

# pcb_model.py
from build123d import *

def create_pcb(
    length: float,
    width: float,
    thickness: float,
    hole_diameter: float,
    hole_offset: float,
) -> Solid:
    """Создает параметрическую модель печатной платы (PCB)."""
    
    pcb_body = Box(length, width, thickness, align=(Align.CENTER,) * 3)

    hole_spacing_x = length - 2 * hole_offset
    hole_spacing_y = width - 2 * hole_offset
    
    # Проверка, чтобы избежать отрицательного или нулевого расстояния
    if hole_spacing_x <= 0 or hole_spacing_y <= 0:
        raise ValueError("Смещение отверстий слишком велико для заданных размеров платы.")

    top_face = pcb_body.faces().filter_by(Axis.Z).last

    with BuildSketch(top_face) as pcb_holes:
        with GridLocations(hole_spacing_x, hole_spacing_y, 2, 2):
            Circle(hole_diameter / 2, mode=Mode.SUBTRACT)

    pcb_with_holes = extrude(pcb_holes.sketch, amount=-thickness)
    
    return pcb_with_holes

# ================== ПРИМЕР ИСПОЛЬЗОВАНИЯ ==================
if __name__ == "__main__":
    # Параметры можно вынести в отдельный словарь для наглядности
    pcb_params = {
        "length": 85.0,
        "width": 56.0,
        "thickness": 1.6,
        "hole_diameter": 3.0,
        "hole_offset": 3.5,
    }
    
    my_pcb = create_pcb(**pcb_params)

    if "show_object" in locals():
        show_object(my_pcb, name="PCB Model")

Мы добавили проверку if __name__ == "__main__":, чтобы код для визуализации выполнялся только при запуске этого файла напрямую, а не при импорте. Это стандартная практика в Python.

5. Интеграция платы в проект корпуса

Теперь самое интересное: поместим нашу плату внутрь корпуса.

  1. Создайте копию файла enclosure_v4.py и назовите её enclosure_v5.py.
  2. В начало файла enclosure_v5.py добавьте импорт нашей новой функции и параметры для платы:
# enclosure_v5.py
from build123d import *
from pcb_model import create_pcb # <--- НАШ ИМПОРТ

# ================== ПАРАМЕТРЫ КОРПУСА ==================
# ... (все параметры корпуса)

# ================== ПАРАМЕТРЫ ПЛАТЫ (PCB) ==================
pcb_length = 85.0
pcb_width = 56.0
pcb_thickness = 1.6
mounting_hole_diameter = 3.0
mounting_hole_offset = 3.5
  1. В конце файла, в секции ВИЗУАЛИЗАЦИЯ, вызовем нашу функцию и разместим плату внутри основания. Мы пока не создаем креплений, поэтому просто положим её на "дно" корпуса.
# ================== ВИЗУАЛИЗАЦИЯ ==================

# Создаем плату, используя параметры
the_pcb = create_pcb(
    length=pcb_length,
    width=pcb_width,
    thickness=pcb_thickness,
    hole_diameter=mounting_hole_diameter,
    hole_offset=mounting_hole_offset,
)

# Помещаем плату на дно основания.
# Координата Z дна основания: -enclosure_height / 2 + wall_thickness
floor_z = -enclosure_height / 2 + wall_thickness
# Центр платы должен быть на уровне floor_z + половина ее толщины
pcb_z_pos = floor_z + pcb_thickness / 2

if "show_object" in locals():
    show_object(base_with_lip, name="Base with Lip")
    show_object(lid_with_groove.moved(Location(Vector(0, 0, 15))), name="Lid with Groove")
    # Отображаем плату в ее проектном положении
    show_object(the_pcb.moved(Location(Vector(0, 0, pcb_z_pos))), name="PCB")

Запустите enclosure_v5.py. Теперь вы увидите не только части корпуса, но и печатную плату, расположенную внутри основания. Это дает наглядное представление о том, сколько свободного места у нас есть и где нужно будет размещать крепежные элементы.

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

Предположим, новая ревизия вашей платы включает дополнительное пятое монтажное отверстие точно в центре.

Задание: Как бы вы изменили функцию create_pcb в файле pcb_model.py, чтобы добавить это центральное отверстие?

Показать решение

Нужно добавить еще один Circle в эскиз pcb_holes. Поскольку по умолчанию BuildSketch размещает новые фигуры в центре своей системы координат (которая совпадает с центром грани), нам не нужно даже указывать позицию.

Достаточно добавить одну строку после блока with GridLocations(...):

# ...
    with BuildSketch(top_face) as pcb_holes:
        with GridLocations(hole_spacing_x, hole_spacing_y, 2, 2):
            Circle(hole_diameter / 2, mode=Mode.SUBTRACT)
        
        # Добавляем центральное отверстие
        Circle(hole_diameter / 2, mode=Mode.SUBTRACT) # <--- ВОТ ЭТА СТРОКА

    pcb_with_holes = extrude(pcb_holes.sketch, amount=-thickness)
# ...

Эскиз pcb_holes теперь будет содержать пять кругов (четыре по углам и один в центре), и операция extrude вырежет их все за один раз. Это демонстрирует, насколько легко модифицировать сложные эскизы в build123d.

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

  • Мы создали параметрическую 3D-модель печатной платы, используя подход "цифрового двойника".
  • Мы научились использовать GridLocations для быстрого и программного создания массивов одинаковых элементов (отверстий).
  • Мы инкапсулировали логику создания модели в переиспользуемую Python-функцию, что является хорошей практикой для организации сложных проектов.
  • Мы интегрировали модель платы в основной проект корпуса, чтобы визуализировать её расположение.

Что дальше?

Теперь, когда у нас есть точная модель платы внутри нашего корпуса, следующий логичный шаг — закрепить её. В следующем уроке мы используем информацию о расположении монтажных отверстий на нашей PCB-модели для проектирования монтажных стоек (standoffs), которые будут поднимать плату над дном корпуса и надежно её фиксировать.

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

Sign up