dobrovolskiy.com
EN
← Заметки2026-08-30 · Дмитрий Добровольский

Генерация схемы и платы KiCad целиком из Python: 4G-контроллер сетевого освещения за один день

Как генератор на Python (1,5 тыс. строк: свой парсер s-выражений, расстановка через pcbnew, freerouting, kicad-cli) выдал проект KiCad 10 для контроллера освещения 220 В с ESP32-S3, LTE-модемом A7682E, 4 реле и 8 входами контроля сети — без ошибок ERC, воспроизводимо, за день.

Вместо ручного черчения платы я написал генератор на Python, который выдаёт весь проект KiCad 10: разбирает библиотеки .kicad_sym, встраивает символы, расставляет экземпляры по сетке 2,54 мм, подключает каждый вывод глобальными метками, затем через pcbnew делает расстановку и зоны, через freerouting — трассировку, через kicad-cli — производственные файлы. Тестовый случай — контроллер освещения 220 В на плате 175 × 115 мм: ESP32-S3, SIMCom A7682E LTE, четыре реле на 16 А, восемь оптоизолированных входов сети — спроектирован за один день.

Идея

Большинство моих плат — вариации одной темы: микроконтроллер, сотовый модем, реле, входы контроля сети, дерево питания. Чертить пятую вариацию руками — не инженерия, а набор текста. Поэтому 8 июля 2026 я попробовал наоборот: описать плату на Python и дать скрипту выдать проект KiCad. tools/kigen.py со спутниками — около 1 500 строк.

Что делает генератор

  1. Разбирает s-выражения KiCad. Небольшой парсер с нуля читает библиотеки .kicad_sym (в том числе конвертации easyeda2kicad для компонентов LCSC), так что генератор встраивает ровно те символы, которые нужны плате.
  2. Расставляет экземпляры символов по сетке 2,54 мм и вычисляет координаты выводов с учётом поворота, чтобы метки попадали на выводы при любой ориентации.
  3. Подключает каждый вывод глобальными метками. Никаких нарисованных проводов; каждая цепь — метка на каждом выводе. Некрасиво, зато однозначно, без ошибок ERC и легко сравнивается в diff.
  4. Строит плату через Python API pcbnew: расстановка посадочных мест по функциональным группам, контур, медные зоны, классы цепей.
  5. Трассирует и экспортирует через freerouting (по файлу Specctra DSN) и kicad-cli, после чего пост-обработка заново применяет зоны и правила.

Цепочка — одна команда: gen_sch → ERC → netlist → gen_pcb → DSN → freerouting → post_route → export_all. Поменял компонент в генераторе, перезапустил — получил новый проект.

Какая плата получилась

Контроллер освещения 220 В на двухслойной плате 175 × 115 мм:

Сетевая и логическая части физически разнесены и имеют свои классы цепей: MAINS с зазорами 2,5 мм / 1,5 мм, MAINS_SENSE, POWER и RF. Все компоненты намеренно из наличия LCSC/JLCPCB.

Честный статус

Сгенерированная схема проходит ERC; плата расставлена, зоны и правила заданы. Она пока не оттрассирована — freerouting есть в цепочке, но прогон не доведён до конца, — так что это демонстрация генератора и проектное исследование, а не изготовленная плата. Изготовленные платы того же семейства — контроллеры FOURLEDS, начерченные в KiCad вручную.

Зачем это

Потому что вторая плата занимает вечер вместо недели, потому что каждое проектное решение лежит в системе контроля версий как код, и потому что рецензент прочитает gen_sch.py быстрее, чем прощёлкает сорок листов. Парсер и помощники расстановки переиспользуются; меняется только описание платы.

Что сделал бы иначе

Генерировал бы настоящие провода для коротких локальных цепей (развязка, резисторы светодиодов), а глобальные метки оставил только для шин и питания: схема из одних меток корректна, но чужому человеку её тяжело читать. И довёл бы freerouting до конца, прежде чем заканчивать день.

Вопросы

Какая версия KiCad и какой API используются?

KiCad 10: схему генератор пишет сам как s-выражения, плата строится через Python API pcbnew, экспорт — kicad-cli. Трассировка — freerouting через файл Specctra DSN.

Плату можно изготовить?

По проекту — да: сетевые зазоры, предохранитель и варистор на входе, компоненты из наличия LCSC/JLCPCB, — но она пока не оттрассирована, так что это проектное исследование. Изготовленные платы того же семейства — контроллеры FOURLEDS.

Можете сгенерировать или проверить плату для меня?

Да. Ревью схемы, автоматизация KiCad или контроллер вроде этого — типичные почасовые сессии с расшаренным экраном.

Нужно что-то похожее?

Делаю это вживую на звонке в Zoom / Яндекс Телемост, вы смотрите на экран, таймер останавливается по вашему слову. Первые 15 минут бесплатно.

Ещё проекты

LTE-контроллер, сгенерированный скриптомПолноценная плата 4G-контроллера сетевого освещения, сгенерированная целиком из Python вместо ручного черчения.