Еще раз о подготовке фотошаблонов или автоматизируем процесс

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

Итак исходная последовательность подготовки такая:
1. Плата прогоняется через gerb274x.cam. Это дает нам комплект Gerber файлов с разводкой, маской, шелкографией и так далее, кроме слоя отверстий.
2. Плата прогоняется через excellon.cam, что бы получить слой отверстий.
3. Правим слой отверстий в текстовом редакторе, что бы на фотошаблоне на месте отверстий были отверстия в меди, которые потом удобно использовать как метки центра пада при сверлении.
4. С помощью gerbv собираем шаблоны для верхнего и нижнего слоя комбинируя их с слоем отверстий и генерим SVG файлы.
5. С помощью inkscape дорисовываем под каждым слоем по черному прямоугольнику, делаем зеркальное отображение (что бы после печати тонер оказывался максимально близко к фоторезисту) и печатаем.

Замечу, что если первые два пункта специфичны для Eagle, остальные шаги, вобщем, одинаковы для любого другого CAD-а умеющего генерить Gerber-файлы. Так что пользователям других программ значительная часть информации приведенной ниже может вполне оказаться полезной.

Посмотрим, что можно упростить или автоматизировать.

Первое, что приходит в голову — генерить нужные файлы за один проход. Заодно можно сразу делать зеркальное отображение. Для этого открываем в CAM Processor-е gerb274x.cam проходимся по всем закладкам и проставляем галочку «Mirror». Затем нажимаем кнопочку Add и добавляем новый джоб который будет копией того, что есть в excellon.cam — Section «Generate drill data», Device — EXCELLON, File — %N.drd, слои — 44 Drills и 45 Holes. В отличие от оригинала тут тоже надо проставить галочку Mirror. Сохраняем полученный CAM файл под новым именем. Эту операцию достаточно проделать один раз и в дальнейшем использовать только свой новый CAM файл вместо gerb274x.cam и excellon.cam, он за один проход будет генерить все нужные файлы, причем сразу в зеркальном отображении (в аттаче аналогичный файл имеет имя gerb274x_es.cam). Я в фотошаблоны для своих плат добавляю также рамку (border outline), которой нет в оригинальном gerb274x.cam. Что бы сгенерить для нее файл достаточно добавить джоб аналогичный сверловке, только Device поставить GERBER_RS274X, слой — Dimension, а File — %N.bor. Рамка полезна для многих вещей, плату с ней и обрезать по размеру удобнее, и совмещать фотошаблоны с ней проще (в частности, в процессе нанесения маски), да и маска внутри рамки не скалывается при механической обработке.

Второе, что хотелось бы автоматизировать — сборка слоев и генерация SVG. Тут все просто — у gerbv есть командная строка, которая позволяет сделать все, что нам нужно. Например, SVG для верхнего слоя меди можно получить так:

gerbv -b#000000 -f#000000 -f#ffffff -f#FFFFFF -xsvg -o board_sol.svg board.drd board.cmp board.bor

Рассмотрим параметры по порядку:

  • -b#000000 — задаем цвет фона (это, к сожалению, не избавляет от необходимости «подкладывать» черный квадрат перед печатью).
  • -f#000000 -f#ffffff -f#FFFFFF — это цвета для трех слоев, которые будут использованы для трех входных файлов. Применяются они в порядке описания, то есть слой из первого файла получит первый цвет, слой из второго — второй и так далее.
  • -xsvg — результат слияния слоев будет сохранен в формате SVG
  • -o board_sol.svg — имя выходного файла

И в конце идут имена трех файлов со слоями. Слои собираются в порядке перечисления файлов (первый сверху, второй под ним и так далее). Аналогично генерятся и другие файлы, например для нижней стороны и для маски (в фотошаблон для маски сверловку добавлять не нужно, как легко догадаться). Для удобства можно сделать маленький скрипт (в винде .bat, в линухе — .sh, например) и передать в него имя файла без расширения, а нужные слои он возьмет сам. Замечу, что слегка модифицировав команду можно получить и позитивные фотошаблоны пригодные для использования, например, с Positiv 20 или со стеклотекстолитом продающимся с уже нанесенным фоторезистом (в наших палестинах доступен, например, такой стеклотекстолит фирмы Bungard). Команда для генерации позитивного фотошаблона выглядит так:

