Skip to content
Snippets Groups Projects
pcb.py 242 KiB
Newer Older
Neil Gershenfeld (test)'s avatar
Neil Gershenfeld (test) committed
         elif (angle == 180):
            self.holes = rotate_180(self.holes)
         elif ((angle == 270) | (angle == -90)):
            self.holes = rotate_270(self.holes)
         elif (angle != 0):
            self.holes = rotate(self.holes,angle)
Neil Gershenfeld (test)'s avatar
Neil Gershenfeld (test) committed
         self.holes = translate(self.holes,x,y,z)
Neil Gershenfeld (test)'s avatar
Neil Gershenfeld (test) committed
      if hasattr(self,'cutout'):
         if (angle == 90):
            self.cutout = rotate_90(self.cutout)
         elif (angle == 180):
            self.cutout = rotate_180(self.cutout)
         elif ((angle == 270) | (angle == -90)):
            self.cutout = rotate_270(self.cutout)
         elif (angle != 0):
            self.cutout = rotate(self.cutout,angle)
         self.cutout = translate(self.cutout,x,y,z)
Neil Gershenfeld (test)'s avatar
Neil Gershenfeld (test) committed
      deg_angle = angle
      angle = math.pi*angle/180
Neil Gershenfeld (test)'s avatar
wip
Neil Gershenfeld (test) committed
      for i in range(len(self.pad)):
         xnew = math.cos(angle)*self.pad[i].x - math.sin(angle)*self.pad[i].y
         ynew = math.sin(angle)*self.pad[i].x + math.cos(angle)*self.pad[i].y
         self.pad[i].x = x + xnew
         self.pad[i].y = y + ynew
         self.pad[i].z += z
      pcb.labels = add(pcb.labels,text(self.value,x,y,z,line=line,color=Green).shape)
      for i in range(len(self.labels)):
         xnew = math.cos(angle)*self.labels[i].x - math.sin(angle)*self.labels[i].y
         ynew = math.sin(angle)*self.labels[i].x + math.cos(angle)*self.labels[i].y
         self.labels[i].x = x + xnew
         self.labels[i].y = y + ynew
         self.labels[i].z += z
         if ((-90 < deg_angle) & (deg_angle <= 90)):
            pcb.labels = add(pcb.labels,text(self.labels[i].text,self.labels[i].x,self.labels[i].y,self.labels[i].z,self.labels[i].line,color=Red,angle=deg_angle-self.labels[i].angle).shape)
         else:
            pcb.labels = add(pcb.labels,text(self.labels[i].text,self.labels[i].x,self.labels[i].y,self.labels[i].z,self.labels[i].line,color=Red,angle=(deg_angle-self.labels[i].angle-180)).shape)
      pcb = pcb.add(self.shape)
Neil Gershenfeld (test)'s avatar
Neil Gershenfeld (test) committed
      if hasattr(self,'holes'):
         pcb.holes = add(pcb.holes,self.holes)
Neil Gershenfeld (test)'s avatar
Neil Gershenfeld (test) committed
      if hasattr(self,'cutout'):
         pcb.interior = subtract(pcb.interior,self.cutout)
         pcb.exterior = add(pcb.exterior,self.cutout)
Neil Gershenfeld (test)'s avatar
wip
Neil Gershenfeld (test) committed
      return pcb

Neil Gershenfeld (test)'s avatar
Neil Gershenfeld (test) committed
def wire(pcb,width,*points):
   x0 = points[0].x
   y0 = points[0].y
   z0 = points[0].z
   pcb.board = add(pcb.board,cylinder(x0,y0,z0,z0,width/2))
Neil Gershenfeld (test)'s avatar
wip
Neil Gershenfeld (test) committed
   for i in range(1,len(points)):
      x0 = points[i-1].x
      y0 = points[i-1].y
      z0 = points[i-1].z
      x1 = points[i].x
      y1 = points[i].y
      z1 = points[i].z
Neil Gershenfeld (test)'s avatar
Neil Gershenfeld (test) committed
      pcb.board = add(pcb.board,line(x0,y0,x1,y1,z1,width))
      pcb.board = add(pcb.board,cylinder(x1,y1,z1,z1,width/2))
Neil Gershenfeld (test)'s avatar
wip
Neil Gershenfeld (test) committed
   return pcb

Neil Gershenfeld (test)'s avatar
Neil Gershenfeld (test) committed
def wirer(pcb,width,*points):
Neil Gershenfeld (test)'s avatar
Neil Gershenfeld (test) committed
   for i in range(1,len(points)):
      x0 = points[i-1].x
      y0 = points[i-1].y
      z0 = points[i-1].z
      x1 = points[i].x
      y1 = points[i].y
      z1 = points[i].z
