From cf80f5126ad6cc14dff5f74b03d10e54bec7179f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?King=20K=C3=A9vin?= Date: Thu, 11 Aug 2022 11:41:11 +0200 Subject: [PATCH] make: add kicad scripts --- .gitignore | 46 +++++++++++++------------ DEVELOPMENT.md | 59 +++++++++++++++++++------------ JLCPCB_CORRECTION.csv | 12 +++++++ Makefile | 80 +++++++++++++++++++++++++++++++++++++++++++ bom.ini | 42 +++++++++++++++++++++++ refdes2fab.py | 9 +++++ 6 files changed, 205 insertions(+), 43 deletions(-) create mode 100644 JLCPCB_CORRECTION.csv create mode 100644 Makefile create mode 100644 bom.ini create mode 100644 refdes2fab.py diff --git a/.gitignore b/.gitignore index 1855a6d..bff861a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,31 +1,35 @@ +# schematic lepton-EDA +*.sch + +# board layout pcb-rnd +*.lht *.lht.* -*.versioned.lht + +# KiCAD +*.kicad_prl +*.kicad_pro-bak +*.xml +fp-info-cache + +# temporary files *~ -*.versioned.sch +\#*\# + +# outputs *.svg +*.png *.pdf *.ps *.zip -*.brd.* -*.ast -*.g2l -*.g3l -*.gbl -*.gbo -*.gbp -*.gbs -*.gko -*.gtl -*.gto -*.gtp -*.gts -*.xln -*.tdx -\#*\# -*.notes.txt *.bom.csv -*.cost.csv *.cpl.csv +*.versioned.* +fabrication + +# scripts and utilities *.json *.rb -geda/footprints/ + +# panel files +panel.* +panel diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md index 5be4776..384bec4 100644 --- a/DEVELOPMENT.md +++ b/DEVELOPMENT.md @@ -1,19 +1,22 @@ -this will describe how to generate the output file form the sources. +this will describe how to generate the output files form the sources. requirements ============ -to be able to generate the outputs you need following software: +to be able to generate the outputs, you need following software: -- rake: the central script taking care of generating the output files (Makefile is too cumbersome to parse files) - [QEDA](http://qeda.org/): to generate footprints for the parts -- [Lepton EDA](https://github.com/lepton-eda/lepton-eda): for the schematic capture -- [pcb-rnd](http://repo.hu/projects/pcb-rnd/): for the board layout -the output generation is automatized. +- [KiCad](https://www.kicad.org/): EDA software used for schematic capture and board layout +- [PcbDraw](https://github.com/yaqwsx/PcbDraw): to generate board layout rendering +- [KiKit](https://github.com/yaqwsx/KiKit): to generate fabrications files (Gerber, Excellon) +- [KiAuto](https://github.com/INTI-CMNB/KiAuto): to generate schematic printout (PDF) +- [KiBoM](https://github.com/SchrodingersGat/KiBoM): to generate Bill of Material (CSV) compiling ========= +to generate schematic, BoM, board render, and fabrication output, run `make`. + library ------- @@ -21,11 +24,13 @@ almost all of the symbols and footprints used in the schematic and board layout the `library` folder contains the QEDA parts definitions. to install QEDA using NPM from the official repository: + ~~~ sudo npm install -g qeda ~~~ to install QEDA from the sources: + ~~~ git clone https://github.com/qeda/qeda cd qeda @@ -34,49 +39,59 @@ sudo npm install --global ~~~ to generate the parts: + ~~~ -rake library +make lib ~~~ -this will use the parts definition (.yaml files) in the `library` to generate [gEDA gschem](http://wiki.geda-project.org/geda:gaf)/[Lepton EDA](https://github.com/lepton-eda/lepton-eda) symbols (.sym files) in the `geda/symbols` folder, and [coralEDA pcb-rnd](http://repo.hu/projects/pcb-rnd/) footprints (.lht files) in the `coraleda/subc` folder. - -only the QEDA parts in subfolders within `library` come from the [QEDA library](https://doc.qeda.org/library/), but the files are included in this project for simplicity and archiving purposes. -all other parts are custom and written for this project. +this will use the parts definition (.yaml files) in the `library` to generate the symbols (.sym files) and footprints used by KiCAD in the `kicad` folder. schematic --------- -the `.sch` file is the schematic source file. -it has been drawn using [Lepton EDA](https://github.com/lepton-eda/lepton-eda). +the `.kicad_sch` file is the schematic source file. +it has been drawn using the [KiCAD eeschema](https://www.kicad.org/) schematic editor. -it uses standard symbols, and the ones in the `geda/symbols/` folder. +it uses standard symbols, and the ones in the `kicad/` folder. most symbols are generated by QEDA as described above. to export as pdf: + ~~~ -rake print +make print ~~~ BOM --- to export the bill of material (as CSV): + ~~~ -rake bom +make bom ~~~ board ----- -the `.lht` file is the board layout source file. -it has been drawn using [coralEDA pcb-rnd](http://repo.hu/projects/pcb-rnd/). +the `.kicad_brd` file is the board layout source file. +it has been drawn using the [KiCAD pcbnew](https://docs.kicad.org/6.0/en/pcbnew/pcbnew.html) PCB editor. -it uses the symbols from the `coraleda/subc/` folder. +it uses the footprints from the `kicad/` folder. most symbols are generated by QEDA as described above. -`oshw_logo.lht` is just the Open Source Hardware Logo. -it been generated from https://oshwlogo.cuvoodoo.info/. to export gerber files for PCB manufacturer (and photo preview + overview document): + ~~~ -rake fabrication +make fabrication ~~~ + +versioning +---------- + +the source schematic and board layout do not include version information. +when generating schematic or board fabrication output, a copy of the source files with date and version information is done as `.versioned.` files. +the date corresponds to the last changes (i.e. commit). +the version is formatted as `v.r`: + +- `v` corresponds to the major version information defined in `version` +- `r` corresponds to the total number of changes done to the source files diff --git a/JLCPCB_CORRECTION.csv b/JLCPCB_CORRECTION.csv new file mode 100644 index 0000000..caa96e1 --- /dev/null +++ b/JLCPCB_CORRECTION.csv @@ -0,0 +1,12 @@ +package;x;y;rot +LEDC2012X80N;0;0;-90 +LEDC1608X90N;0;0;-90 +UC1608X55N;0;0;-90 +CAPC1608X92N;0;0;-90 +SOT95P237X112-3N;0;0;180 +CONNECTOR_MY-1220-03;0;-1.1;0 +CONNECTOR_XKB_U262-24XN-4BV64;0;-1.3;0 +CONNECTOR_U231-09XN-4BLRA00;0;-3.0;0 +SOP254P976X355-14N;0;0;-90 +SOP65P640X120-20N;0;0;-90 +CONNECTOR_HDMI-001S;0;1.1;0 diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..6527b30 --- /dev/null +++ b/Makefile @@ -0,0 +1,80 @@ +# project file name (use for schematic and board layout) +NAME ?= pd_blocker +# path to qeda +QEDA := qeda +# path to InteractiveHtmlBom +IBOMGEN := /usr/share/kicad/scripting/plugins/InteractiveHtmlBom/generate_interactive_bom.py + +# read project version +VERSION := $(shell cat version) +# current date for stamping output +DATE = $(shell date +%Y-%m-%d) +# revision based on number of changes on schematic or board layout +REVISION := $(shell git log --pretty=oneline "${NAME}.kicad_sch" "${NAME}.kicad_pcb" | wc -l) + +# generate file with version information +VERSIONED_EXT = kicad_sch kicad_pcb kicad_pro json +define version_rule +%.versioned.$1: %.$1 + cp $$< $$@ + sed --in-place 's/\$$$$version\$$$$/${VERSION}/g' $$@ + sed --in-place 's/\$$$$date\$$$$/${DATE}/g' $$@ + sed --in-place 's/\$$$$revision\$$$$/${REVISION}/g' $$@ +endef +$(foreach EXT,$(VERSIONED_EXT),$(eval $(call version_rule,$(EXT)))) + +FABRICATION_DIR := fabrication +IBOM := ${FABRICATION_DIR}/ibom.html + +all: ${NAME}.sch.pdf ${NAME}.brd-top.png ${NAME}.brd-bot.png ${NAME}.bom.csv fab + +fab: ${FABRICATION_DIR} ${IBOM} + +# generate fabrication files (gerbers/drill/BoM/PnP) +${FABRICATION_DIR}: ${NAME}.versioned.kicad_sch ${NAME}.versioned.kicad_pcb + kikit fab jlcpcb --drc --assembly --schematic $^ $@ + +# generate interactive BoM +${IBOM}: ${NAME}.versioned.kicad_pcb + $(IBOMGEN) --no-browser --dest-dir `dirname $@` --name-format `basename $@ ".html"` --show-fields "Value" $< &>/dev/null + +# generate symbols and footprints from parts +lib: + $(QEDA) generate qeda + +# generate printable version (PDF) of schematic +%.sch.pdf: %.versioned.kicad_sch %.versioned.kicad_pro + eeschema_do export $< . + mv $*.versioned.pdf $@ + +# generate render from layout (top side) +%.brd-top.png: %.versioned.kicad_pcb + pcbdraw --silent $< --dpi 600 $@ + +# generate render from layout (bottom side) +%.brd-bot.png: %.versioned.kicad_pcb + pcbdraw --silent $< --dpi 600 --back $@ + +# export Bill of Material (as CSV) +%.bom.csv: %.versioned.kicad_sch %.versioned.kicad_pro + eeschema_do bom_xml $< . + kibom $*.versioned.xml $@ + +# generate panel +PANEL_DIR := panel +panel: panel.kicad_pcb +panel.kicad_pcb: ${NAME}.versioned.kicad_pcb ${NAME}.versioned.kicad_pro ${NAME}.versioned.kicad_sch ${NAME}.versioned.json + kikit panelize -p ${NAME}.versioned.json ${NAME}.versioned.kicad_pcb $@ + sed --in-place 's/\"missing_courtyard\": \"warning\"/\"missing_courtyard\": \"ignore\"/g' $(patsubst %.kicad_pcb,%.kicad_pro,$@) # the mouse bites don't have a courtyard + kikit fab jlcpcb --drc --assembly --missingError --schematic ${NAME}.versioned.kicad_sch $@ ${PANEL_DIR} + pcbdraw --silent $@ --dpi 600 panel.brd-top.png + pcbdraw --silent $@ --dpi 600 --back panel.brd-bot.png + +clean: + rm -f $(foreach EXT,$(VERSIONED_EXT),${NAME}.versioned.$(EXT)) + rm -f ${NAME}.sch.pdf ${NAME}.brd-top.png ${NAME}.brd-bot.png ${NAME}.versioned.xml ${NAME}.bom.csv + rm -f ${NAME}.versioned.kicad_prl ${NAME}.versioned.kicad_pro-bak ${NAME}.versioned.xml ${NAME}.versioned.csv + rm -f ${IBOM} + rm -rf ${FABRICATION_DIR} + rm -f panel.kicad_pcb panel.kicad_pro + rm -rf ${PANEL_DIR} diff --git a/bom.ini b/bom.ini new file mode 100644 index 0000000..837be7f --- /dev/null +++ b/bom.ini @@ -0,0 +1,42 @@ +[BOM_OPTIONS] +ignore_dnf = 0 +number_rows = 0 +group_connectors = 1 +test_regex = 0 +merge_blank_fields = 1 +output_file_name = %O%V + +[IGNORE_COLUMNS] +; Any column heading that appears here will be excluded from the Generated BoM +; Titles are case-insensitive +Part +Part Lib +Footprint +Footprint Lib +Build Quantity +sheetpath + +[COLUMN_ORDER] +; Columns will apear in the order they are listed here +; Titles are case-insensitive +References +Value +Quantity Per PCB +Description +Part +Part Lib +Footprint +Footprint Lib +Build Quantity +LCSC +Datasheet + +[GROUP_FIELDS] +; List of fields used for sorting individual components into groups +; Components which match (comparing *all* fields) will be grouped together +; Field names are case-insensitive +Part +Part Lib +Value +Footprint +Footprint Lib diff --git a/refdes2fab.py b/refdes2fab.py new file mode 100644 index 0000000..41d4ed5 --- /dev/null +++ b/refdes2fab.py @@ -0,0 +1,9 @@ +import pcbnew +import sys + +board = pcbnew.LoadBoard(sys.argv[1]) +for fp in board.GetFootprints(): + fp.Value().SetVisible(False) + fp.Reference().SetLayer(board.GetLayerID('F.Fab')) + +board.Save(sys.argv[1])