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