Neil Gershenfeld (test)'s avatar
Neil Gershenfeld (test) committed
      if (x0 < x1):
         pcb.board = add(pcb.board,cube(x0-width/2,x1+width/2,y0-width/2,y0+width/2,z0,z0))
      elif (x1 < x0):
         pcb.board = add(pcb.board,cube(x1-width/2,x0+width/2,y0-width/2,y0+width/2,z0,z0))
      if (y0 < y1):
         pcb.board = add(pcb.board,cube(x1-width/2,x1+width/2,y0-width/2,y1+width/2,z0,z0))
      elif (y1 < y0):
         pcb.board = add(pcb.board,cube(x1-width/2,x1+width/2,y1-width/2,y0+width/2,z0,z0))
Neil Gershenfeld (test)'s avatar
Neil Gershenfeld (test) committed
   return pcb

Neil Gershenfeld (test)'s avatar
wip
Neil Gershenfeld (test) committed
#
# PCB library
#

Neil Gershenfeld (test)'s avatar
Neil Gershenfeld (test) committed
class via(part):
   #
   # via
   #
   def __init__(self,zb,zt,rv,rp,value=''):
      self.value = value
      self.labels = []
      self.pad = [point(0,0,0)]
      self.shape = cylinder(0,0,zb,zt,rp)
      self.holes = cylinder(0,0,zb,zt,rv)
      self.pad.append(point(0,0,zt))
      self.pad.append(point(0,0,zb))

Neil Gershenfeld (test)'s avatar
Neil Gershenfeld (test) committed
class SJ(part):
   #
   # solder jumper
   #
   def __init__(self,value=''):
      pad_SJ = cube(-.02,.02,-.03,.03,0,0)
      self.value = value
      self.labels = []
      self.pad = [point(0,0,0)]
      self.shape = translate(pad_SJ,-.029,0,0)
      self.pad.append(point(-.029,0,0))
      self.shape = add(self.shape,translate(pad_SJ,.029,0,0))
      self.pad.append(point(.029,0,0))

Neil Gershenfeld (test)'s avatar
wip
Neil Gershenfeld (test) committed
#
# discretes
#

pad_0402 = cube(-.0175,.0175,-.014,.014,0,0)

class R_0402(part):
   #
   # 0402 resistor
   #
   def __init__(self,value=''):
      self.value = value
      self.labels = []
      self.pad = [point(0,0,0)]
      self.shape = translate(pad_0402,-.0265,0,0)
      self.pad.append(point(-.0265,0,0))
      self.shape = add(self.shape,translate(pad_0402,.0265,0,0))
      self.pad.append(point(.0265,0,0))

pad_1206 = cube(-.032,.032,-.034,.034,0,0)

class R_1206(part):
   #
   # 1206 resistor
   #
   def __init__(self,value=''):
      self.value = value
      self.labels = []
      self.pad = [point(0,0,0)]
      self.shape = translate(pad_1206,-.06,0,0)
      self.pad.append(point(-.06,0,0))
      self.shape = add(self.shape,translate(pad_1206,.06,0,0))
      self.pad.append(point(.06,0,0))

class C_1206(part):
   #
   # 1206 capacitor
   #
   def __init__(self,value=''):
      self.value = value
      self.labels = []
      self.pad = [point(0,0,0)]
      self.shape = translate(pad_1206,-.06,0,0)
      self.pad.append(point(-.06,0,0))
      self.shape = add(self.shape,translate(pad_1206,.06,0,0))
      self.pad.append(point(.06,0,0))

pad_1210 = cube(-.032,.032,-.048,.048,0,0)

class L_1210(part):
   #
   # 1210 inductor
   #
   def __init__(self,value=''):
      self.value = value
      self.labels = []
      self.pad = [point(0,0,0)]
      self.shape = translate(pad_1210,-.06,0,0)
      self.pad.append(point(-.06,0,0))
      self.shape = add(self.shape,translate(pad_1210,.06,0,0))
      self.pad.append(point(.06,0,0))

pad_choke = cube(-.06,.06,-.06,.06,0,0)

class choke(part):
   #
   # Panasonic ELLCTV
   #
   def __init__(self,value=''):
      self.value = value
      self.labels = []
      self.pad = [point(0,0,0)]
      self.shape = translate(pad_choke,-.177,-.177,0)
      self.pad.append(point(-.177,-.177,0))
      self.shape = add(self.shape,translate(pad_choke,.177,.177,0))
      self.pad.append(point(.177,.177,0))

