Объединение печатных плат с gerbmerge

Мы — небольшой стартап, который занимается разработкой современной электроники. Разумеется, мы регулярно делаем тестовые партии небольшого размера, для изготовления которых заказывать полноценное производство не имеет смысла — стоимость подготовки будет самой крупной статьёй бюджета. Поэтому мы регулярно придумываем, как быстрее, дешевле и эффективнее собирать эти партии самостоятельно. Иногда в процессе рождается что-то новое или допиливается что-то старое. Результатом мы и будем с вами периодически делиться.

Один из способов снизить себестоимость изготовления печатных плат — это объединение нескольких плат на одной заготовке и отправка на фабрику этой заготовки как единого проекта. Фокус в том, что серьёзные фабрики берут деньги за подготовку производства каждой платы, а ориентированные на DIY китайцы часто предлагают (Seeedstudio, например) фиксированную цену за фиксированный размер текстолита. В первом случае единый проект, даже если он в итоге разрезается на несколько плат, будет считаться как одна плата, а во втором — можно вместить на одну стандартную заготовку несколько небольших плат.

Кроме того, объединение плат удобно, если вы делаете фиксированные комплекты — например, у вас в проекте один управляющий модуль и четыре исполнительных; в таком случае банально удобно положить их на одну заготовку и всегда заказывать именно таким комплектом.

У нас в данном случае было и то, и другое — и комплект, и желание сэкономить на производстве пробной партии.

006cdabad2314563866f29764504e0c8.png

Это — один проект. В нём 32 платы 13 разных видов. Как собрать такой проект за четверть часа — ниже.

Как ни удивительно, но попытка найти готовый и хотя бы относительно доступный софт для такой операции довольно быстро доводит человека до депрессии — после первого пяточка сайтов, предлагающих позвонить по указанному номеру телефона для получения индивидуального предложения по цене. Проблема в том, что непосредственной работой с файлами формата Gerber RS-274X обычно занимаются фабрики, а потому и стоимость всего подобного софта — традиционная для коммерческого применения, от нескольких сотен долларов за рабочее место.

Бюджетные же предложения либо умеют лишь размножать одну плату на много копий (в Eagle, например, это родная функция), но не собирать несколько файлов из разных проектов. либо — чаще — не умеют ничего. Из относительно дешёвого мне удалось найти лишь ViewMate Deluxe, стоящий хоть и не особо сильно, но всё же меньше $100 и умеющий редактировать герберы — вот только работа в нём местами уж очень сильно похожа на изощренную пытку.

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

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

GerbMerge умеет работать только с файлами формата Gerber RS-274X и Excellon, но это трудно считать недостатком — любой CAD, которым хотя бы теоретически можно пользоваться, умеет экспортировать платы в этих форматах, а любая фабрика умеет их принимать. Более того, если вы хотите максимальную гарантию результата и минимальный шанс на кривые руки фабрики — именно Gerber + Excellon, предварительно проверенные вами, и надо им отправлять.

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

  1. Он не устанавливается
  2. Будучи установленным, он не запускается
  3. Будучи запущенным, файлы DipTrace он не переваривает
  4. Будучи заставленным, файлы в метрических единицах он не переваривает
  5. Под Cygwin он не работает вообще
  6. Есть попытки привести в порядок установщик — в правильном направлении, но незавершённые
  7. Есть попытки привести в порядок метрические единицы — в правильном направлении, но незавершённые
  8. Все ссылки на готовые установочные пакеты под Windows вообще протухли годы тому назад

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

А вот теперь — ссылка: github.com/unwireddevices/gerbmerge

В версии 1.9.4, которая сейчас по данной ссылке и доступна, gerbmerge:

  • Успешно работает под Linux, Windows и Cygwin
  • Устанавливается под всеми системами штатными средствами без правки чего-либо руками
  • Понимает файлы, сгенерированные DipTrace
  • Работает и с дюймами, и с миллиметрами

Установка GerbMerge

GerbMerge — это скрипт на питоне, поэтому установка имеет свои особенности. Запущен он может быть на Linux и Windows (нативном и под Cygwin), теоретически также и на MacOS, но я не проверял — не на чем.

