Compare commits

...

6 Commits

5 changed files with 343 additions and 121 deletions

View File

@ -6,7 +6,7 @@ requirements
to be able to generate the outputs, you need following software: to be able to generate the outputs, you need following software:
- [QEDA](http://qeda.org/): to generate footprints for the parts - [QEDA](http://qeda.org/): to generate footprints for the parts
- [KiCad v7](https://www.kicad.org/): EDA software used for schematic capture and board layout - [KiCad v8](https://www.kicad.org/): EDA software used for schematic capture and board layout
- [PcbDraw](https://github.com/yaqwsx/PcbDraw): to generate board layout rendering - [PcbDraw](https://github.com/yaqwsx/PcbDraw): to generate board layout rendering
- [KiKit](https://github.com/yaqwsx/KiKit): to generate fabrications files (Gerber, Excellon) - [KiKit](https://github.com/yaqwsx/KiKit): to generate fabrications files (Gerber, Excellon)
- [KiBoM](https://github.com/SchrodingersGat/KiBoM): to generate Bill of Material (CSV) - [KiBoM](https://github.com/SchrodingersGat/KiBoM): to generate Bill of Material (CSV)

View File

@ -8,7 +8,7 @@ QEDA := qeda
# path to KiBOM # path to KiBOM
KIBOM := kibom KIBOM := kibom
# path to InteractiveHtmlBom # path to InteractiveHtmlBom
IBOMGEN := ~/.local/share/kicad/7.0/3rdparty/plugins/org_openscopeproject_InteractiveHtmlBom/generate_interactive_bom.py IBOMGEN := ~/.local/share/kicad/8.0/3rdparty/plugins/org_openscopeproject_InteractiveHtmlBom/generate_interactive_bom.py
# read project version # read project version
VERSION := $(shell cat version) VERSION := $(shell cat version)
@ -33,10 +33,12 @@ VERSIONED_SHEET = $(foreach SHEET,$(NAME) $(SUBSHEET),$(SHEET).versioned.kicad_s
FABRICATION_DIR := fabrication FABRICATION_DIR := fabrication
IBOM := ${FABRICATION_DIR}/ibom.html IBOM := ${FABRICATION_DIR}/ibom.html
all: $(VERSIONED_SHEET) ${NAME}.sch.pdf ${NAME}.brd-top.png ${NAME}.brd-bot.png ${NAME}.bom.csv ${NAME}.3d.step fab all: $(VERSIONED_SHEET) ${NAME}.sch.pdf ${NAME}.bom.csv render fab
fab: ${FABRICATION_DIR} ${IBOM} fab: ${FABRICATION_DIR} ${IBOM}
render: ${NAME}.brd-top.png ${NAME}.brd-bot.png ${NAME}.brd-top.svg ${NAME}.brd-bot.svg ${NAME}.3d.step
# generate fabrication files (gerbers/drill/BoM/PnP) # generate fabrication files (gerbers/drill/BoM/PnP)
${FABRICATION_DIR}: ${NAME}.versioned.kicad_sch ${NAME}.versioned.kicad_pcb ${FABRICATION_DIR}: ${NAME}.versioned.kicad_sch ${NAME}.versioned.kicad_pcb
kikit fab jlcpcb --no-drc --assembly --field JLCPCB,LCSC --schematic $^ $@ kikit fab jlcpcb --no-drc --assembly --field JLCPCB,LCSC --schematic $^ $@
@ -68,6 +70,14 @@ lib:
%.brd-bot.png: %.versioned.kicad_pcb %.brd-bot.png: %.versioned.kicad_pcb
pcbdraw plot --silent --no-components --dpi 600 --side back $< $@ pcbdraw plot --silent --no-components --dpi 600 --side back $< $@
# generate render from layout (top side)
%.brd-top.svg: %.versioned.kicad_pcb
$(KICAD) pcb export svg --layers F.Cu,F.Paste,F.Silkscreen,Edge.Cuts --page-size-mode 2 --exclude-drawing-sheet --output $@ $<
# generate render from layout (bottom side)
%.brd-bot.svg: %.versioned.kicad_pcb
$(KICAD) pcb export svg --layers B.Cu,B.Paste,B.Silkscreen,Edge.Cuts --mirror --page-size-mode 2 --exclude-drawing-sheet --output $@ $<
# export Bill of Material (as CSV) # export Bill of Material (as CSV)
%.bom.xml: %.versioned.kicad_sch %.versioned.kicad_pro %.bom.xml: %.versioned.kicad_sch %.versioned.kicad_pro
$(KICAD) sch export python-bom --output $@ $< $(KICAD) sch export python-bom --output $@ $<
@ -92,7 +102,7 @@ panel.kicad_pcb: ${NAME}.versioned.kicad_pcb ${NAME}.versioned.kicad_pro ${NAME}
clean: clean:
rm -f $(foreach EXT,$(VERSIONED_EXT),${NAME}.versioned.$(EXT)) 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}.sch.pdf ${NAME}.brd-top.png ${NAME}.brd-bot.png ${NAME}.brd-top.svg ${NAME}.brd-bot.svg ${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 ${NAME}.versioned.kicad_prl ${NAME}.versioned.kicad_pro-bak ${NAME}.versioned.xml ${NAME}.versioned.csv
rm -f ${IBOM} rm -f ${IBOM}
rm -rf ${FABRICATION_DIR} rm -rf ${FABRICATION_DIR}

View File

@ -1,83 +1,113 @@
(kicad_pcb (version 20221018) (generator pcbnew) (kicad_pcb
(version 20240108)
(general (generator "pcbnew")
(thickness 1.6) (generator_version "8.0")
) (general
(thickness 1.6)
(paper "A4") (legacy_teardrops no)
(title_block )
(date "$date$") (paper "A4")
(rev "$version$.$revision$") (title_block
(company "CuVoodoo") (date "$date$")
(comment 1 "King Kévin") (rev "$version$.$revision$")
(comment 2 "CERN-OHL-S") (company "CuVoodoo")
) (comment 1 "King Kévin")
(comment 2 "CERN-OHL-S")
(layers )
(0 "F.Cu" signal) (layers
(31 "B.Cu" signal) (0 "F.Cu" signal)
(33 "F.Adhes" user "F.Adhesive") (31 "B.Cu" signal)
(36 "B.SilkS" user "B.Silkscreen") (33 "F.Adhes" user "F.Adhesive")
(37 "F.SilkS" user "F.Silkscreen") (36 "B.SilkS" user "B.Silkscreen")
(38 "B.Mask" user) (37 "F.SilkS" user "F.Silkscreen")
(39 "F.Mask" user) (38 "B.Mask" user)
(44 "Edge.Cuts" user) (39 "F.Mask" user)
(45 "Margin" user) (44 "Edge.Cuts" user)
(46 "B.CrtYd" user "B.Courtyard") (45 "Margin" user)
(47 "F.CrtYd" user "F.Courtyard") (46 "B.CrtYd" user "B.Courtyard")
(48 "B.Fab" user) (47 "F.CrtYd" user "F.Courtyard")
(49 "F.Fab" user) (48 "B.Fab" user)
) (49 "F.Fab" user)
)
(setup (setup
(stackup (stackup
(layer "F.SilkS" (type "Top Silk Screen") (color "White")) (layer "F.SilkS"
(layer "F.Mask" (type "Top Solder Mask") (color "Green") (thickness 0.01)) (type "Top Silk Screen")
(layer "F.Cu" (type "copper") (thickness 0.035)) (color "White")
(layer "dielectric 1" (type "core") (thickness 1.51) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02)) )
(layer "B.Cu" (type "copper") (thickness 0.035)) (layer "F.Mask"
(layer "B.Mask" (type "Bottom Solder Mask") (color "Green") (thickness 0.01)) (type "Top Solder Mask")
(layer "B.SilkS" (type "Bottom Silk Screen") (color "White")) (color "Green")
(copper_finish "None") (thickness 0.01)
(dielectric_constraints no) )
) (layer "F.Cu"
(pad_to_mask_clearance 0) (type "copper")
(pcbplotparams (thickness 0.035)
(layerselection 0x00010fc_ffffffff) )
(plot_on_all_layers_selection 0x0000000_00000000) (layer "dielectric 1"
(disableapertmacros false) (type "core")
(usegerberextensions false) (color "Polyimide")
(usegerberattributes true) (thickness 1.51)
(usegerberadvancedattributes true) (material "FR4")
(creategerberjobfile true) (epsilon_r 4.5)
(dashed_line_dash_ratio 12.000000) (loss_tangent 0.02)
(dashed_line_gap_ratio 3.000000) )
(svgprecision 6) (layer "B.Cu"
(plotframeref false) (type "copper")
(viasonmask false) (thickness 0.035)
(mode 1) )
(useauxorigin false) (layer "B.Mask"
(hpglpennumber 1) (type "Bottom Solder Mask")
(hpglpenspeed 20) (color "Green")
(hpglpendiameter 15.000000) (thickness 0.01)
(dxfpolygonmode true) )
(dxfimperialunits true) (layer "B.SilkS"
(dxfusepcbnewfont true) (type "Bottom Silk Screen")
(psnegative false) (color "White")
(psa4output false) )
(plotreference true) (copper_finish "HAL SnPb")
(plotvalue true) (dielectric_constraints no)
(plotinvisibletext false) )
(sketchpadsonfab false) (pad_to_mask_clearance 0.038)
(subtractmaskfromsilk false) (solder_mask_min_width 0.1)
(outputformat 1) (allow_soldermask_bridges_in_footprints no)
(mirror false) (pcbplotparams
(drillshape 1) (layerselection 0x00010fc_ffffffff)
(scaleselection 1) (plot_on_all_layers_selection 0x0000000_00000000)
(outputdirectory "") (disableapertmacros no)
) (usegerberextensions no)
) (usegerberattributes yes)
(usegerberadvancedattributes yes)
(net 0 "") (creategerberjobfile yes)
(dashed_line_dash_ratio 12.000000)
) (dashed_line_gap_ratio 3.000000)
(svgprecision 6)
(plotframeref no)
(viasonmask no)
(mode 1)
(useauxorigin no)
(hpglpennumber 1)
(hpglpenspeed 20)
(hpglpendiameter 15.000000)
(pdf_front_fp_property_popups yes)
(pdf_back_fp_property_popups yes)
(dxfpolygonmode yes)
(dxfimperialunits yes)
(dxfusepcbnewfont yes)
(psnegative no)
(psa4output no)
(plotreference yes)
(plotvalue yes)
(plotfptext yes)
(plotinvisibletext no)
(sketchpadsonfab no)
(subtractmaskfromsilk no)
(outputformat 1)
(mirror no)
(drillshape 1)
(scaleselection 1)
(outputdirectory "")
)
)
(net 0 "")
)

View File

@ -3,14 +3,17 @@
"3dviewports": [], "3dviewports": [],
"design_settings": { "design_settings": {
"defaults": { "defaults": {
"board_outline_line_width": 0.049999999999999996, "apply_defaults_to_fp_fields": false,
"copper_line_width": 0.19999999999999998, "apply_defaults_to_fp_shapes": false,
"apply_defaults_to_fp_text": false,
"board_outline_line_width": 0.05,
"copper_line_width": 0.2,
"copper_text_italic": false, "copper_text_italic": false,
"copper_text_size_h": 1.5, "copper_text_size_h": 1.5,
"copper_text_size_v": 1.5, "copper_text_size_v": 1.5,
"copper_text_thickness": 0.3, "copper_text_thickness": 0.3,
"copper_text_upright": false, "copper_text_upright": false,
"courtyard_line_width": 0.049999999999999996, "courtyard_line_width": 0.05,
"dimension_precision": 4, "dimension_precision": 4,
"dimension_units": 3, "dimension_units": 3,
"dimensions": { "dimensions": {
@ -21,7 +24,7 @@
"text_position": 0, "text_position": 0,
"units_format": 1 "units_format": 1
}, },
"fab_line_width": 0.09999999999999999, "fab_line_width": 0.1,
"fab_text_italic": false, "fab_text_italic": false,
"fab_text_size_h": 1.0, "fab_text_size_h": 1.0,
"fab_text_size_v": 1.0, "fab_text_size_v": 1.0,
@ -54,6 +57,11 @@
"gap": 0.0, "gap": 0.0,
"via_gap": 0.0, "via_gap": 0.0,
"width": 0.0 "width": 0.0
},
{
"gap": 0.43,
"via_gap": 0.0,
"width": 0.2
} }
], ],
"drc_exclusions": [], "drc_exclusions": [],
@ -63,20 +71,27 @@
"rule_severities": { "rule_severities": {
"annular_width": "error", "annular_width": "error",
"clearance": "error", "clearance": "error",
"connection_width": "warning",
"copper_edge_clearance": "error", "copper_edge_clearance": "error",
"copper_sliver": "warning",
"courtyards_overlap": "error", "courtyards_overlap": "error",
"diff_pair_gap_out_of_range": "error", "diff_pair_gap_out_of_range": "error",
"diff_pair_uncoupled_length_too_long": "error", "diff_pair_uncoupled_length_too_long": "error",
"drill_out_of_range": "error", "drill_out_of_range": "error",
"duplicate_footprints": "warning", "duplicate_footprints": "warning",
"extra_footprint": "warning", "extra_footprint": "warning",
"footprint_type_mismatch": "error", "footprint": "error",
"footprint_symbol_mismatch": "warning",
"footprint_type_mismatch": "warning",
"hole_clearance": "error", "hole_clearance": "error",
"hole_near_hole": "error", "hole_near_hole": "error",
"invalid_outline": "error", "invalid_outline": "error",
"isolated_copper": "warning",
"item_on_disabled_layer": "error", "item_on_disabled_layer": "error",
"items_not_allowed": "error", "items_not_allowed": "error",
"length_out_of_range": "error", "length_out_of_range": "error",
"lib_footprint_issues": "ignore",
"lib_footprint_mismatch": "ignore",
"malformed_courtyard": "error", "malformed_courtyard": "error",
"microvia_drill_out_of_range": "error", "microvia_drill_out_of_range": "error",
"missing_courtyard": "warning", "missing_courtyard": "warning",
@ -86,9 +101,14 @@
"padstack": "error", "padstack": "error",
"pth_inside_courtyard": "ignore", "pth_inside_courtyard": "ignore",
"shorting_items": "error", "shorting_items": "error",
"silk_edge_clearance": "ignore",
"silk_over_copper": "warning", "silk_over_copper": "warning",
"silk_overlap": "warning", "silk_overlap": "warning",
"skew_out_of_range": "error", "skew_out_of_range": "error",
"solder_mask_bridge": "error",
"starved_thermal": "error",
"text_height": "warning",
"text_thickness": "warning",
"through_hole_pad_without_hole": "error", "through_hole_pad_without_hole": "error",
"too_many_vias": "error", "too_many_vias": "error",
"track_dangling": "warning", "track_dangling": "warning",
@ -105,32 +125,129 @@
"allow_microvias": false, "allow_microvias": false,
"max_error": 0.005, "max_error": 0.005,
"min_clearance": 0.127, "min_clearance": 0.127,
"min_copper_edge_clearance": 0.19999999999999998, "min_connection": 0.127,
"min_copper_edge_clearance": 0.3,
"min_hole_clearance": 0.254, "min_hole_clearance": 0.254,
"min_hole_to_hole": 0.254, "min_hole_to_hole": 0.254,
"min_microvia_diameter": 0.19999999999999998, "min_microvia_diameter": 0.2,
"min_microvia_drill": 0.09999999999999999, "min_microvia_drill": 0.1,
"min_silk_clearance": 0.0, "min_resolved_spokes": 2,
"min_silk_clearance": 0.15,
"min_text_height": 1.0,
"min_text_thickness": 0.153,
"min_through_hole_diameter": 0.3, "min_through_hole_diameter": 0.3,
"min_track_width": 0.127, "min_track_width": 0.127,
"min_via_annular_width": 0.13, "min_via_annular_width": 0.13,
"min_via_diameter": 0.5, "min_via_diameter": 0.5,
"solder_mask_clearance": 0.0, "solder_mask_clearance": 0.0,
"solder_mask_min_width": 0.0, "solder_mask_min_width": 0.0,
"solder_mask_to_copper_clearance": 0.05,
"use_height_for_length_calcs": true "use_height_for_length_calcs": true
}, },
"track_widths": [ "teardrop_options": [
0.0 {
"td_onpadsmd": true,
"td_onroundshapesonly": false,
"td_ontrackend": false,
"td_onviapad": true
}
], ],
"teardrop_parameters": [
{
"td_allow_use_two_tracks": true,
"td_curve_segcount": 0,
"td_height_ratio": 1.0,
"td_length_ratio": 0.5,
"td_maxheight": 2.0,
"td_maxlen": 1.0,
"td_on_pad_in_zone": false,
"td_target_name": "td_round_shape",
"td_width_to_size_filter_ratio": 0.9
},
{
"td_allow_use_two_tracks": true,
"td_curve_segcount": 0,
"td_height_ratio": 1.0,
"td_length_ratio": 0.5,
"td_maxheight": 2.0,
"td_maxlen": 1.0,
"td_on_pad_in_zone": false,
"td_target_name": "td_rect_shape",
"td_width_to_size_filter_ratio": 0.9
},
{
"td_allow_use_two_tracks": true,
"td_curve_segcount": 0,
"td_height_ratio": 1.0,
"td_length_ratio": 0.5,
"td_maxheight": 2.0,
"td_maxlen": 1.0,
"td_on_pad_in_zone": false,
"td_target_name": "td_track_end",
"td_width_to_size_filter_ratio": 0.9
}
],
"track_widths": [
0.0,
0.127,
0.2,
0.3,
0.5
],
"tuning_pattern_settings": {
"diff_pair_defaults": {
"corner_radius_percentage": 80,
"corner_style": 1,
"max_amplitude": 1.0,
"min_amplitude": 0.2,
"single_sided": false,
"spacing": 1.0
},
"diff_pair_skew_defaults": {
"corner_radius_percentage": 80,
"corner_style": 1,
"max_amplitude": 1.0,
"min_amplitude": 0.2,
"single_sided": false,
"spacing": 0.6
},
"single_track_defaults": {
"corner_radius_percentage": 80,
"corner_style": 1,
"max_amplitude": 1.0,
"min_amplitude": 0.2,
"single_sided": false,
"spacing": 0.6
}
},
"via_dimensions": [ "via_dimensions": [
{ {
"diameter": 0.0, "diameter": 0.0,
"drill": 0.0 "drill": 0.0
},
{
"diameter": 0.6,
"drill": 0.3
},
{
"diameter": 0.8,
"drill": 0.4
},
{
"diameter": 1.0,
"drill": 0.5
} }
], ],
"zones_allow_external_fillets": false, "zones_allow_external_fillets": false,
"zones_use_no_outline": true "zones_use_no_outline": true
}, },
"ipc2581": {
"dist": "",
"distpn": "",
"internal_id": "",
"mfg": "",
"mpn": ""
},
"layer_presets": [], "layer_presets": [],
"viewports": [] "viewports": []
}, },
@ -423,14 +540,75 @@
"gencad": "", "gencad": "",
"idf": "", "idf": "",
"netlist": "", "netlist": "",
"plot": "",
"pos_files": "",
"specctra_dsn": "", "specctra_dsn": "",
"step": "", "step": "",
"svg": "",
"vrml": "" "vrml": ""
}, },
"page_layout_descr_file": "" "page_layout_descr_file": ""
}, },
"schematic": { "schematic": {
"annotate_start_num": 0, "annotate_start_num": 0,
"bom_fmt_presets": [],
"bom_fmt_settings": {
"field_delimiter": ",",
"keep_line_breaks": false,
"keep_tabs": false,
"name": "CSV",
"ref_delimiter": ",",
"ref_range_delimiter": "",
"string_delimiter": "\""
},
"bom_presets": [],
"bom_settings": {
"exclude_dnp": false,
"fields_ordered": [
{
"group_by": false,
"label": "Reference",
"name": "Reference",
"show": true
},
{
"group_by": true,
"label": "Value",
"name": "Value",
"show": true
},
{
"group_by": false,
"label": "Datasheet",
"name": "Datasheet",
"show": true
},
{
"group_by": false,
"label": "Footprint",
"name": "Footprint",
"show": true
},
{
"group_by": false,
"label": "Qty",
"name": "${QUANTITY}",
"show": true
},
{
"group_by": true,
"label": "DNP",
"name": "${DNP}",
"show": true
}
],
"filter_string": "",
"group_symbols": true,
"name": "Grouped By Value",
"sort_asc": true,
"sort_field": "Reference"
},
"connection_grid_size": 50.0,
"drawing": { "drawing": {
"dashed_lines_dash_length_ratio": 12.0, "dashed_lines_dash_length_ratio": 12.0,
"dashed_lines_gap_length_ratio": 3.0, "dashed_lines_gap_length_ratio": 3.0,
@ -444,6 +622,11 @@
"intersheets_ref_suffix": "", "intersheets_ref_suffix": "",
"junction_size_choice": 3, "junction_size_choice": 3,
"label_size_ratio": 0.375, "label_size_ratio": 0.375,
"operating_point_overlay_i_precision": 3,
"operating_point_overlay_i_range": "~A",
"operating_point_overlay_v_precision": 3,
"operating_point_overlay_v_range": "~V",
"overbar_offset_ratio": 1.23,
"pin_symbol_size": 25.0, "pin_symbol_size": 25.0,
"text_offset_ratio": 0.15 "text_offset_ratio": 0.15
}, },
@ -469,6 +652,7 @@
"spice_external_command": "spice \"%I\"", "spice_external_command": "spice \"%I\"",
"spice_model_current_sheet_as_root": true, "spice_model_current_sheet_as_root": true,
"spice_save_all_currents": false, "spice_save_all_currents": false,
"spice_save_all_dissipations": false,
"spice_save_all_voltages": false, "spice_save_all_voltages": false,
"subpart_first_id": 65, "subpart_first_id": 65,
"subpart_id_separator": 0 "subpart_id_separator": 0
@ -476,7 +660,7 @@
"sheets": [ "sheets": [
[ [
"43fc3289-82a7-492c-a423-3030e10115dc", "43fc3289-82a7-492c-a423-3030e10115dc",
"" "Root"
] ]
], ],
"text_variables": {} "text_variables": {}

View File

@ -1,22 +1,20 @@
(kicad_sch (version 20230121) (generator eeschema) (kicad_sch
(version 20231120)
(uuid 43fc3289-82a7-492c-a423-3030e10115dc) (generator "eeschema")
(generator_version "8.0")
(paper "A4") (uuid "43fc3289-82a7-492c-a423-3030e10115dc")
(paper "A4")
(title_block (title_block
(date "$date$") (date "$date$")
(rev "$version$.$revision$") (rev "$version$.$revision$")
(company "CuVoodoo") (company "CuVoodoo")
(comment 1 "King Kévin") (comment 1 "King Kévin")
(comment 2 "CERN-OHL-S") (comment 2 "CERN-OHL-S")
) )
(lib_symbols)
(lib_symbols (sheet_instances
) (path "/"
(page "1")
)
(sheet_instances )
(path "/" (page "1")) )
)
)