#
# connectors
#

Neil Gershenfeld (test)'s avatar
Neil Gershenfeld (test) committed
class TFT8x1v(part):
   #
   # TFT 8x1 vertical
   #    2x Sullins S5635-ND
   #
   def __init__(self,value=''):
      pad_header = cube(-.079/2,.079/2,-.039/2,.039/2,0,0)
      d = .209/2-.079/2
      self.value = value
      self.pad = [point(0,0,0)]
      self.labels = []
      #
      # pin 1
      #
      self.shape = translate(pad_header,-d,-.35,0)
      self.pad.append(point(-d,-.35,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'1LED'))
      #
      # pin 2
      #
      self.shape = add(self.shape,translate(pad_header,d,-.25,0))
      self.pad.append(point(d,-.25,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'SCK'))
      #
      # pin 3
      #
      self.shape = add(self.shape,translate(pad_header,-d,-.15,0))
      self.pad.append(point(-d,-.15,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'MOSI'))
      #
      # pin 4
      #
      self.shape = add(self.shape,translate(pad_header,d,-.05,0))
      self.pad.append(point(d,-.05,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'DC'))
      #
      # pin 5
      #
      self.shape = add(self.shape,translate(pad_header,-d,.05,0))
      self.pad.append(point(-d,.05,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'RST'))
      #
      # pin 6
      #
      self.shape = add(self.shape,translate(pad_header,d,.15,0))
      self.pad.append(point(d,.15,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'CS'))
      #
      # pin 7
      #
      self.shape = add(self.shape,translate(pad_header,-d,.25,0))
      self.pad.append(point(-d,.25,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'GND'))
      #
      # pin 8
      #
      self.shape = add(self.shape,translate(pad_header,d,.35,0))
      self.pad.append(point(d,.35,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'VCC'))

Neil Gershenfeld (test)'s avatar
Neil Gershenfeld (test) committed
class header_SWD_4_05(part):
Neil Gershenfeld (test)'s avatar
Neil Gershenfeld (test) committed
   #
   # 4-pin header
Neil Gershenfeld (test)'s avatar
Neil Gershenfeld (test) committed
   # Sullins GRPB022VWQS-RC 2x2x0.05"
   #
   def __init__(self,value=''):
      pad_header = cube(-.043,.043,-.015,.015,0,0)
      self.value = value
      self.pad = [point(0,0,0)]
      self.labels = []
      #
      # pin 1
      #
      self.shape = translate(pad_header,-.072,.025,0)
      self.shape = add(self.shape,cylinder(-.116,.025,0,0,.015))
      self.pad.append(point(-.072,.025,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'CLK'))
      #
      # pin 2
      #
      self.shape = add(self.shape,translate(pad_header,.072,.025,0))
      self.pad.append(point(.072,.025,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'DIO'))
      #
      # pin 3
      #
      self.shape = add(self.shape,translate(pad_header,-.072,-.025,0))
      self.pad.append(point(-.072,-.025,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'RST'))
      #
      # pin 4
      #
      self.shape = add(self.shape,translate(pad_header,.072,-.025,0))
      self.pad.append(point(.072,-.025,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'GND'))

class header_SWD_4_1(part):
   #
   # 4-pin header
   # FCI 95278-101a04lf Bergstik 2x2x0.1"
Neil Gershenfeld (test)'s avatar
Neil Gershenfeld (test) committed
   #
   pad_header = cube(-.05,.05,-.025,.025,0,0)
   def __init__(self,value=''):
      self.value = value
      self.pad = [point(0,0,0)]
      self.labels = []
      #
      # pin 1
      #
      self.shape = translate(pad_header,-.107,.05,0)
      self.shape = add(self.shape,cylinder(-.157,.05,0,0,.025))
      self.pad.append(point(-.107,.05,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'CLK'))
      #
      # pin 2
      #
      self.shape = add(self.shape,translate(pad_header,.107,.05,0))
      self.pad.append(point(.107,.05,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'DIO'))
      #
      # pin 3
      #
      self.shape = add(self.shape,translate(pad_header,-.107,-.05,0))
      self.pad.append(point(-.107,-.05,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'RST'))
      #
      # pin 4
      #
      self.shape = add(self.shape,translate(pad_header,.107,-.05,0))
      self.pad.append(point(.107,-.05,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'GND'))

