Skip to content
Snippets Groups Projects
Select Git revision
  • a3170f0f5521d156e5cf4155026aee9b60f8a469
  • master default protected
2 results

servo-stepper-1.ko

Blame
  • 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)