Linux.

Так как python, pip и gcc у вас почти наверняка уже установлены, остаётся поставить simpleparse — pip install simpleparse, а затем перейти к gerbmerge. Скачайте с гитхаба архив исходников, распакуйте, зайдите внутрь:

python setup.py sdist
sudo pip install dist/gerbmerge-1.9.4.tar_gz

Первая команда подготовит установочный пакет под вашу систему, вторая его установит. Можно, конечно, сразу сделать sudo python setup.py install, но тогда при желании расстаться с gerbmerge или обновить его вы будете удалять его файлы ручками.

Windows / Cygwin.

Установите Cygwin с пакетами python, python-setuptools и gcc (последний нужен для сборки simpleparse). Скачайте архив исходников gerbmerge, распакуйте, запустите Cygwin и зайдите в каталог с исходниками.

easy_install-x.y pip
pip install simpleparse
python setup.py sdist
pip install dist/gerbmerge-1.9.4.tar_gz

Первая команда (вместо x.y будет версия вашего питона, то есть, скорее всего 2.7) установит pip, остальное — так же, как в линуксе.

Windows нативный.

Скачайте инсталяшку питона под вашу систему и установите его — по умолчанию он ставится в C:\Python27\ и тащит нужный нам pip с собой. Скачайте gerbmerge, распакуйте. Запустите cmd.exe и проследуйте в папку с исходниками gerbmerge:

c:\python27\scripts\pip.exe install simpleparse
c:\python27\python.exe setyp.py sdist
c:\python27\scripts\pip.exe istall dist\gerbmerge-1.9.4.zip

Всё. Если в предыдущих случаях gerbmerge запускался, собственно, командой gerbmerge, то здесь для запуска надо позвать файл c:\Python27\gerbmerge.bat (если вы поставили Python в другую папку, то путь надо изменить соответственно).

Использование GerbMerge

Для работы gerbmerge требуется конфигурационный файл и наборы файлов с герберами исходных плат. На гитхабе в папке examples есть примеры и того, и другого — причём как для дюймовых герберов, так и для метрических.

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

[DEFAULT]
projdir = .

[Options]
ExcellonLeadingZeros = 1
PanelWidth = 400
PanelHeight = 300
XSpacing = 2
YSpacing = 2
MeasurementUnits = mm
AllowMissingLayers = 0

[MergeOutputFiles]
Prefix = %(projdir)s/merged
*TopLayer=%(prefix)s/Top.gbr
*BottomLayer=%(prefix)s/Bottom.gbr
*TopSilkscreen=%(prefix)s/TopSilk.gbr
*BottomSilkscreen=%(prefix)s/BottomSilk.gbr
*TopSoldermask=%(prefix)s/TopMask.gbr
*BottomSoldermask=%(prefix)s/BottomMask.gbr
Drills=%(prefix)s/Drills.txt
BoardOutline=%(prefix)s/BoardOutline.gbr
ToolList = %(prefix)s/Tools.drl
Placement = %(prefix)s/Placement.txt

[aa]
Prefix=%(projdir)s/aa
*TopLayer=%(prefix)s/Top.gbr
*BottomLayer=%(prefix)s/Bottom.gbr
*TopSilkscreen=%(prefix)s/TopSilk.gbr
*TopSoldermask=%(prefix)s/TopMask.gbr
*BottomSilkscreen=%(prefix)s/BottomSilk.gbr
*BottomSoldermask=%(prefix)s/BottomMask.gbr
Drills=%(prefix)s/Through.drl
BoardOutline=%(prefix)s/BoardOutline.gbr

Repeat = 10

[bb]
Prefix=%(projdir)s/bb
*TopLayer=%(prefix)s/Top.gbr
*BottomLayer=%(prefix)s/Bottom.gbr
*TopSilkscreen=%(prefix)s/TopSilk.gbr
*TopSoldermask=%(prefix)s/TopMask.gbr
*BottomSilkscreen=%(prefix)s/BottomSilk.gbr
*BottomSoldermask=%(prefix)s/BottomMask.gbr
Drills=%(prefix)s/Through.drl
BoardOutline=%(prefix)s/BoardOutline.gbr