Neil Gershenfeld (test)'s avatar
Neil Gershenfeld (test) committed
class header_UPDI(part):
   #
   # UPDI header
   #    Sullins GEC36SBSN-M89	
   #
   def __init__(self,value=''):
      self.value = value
      self.pad = [point(0,0,0)]
      self.labels = []
      #
      # pin 1: UPDI
      #
      self.shape = translate(pad_header,0,-.05,0)
      self.shape = add(self.shape,cylinder(.05,-.05,0,0,.025))
      self.pad.append(point(0,-.05,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'UPDI'))
      #
      # pin 2: GND
      #
      self.shape = add(self.shape,translate(pad_header,0,.05,0))
      self.pad.append(point(0,.05,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'GND'))

class header_UPDI_reverse(part):
   #
   # UPDI header, reverse for female connector
   #    GCT BG300-03-A-L-A	
   #
   def __init__(self,value=''):
      self.value = value
      self.pad = [point(0,0,0)]
      self.labels = []
      #
      # pin 1: UPDI
      #
      self.shape = translate(pad_header,0,.05,0)
      self.shape = add(self.shape,cylinder(.05,.05,0,0,.025))
      self.pad.append(point(0,.05,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'UPDI'))
      #
      # pin 2: GND
      #
      self.shape = add(self.shape,translate(pad_header,0,-.05,0))
      self.pad.append(point(0,-.05,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'GND'))

Neil Gershenfeld (test)'s avatar
Neil Gershenfeld (test) committed
class USB_A_plug(part):
   #
   # USB type A PCB plug
   #
   def __init__(self,value=''):
      self.value = value
      self.pad = [point(0,0,0)]
      self.labels = []
      #
      # pin 1: 5V
      #
      self.shape = translate(cube(-.05,.242,-.02,.02,0,0),0,.138,0)
      self.pad.append(point(0,.138,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'5V'))
      #
      # pin 2: D-
      #
      self.shape = add(self.shape,translate(cube(-0.05,.202,-.02,.02,0,0),0,.039,0))
      self.pad.append(point(0,.039,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'D-'))
      #
      # pin 3: D+
      #
      self.shape = add(self.shape,translate(cube(-.05,.202,-.02,.02,0,0),0,-.039,0))
      self.pad.append(point(0,-.039,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'D+'))
      #
      # pin 4: GND
      #
      self.shape = add(self.shape,translate(cube(-.05,.242,-.02,.02,0,0),0,-.138,0))
      self.pad.append(point(0,-.138,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'GND'))
      #
      # plug cutout
      #
Neil Gershenfeld (test)'s avatar
Neil Gershenfeld (test) committed
      self.cutout = cube(-.05,1,.24,1,zb,zt)
      self.cutout = add(self.cutout,cube(-.05,1,-1,-.24,zb,zt))
Neil Gershenfeld (test)'s avatar
Neil Gershenfeld (test) committed

class header_SWD(part):
   #
   # Serial Wire Debug programming header
   # Amphenol 20021121-00010T1LF	2x5x0.05
   #
   def __init__(self,value=''):
      self.value = value
      self.pad = [point(0,0,0)]
      self.labels = []
      d = 0.077
      w = 0.015
      h = .047
      pad = cube(-h,h,-w,w,0,0)
      #
      # pin 1: VCC
      #
      self.shape = translate(pad,d,-.1,0)
      self.shape = add(self.shape,cylinder(d+h,-.1,0,0,w))
      self.pad.append(point(d,-.1,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'VCC'))
      #
      # pin 2: DIO
      #
      self.shape = add(self.shape,translate(pad,-d,-.1,0))
      self.pad.append(point(-d,-.1,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'DIO'))
      #
      # pin 3: GND
      #
      self.shape = add(self.shape,translate(pad,d,-.05,0))
      self.pad.append(point(d,-.05,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'GND'))
      #
      # pin 4: CLK
      #
      self.shape = add(self.shape,translate(pad,-d,-.05,0))
      self.pad.append(point(-d,-.05,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'CLK'))
      #
      # pin 5: GND
      #
      self.shape = add(self.shape,translate(pad,d,0,0))
      self.pad.append(point(d,0,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'GND'))
      #
      # pin 6: SWO
      #
      self.shape = add(self.shape,translate(pad,-d,0,0))
      self.pad.append(point(-d,0,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'SWO'))
      #
      # pin 7: KEY
      #
      self.shape = add(self.shape,translate(pad,d,.05,0))
      self.pad.append(point(d,.05,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'KEY'))
      #
      # pin 8: NC
      #
      self.shape = add(self.shape,translate(pad,-d,.05,0))
      self.pad.append(point(-d,.05,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'NC'))
      #
      # pin 9: GND
      #
      self.shape = add(self.shape,translate(pad,d,.1,0))
      self.pad.append(point(d,.1,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'GND'))
      #
      # pin 10: nRESET
      #
      self.shape = add(self.shape,translate(pad,-d,.1,0))
      self.pad.append(point(-d,.1,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'RST'))