gerbv -b#FFFFFF -f#FFFFFF -f#000000 -f#000000 -o panel_top.svg -xsvg board.drd board.cmp board.bor


Как не сложно заметить, от исходной она отличается только цветами слоев.

С такими минимальными доработками процесс значительно упрощается — прогнали CAM, запустили скрипт, из Inkscape импортировали (для слоев меди — подложили по черному прямоугольнику) и тут же можно печатать.

Во многих случаях удобно делать больше одной платы или комбинировать несколько разных плат на одном фотошаблоне и в таком виде выполнять все технологические шаги (этот процесс называется панелизацией, а сама комбинированная плата, соответственно, панелью). Время процессов от размера платы зависит мало, а всего операций достаточно много, так что делать одновременно несколько плат вполне имеет смысл. Единственная проблема с таким решением это сложность изготовления фотошаблона с несколькими платами (и масками) одновременно. Даже если делать фотошаблон для одного слоя, возни в графическом редакторе довольно много. Если слоев больше одного (и/или есть шаблон для паяльной маски), возникает проблема совмещения отдельных плат на разных слоях. Понятное дело, я был не первым, кто столкнулся с этой проблемой, поэтому покопавшись в инете я нашел очень удобный инструмент для таких задач — GerbMerge. Я не буду описывать процесс установки (статья, вобщем, не об этом, да и в разных системах это будет выглядеть по разному), вместо этого расскажу немного о том, как этим пользоваться.

GerbMerge использует для работы два файла конфигурации. В первом описаны глобальные настройки и описания плат. Во втором — расположение плат на панели (без второго файла можно обойтись если воспользоваться авторазмещением). Используя описания плат GerbMerge собирает одинаковые слои из разных плат вместе и размещает их согласно указаниям из файла размещения. На выходе он генерит отдельные файлы для каждого слоя, которые можно использовать так, как это делается для одной платы (например, с помощью gerbv сгенерить SVG). Мой вариант файла конфигурации лежит в аттаче, если же что-то нужно изменить, то все параметры снабжены подробными комментариями прямо в самом файле, так что я не вижу смысла расписывать их тут. Файл расположения штука более любопытная, да и править его приходится значительно чаще, поэтом остановлюсь на нем подробнее.

Для описания расположения плат используется древовидный подход, который позволяет описывать произвольную структуру прямоугольников (плат) покрывающих площадь панели. В каком-то смысле это здорово напоминает описание таблиц в HTML, только синтаксис значительно более прозрачный и читаемый. Сначала описывается, например, ряд (с равным успехом можно начать с колонки, это не имеет значения):

Row {
...
}

В ряду располагаются елементы, которые могут быть платами (Board) или колонками:

Row {
    Board1
    ...
    BoardN
    ...
    Col {
    ...
    }
...
    Col {
    ...
    }
}

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

Иногда необходимо плату развернуть на 90 градусов. В этом случае после имени платы пишется ключевое слово Rotate, например:
Col {
     Board1 Rotate
     Board1 Rotate
     Board1 Rotate
     }


Простейший файл с описанием расположения может выглядеть так:
Row {
    Board1
}

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

Row {
    Col {
     Board1 Rotate
     Board1 Rotate
     Board1 Rotate
     }
    Col {
     Board2
     Board2
     }
}


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

Использование GerbMerge сильно упрощает жизнь, но не избавляет от рутинных операций полностью. Все так же надо руками править файл сверловки и надо добавлять плату в конфигурацию GerbMerge (и, возможно, файл с расположением). К счастью почти все эти задачи тоже можно автоматизировать. Для этого заготавливаем шаблон конфигурации GerbMerge со всеми настройками но без плат и с помощью небольшого скрипта делаем все остальное:


#!/bin/sh

