Skip to content
This repository has been archived by the owner on Oct 7, 2020. It is now read-only.

Connector Wuerth: Add WR-PHD Bottom Entry series #613

Open
wants to merge 5 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
153 changes: 153 additions & 0 deletions scripts/Connector_Wuerth_WR-PHD/wuerth_wr_phd_bottom_entry.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,153 @@
#!/usr/bin/env python3

import sys
import os
sys.path.append(os.path.join(sys.path[0], "..", ".."))
import argparse
import yaml
from KicadModTree import *

# Load parent path of tools
sys.path.append(os.path.join(sys.path[0], "..", "tools"))
from footprint_text_fields import addTextFields

# Function used to generate footprint
def generate_footprint(params, part_params, mpn, configuration):

# Build footprint name
fp_name = "Connector_Wuerth_{series_prefix}_{type}_{rows}x{pins:02d}_P{pitch}_{orientation}_{mpn}".format(
series_prefix=params['series_prefix'], type=params['type'], rows=part_params['rows'], pins=part_params['pins']//2, pitch=params['pitch'], orientation=params['orientation'], mpn=mpn)

# Create footprint
kicad_mod = Footprint(fp_name)

# Set SMD attribute if required
if params['type'] == 'SMD':
kicad_mod.setAttribute('smd')

# Description
kicad_mod.setDescription("Connector Wuerth, WR-PHD {pitch}mm Dual Socket Header Bottom Entry {type}, Wuerth electronics {mpn} ({datasheet}), generated with kicad-footprint-generator".format(
pitch=params['pitch'], type=params['type'], mpn=mpn, datasheet=part_params['datasheet']))

# Keywords
kicad_mod.setTags("Connector Wuerth WR-PHD {pitch}mm {mpn}".format(
pitch=params['pitch'], mpn=mpn))

# Pads
if params['type'] == 'SMD':
kicad_mod.append(PadArray(initial=1, start=[-params['pitch']/2-params['holes']['offset'], -params['pitch']*(part_params['pins']//2-1)/2], y_spacing=params['pitch'], pincount=part_params['pins']//2, increment=2,
size=[params['pads']['x'], params['pads']['y']], type=Pad.TYPE_SMT, shape=Pad.SHAPE_RECT, layers=['F.Cu', 'F.Paste', 'F.Mask']))
kicad_mod.append(PadArray(initial=2, start=[params['pitch']/2+params['holes']['offset'], -params['pitch']*(part_params['pins']//2-1)/2], y_spacing=params['pitch'], pincount=part_params['pins']//2, increment=2,
size=[params['pads']['x'], params['pads']['y']], type=Pad.TYPE_SMT, shape=Pad.SHAPE_RECT, layers=['F.Cu', 'F.Paste', 'F.Mask']))
else:
kicad_mod.append(PadArray(initial=1, start=[0, 0], y_spacing=params['pitch'], pincount=part_params['pins']//2, increment=2,
size=[params['pads']['diameter'], params['pads']['diameter']], drill=params['pads']['drill'], type=Pad.TYPE_THT, tht_pad1_shape=Pad.SHAPE_RECT, shape=Pad.SHAPE_OVAL, layers=['*.Cu', '*.Mask']))
kicad_mod.append(PadArray(initial=2, start=[params['pitch']+2*params['holes']['offset'], 0], y_spacing=params['pitch'], pincount=part_params['pins']//2, increment=2,
size=[params['pads']['diameter'], params['pads']['diameter']], drill=params['pads']['drill'], type=Pad.TYPE_THT, tht_pad1_shape=Pad.SHAPE_RECT, shape=Pad.SHAPE_OVAL, layers=['*.Cu', '*.Mask']))

# Bottom entry holes
if params['type'] == 'SMD':
kicad_mod.append(PadArray(initial="", start=[params['pitch']/2, -params['pitch']*(part_params['pins']//2-1)/2], y_spacing=params['pitch'], pincount=part_params['pins']//2, increment="",
size=params['holes']['drill'], drill=params['holes']['drill'], type=Pad.TYPE_NPTH, shape=Pad.SHAPE_CIRCLE, layers=Pad.LAYERS_NPTH))
kicad_mod.append(PadArray(initial="", start=[-params['pitch']/2, -params['pitch']*(part_params['pins']//2-1)/2], y_spacing=params['pitch'], pincount=part_params['pins']//2, increment="",
size=params['holes']['drill'], drill=params['holes']['drill'], type=Pad.TYPE_NPTH, shape=Pad.SHAPE_CIRCLE, layers=Pad.LAYERS_NPTH))
else:
kicad_mod.append(PadArray(initial="", start=[params['holes']['offset'], 0], y_spacing=params['pitch'], pincount=part_params['pins']//2, increment="",
size=params['holes']['drill'], drill=params['holes']['drill'], type=Pad.TYPE_NPTH, shape=Pad.SHAPE_CIRCLE, layers=Pad.LAYERS_NPTH))
kicad_mod.append(PadArray(initial="", start=[params['pitch']+params['holes']['offset'], 0], y_spacing=params['pitch'], pincount=part_params['pins']//2, increment="",
size=params['holes']['drill'], drill=params['holes']['drill'], type=Pad.TYPE_NPTH, shape=Pad.SHAPE_CIRCLE, layers=Pad.LAYERS_NPTH))

# Add fab layer
if params['type'] == 'SMD':
body_top_left = [-params['width']/2, -params['top']-params['pitch']*(part_params['pins']//2-1)/2]
body_bottom_right = [params['width']/2, params['top']+params['pitch']*(part_params['pins']//2-1)/2]
else:
body_top_left = [(-params['width']+params['pitch'])/2+params['holes']['offset'], -params['top']]
body_bottom_right = [(-params['width']+params['pitch'])/2+params['width']+params['holes']['offset'], params['top']+params['pitch']*(part_params['pins']//2-1)]
kicad_mod.append(RectLine(start=body_top_left, end=body_bottom_right, layer='F.Fab', width=configuration['fab_line_width']))

# Add silkscreen layer
silk_top_left = [body_top_left[0] - configuration['silk_fab_offset'], body_top_left[1] - configuration['silk_fab_offset']]
silk_bottom_right = [body_bottom_right[0] + configuration['silk_fab_offset'], body_bottom_right[1] + configuration['silk_fab_offset']]
# -> Top part
kicad_mod.append(Line(start=[silk_top_left[0], silk_top_left[1]], end=[silk_bottom_right[0], silk_top_left[1]], layer='F.SilkS', width=configuration['silk_line_width']))
kicad_mod.append(Line(start=[silk_top_left[0], silk_top_left[1]], end=[silk_top_left[0], silk_top_left[1] + 1.27/2], layer='F.SilkS', width=configuration['silk_line_width']))
kicad_mod.append(Line(start=[silk_bottom_right[0], silk_top_left[1]], end=[silk_bottom_right[0], silk_top_left[1] + 1.27/2], layer='F.SilkS', width=configuration['silk_line_width']))
kicad_mod.append(Line(start=[silk_top_left[0], silk_top_left[1] + 1.27/2], end=[silk_top_left[0] - 1.27/2, silk_top_left[1] + 1.27/2], layer='F.SilkS', width=configuration['silk_line_width']))
# -> Dashes between the pads
for x in range(0, part_params['pins']//2-1):
if params['type'] == 'SMD':
kicad_mod.append(Line(start=[silk_bottom_right[0], -params['pitch']*(part_params['pins']//2-1)/2 + 3*params['pitch']/8 + x * params['pitch']], end=[silk_bottom_right[0], -params['pitch']*(part_params['pins']//2-1)/2 + 3*params['pitch']/8 + params['pitch']/4 + x * params['pitch']], layer='F.SilkS', width=configuration['silk_line_width']))
kicad_mod.append(Line(start=[silk_top_left[0], -params['pitch']*(part_params['pins']//2-1)/2 + 3*params['pitch']/8 + x * params['pitch']], end=[silk_top_left[0], -params['pitch']*(part_params['pins']//2-1)/2 + 3*params['pitch']/8 + params['pitch']/4 + x * params['pitch']], layer='F.SilkS', width=configuration['silk_line_width']))
else:
kicad_mod.append(Line(start=[silk_bottom_right[0], 3*params['pitch']/8 + x * params['pitch']], end=[silk_bottom_right[0], 3*params['pitch']/8 + params['pitch']/4 + x * params['pitch']], layer='F.SilkS', width=configuration['silk_line_width']))
kicad_mod.append(Line(start=[silk_top_left[0], 3*params['pitch']/8 + x * params['pitch']], end=[silk_top_left[0], 3*params['pitch']/8 + params['pitch']/4 + x * params['pitch']], layer='F.SilkS', width=configuration['silk_line_width']))
# -> Bottom part
kicad_mod.append(Line(start=[silk_bottom_right[0], silk_bottom_right[1]], end=[silk_bottom_right[0], silk_bottom_right[1] - 1.27/2], layer='F.SilkS', width=configuration['silk_line_width']))
kicad_mod.append(Line(start=[silk_top_left[0], silk_bottom_right[1]], end=[silk_top_left[0], silk_bottom_right[1] - 1.27/2], layer='F.SilkS', width=configuration['silk_line_width']))
kicad_mod.append(Line(start=[silk_top_left[0], silk_bottom_right[1]], end=[silk_bottom_right[0], silk_bottom_right[1]], layer='F.SilkS', width=configuration['silk_line_width']))

# Add courtyard layer
courtyard_top_left = [body_top_left[0] - configuration['courtyard_offset']['connector'], body_top_left[1] - configuration['courtyard_offset']['connector']]
if params['type'] == 'SMD':
if courtyard_top_left[0] > 0 - params['pitch']/2 - params['holes']['offset'] - params['pads']['x']/2 - configuration['courtyard_offset']['connector']:
courtyard_top_left[0] = 0 - params['pitch']/2 - params['holes']['offset'] - params['pads']['x']/2 - configuration['courtyard_offset']['connector']
else:
if courtyard_top_left[0] > 0 - params['pads']['diameter']/2 - configuration['courtyard_offset']['connector']:
courtyard_top_left[0] = 0 - params['pads']['diameter']/2 - configuration['courtyard_offset']['connector']
courtyard_bottom_right = [body_bottom_right[0] + configuration['courtyard_offset']['connector'], body_bottom_right[1] + configuration['courtyard_offset']['connector']]
if params['type'] == 'SMD':
if courtyard_bottom_right[0] < params['pitch']/2 + params['holes']['offset'] + params['pads']['x']/2 + configuration['courtyard_offset']['connector']:
courtyard_bottom_right[0] = params['pitch']/2 + params['holes']['offset'] + params['pads']['x']/2 + configuration['courtyard_offset']['connector']
else:
if courtyard_bottom_right[0] < params['pitch'] + 2*params['holes']['offset'] + params['pads']['diameter']/2 + configuration['courtyard_offset']['connector']:
courtyard_bottom_right[0] = params['pitch'] + 2*params['holes']['offset'] + params['pads']['diameter']/2 + configuration['courtyard_offset']['connector']
kicad_mod.append(RectLine(start=courtyard_top_left, end=courtyard_bottom_right, layer='F.CrtYd', width=configuration['courtyard_line_width']))

# Add texts
body_edge={'left': body_top_left[0], 'right': body_bottom_right[0], 'top': body_top_left[1], 'bottom': body_bottom_right[1]}
addTextFields(kicad_mod=kicad_mod, configuration=configuration, body_edges=body_edge, fp_name=fp_name, text_y_inside_position='top',
courtyard={'top': body_edge['top'] - configuration['courtyard_offset']['connector'], 'bottom': body_edge['bottom'] + configuration['courtyard_offset']['connector'] + 0.2})

# 3D model definition
model3d_path_prefix = configuration.get('3d_model_prefix', '${KISYS3DMOD}/')
model_name = "{model3d_path_prefix:s}Connector_Wuerth_{series_prefix}_Bottom-Entry.3dshapes/{fp_name:s}.wrl".format(
model3d_path_prefix=model3d_path_prefix, series_prefix=params['series_prefix'], fp_name=fp_name)
kicad_mod.append(Model(filename=model_name))

# Create output directory
output_dir = 'Connector_Wuerth_{series_prefix}_Bottom-Entry.pretty/'.format(series_prefix=params['series_prefix'])
if not os.path.isdir(output_dir):
os.makedirs(output_dir)
filename = '{output_dir:s}{fp_name:s}.kicad_mod'.format(output_dir=output_dir, fp_name=fp_name)

# Create footprint
file_handler = KicadFileHandler(kicad_mod)
file_handler.writeFile(filename)

if __name__ == "__main__":

# Parse arguments
parser = argparse.ArgumentParser(description='use config .yaml files to create footprints.')
parser.add_argument('--global_config', type=str, nargs='?', help='the config file defining how the footprint will look like. (KLC)', default='../tools/global_config_files/config_KLCv3.0.yaml')
parser.add_argument('--params', type=str, nargs='?', help='the part definition file', default='./wuerth_wr_phd_bottom_entry.yaml')
args = parser.parse_args()

# Load configuration
with open(args.global_config, 'r') as config_stream:
try:
configuration = yaml.safe_load(config_stream)
except yaml.YAMLError as exc:
print(exc)

# Load yaml file for this library
with open(args.params, 'r') as params_stream:
try:
params = yaml.safe_load(params_stream)
except yaml.YAMLError as exc:
print(exc)

# Create each part
for series in params:
for mpn in params[series]['parts']:
generate_footprint(params[series], params[series]['parts'][mpn], mpn, configuration)
195 changes: 195 additions & 0 deletions scripts/Connector_Wuerth_WR-PHD/wuerth_wr_phd_bottom_entry.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,195 @@
standard:
series_prefix: WR-PHD
type: Standard
orientation: Vertical
pitch: 2.54
width: 5.08
height: 5.0
top: 1.52
pads:
diameter: 1.3
drill: 1
holes:
offset: 1.27
drill: 1.2
parts:
61300425721:
datasheet: https://katalog.we-online.de/em/datasheet/61300425721.pdf
rows: 2
pins: 4
61300625721:
datasheet: https://katalog.we-online.de/em/datasheet/61300625721.pdf
rows: 2
pins: 6
61300825721:
datasheet: https://katalog.we-online.de/em/datasheet/61300825721.pdf
rows: 2
pins: 8
61301025721:
datasheet: https://katalog.we-online.de/em/datasheet/61301025721.pdf
rows: 2
pins: 10
61301225721:
datasheet: https://katalog.we-online.de/em/datasheet/61301225721.pdf
rows: 2
pins: 12
61301625721:
datasheet: https://katalog.we-online.de/em/datasheet/61301625721.pdf
rows: 2
pins: 16
61302025721:
datasheet: https://katalog.we-online.de/em/datasheet/61302025721.pdf
rows: 2
pins: 20
61302425721:
datasheet: https://katalog.we-online.de/em/datasheet/61302425721.pdf
rows: 2
pins: 24
61302625721:
datasheet: https://katalog.we-online.de/em/datasheet/61302625721.pdf
rows: 2
pins: 26
61303225721:
datasheet: https://katalog.we-online.de/em/datasheet/61303225721.pdf
rows: 2
pins: 32
61303425721:
datasheet: https://katalog.we-online.de/em/datasheet/61303425721.pdf
rows: 2
pins: 34

large:
series_prefix: WR-PHD
type: Large
orientation: Vertical
pitch: 2.54
width: 5.08
height: 5.0
top: 1.52
pads:
diameter: 1.7
drill: 1
holes:
offset: 2.54
drill: 1.2
parts:
613004216921:
datasheet: https://katalog.we-online.de/em/datasheet/613004216921.pdf
rows: 2
pins: 4
613006216921:
datasheet: https://katalog.we-online.de/em/datasheet/613006216921.pdf
rows: 2
pins: 6
613008216921:
datasheet: https://katalog.we-online.de/em/datasheet/613008216921.pdf
rows: 2
pins: 8
613010216921:
datasheet: https://katalog.we-online.de/em/datasheet/613010216921.pdf
rows: 2
pins: 10
613012216921:
datasheet: https://katalog.we-online.de/em/datasheet/613012216921.pdf
rows: 2
pins: 12
613016216921:
datasheet: https://katalog.we-online.de/em/datasheet/613016216921.pdf
rows: 2
pins: 16
613018216921:
datasheet: https://katalog.we-online.de/em/datasheet/613018216921.pdf
rows: 2
pins: 18
613020216921:
datasheet: https://katalog.we-online.de/em/datasheet/613020216921.pdf
rows: 2
pins: 20
613022216921:
datasheet: https://katalog.we-online.de/em/datasheet/613022216921.pdf
rows: 2
pins: 22
613024216921:
datasheet: https://katalog.we-online.de/em/datasheet/613024216921.pdf
rows: 2
pins: 24
613026216921:
datasheet: https://katalog.we-online.de/em/datasheet/613026216921.pdf
rows: 2
pins: 26
613032216921:
datasheet: https://katalog.we-online.de/em/datasheet/613032216921.pdf
rows: 2
pins: 32
613034216921:
datasheet: https://katalog.we-online.de/em/datasheet/613034216921.pdf
rows: 2
pins: 34

smd:
series_prefix: WR-PHD
type: SMD
orientation: Vertical
pitch: 2.54
width: 5.0
height: 3.7
top: 1.27
pads:
x: 1.8
y: 0.9
holes:
offset: 1.93
drill: 1.1
parts:
610004243021:
datasheet: https://katalog.we-online.de/em/datasheet/610004243021.pdf
rows: 2
pins: 4
610006243021:
datasheet: https://katalog.we-online.de/em/datasheet/610006243021.pdf
rows: 2
pins: 6
610008243021:
datasheet: https://katalog.we-online.de/em/datasheet/610008243021.pdf
rows: 2
pins: 8
610010243021:
datasheet: https://katalog.we-online.de/em/datasheet/610010243021.pdf
rows: 2
pins: 10
610012243021:
datasheet: https://katalog.we-online.de/em/datasheet/610012243021.pdf
rows: 2
pins: 12
610016243021:
datasheet: https://katalog.we-online.de/em/datasheet/610016243021.pdf
rows: 2
pins: 16
610018243021:
datasheet: https://katalog.we-online.de/em/datasheet/610018243021.pdf
rows: 2
pins: 18
610020243021:
datasheet: https://katalog.we-online.de/em/datasheet/610020243021.pdf
rows: 2
pins: 20
610022243021:
datasheet: https://katalog.we-online.de/em/datasheet/610022243021.pdf
rows: 2
pins: 22
610024243021:
datasheet: https://katalog.we-online.de/em/datasheet/610024243021.pdf
rows: 2
pins: 24
610026243021:
datasheet: https://katalog.we-online.de/em/datasheet/610026243021.pdf
rows: 2
pins: 26
610032243021:
datasheet: https://katalog.we-online.de/em/datasheet/610032243021.pdf
rows: 2
pins: 32
610034243021:
datasheet: https://katalog.we-online.de/em/datasheet/610034243021.pdf
rows: 2
pins: 34