Neil Gershenfeld (test)'s avatar
Neil Gershenfeld (test) committed
class ESC(part):
   #
   # ESC 3x1
   # Sullins S1013E-36-ND
   #
   def __init__(self,value=''):
      pad_header = cube(-.1,.1,-.05/2,.05/2,0,0)
      d = .075
      self.value = value
      self.pad = [point(0,0,0)]
      self.labels = []
      #
      # pin 1: PWM
      #
      self.shape = translate(pad_header,-d,-.1,0)
      self.pad.append(point(-d,-.1,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'PWM'))
      #
      # pin 2: 5V
      #
      self.shape = add(self.shape,translate(pad_header,d,0,0))
      self.pad.append(point(d,0,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'5V'))
      #
      # pin 3: GND 
      #
      self.shape = add(self.shape,translate(pad_header,-d,.1,0))
      self.pad.append(point(-d,.1,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'GND'))

Neil Gershenfeld (test)'s avatar
Neil Gershenfeld (test) committed
class I2C4x1h(part):
Neil Gershenfeld (test)'s avatar
Neil Gershenfeld (test) committed
   #
Neil Gershenfeld (test)'s avatar
Neil Gershenfeld (test) committed
   # I2C 4x1 horizontal female
   #    GCT BG300-03-A-L-A	
   #
   def __init__(self,value=''):
      self.value = value
      self.pad = [point(0,0,0)]
      self.labels = []
      #
      # pin 1: SCL
      #
      self.shape = translate(pad_header,0,-.15,0)
      #self.shape = cylinder(.05,.15,0,0,.025)
      self.pad.append(point(0,-.15,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'SCL'))
      #
      # pin 2: SDA
      #
      self.shape = add(self.shape,translate(pad_header,0,-.05,0))
      self.pad.append(point(0,-.05,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'SDA'))
      #
      # pin 3: VCC
      #
      self.shape = add(self.shape,translate(pad_header,0,.05,0))
      self.pad.append(point(0,.05,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'VCC'))
      #
      # pin 4: GND
      #
      self.shape = add(self.shape,translate(pad_header,0,.15,0))
      self.pad.append(point(0,.15,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'GND'))

class I2C4x1v(part):
   #
   # I2C 4x1 vertical
   #    Sullins S5635-ND
Neil Gershenfeld (test)'s avatar
Neil Gershenfeld (test) committed
   #
   def __init__(self,value=''):
      pad_header = cube(-.079/2,.079/2,-.039/2,.039/2,0,0)
      d = .209/2-.079/2
      self.value = value
      self.pad = [point(0,0,0)]
      self.labels = []
      #
      # pin 1: VCC
      #
      self.shape = translate(pad_header,-d,-.15,0)
      self.pad.append(point(-d,-.15,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'1VCC'))
      #
      # pin 2: GND
      #
      self.shape = add(self.shape,translate(pad_header,d,-.05,0))
      self.pad.append(point(d,-.05,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'GND'))
      #
      # pin 3: SCL
      #
      self.shape = add(self.shape,translate(pad_header,-d,.05,0))
      self.pad.append(point(-d,.05,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'SCL'))
      #
      # pin 4: SDA
      #
      self.shape = add(self.shape,translate(pad_header,d,.15,0))
      self.pad.append(point(d,.15,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'SDA'))

class I2C4x1i(part):
   #
   # I2C 4x1 inline
   #
   def __init__(self,value=''):
      pad_header = cube(-.079/2,.079/2,-.039/2,.039/2,0,0)
      d = 0
      self.value = value
      self.pad = [point(0,0,0)]
      self.labels = []
      #
      # pin 1: VCC
      #
      self.shape = translate(pad_header,-d,-.15,0)
      self.pad.append(point(-d,-.15,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'1VCC'))
      #
      # pin 2: GND
      #
      self.shape = add(self.shape,translate(pad_header,d,-.05,0))
      self.pad.append(point(d,-.05,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'GND'))
      #
      # pin 3: SCL
      #
      self.shape = add(self.shape,translate(pad_header,-d,.05,0))
      self.pad.append(point(-d,.05,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'SCL'))
      #
      # pin 4: SDA
      #
      self.shape = add(self.shape,translate(pad_header,d,.15,0))
      self.pad.append(point(d,.15,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'SDA'))