if [ $# -eq 0 ] 
then 
    echo "Usage: ./convert.sh board_path [board_path...]"
    exit
fi

cat panel.cfg.template >panel.cfg
./process_boards.sh "$@" >>panel.cfg

gerbmerge panel.cfg panel.def
gerbv -b#000000 -f#000000 -f#ffffff -f#FFFFFF -o panel_top.svg -xsvg merge2.drd merge2.cmp merge2.bor
gerbv -b#000000 -f#000000 -f#ffffff -f#FFFFFF -o panel_bot.svg -xsvg merge2.drd merge2.sol merge2.bor
gerbv -b#FFFFFF -f#000000 -f#000000 -xsvg -o panel_top_sm.svg merge2.bor merge2.stc
rsvg-convert -o panel_top.pdf -a -p 72 -d 72 --background-color=black -f pdf panel_top.svg
rsvg-convert -o panel_bot.pdf -a -p 72 -d 72 --background-color=black -f pdf panel_bot.svg
acroread panel_top.pdf panel_bot.pdf


Скрипт process_boards.sh (есть в аттаче) генерирует описания плат в конфигурации (для этого используются два шаблона — шаблон общей конфигурации и шаблон описания платы) и присваивает им имена в порядке перечисления в командной строке, начиная с Board1. Заодно он вызывает еще один вспомогательный скрипт fix_drd.sh и правит файлы сверловки, проставляя всем отверстиям размер 0.016 дюйма (~0.4mm). Регексп для правки сверловки заточен под файлы, которые генерит Eagle, так что под конкретный CAD, возможно, его придется поправить.

Далее convert.sh вызывает gerbmerge, что бы тот сгенерил слои для панели в целом и, наконец, из слоев собираются SVG файлы. Три последних строчки, в принципе, опциональные. Они генерят PDF-ы для верхнего и нижнего слоев и вызывают acroread, что позволяет сразу же просмотреть результат обработки. Если вам эта возможность не нужна, можно просто закоментировать или удалить эти строчки, на основную функциональность скрипта это не повлияет.

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

Ну и, наконец, как же всем этим пользоваться. CAM файл из аттача кладем в соответствующий подкаталог в Eagle. Остальное кладем в какую-нибудь директорию. Скрипты расчитаны на то, что текущей является директория, в которой лежат они сами (там же они ищут шаблоны и так далее), так что запускать надо находясь именно в этой директории. Туда же попадают результаты конверсии. Последовательность действий такая:

1. Все платы, для которых собираемся делать фотошаблон по очереди открываем в Eagle, вызываем CAM Processor и в нем открываем джоб файл (gerb274x_es.cam из аттача или свой собственный) и генерим гербер файлы.

2. Правим файл с расположением плат. Тут важно запомнить какое имя было выбрано для какой платы, поскольку число в имени платы (Board1, Board2, ..., BoardN) определяет позицию имен файлов к этой плате в командной строке конвертора (см. следующий шаг).

3. Находясь в директории, где лежат скрипты, запускаем конвертор:
./convert.sh path1/board_file1 path2/board_file2 ... pathN/board_fileN

Например, вот так:
./convert.sh st7735/std/hsweg01-v0.3 st7735/std/jdt1800-v0.2

Обращаю внимание, что имена даются без расширений.

4. Когда скрипт отработает, имеем profit в виде следующего набора файлов:
  • panel_top.svg — верх (слой компонентов)
  • panel_top_sm.svg — паяльная маска для верхнего слоя
  • panel_bot.svg — низ (слой пайки для трухольных компонентов)
При необходимости по аналогии можно собрать и другие слои, например, маску для нижнего слоя или шелкографию.
ВНИМАНИЕ! имена сгенеренных файлов фиксированы, а сами файлы перезаписываются при каждом запуске скрипта. Это сделанно как из соображений удобства последующей обработки, так и исходя из того, что при наличии исходных плат всегда можно сгенерить необходимые фотошаблоны. Так что если вам нужны эти файлы — скопируйте их в другое место, прежде чем запускать скрипт заново.
Если включена генерация .PDF, то помимо указанных будут сгенерены еще и .PDF-ники для верхнего и нижнего слоев. Сгенеренные SVG файлы затем прогоняются по уже известному маршруту — загоняем все в Inkscape, под рисунки со слоями дорожек подкладываем черный прямоугольник и печатаем шаблоны как для одной платы.

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

P.S. Заранее прошу прощения у пользователей винды, под ней работоспособность скриптов не проверялась и для запуска самого скрипта вам придется поставить юниксовые утилиты, в том числе шелл. Ну или можно переписать скрипты на язык понятный CMD.EXE, благо в них ничего особенного нет.
  • +2
  • 19 февраля 2012, 03:15
  • evsi
  • 1
Файлы в топике: automating_mask.zip

Комментарии (15)

RSS свернуть / развернуть
Надо будет поэкспериментировать. Я правда в PCADe работаю, но если надо объединить несколько плат на лист всегда геморой вылазит, потому как если есть полигоны, то сдублированная в pcb плата автоматически теряет связи, что в итоге твыходит боком… А через гербер должно прокатить…
0
В пикаде можно использовать edit — paste — circuit, тогда все связи сохраняются.
0
спасибо, поэкспериментирую
0
Да, весь процесс тем и хорош, что, вобщем, к самому иглу практически не привязан после того, как сгенерены герберы. Единственное, что пока не получается, так это добить сборку PDF-ов, что бы шаблоны не по одному на страницу получались, а скопом. Два подхода к снаряду уже делал, но пока никак. Уж очень мне хочется обойтись без Inkscape, больно он глючен на таких SVG-шках и тормозит нещадно. Справедливости ради надо заметить, что на таких файлах любой софт колбасит. Недавно попробовал в соседней фотостудии распечатать шаблон, так удалось распечатать только в виндовой версии Inkscape, остальные либо падали (корел), либо печатали ахинею (адобовский плагин).
0
  • avatar
  • evsi
  • 20 февраля 2012, 09:56
Я пока печатаю напрямую с пикада. Потому как перевод в PDF меня не порадовал, а Inkscape я не ставил, да и в SVG не конвертил. А при печати гербера (да и не только) через PDF-принтер (включая и адобовский) перевирались размеры (достаточно чтобы закосячить LQFP легким движением паяльника)…
0
Я конвертирую в PDF утилитой (там в тексте есть ссылка на нее), с размерами там все идеально, если правильно указан DPI документа.
0
А вообще, IMHO, герберы это правильный путь, поскольку именно в таком виде оно идет в производство. Ну и универсальность постобработки после када. У меня, например, слои рихтуются и сливаются в один. Кады такого делать не умеют (да и не их задача, по большому счету).
0
Здесь натоптал о выводе в негативе вверху страницы.
0
Evsi, спасибо за подробное руководство, попробовал у себя, все получилось, за исключением небольшого косячка — не понимаются абсолютные пути, работает только с относительными, но это легко поправимо. Очень клево, теперь целые наборы генерятся легким движением руки. Я только одну вещь не понял — почему в gerb274x_es.cam зеркалируется нижний слой? Зеркалировать нужно же только верхний, а нижний чернилами будет направлен к фольге только при прямой печати. Соответственно, и слой сверловки для него нужен отдельный, не зеркальный. А то сейчас получается, что верхний слой — как надо, чернилами к фольге, а нижний — с противоположной от фольги стороны. Или я что-то неправильно понимаю?
0
  • avatar
  • Infod
  • 09 февраля 2014, 16:01
Это поправимо. Достаточно загрузить .cam в Eagle и поправить настройки так, как удобно. Вообще у меня есть более новая версия всех скриптов, в том числе я допилил скрипт, который сам умеет из .brd генерить герберы по .cam.
0
Да, исправить то несложно, я просто думал, это специально так задумано по какой-то причине. А новую версию можно увидеть, если она не секретная? А скрипт, который генерит из brd — он с какой-нибудь API игла работает, или пришлось писать парсер этого формата? Как он генерит, надежно без ошибок?
0
Он идет по .cam файлу и генерирует параметры вызова игла из командной строки для каждого слоя. Пока сбоев не было. Новую версию планирую выложить вместе с описанием, как руки дойдут написать статью.
0
Ок, спасибо, будем ждать! Хотя там легко разобраться и без описания, во всяком случае со скриптами из этой статьи все очень понятно.
0
Тут проблема больше в том, что бы отвязать их от конкретного окружения. Скрипты ведь пилятся на скорую руку, зачастую под конкретную ситуацию, а она у меня довольно не типичная.
0
Да, знаю, обычно написать работающие скрипты для себя проще и быстрее, чем причесать их для публичного показа, еще и со статьей :)
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.