2 # Copyright 2013 by Bdale Garbee <bdale@gag.com>. GPLv2
4 # Program to emit PCB footprint for U-Blox MAX-6 GPS receiver
7 # dimensions in mm fromL
8 # LEA-6_NEO-6_MAX-6_HardwareIntegrationManual_(GPS.G6-HW-09007).pdf
11 BodyWidth = 12.5 # physical is 9.7, 12.5 includes paste
17 RowCenters = 9.7 - (1.0 - 0.8)
18 RowSpacing = RowCenters - PinHeight
20 PasteTongueWidthDelta = 0.2
22 PasteHeight = (12.5 - 9.7) / 2
23 #PasteHeight = 0.8 # not quite what the manual says
27 # we're going to use the 1/100 of a mil fundamental unit form
29 return int( mm / 25.4 * 1000.0 * 100.0 + 0.5 )
31 print '# author: Bdale Garbee'
32 print '# email: bdale@gag.com'
33 print '# dist-license: GPL 2'
34 print '# use-license: unlimited'
36 print 'Element[0x0 "UBLOX-MAX" "" "" 0 0 -10161 -12011 0 100 0x0]'
38 # first, lay down the copper but with no paste mask defined
39 for pin in range (0,9):
40 if (pin == 0) or (pin == 8):
41 PinWidth = CornerPinWidth
43 PinWidth = MainPinWidth
45 mm2mils100((pin-4) * PinSpacing), \
46 mm2mils100(-(RowSpacing/2 + PinWidth/2)), \
47 mm2mils100((pin-4) * PinSpacing), \
48 mm2mils100(-(RowSpacing/2 + PinHeight - PinWidth/2)), \
49 mm2mils100(PinWidth), \
50 mm2mils100(PinSpacing - PinWidth), \
51 mm2mils100(PinWidth)+600, \
52 '"pin%i"' % (18 - pin), '"%i"' % (18 - pin), '"square,nopaste"]'
55 mm2mils100((pin-4) * PinSpacing), \
56 mm2mils100(RowSpacing/2 + PinWidth/2), \
57 mm2mils100((pin-4) * PinSpacing), \
58 mm2mils100(RowSpacing/2 + PinHeight - PinWidth/2), \
59 mm2mils100(PinWidth), \
60 mm2mils100(PinSpacing - PinWidth), \
61 mm2mils100(PinWidth)+600, \
62 '"pin%i"' % (1 + pin), '"%i"' % (1 + pin), '"square,nopaste"]'
64 # now define the paste mask, which needs two rectangles per pad in T-shape
65 # the first rectangle is full pin height but narrower
66 for pin in range (0,9):
67 if (pin == 0) or (pin == 8):
68 PinWidth = CornerPinWidth - PasteTongueWidthDelta
70 PinWidth = MainPinWidth - PasteTongueWidthDelta
72 mm2mils100((pin-4) * PinSpacing), \
73 mm2mils100(-(RowSpacing/2 + PinWidth/2)), \
74 mm2mils100((pin-4) * PinSpacing), \
75 mm2mils100(-(RowSpacing/2 + PinHeight - PinWidth/2)), \
76 mm2mils100(PinWidth), \
77 mm2mils100(PinSpacing - PinWidth), \
78 mm2mils100(PinWidth)+600, \
79 '"pin%i"' % (18 - pin), '"%i"' % (18 - pin), '"square"]'
82 mm2mils100((pin-4) * PinSpacing), \
83 mm2mils100(RowSpacing/2 + PinWidth/2), \
84 mm2mils100((pin-4) * PinSpacing), \
85 mm2mils100(RowSpacing/2 + PinHeight - PinWidth/2), \
86 mm2mils100(PinWidth), \
87 mm2mils100(PinSpacing - PinWidth), \
88 mm2mils100(PinWidth)+600, \
89 '"pin%i"' % (1 + pin), '"%i"' % (1 + pin), '"square"]'
91 # the second rectangle is partial height but full width
92 for pin in range (0,9):
93 if (pin == 0) or (pin == 8):
94 PinWidth = CornerPinWidth
96 PinWidth = MainPinWidth
98 mm2mils100((pin-4) * PinSpacing), \
99 mm2mils100(-(PasteRowSpacing/2 + PinWidth/2)), \
100 mm2mils100((pin-4) * PinSpacing), \
101 mm2mils100(-(PasteRowSpacing/2 + PasteHeight - PinWidth/2)), \
102 mm2mils100(PinWidth), \
103 mm2mils100(PinSpacing - PinWidth), \
104 mm2mils100(PinWidth)+600, \
105 '"pin%i"' % (18 - pin), '"%i"' % (18 - pin), '"square"]'
108 mm2mils100((pin-4) * PinSpacing), \
109 mm2mils100(PasteRowSpacing/2 + PinWidth/2), \
110 mm2mils100((pin-4) * PinSpacing), \
111 mm2mils100(PasteRowSpacing/2 + PasteHeight - PinWidth/2), \
112 mm2mils100(PinWidth), \
113 mm2mils100(PinSpacing - PinWidth), \
114 mm2mils100(PinWidth)+600, \
115 '"pin%i"' % (1 + pin), '"%i"' % (1 + pin), '"square"]'
118 print ' ElementLine[',\
119 mm2mils100(-BodyHeight/2), \
120 mm2mils100(-BodyWidth/2), \
121 mm2mils100(-BodyHeight/2), \
122 mm2mils100( BodyWidth/2), \
125 print ' ElementLine[',\
126 mm2mils100(-BodyHeight/2), \
127 mm2mils100( BodyWidth/2), \
128 mm2mils100( BodyHeight/2), \
129 mm2mils100( BodyWidth/2), \
132 print ' ElementLine[',\
133 mm2mils100( BodyHeight/2), \
134 mm2mils100( BodyWidth/2), \
135 mm2mils100( BodyHeight/2), \
136 mm2mils100(-BodyWidth/2), \
139 print ' ElementLine[',\
140 mm2mils100( BodyHeight/2), \
141 mm2mils100(-BodyWidth/2), \
142 mm2mils100(-BodyHeight/2), \
143 mm2mils100(-BodyWidth/2), \
146 print ' ElementArc[',\
147 mm2mils100(-4 * PinSpacing), \
148 mm2mils100(RowSpacing/2-PinHeight/2), \
149 '500 500 0 360 1000 ]'