Neil Gershenfeld (test)'s avatar
Neil Gershenfeld (test) committed
class RCWL0516(part):
   #
   # RCWL-0516 Doppler radar
   #
   def __init__(self,value=''):
      pad_header = cube(-.065,.065,-.025,.025,0,0)
      self.value = value
      self.pad = [point(0,0,0)]
      self.labels = []
      #
      # pin 1: 3.3V
      #
      self.shape = translate(pad_header,.107,-.2,0)
      self.shape = add(self.shape,cylinder(.172,-.2,0,0,.025))
      self.pad.append(point(.107,-.2,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'3.3V'))
      #
      # pin 2: GND
      #
      self.shape = add(self.shape,translate(pad_header,-.107,-.1,0))
      self.pad.append(point(-.107,-.1,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'GND'))
      #
      # pin 3: OUT
      #
      self.shape = add(self.shape,translate(pad_header,.107,0,0))
      self.pad.append(point(.107,0,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'OUT'))
      #
      # pin 4: VIN
      #
      self.shape = add(self.shape,translate(pad_header,-.107,.1,0))
      self.pad.append(point(-.107,.1,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'VIN'))
      #
Neil Gershenfeld (test)'s avatar
Neil Gershenfeld (test) committed
      # pin 5: CDS
Neil Gershenfeld (test)'s avatar
Neil Gershenfeld (test) committed
      #
      self.shape = add(self.shape,translate(pad_header,.107,.2,0))
      self.pad.append(point(.107,.2,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'CDS'))

Neil Gershenfeld (test)'s avatar
Neil Gershenfeld (test) committed
class microSD(part):
   #
   # microSD
   # Amphenol 114-00841-68
   # 
   def __init__(self,value=''):
      self.value = value
      self.pad = [point(0,0,0)]
      self.labels = []
      #
      # pin 1
      #
      self.shape = translate(cube(-.0138,.0138,-.034,.034,0,0),-.177+7*.0433,-.304,0)
      self.pad.append(point(-.177+7*.0433,-.304,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'1NC',angle=90))
      #
      # pin 2
      #
      self.shape = add(self.shape,translate(cube(-.0138,.0138,-.034,.034,0,0),-.177+6*.0433,-.304,0))
      self.pad.append(point(-.177+6*.0433,-.304,0))
Neil Gershenfeld (test)'s avatar
Neil Gershenfeld (test) committed
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'SS',angle=90))
Neil Gershenfeld (test)'s avatar
Neil Gershenfeld (test) committed
      #
      # pin 3
      #
      self.shape = add(self.shape,translate(cube(-.0138,.0138,-.034,.034,0,0),-.177+5*.0433,-.304,0))
      self.pad.append(point(-.177+5*.0433,-.304,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'MOSI',angle=90))
      #
      # pin 4
      #
      self.shape = add(self.shape,translate(cube(-.0138,.0138,-.034,.034,0,0),-.177+4*.0433,-.304,0))
      self.pad.append(point(-.177+4*.0433,-.304,0))
Neil Gershenfeld (test)'s avatar
Neil Gershenfeld (test) committed
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'VCC',angle=90))
Neil Gershenfeld (test)'s avatar
Neil Gershenfeld (test) committed
      #
      # pin 5
      #
      self.shape = add(self.shape,translate(cube(-.0138,.0138,-.034,.034,0,0),-.177+3*.0433,-.304,0))
      self.pad.append(point(-.177+3*.0433,-.304,0))
