e5440bc4ed3c235404cf3ef91afc714d26ab8f81
[hw/altusmetrum] / packages / NHD-C12864LZ.py
1 #!/usr/bin/python3
2 # Copyright 2022 by Keith Packard <keithp@keithp.com>.  GPLv3
3 #
4 # Program to emit PCB footprint for NHD-C12864LZ-FSW-FBW-3V3 graphic LCD
5 #
6
7 # dimensions in mm from NHD_C12864LZ-FSW-FBW-3V3.pdf datasheet
8 BodyWidth = 77.4
9 BodyHeight = 52.4
10 PinDiam = 0.7
11 RingDiam = 1.1
12 PinSpacing = 1.27
13 PinOffset = 1.05
14 Pins = 28
15
16 ViewWidth = 66.52
17 ViewHeight = 33.24
18 ViewHCtr = BodyHeight / 2 - (33.24 / 2 + 6.08)
19
20 # centered pair of holes for alignment pins
21 MntWidth = 72.40
22 MntOffset = 3
23 MntDiam = 1.6
24
25 # contacts for LED backlight
26 BLWidth = 60.0
27 BLDiam = 1.9    # a 1.9 x 1.0 slot is called for
28 BLOffset = 3.79
29
30 import sys
31
32 # we're going to use the 1/100 of a mil fundamental unit form
33 def mm2mils100( mm ):
34         return int( mm / 25.4 * 1000.0 * 100.0 + 0.5 )
35
36 print('# author: Keith Packard')
37 print('# email: keithp@keithp.com')
38 print('# dist-license: GPL 3')
39 print('# use-license: unlimited')
40
41 print('Element[0x0 "NHD-C12864LZ" "" "" 0 0 0 0 0 100 0x0]')
42 print("(")
43
44 # pins
45         # pin( x y thickness clearance mask drillhole name number flags)
46 for pin in range (0,Pins):
47     if pin == Pins - 1:
48         Flags = '0x0101'
49     else:
50         Flags = '0x0001'
51
52     print('   Pin[',\
53         mm2mils100((13.5 - pin)*PinSpacing), \
54         mm2mils100(-BodyHeight/2+PinOffset), \
55         mm2mils100(RingDiam), \
56         1200, \
57         mm2mils100(RingDiam) + 500, \
58         mm2mils100(PinDiam), \
59         '"pin%i"' % (Pins-pin), '"%i"' % (Pins-pin), Flags, ']')
60
61 print('   ElementLine[',\
62         -mm2mils100(BodyWidth/2), \
63         -mm2mils100(BodyHeight/2), \
64         mm2mils100(BodyWidth/2), \
65         -mm2mils100(BodyHeight/2), \
66         500, \
67         ']')
68 print('   ElementLine[',\
69         -mm2mils100(BodyWidth/2), \
70         -mm2mils100(BodyHeight/2), \
71         -mm2mils100(BodyWidth/2), \
72         mm2mils100(BodyHeight/2), \
73         500, \
74         ']')
75 print('   ElementLine[',\
76         -mm2mils100(BodyWidth/2), \
77         mm2mils100(BodyHeight/2), \
78         mm2mils100(BodyWidth/2), \
79         mm2mils100(BodyHeight/2), \
80         500, \
81         ']')
82 print('   ElementLine[',\
83         mm2mils100(BodyWidth/2), \
84         mm2mils100(BodyHeight/2), \
85         mm2mils100(BodyWidth/2), \
86         -mm2mils100(BodyHeight/2), \
87         500, \
88         ']')
89
90 # mark viewable area
91
92 print('   ElementLine[',\
93         mm2mils100(-ViewWidth/2), \
94         mm2mils100(ViewHCtr + ViewHeight/2), \
95         mm2mils100(ViewWidth/2), \
96         mm2mils100(ViewHCtr + ViewHeight/2), \
97         500, \
98         ']')
99
100 print('   ElementLine[',\
101         mm2mils100(-ViewWidth/2), \
102         mm2mils100(ViewHCtr - ViewHeight/2), \
103         mm2mils100(ViewWidth/2), \
104         mm2mils100(ViewHCtr - ViewHeight/2), \
105         500, \
106         ']')
107
108 print('   ElementLine[',\
109         mm2mils100(-ViewWidth/2), \
110         mm2mils100(ViewHCtr - ViewHeight/2), \
111         mm2mils100(-ViewWidth/2), \
112         mm2mils100(ViewHCtr + ViewHeight/2), \
113         500, \
114         ']')
115
116 print('   ElementLine[',\
117         mm2mils100(ViewWidth/2), \
118         mm2mils100(ViewHCtr - ViewHeight/2), \
119         mm2mils100(ViewWidth/2), \
120         mm2mils100(ViewHCtr + ViewHeight/2), \
121         500, \
122         ']')
123
124 print('   ElementLine[',\
125         mm2mils100(ViewWidth/2), \
126         mm2mils100(ViewHCtr - ViewHeight/2), \
127         mm2mils100(-ViewWidth/2), \
128         mm2mils100(ViewHCtr + ViewHeight/2), \
129         500, \
130         ']')
131
132 print('   ElementLine[',\
133         mm2mils100(-ViewWidth/2), \
134         mm2mils100(ViewHCtr - ViewHeight/2), \
135         mm2mils100(ViewWidth/2), \
136         mm2mils100(ViewHCtr + ViewHeight/2), \
137         500, \
138         ']')
139
140 # holes for alignment pins
141 print('   Pin[',\
142         mm2mils100(MntWidth/2), \
143         mm2mils100(-BodyHeight / 2 + MntOffset), \
144         mm2mils100(MntDiam * 1.75), \
145         1200, \
146         mm2mils100(MntDiam * 1.75) + 600, \
147         mm2mils100(MntDiam), \
148         '"G"', '"G"', '0x0001', ']')
149
150 print('   Pin[',\
151         mm2mils100(-MntWidth/2), \
152         mm2mils100(-BodyHeight / 2 + MntOffset), \
153         mm2mils100(MntDiam * 1.75), \
154         1200, \
155         mm2mils100(MntDiam * 1.75) + 600, \
156         mm2mils100(MntDiam), \
157         '"G"', '"G"', '0x0001', ']')
158
159 # backlight pins
160 print('   Pin[',\
161         mm2mils100(-BLWidth/2), \
162         mm2mils100(-BodyHeight/2+BLOffset), \
163         mm2mils100(BLDiam * 1.75), \
164         1200, \
165         mm2mils100(BLDiam * 1.75) + 600, \
166         mm2mils100(BLDiam), \
167         '"K"', '"K"', '0x0001', ']')
168
169 print('   Pin[',\
170         mm2mils100(BLWidth/2), \
171         mm2mils100(-BodyHeight/2+BLOffset), \
172         mm2mils100(BLDiam * 1.75), \
173         1200, \
174         mm2mils100(BLDiam * 1.75) + 600, \
175         mm2mils100(BLDiam), \
176         '"A"', '"A"', '0x0001', ']')
177
178 print(")")