Select Git revision
servo-stepper-1.ko
-
Sam Calisch authoredSam Calisch authored
servo-stepper-1.ko 13.75 KiB
from koko.lib.sam import *
from koko.lib.pcb import *
from koko.lib.shapes2d import *
class TagConnectPDI(Component):
'''
'''
_pad = s2d.circle(0,0,.5*.031)
_via = s2d.circle(0,0,.5*.039)
pins = [
Pin(-.05,-.025,_pad,'CLK',label_size=.02),
Pin( .00,-.025,_pad,'NC',label_size=.02),
Pin( .05,-.025,_pad,'DAT',label_size=.02),
Pin(-.05,.025,_pad,'VCC',label_size=.02),
Pin( .00,.025,_pad,'NC',label_size=.02),
Pin( .05,.025,_pad,'GND',label_size=.02)
]
vias = [
Via(-.1,0,_via),
Via(.1,0.04,_via),
Via(.1,-.04,_via),
]
class Pheonix_WTB(Component):
_pad = rectangle(-.4*1.4/25.4,.4*1.4/25.4, -.5*3.4/25.4,.5*3.4/25.4)
_pad_big = chamfered_rectangle(-1.15/25.4,1.15/25.4,-2.8/25.4,2.8/25.4,.01)
pins = [
Pin(-1.5*2.5/25.4, -6.6/25.4,_pad,'1'),
Pin(- .5*2.5/25.4, -6.6/25.4,_pad,'2'),
Pin( .5*2.5/25.4, -6.6/25.4,_pad,'3'),
Pin( 1.5*2.5/25.4, -6.6/25.4,_pad,'4'),
Pin( -12.7/25.4/2, 0, _pad_big),
Pin( 12.7/25.4/2, 0, _pad_big),
]
vias = []
shadow = rectangle(-6/25.4,6/25.4,-8.3/25.4,2.8/25.4)
class Regulator_SOT23(Component):
''' LM3480 100-mA, 3.3V
'''
_pad_SOT23 = s2d.rectangle(-.02,.02,-.012,.012)
pins = [
Pin(-0.045, -0.0375, _pad_SOT23,'IN'),
Pin(-0.045, 0.0375, _pad_SOT23,'OUT'),
Pin(0.045, 0, _pad_SOT23,'GND')
]
prefix = 'U'
vias = []
class AS5047D(Component):
_pad_TSSOP = rectangle(-.7/25.4,.7/25.4, -.2/25.4,.2/25.4)
hw = 5.55/25.4/2
pitch = .65/25.4
pins = [
Pin(-hw, 3*pitch,_pad_TSSOP,'CSn',label_size=.02),
Pin(-hw, 2*pitch,_pad_TSSOP,'CLK',label_size=.02),
Pin(-hw, 1*pitch,_pad_TSSOP,'MISO',label_size=.02),
Pin(-hw, 0*pitch,_pad_TSSOP,'MOSI',label_size=.02),
Pin(-hw,-1*pitch,_pad_TSSOP,'TEST',label_size=.02),
Pin(-hw,-2*pitch,_pad_TSSOP,'B',label_size=.02),
Pin(-hw,-3*pitch,_pad_TSSOP,'A',label_size=.02),
Pin( hw,-3*pitch,_pad_TSSOP,'W/PWM',label_size=.02),
Pin( hw,-2*pitch,_pad_TSSOP,'V',label_size=.02),
Pin( hw,-1*pitch,_pad_TSSOP,'U',label_size=.02),
Pin( hw, 0*pitch,_pad_TSSOP,'VDD',label_size=.02),
Pin( hw, 1*pitch,_pad_TSSOP,'VDD3V',label_size=.02),
Pin( hw, 2*pitch,_pad_TSSOP,'GND',label_size=.02),
Pin( hw, 3*pitch,_pad_TSSOP,'I/PWM',label_size=.02),
]
vias = []
prefix='IC'
shadow = s2d.rectangle(-2.25/25.4,2.25/25.4, -2.95/25.4,2.95/25.4)
class AS5047D_FLIP(Component):
_pad_TSSOP = rectangle(-.9/25.4,.9/25.4, -.2/25.4,.2/25.4)
hw = 5.55/25.4/2
pitch = .65/25.4
pins = [
Pin( hw, 3*pitch,_pad_TSSOP,'CSn',label_size=.02),
Pin( hw, 2*pitch,_pad_TSSOP,'CLK',label_size=.02),
Pin( hw, 1*pitch,_pad_TSSOP,'MISO',label_size=.02),
Pin( hw, 0*pitch,_pad_TSSOP,'MOSI',label_size=.02),
Pin( hw,-1*pitch,_pad_TSSOP,'TEST',label_size=.02),
Pin( hw,-2*pitch,_pad_TSSOP,'B',label_size=.02),
Pin( hw,-3*pitch,_pad_TSSOP,'A',label_size=.02),
Pin(-hw,-3*pitch,_pad_TSSOP,'W/PWM',label_size=.02),
Pin(-hw,-2*pitch,_pad_TSSOP,'V',label_size=.02),
Pin(-hw,-1*pitch,_pad_TSSOP,'U',label_size=.02),
Pin(-hw, 0*pitch,_pad_TSSOP,'VDD',label_size=.02),
Pin(-hw, 1*pitch,_pad_TSSOP,'VDD3V',label_size=.02),
Pin(-hw, 2*pitch,_pad_TSSOP,'GND',label_size=.02),
Pin(-hw, 3*pitch,_pad_TSSOP,'I/PWM',label_size=.02),
]
vias = [ Via(0,0, dogboned_rectangle( -2.75/25.4,2.75/25.4, -2.95/25.4,2.95/25.4, .017 ) ) ]
prefix='IC'
shadow = s2d.rectangle(-2.25/25.4,2.25/25.4, -2.95/25.4,2.95/25.4)
class Header_FTDI(Component):
''' For ftdi cable
'''
_pad_header = chamfered_rectangle(-0.06, 0.06, -0.025, 0.025,.007)
pins = [
#Pin(0, 0.25, _pad_header, 'RTS'),
Pin(0, 0.15, _pad_header, 'RX'),
Pin(0, 0.05, _pad_header, 'TX'),
Pin(0, -0.05, _pad_header, 'VCC'),
Pin(0, -0.15, _pad_header, 'CTS'),
Pin(0, -0.25, _pad_header, 'GND'),
]
prefix = 'J'
vias = []
shadow = s2d.rectangle(-.06,8/25.4,-.28,.18)
class Header_Stepper(Component):
''' For bipolar stepper
'''
_pad_header = chamfered_rectangle(-0.06, 0.06, -0.025, 0.025,.007)
pins = [
Pin(0, -0.15, _pad_header, 'A1'),
Pin(0, -0.05, _pad_header, 'A2'),
Pin(0, 0.05, _pad_header, 'B1'),
Pin(0, 0.15, _pad_header, 'B2'),
]
prefix = 'J'
vias = []
shadow = s2d.rectangle(-.06,8/25.4,-.18,.18)
class ATxmega16A4U(Component):
_padh = chamfered_rectangle(-.024,.024,-.007,.007,.003)
_padv = chamfered_rectangle(-.007,.007,-.024,.024,.003)
c= 11/25.4/2.
d = 0.8/25.4
names = [
'PA5','PA6','PA7','PB0','PB1','PB2','PB3','GND','VCC','PC0','PC1',
'PC2','PC3','PC4','PC5','PC6','PC7','GND2','VCC2','PD0','PD1','PD2',
'PD3','PD4','PD5','PD6','PD7','PE0','PE1','GND3','VCC3','PE2','PE3',
'PDI/DATA','RST/CLK','PR0','PR1','GND4','AVCC','PA0','PA1','PA2','PA3','PA4'
]
n_side = 11
pins = [Pin(-c,(5-i)*d,_padh,n,label_size=.025) for i,n in enumerate(names[:n_side])]
pins += [Pin((-5+i)*d,-c,_padv,n,label_size=.025,label_rot=-90) for i,n in enumerate(names[n_side:2*n_side])]
pins += [Pin(c,(-5+i)*d,_padh,n,label_size=.025) for i,n in enumerate(names[2*n_side:3*n_side])]
pins += [Pin((5-i)*d,c,_padv,n,label_size=.025,label_rot=-90) for i,n in enumerate(names[3*n_side:])]
vias = []
shadow = rectangle(-c+d,c-d,-c+d,c-d)
_pad_SOIC = s2d.rectangle(-.041,.041,-.015,.015)
class A4950(Component):
_pad_SOIC = chamfered_rectangle(-.041,.041,-.015,.015,.008)
pins = [
Pin(-.11, .075,_pad_SOIC,"GND"),
Pin(-.11, .025,_pad_SOIC,"IN2"),
Pin(-.11,-.025,_pad_SOIC,"IN1"),
Pin(-.11,-.075,_pad_SOIC,"VREF"),
Pin( .11,-.075,_pad_SOIC,"VBB"),
Pin( .11,-.025,_pad_SOIC,"OUT1"),
Pin( .11, .025,_pad_SOIC,"LSS"),
Pin( .11, .075,_pad_SOIC,"OUT2"),
Pin( 0,0,s2d.rectangle(-.04,.04,-.075,.075),"")
]
prefix = 'U'
vias = []
class BarrelJackSMD(Component):
pw = 2.8/25.4
ph = 2.4/25.4
_pad = chamfered_rectangle(-.5*pw,.5*pw,-.5*ph,.5*ph,.01)
_via = s2d.circle(0,0,.065)
pins = [
Pin(.192,.177+.5*ph,_pad,'V'),
Pin(.437,.177+.5*ph,_pad,'V2'),
Pin(.192,-.177-.5*ph,_pad,'GND'),
Pin(.437,-.177-.5*ph,_pad,'GND2'),
]
vias = [Via(.197,0,s2d.circle(0,0,.5*.065)),
Via(.374,0,s2d.circle(0,0,.5*.073))]
shadow = s2d.rectangle(0,.58,-.18,.18)
class Header_Female_R_SMD(Component):
_pad = s2d.rectangle(-.045,.045,-.03,.03)
pins = [Pin(-.178,0,_pad),Pin(.178,0,_pad)]
shadow = s2d.rectangle(-.178,.178,-.05,.05)
vias = []
class R_2010(Component):
_pad_2010 = s2d.rectangle(-0.032, 0.032, -0.045, 0.045)
''' 2010 Resistor
'''
pins = [Pin(-0.096, 0, _pad_2010), Pin(0.096, 0, _pad_2010)]
prefix = 'R'
vias = []
class R_2512(Component):
_pad_2010 = s2d.rectangle(-0.032, 0.032, -0.0625, 0.0625)
''' 2010 Resistor
'''
pins = [Pin(-0.125, 0, _pad_2010), Pin(0.125, 0, _pad_2010)]
prefix = 'R'
vias = []
class M3_Hole(Component):
pins = [Pin(0,0,circle(0,0,.001))]
prefix='V'
vias = [Via(0,0,circle(0,0,1.55/25.4))]
shadow = circle(0,0,5.5/25.4/2)
width = 42.3/25.4
height = 42.3/25.4
mid = width/2.
pcb = PCB(0,0,width,height,chamfer_distance=.12)
hole = M3_Hole(mid-15.5/25.4, mid-15.5/25.4)
pcb += hole
hole = M3_Hole(mid+15.5/25.4, mid-15.5/25.4)
pcb += hole
hole = M3_Hole(mid-15.5/25.4, mid+15.5/25.4)
pcb += hole
hole = M3_Hole(mid+15.5/25.4, mid+15.5/25.4)
pcb += hole
def connectG(pin,dx,dy,width=.014,pts=[]):
'''
Convenience function for connecting to ground plane
'''
sides = [0 for p in pts]+[0,1,1]
pts = [pin] + pts + [[pin.x+dx,pin.y+dy],[pin.x+dx-.0001,pin.y+dy]]
pcb.connectD(*pts,width=width,sides=sides)
def connectGf(pin,dx,dy,width=.014,pts=[]):
sides = [1,0] + [0 for p in pts]+ [1]
pts = [[pin.x+dx,pin.y+dy],[pin.x+dx-.0001,pin.y+dy]] + pts + [pin]
pcb.connectD(*pts,width=width,sides=sides)
def connectS(pin,dx,dy,width=.014):
pcb.connectD(pin,[pin.x+dx+.0001,pin.y+dy],width=width)
def connectM(pin1,pin2,dx,width=.014):
pcb.connectD(pin1,[pin1.x+dx,pin1.y],pin2,width=width)
xmega = ATxmega16A4U(1.26,mid-.01,-90,'Xmega\n16A4U')
pcb += xmega
pdi = TagConnectPDI(width-.16,xmega.y-.33,-90-45)
pcb += pdi
pcb.connectD(pdi['DAT'],[pdi['DAT'].x,pdi['DAT'].y+.08],xmega['PDI/DATA'])
C1 = C_0805(xmega.x-.03,xmega.y-.5,90,'C1\n1uF',label_size=.03)
C2 = C_0805(C1.x-.06,C1.y,90,'C2\n.1uF',label_size=.03)
R1 = R_0805(xmega['RST/CLK'].x+.11,xmega['RST/CLK'].y-.04,0,'R1 10k',label_size=.03)
pcb += R1
F1 = R_0805( xmega['AVCC'].x+.11,xmega['AVCC'].y+.02,0,'ferrite',label_size=.03)
pcb += F1
CA = C_0805( xmega['GND4'].x+.11, xmega['GND4'].y-.02, 0, 'CA .1 uF', label_size=.03)
pcb += CA
connectG(CA[1],.01,-.045)
pcb.connectD(xmega['VCC3'],[xmega['VCC3'].x,xmega['VCC3'].y+.03],xmega['VCC'],width=.014)
pcb.connectD(R1[1],xmega['RST/CLK'],width=.014)
pcb.connectH(xmega['AVCC'],F1[1],width=.014)
pcb.connectD(R1[1],pdi['CLK'],width=.014)
pcb.connectH(xmega['GND4'],CA[1],width=.014)
pcb.connectD(pdi['VCC'],[pdi['VCC'].x+.03,pdi['VCC'].y],F1[0])
pcb.connectD(xmega['VCC2'],[xmega['VCC'].x-.05,xmega['VCC2'].y],xmega['VCC'],width=.014)
pcb.connectD(xmega['GND4'],[xmega['GND4'].x-.2,xmega['GND4'].y],xmega['GND'],width=.014)
ftdi = Header_FTDI(1.14,.18,-90,'ftdi')
pcb += ftdi
reg = Regulator_SOT23(ftdi.x-.13,ftdi['GND'].y+.19,0,'3.3v',label_size=.04)
pcb += reg
pow = BarrelJackSMD(.6,-.1,90,'12V')
pcb += pow
pcb.connectD(reg['IN'],[reg['IN'].x+.04,reg['IN'].y],ftdi['VCC'],width=.02)
pcb.connectH(reg['GND'],[ftdi['GND'].x-.02,ftdi['GND'].y],ftdi['GND'])
C_in = C_0805(reg.x-.07,reg.y-.08,0,'.1 uF',label_size=.03)
pcb += C_in
C_out = C_0805(C_in.x,C_in.y+.16,0,'.1 uF',label_size=.03)
pcb += C_out
pcb.connectD(C_in[1],pow['GND2'])
pcb.connectD(C_in[0],reg['IN'])
pcb.connectD(C_out[1],pow['GND2'])
pcb.connectH(C_out[0],reg['OUT'])
C_out_bulk = C_0805(reg.x+.08,reg.y+.02,90,'10\nuF',label_size=.03)
pcb += C_out_bulk
pcb.connectD(xmega['PE3'],[xmega['PE3'].x,xmega['PE3'].y-.08],ftdi['RX'],width=.014)
pcb.connectD(xmega['PE2'],[xmega['PE2'].x,xmega['PE3'].y-.06],ftdi['TX'],width=.014)
pcb.connectD(xmega['VCC3'],[xmega['VCC3'].x,xmega['VCC3'].y-.05],reg['OUT'],width=.014)
pcb.connectD(xmega['GND3'],[xmega['GND3'].x,xmega['GND3'].y-.03],[C_out[1].x,C_out[1].y+.07],C_out[1])
pcb.connectH(reg['OUT'],[ftdi['TX'].x-.05,.08],R1[0]).cut_corners([(3,.1)])
enc = AS5047D_FLIP(.5*width,.5*height,0,'AMS\n5047D')
pcb += enc
pcb.connectD(xmega['PC4'],[enc['CSn'].x+.06,xmega['PC4'].y],enc['CSn'],width=.014)
pcb.connectD(xmega['PC7'],[enc['MOSI'].x+.06,xmega['PC7'].y],enc['MOSI'],width=.014)
pcb.connectD(xmega['PC6'],[enc['MISO'].x+.06,xmega['PC6'].y],enc['MISO'],width=.014)
pcb.connectD(xmega['PC5'],[enc['CLK'].x+.06,xmega['PC5'].y],enc['CLK'],width=.014)
pcb.connectD(xmega['GND2'],[enc['TEST'].x+.06,xmega['GND2'].y],enc['TEST'],width=.014)
#connectG(xmega['GND2'],-.06,-.09,pts=[[xmega['GND2'].x-.05,xmega['GND2'].y],[xmega['GND2'].x-.05,xmega['GND2'].y-.09]])
pcb.connectV(xmega['GND2'],[xmega['GND2'].x-.045,xmega['GND2'].y],[C_out[1].x,C_out[1].y+.07],C_out[1],width=.014)
#step = Header_Stepper(mid-.3,height-.15,90,'step')
step = Pheonix_WTB(.11,height-.63,90,'step')
pcb += step
h1 = A4950(step.x+.5,step.y+.05,180,'h1')
pcb += h1
RS1 = R_2512(h1.x+.1,h1.y+.52,0, '50mOhm') #2W
#Rs1 = R_1206(h1.x+.25,h1.y-.1,90, '50mOhm',label_size=.04) #1W
pcb += RS1
pcb.connectV(h1['OUT2'],step['1'],width=.025)
pcb.connectV(h1['OUT1'],step['2'],width=.025)
pcb.connectV(h1['GND'],h1[0],width=.025)
pcb.connectD(h1['VREF'],[h1['VREF'].x,h1['VREF'].y-.04],[xmega['PC1'].x-.06,xmega['PC1'].y],[xmega['VCC'].x,xmega['VCC'].y-.05],xmega['VCC'],width=.014)
pcb.connectD(h1['IN1'],[h1['IN1'].x,h1['IN1'].y-.05],[xmega['PC2'].x-.05,xmega['PC2'].y+.02],xmega['PC2'],width=.014)
pcb.connectD(h1['IN2'],[h1['IN2'].x,h1['IN2'].y-.05],[xmega['PC3'].x-.08,xmega['PC3'].y+.02],xmega['PC3'],width=.014)
pcb.connectV(h1['LSS'],RS1[1],width=.025)
h2 = A4950(h1.x,h1.y+.2,180,'h2')
#h2 = A4950(h1.x+.21,h1.y,90,'h2')
pcb += h2
RS2 = R_2512(h2.x+.1,h2.y+.38,0, '50mOhm') #2W
#Rs2 = R_1206(h2.x+.25,h2.y-.1,90, '50mOhm',label_size=.04) #1W
pcb += RS2
pcb.connectV(h2['OUT2'],step['3'],width=.025)
pcb.connectV(h2['OUT1'],step['4'],width=.025)
#pcb.connectV(h2['VBB'],h2[0],width=.025)
pcb.connectV(h2['GND'],h2[0],width=.025)
pcb.connectD(h2['VREF'],[xmega['VCC'].x-.03,h2['VREF'].y-.03],xmega['VCC'],width=.014)
pcb.connectD(h2['IN1'],[h2['IN1'].x,h2['IN1'].y-.04],[xmega['PC0'].x-.01,xmega['PC0'].y+.07],xmega['PC0'],width=.014)
pcb.connectD(h2['IN2'],[h2['IN2'].x,h2['IN2'].y-.05],[xmega['PC1'].x,xmega['PC1'].y+.03],xmega['PC1'],width=.014)
pcb.connectV(h2['LSS'],RS2[1],width=.025)
R1A = R_1206(xmega['PA7'].x-.06,xmega['PA7'].y+.1,0,'R1A 10k',label_size=.03)
pcb += R1A
R2A = R_1206(R1A.x+.18,R1A.y,0,'R2A 10k',label_size=.03)
pcb += R2A
pcb.connectV(xmega['PA7'],R1A[0],width=.014)
pcb.connectV(xmega['PB3'],R1A[1],width=.014)
R1B = R_1206(R1A.x,R1A.y+.1,0,'R1B 10k',label_size=.03)
pcb += R1B
R2B = R_1206(R1B.x+.18,R1B.y,0,'R2B 10k',label_size=.03)
pcb += R2B
pcb.connectV(xmega['PA4'],R1B[0],width=.014)
pcb.connectV(xmega['PB3'],R1B[1],width=.014)
pcb.connectV(R2B[0],R2A[0])
connectG(R2A[0],.08,0)
R3A = R_1206(R1B.x-.15,R1B.y+.15,-90,'R3A 2k',label_size=.03)
pcb += R3A
R3B = R_1206(R3A.x+.12,R3A.y+.07,-90,'R3B 2k',label_size=.03)
pcb += R3B
pcb.connectH(R3A[0],[R1A[0].x-.06,R1A[0].y],R1A[0]).cut_corners([(1,.03)])
pcb.connectD(R3B[0],[R1B[0].x-.0,R1B[0].y],R1B[0])
cad.shapes = pcb.layout
#cad.shape = pcb.traces+(pcb.cutout-pcb.cutout)
#cad.shape = pcb.traces_other_side+(pcb.cutout-pcb.cutout)
#cad.shape = pcb.cutout+(pcb.traces-pcb.traces)