Neil Gershenfeld (test)'s avatar
Neil Gershenfeld (test) committed
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'SCK',angle=90))
Neil Gershenfeld (test)'s avatar
Neil Gershenfeld (test) committed
      #
      # pin 6
      #
      self.shape = add(self.shape,translate(cube(-.0138,.0138,-.034,.034,0,0),-.177+2*.0433,-.304,0))
      self.pad.append(point(-.177+2*.0433,-.304,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'GND',angle=90))
      #
      # pin 7
      #
      self.shape = add(self.shape,translate(cube(-.0138,.0138,-.034,.034,0,0),-.177+1*.0433,-.304,0))
      self.pad.append(point(-.177+1*.0433,-.304,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'MISO',angle=90))
      #
      # pin 8
      #
      self.shape = add(self.shape,translate(cube(-.0138,.0138,-.034,.034,0,0),-.177+0*.0433,-.304,0))
      self.pad.append(point(-.177+0*.0433,-.304,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'NC',angle=90))
      #
      # feet
      #
      self.shape = add(self.shape,translate(cube(-.021,.021,-.029,.029,0,0),-.228,-.299,0)) # leave extra space for 1/64 milling
      self.shape = add(self.shape,translate(cube(-.029,.029,-.029,.029,0,0),.222,-.299,0))
      self.shape = add(self.shape,translate(cube(-.015,.015,-.029,.025,0,0),-.232,0,0)) # leave extra space for 1/64 milling
      self.shape = add(self.shape,translate(cube(-.015,.015,-.029,.029,0,0),-.232+.47,.025,0))
      self.shape = add(self.shape,translate(cube(-.028,.028,-.019,.019,0,0),-.221,.059,0))
      self.shape = add(self.shape,translate(cube(-.019,.019,-.030,.030,0,0),.222,.121,0))

Neil Gershenfeld (test)'s avatar
wip
Neil Gershenfeld (test) committed
pad_USB_trace = cube(-.0075,.0075,-.04,.04,0,0)
pad_USB_feet = cube(-.049,.049,-.043,.043,0,0)

class USB_mini_B(part):
   #
   # USB mini B
   # Hirose UX60-MB-5ST
   #
   def __init__(self,value=''):
      self.value = value
      self.pad = [point(0,0,0)]
      self.labels = []
      #
      # pin 1
      #
      self.shape = translate(pad_USB_trace,.063,.36,0)
      self.pad.append(point(.063,.36,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'G'))
      #
      # pin 2
      #
      self.shape = add(self.shape,translate(pad_USB_trace,.0315,.36,0))
      self.pad.append(point(.0315,.36,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,''))
      #
      # pin 3
      #
      self.shape = add(self.shape,translate(pad_USB_trace,0,.36,0))
      self.pad.append(point(0,.36,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'+'))
      #
      # pin 4
      #
      self.shape = add(self.shape,translate(pad_USB_trace,-.0315,.36,0))
      self.pad.append(point(-.0315,.36,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'-'))
      #
      # pin 5
      #
      self.shape = add(self.shape,translate(pad_USB_trace,-.063,.36,0))
      self.pad.append(point(-.063,.36,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'V'))
      #
      # feet
      #
      self.shape = add(self.shape,translate(pad_USB_feet,.165,.33,0))
      self.shape = add(self.shape,translate(pad_USB_feet,-.165,.33,0))
      self.shape = add(self.shape,translate(pad_USB_feet,.165,.12,0))
      self.shape = add(self.shape,translate(pad_USB_feet,-.165,.12,0))

pad_header = cube(-.05,.05,-.025,.025,0,0)

class header_4(part):
   #
   # 4-pin header
   # fci 95278-101a04lf bergstik 2x2x0.1"
   #
   def __init__(self,value=''):
      self.value = value
      self.pad = [point(0,0,0)]
      self.labels = []
      #
      # pin 1
      #
      self.shape = translate(pad_header,-.107,.05,0)
      self.shape = add(self.shape,cylinder(-.157,.05,0,0,.025))
      self.pad.append(point(-.107,.05,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'1'))
      #
      # pin 2
      #
      self.shape = add(self.shape,translate(pad_header,.107,.05,0))
      self.pad.append(point(.107,.05,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'2'))
      #
      # pin 3
      #
      self.shape = add(self.shape,translate(pad_header,-.107,-.05,0))
      self.pad.append(point(-.107,-.05,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'3'))
      #
      # pin 4
      #
      self.shape = add(self.shape,translate(pad_header,.107,-.05,0))
      self.pad.append(point(.107,-.05,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'4'))

class header_signal(part):
   #
   # signal header
   # FCI 95278-101A04LF Bergstik 2x2x0.1"
   #
   def __init__(self,value=''):
      self.value = value
      self.pad = [point(0,0,0)]
      self.labels = []
      #
      # pin 1: Gnd
      #
      self.shape = translate(pad_header,.107,-.05,0)
      self.shape = add(self.shape,cylinder(.157,-.05,0,0,.025))
      self.pad.append(point(.107,-.05,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'GND'))
      #
      # pin 2
      #
      self.shape = add(self.shape,translate(pad_header,-.107,-.05,0))
      self.pad.append(point(-.107,-.05,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,''))
      #
      # pin 3: signal
      #
      self.shape = add(self.shape,translate(pad_header,.107,.05,0))
      self.pad.append(point(.107,.05,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'signal'))
      #
      # pin 4:
      #
      self.shape = add(self.shape,translate(pad_header,-.107,.05,0))
      self.pad.append(point(-.107,.05,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,''))