Repeat = 6

В этом примере — две платы, лежащие в папках aa и bb, файлы в них — со стандартными именами экспорта DipTrace. Папки лежат рядом, gerbmerge запускается тут же, поэтому каталог проекта — просто ».», а пути к папкам, соответственно,»./aa» и »./bb». Первой платы надо сделать 10 штук на одной заготовке, второй — шесть. Герберы — в миллиметрах, максимальный размер панели — 400×300 мм, между платами надо сделать зазоры 2 мм, чтобы фабрика прорезала их фрезой (размеры панелей и зазоров спрашивайте у конкретной фабрики). Формат Excellon для сверлильного станка записывать с нулями в начале, при отсутствии какого-либо файла из перечисленных — ругаться. Результат надо сохранить в папку merged с указанными именами файлов.

Обратите внимание, что все файлы, кроме BoardOutline и Drills, начинаются со звёздочки — так надо. Если поставить AllowMissingLayers в единицу, файлы со звёздочками могут отсутствовать. Но звёздочка должна быть в любом случае (не сильно логично, но такие мелочи исправлять уже лень, они никому не мешают).

После создания конфига остаётся только запустить gerbmerge с ним в качестве единственного параметра:

gerbmerge layout.cfg

Или, если вы до сих пор не примкнули к миру Свободы, Равенства и Братства (как я), а также не любите Cygwin (не как я), то:

C:\Python27\gerbmerge.bat layout.cfg

При запуске gerbmerge вывешивает простыню дисклеймера и ждёт нажатия «y», если вам это надоело — добавьте параметр »-s».

d3bc1b3c3b914727888a19c4e00d9f75.png

Если иное не сказано в конфиге, gerbmerge работает вечно, периодически сообщая, что он не умер. Остановить его можно в любой момент, нажав Ctrl-C — он сохранит конфигурацию плат, которую на этот момент будет считать наиболее удачной, в файлы, и завершится. К сожалению, как-то отследить, насколько результат удачен, невозможно, поэтому просто давайте ему достаточно времени — от пяти минут на среднем Core i* до пятнадцати на AMD Sempron хватает для получения аккуратного размещения даже для проекта вроде описанного перед катом.

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

Полученные файлы стоит привычно проверить любым Gerber-просмотрщиком (я обычно пользуюсь Viewplot) — и если ничего не разъехалось, то отправлять на фабрику.

Ограничения

  • В общем случае в одну реку нельзя войти дважды: так как скрипт перебирает десятки тысяч комбинаций, то на сложных композициях у вас при каждом запуске будет получаться что-то новенькое.
    Тем не менее, если вам понравилась получившаяся раскладка, обратите внимание, что в папке с результатом есть файл Placement.txt — в нём она и записана. Этот файл не нужен фабрике, но если вы на следующем запуске gerbmerge с тем же набором плат подсунете его программе через командную строку (--place-file=), вместо поиска новой конфигурации она просто сложит платы в описанную в этом файле. Удобно для двух случаев: если вы хотите попробовать заставить gerbmerge сгенерировать пяток разных раскладок и выбрать лучшую и если вы хотите в уже готовой раскладке поменять одну из плат на другую такого же размера.
  • Скрипт не понимает микса из дюймовых и метрических файлов. Все входящие герберы должны быть в одной системе, совпадающей с указанной в конфиге. В принципе, это повод для дальнейшей доработки, но т.к. внутри gerbmerge с работой с единицами измерения сейчас та ещё каша, вряд ли я когда-либо за неё возьмусь.

Пруфпик

Тот самый проект из 32 плат 13 видов, исполненный в текстолите компанией «Микролит»:

75c5fb39db724bec867d0a3661176b4e.jpg

Вопросов у фабрики не возникло, на качество нареканий нет.

F.A. Q.

Q: На черта вам вообще столько плат???
A: Вот для этого проекта.

© Geektimes