Функция создания перечня компонентов в программе KiCad оставляет желать много лучшего. Самый главный ее недостаток состоит в том, что она не дает никаких возможностей для повторного создания конечного продукта - списка компонентов. Обычно процесс создания BOM выглядит так: создали csv, открыли в Excel или Office, привели в приличный вид, поменяли что-то в печатной плате, опять создали csv, опять привели в приличный вид, и так далее.
Эта программа позволяет при помощи настроечных файлов сразу создавать красиво выглядящие электронные таблицы запуском одного скрипта на Питоне.
Все необходимые настройки хранятся в одном конфигурационном файле. Это, кроме всего прочего, позволяет иметь набор таких файлов на уровне предприятия и создавать единообразную документацию к проектам.
Давайте посмотрим, как это работает
У вас на компьютере должен быть установлен Python3 и в нем еще одна дополнительная библиотека под названием xlsxwriter. Чтобы ее установить, наберите в командной строке
pip3 install --user xlsxwriter
и положите скрипт kicad_bom.py
куда вам удобно.
И все дела.
Давайте проверим работу скрипта на проекте Olinuxino.
Скачаем этот проект и запустим kicad_bom.py
в том каталоге, где лежит проект.
python3 path/to/kicad_bom.py
У нас получился первый список компонентов, который можно открыть в Excel или LibreOffice. Посмотрим, что в нем. Что это?
Это печатная антенна, которая не является компонентом с точки зрения сборщиков, но является с точки зрения CAD.
Уберем ее из списка. Для этого нужно создать в том же каталоге файл с именем bom.cfg
и написать в нем следующее:
[ignore]
reference(ANT1)
Запустим скрипт снова - в списке больше нет антенны! В конфиге можно писать регулярные выражения, так что если бы у нас было несколько антенн ANT1, ANT2 и так далее, можно было бы написать
reference(ANT\d+)
Теперь о том, как все это работает. У каждого компонента есть набор свойств, на которые в конфиге можно ссылаться:
reference
- это обозначение на принципиальной схеме, package
- корпус компонента, value
- номинал компонента,
library
- библиотека, откуда взят компонент, side
- сторона печатной платы. Любое из этих свойств можно использовать
в секции [ignore]
и в любых других секциях настроечного файла. Например, если у нас на плате есть реперные точки из
библиотеки Fiducial, можно одной строчкой отправить в игнор всю библиотеку:
[ignore]
library(Fiducial)
Обратите внимание, что заглавные и строчные буквы во всех этих именах имеют значение, нельзя было бы написать fiducial вместо
Fiducial. Также скрипт не учитывает компоненты без обозначений вообще и с обозначениями в виде ~
. Также при работе программы
выводится список всех проигнорированных компонетов, чтобы вы могли проверить, что не перестарались с регулярными выражениями и
не выбросили из списка что-то важное.
Посмотрим еще раз на полученный список. Он пока что не идеален, колонка Type/Value слишком узкая. Нет проблем. Добавим в конфиг все нужные нам колонки вывода:
[columns]
col1=N:n
col2=Ref:reference
col3=Size/Package:package
col4=Qty:quantity
col5=Type/Value:value:30
Описание колонки выглядит как имя:свойство:ширина, ширину можно не писать, тогда будет использовано некое значение по умолчанию. Также это описание позволяет давать произвольные имена колонкам, например, на русском языке:
[columns]
col1=Номер п.п.:n
col2=Обозначение:reference
col3=Корпус:package
col4=Количество:quantity
col5=Номинал:value:30
Также можно добавить дополнительные колонки с именами для каких-то целей.
col6 = Поставщик
col7 = Цена
col8 = Комментарий
Еще одна важная задача - уметь праильно переименовывать корпуса компонентов. В Kicad есть множество корпусов
со специальными названиями, такими как C_0402_5MIL_DWS
or D_SOT-23_ANK
vs D_SOT-23_NKA
. Для закупки
компонентов или их монтажа части названия такие как NKA
или ANK
не имеют значения. Поэтому в конфиге есть
секция packages, позволяющая переименовать корпуса.
[packages]
D_SOD-323 = SOD-323
LQFP-48.* = LQFP-48
C_0402_5MIL_DWS = C_0402
D_SOT-23_ANK = SOT-23
В ней также можно использовать регулярные выражения.
Полезно было бы разделить список компонентов также и по вертикали, перечислив отдельно резисторы, конденсаторы, и так далее. Поскольку телепатическими способностями программа не обладает, придется делать это в два этапа, сначала написать, к какой категории относится каждый компонент, а потом сделать список категорий. Имя категории это одно слово латинскими буквами:
[categories]
value(1N7002) = transistors
reference(LED.+) = leds
reference(D.+) = diodes
reference(J.+) = connectors
reference(SW1) = pushbuttons
Для классификации компонентов можно использовать все имеющиеся у них свойства. Категория компонента сама является его свойством, и ее можно вывести в списке отдельной колонкой (хотя, похоже, что это не очень полезная функция)
col6=Element type:category
Если так случилось, что компонент не попал ни в одну категорию, тогда соответствующее свойство будет пустым. И вот это очень важная особенность процесса задания категорий - для каждого компонента вы должны убедиться, что он куда-то отнесен и что вы вообще понимаете, что это такое.
Теперь можно задать секции, в которых будут перечисляться компоненты
[sections]
resistors = Resistors
capacitors = Capacitors
transistors = Transistors
diodes = Diodes
Еще раз: категория (category) это свойство, которое вы сами приписываете компоненту, а секция (section) это часть списка, в котором появятся компоненты, отнесенные к данной категории.
Описание секции выглядит как категория = Заголовок секции
. Все комопненты, которые не попали в категории, будут
перечислены в конце списка без всякого фориатирования.