class header_power(part):
   #
   # power header
   # FCI 95278-101A04LF Bergstik 2x2x0.1"
   #
   def __init__(self,value=''):
      self.value = value
      self.pad = [point(0,0,0)]
      self.labels = []
      #
      # pin 1: Gnd
      #
      self.shape = translate(pad_header,.107,-.05,0)
      self.shape = add(self.shape,cylinder(.157,-.05,0,0,.025))
      self.pad.append(point(.107,-.05,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'GND'))
      #
      # pin 2
      #
      self.shape = add(self.shape,translate(pad_header,-.107,-.05,0))
      self.pad.append(point(-.107,-.05,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,''))
      #
      # pin 3: V
      #
      self.shape = add(self.shape,translate(pad_header,.107,.05,0))
      self.pad.append(point(.107,.05,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'V'))
      #
      # pin 4:
      #
      self.shape = add(self.shape,translate(pad_header,-.107,.05,0))
      self.pad.append(point(-.107,.05,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,''))

class header_i0(part):
   #
   # i0 header
   # FCI 95278-101A04LF Bergstik 2x2x0.1"
   #
   def __init__(self,value=''):
      self.value = value
      self.pad = [point(0,0,0)]
      self.labels = []
      #
      # pin 1: Gnd
      #
      self.shape = translate(pad_header,.107,-.05,0)
      self.shape = add(self.shape,cylinder(.157,-.05,0,0,.025))
      self.pad.append(point(.107,-.05,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'GND'))
      #
      # pin 2: data
      #
      self.shape = add(self.shape,translate(pad_header,-.107,-.05,0))
      self.pad.append(point(-.107,-.05,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'data'))
      #
      # pin 3: V
      #
      self.shape = add(self.shape,translate(pad_header,.107,.05,0))
      self.pad.append(point(.107,.05,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'V'))
      #
      # pin 4:
      #
      self.shape = add(self.shape,translate(pad_header,-.107,.05,0))
      self.pad.append(point(-.107,.05,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,''))

class header_serial(part):
   #
   # serial comm header
   # FCI 95278-101A04LF Bergstik 2x2x0.1"
   #
   def __init__(self,value=''):
      self.value = value
      self.pad = [point(0,0,0)]
      self.labels = []
      #
      # pin 1: Gnd
      #
      self.shape = translate(pad_header,.107,-.05,0)
      self.shape = add(self.shape,cylinder(.157,-.05,0,0,.025))
      self.pad.append(point(.107,-.05,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'GND'))
      #
      # pin 2:DTR
      #
      self.shape = add(self.shape,translate(pad_header,-.107,-.05,0))
      self.pad.append(point(-.107,-.05,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'DTR'))
      #
      # pin 3: Tx
      #
      self.shape = add(self.shape,translate(pad_header,.107,.05,0))
      self.pad.append(point(.107,.05,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'Tx'))
      #
      # pin 4: Rx
      #
      self.shape = add(self.shape,translate(pad_header,-.107,.05,0))
      self.pad.append(point(-.107,.05,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'Rx'))

class header_bus(part):
   #
   # bus header
   # FCI 95278-101A04LF Bergstik 2x2x0.1"
   #
   def __init__(self,value=''):
      self.value = value
      self.pad = [point(0,0,0)]
      self.labels = []
      #
      # pin 1: Gnd
      #
      self.shape = translate(pad_header,.107,-.05,0)
      self.shape = add(self.shape,cylinder(.157,-.05,0,0,.025))
      self.pad.append(point(.107,-.05,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'GND'))
      #
      # pin 2: Tx
      #
      self.shape = add(self.shape,translate(pad_header,-.107,-.05,0))
      self.pad.append(point(-.107,-.05,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'Tx'))
      #
      # pin 3: V
      #
      self.shape = add(self.shape,translate(pad_header,.107,.05,0))
      self.pad.append(point(.107,.05,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'V'))
      #
      # pin 4: Rx
      #
      self.shape = add(self.shape,translate(pad_header,-.107,.05,0))
      self.pad.append(point(-.107,.05,0))
      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'Rx'))

class header_I2C(part):
   #
   # I2C header
   # FCI 95278-101A04LF Bergstik 2x2x0.1"
   #
   def __init__(self,value=''):
      self.value = value
      self.pad = [point(0,0,0)]
      self.labels = []
      #
      # pin 1: SCL
      #