from koko.lib.pcb import * from koko.lib.shapes import * from numpy import * class mounting_hole(Component): pins = [Pin(0,0,s2d.circle(0,0,1.8/25.4/2))] vias = [Via(0,0,s2d.circle(0,0,2.2/25.4/2))] class Header_dc_skinny(Component): ''' FTDI cable header ''' _pad_header_skinny = s2d.rectangle(-0.06, 0.06, -0.030, 0.030) pins = [ Pin(0, 0.25, _pad_header_skinny, 'MA'), Pin(0, 0.15, _pad_header_skinny, 'MB'), Pin(0, 0.05, _pad_header_skinny, 'ENGND'), Pin(0, -0.05, _pad_header_skinny, 'ENVCC'), Pin(0, -0.15, _pad_header_skinny, 'ENA'), Pin(0, -0.25, _pad_header_skinny, 'ENB') ] prefix = 'J' shadow = s2d.rectangle(-.06,8/25.4,-.325,.325) vias = [] class BarrelJack(Component): _pad = rectangle(-0.07, 0.07, -0.05, 0.05) _via = rectangle(-1.5/25.4,1.5/25.4,-.018,.018) shadow = rectangle(-4.5/25.4,4.5/25.4,0,13.2/25.4) pins = [ Pin(0,13.2/25.4,_pad,'V'), Pin(0, 7.4/25.4,_pad,'GND'), #Pin(4.4/25.4,10.8/25.4,rotate(_pad,90),'3') ] vias = [ Via(0,13.2/25.4,rectangle(-1.5/25.4,1.5/25.4,-.018,.018)), Via(0, 7.4/25.4,rectangle(-1./25.4,1./25.4,-.018,.018)), #Via(4.4/25.4,10.8/25.4,rotate(rectangle(-1./25.4,1./25.4,-.018,.018),90)) ] class RFD16N05LSM9A(Component): ''' Mosfet ''' pins = [ Pin(-.1, -0.145, rectangle(-.0325,.0325,-.075,.05),'G'), Pin( .1, -0.145, rectangle(-.0325,.0325,-.075,.05),'S'), Pin(0., .1675, rectangle(-.155,.155,-.11,.1675),'D') ] prefix = 'IC' vias = [] class AstarMicro(Component): ''' Polulo Astar micro ''' _pad = s2d.rectangle(-0.05, 0.05, -0.03, 0.03) _pad_isp = s2d.rectangle(-0.04, 0.04, -0.03, 0.03) _via = s2d.circle(0,0,.019) #flip names since through hole names = [ '9/A9/PWM','8/A8','7','6/A7/PWM','5/PWM','4/A6','3/PWM','2','1','0', 'VIN','GND','5V','3v3','RST','12/A11/PWM','11','10/A10/PWM','A1','A0'] isp_names = ['MISO','5V2','SCK','MOSI']#,'RST','GND'] w = .6 l = 1. wp = .5 lp = .9 ys = arange(.5*lp,-.5*lp-.001,-.1) pts = list(vstack(( dstack((.5*wp*ones_like(ys),ys))[0], dstack((-.5*wp*ones_like(ys),ys[::-1]))[0] ))) isp_pts = list(dstack(mgrid[.1:-.1:3j,-.45:-.35:2j]).reshape(-1,2)) pins = [Pin(p[0],p[1],_pad,n) for n,p in zip(names,pts)] pins += [Pin(p[0],p[1],_pad_isp,n) for n,p in zip(isp_names,isp_pts)] vias = [Via(p[0],p[1],_via) for n,p in zip(names+isp_names,pts+isp_pts)] shadow = rectangle(-.5*w,.5*w,-.5*l,.5*l) prefix = 'IC' class VNH5019(Component): #VNH5019 motor driver: http://www.pololu.com/product/1451 _pad = s2d.rectangle(-0.04, 0.04, -0.03, 0.03) _via = s2d.circle(0,0,.019) names = ['INA','ENA','PWM','CS','ENB','INB','VDD','GND','VOUT','GND2', 'OUTA2','OUTA','OUTB2','OUTB','SRC GND','SRC GND','VIN','VIN','VINO'] w = 1.4 h = .9 ys = arange(.5*h,-.5*h-.001,-.1) pts = dstack((.5*w*ones_like(ys),ys))[0] pts = vstack((pts, dstack((-.5*w*ones_like(ys[:-1]),ys[:-1]))[0] )) #pts = vstack(( dstack((-.5*w*ones_like(ys),ys))[0], #stack((.5*w*ones_like(ys[2:]),ys[:2:-1]))[0] )) pins = [Pin(p[0],p[1],_pad,n) for n,p in zip(names,pts)] vias = [Via(p[0],p[1],_via) for n,p in zip(names,pts)] shadow = rectangle(-.75,.75,-.55,.55) - circle(-.65,-.45,.043) - circle(.55,.45,.043) prefix = 'IC' class WIZ820(Component): _pad = s2d.rectangle(-0.04, 0.04, -0.03, 0.03) _via = s2d.circle(0,0,.019) names = ['GND','3V3','3V32','PWDN','nRST','MISO', 'nINT','nSS','SCLK','MOSI','GND2','GND3'] w = 20.3/25.4 h = .5 ys = arange(.5*h,-.5*h-.001,-.1) pts = dstack((-.5*w*ones_like(ys),ys))[0] pts = vstack((pts, dstack((.5*w*ones_like(ys),ys))[0][::-1] )) pins = [Pin(p[0],p[1],_pad,n) for n,p in zip(names,pts)] vias = [Via(p[0],p[1],_via) for n,p in zip(names,pts)] w = 23/25.4 h = 25/25.4 os = (6.4-5.8)/25.4 shadow = rectangle(-.5*w,.5*w,-.5*h+os,.5*h+os) prefix = 'IC' width = 1.92 height = 2.08 pcb = PCB(0,0,width,height,chamfer_distance=.1) #power = ScrewTerminal(.13,.35,90,'12-15V') power = BarrelJack(.17,-.0,0,'12-15V') power.pins[1].name='GND' power.pins[0].name='V' pcb += power reg = ZLDO1117(power.x+.02,power.y+.77,0,'3.3V') pcb += reg pcb.connectH(power[0],[power.x-.12,reg['GND'].y],reg['GND'],width=.04) pcb.connectH(power[1],reg['Vin'],width=.04) dc = VNH5019(power.x+.94,.57,0,'dc\nmotor') pcb += dc for i in [11,13,15,17,18]: pcb.connectV(dc[i],dc[i+1],width=.06) pcb.connectV(power['V'],dc['VIN'],width=.07) pcb.connectV(power['GND'],[dc['SRC GND'].x+.1,dc['VIN'].y-.3],dc[16],width=.06) astar = AstarMicro(dc.x+.28,dc.y+.92,-90,'astar\nmicro\n32u4') pcb += astar wiz = WIZ820(.38,astar.y+.09,90,'wiz820') pcb += wiz pcb.connectV(wiz['MISO'],astar['MISO'],width=.03).cut_corners([(1,.1)]) pcb.connectV(wiz['MOSI'],[astar['MOSI'].x,astar['MOSI'].y+.1],astar['MOSI']) pcb.connectV(wiz['SCLK'],astar['SCK'],width=.03).add_jumper([wiz['SCLK'].x,astar['MOSI'].y+.1],90) pcb.connectV(wiz['GND'],wiz['GND2'],width=.04) pcb.connectV(wiz['GND'],wiz['GND3'],width=.04) pcb.connectH(wiz['GND'],[reg.x-.14,reg['GND'].y],reg['GND'],width=.04) pcb.connectV(wiz['3V3'],reg['Vout2'],width=.05) pcb.connectV(wiz['3V3'],wiz['3V32'],width=.05) pcb.connectV(wiz['nRST'],[astar['0'].x,astar['0'].y-.2],astar['0'],width=.03).cut_corners([(1,.05),(3,.05)]).add_jumper([astar['0'].x-.12,wiz['nRST'].y-.14],0) pcb.connectH(wiz['nSS'],[wiz['nSS'].x,astar.y+.15],astar['10/A10/PWM'],width=.025).cut_corners([(1,.25)]) power2 = ScrewTerminal(astar['VIN'].x+.08,astar.y+.42,0,'12-15V') pcb += power2 pcb.connectV(astar['GND'],power2[0],width=.03) pcb.connectH(wiz['GND2'],[wiz['GND2'].x,wiz['GND2'].y+.08],power2[0],width=.03).cut_corners([(1,.05),(3,.08)]) #pcb.connectH(wiz['GND'],[reg.x-.1,reg.y],reg['GND']) pcb.connectV(power2[1],astar['VIN'],width=.04) #pcb.connectV(astar['GND'],[wiz['GND2'].x,wiz['GND2'].y-.08],wiz['GND2']) dc_out = Header_dc_skinny(dc.x-.25,dc.y-.35,90,'motor') pcb += dc_out pcb.connectV(dc_out['MA'],dc['OUTB'],width=.06) pcb.connectV(dc_out['MB'],dc['OUTA'],width=.06) pcb.connectV(dc_out['ENGND'],[power.x,.08],power['GND'],width=.05).cut_corners([(2,.05)]) pcb.connectV(dc_out['ENGND'],[dc['GND2'].x,.08],dc['GND2'],width=.05).cut_corners([(2,.05)]) #pcb.connectH(dc_out['ENVCC'],[dc_out['ENVCC'].x,astar['1'].y-.15],astar['1'],width=.03).cut_corners([(1,.19)]) #pcb.connectH(dc['GND'],[dc.x+.08,dc.y-.15],dc_out['ENGND']).cut_corners([(1,.1),(4,.1)]) pcb.connectH(dc['GND'],[dc['GND2'].x-.1,dc['GND2'].y],dc['GND2'],width=.05) pcb.connectH(dc_out['ENA'],[dc_out['ENA'].x,astar['2'].y-.15],astar['1'],width=.03).cut_corners([(1,.03)]).add_jumper([dc_out['ENA'].x,dc['VDD'].y],90) pcb.connectH(dc_out['ENB'],[dc_out['ENB'].x,astar['2'].y-.15],astar['2'],width=.03).cut_corners([(1,.03)]).add_jumper([dc_out['ENB'].x,dc['VDD'].y],90) pcb.connectV(astar['3/PWM'],dc['INB'],width=.028).cut_corners([(1,.4)]) pcb.connectV(astar['4/A6'],dc['CS'],width=.03).cut_corners([(1,.3)]) pcb.connectV(astar['5/PWM'],dc['PWM'],width=.03).cut_corners([(1,.2)]) pcb.connectV(astar['7'],dc['INA'],width=.03).cut_corners([(1,.1)]) #pcb.connectH(dc['VDD'],[dc['VDD'].x+.1,astar['5V2'].y],astar['5V2'],width=.03).cut_corners([(2,.05)]) ##pcb.connectH(dc['VDD'],[dc['VDD'].x+.1,dc.y-.52],dc_out['ENVCC'],width=.03).cut_corners([(2,.05),(4,.05)]) pcb.connectV(dc_out['ENVCC'],dc['VDD']) pcb.connectV(dc_out['ENVCC'],[astar['0'].x-.12,dc.y+.35],[astar['5V2'].x,astar['1'].y+.08],astar['5V2']).cut_corners([(1,.085),(4,.07)]) R1 = R_1206(astar['A1'].x-.15,astar['A1'].y+.12,0,'R1 NTC') pcb += R1 R2 = R_1206(astar['A1'].x-.15,astar['A1'].y+.22,0,'R2 10k') pcb += R2 pcb.connectH(R1[1],astar['GND'],width=.04) pcb.connectH(R2[1],astar['GND'],width=.04) R3 = R_1206(astar['A0'].x,astar['A1'].y-.18,90,'R3\n10k') pcb += R3 R4 = R_1206(astar['A1'].x,astar['A1'].y-.18,90,'R4\n10k') pcb += R4 pcb.connectV(R3[1],astar['5V2'],width=.04) pcb.connectV(R4[1],astar['5V2'],width=.04) pcb.connectV(R3[0],astar['A0'],width=.03) pcb.connectV(R4[0],astar['A1'],width=.03) pcb.connectV(astar['A0'],R2[0],width=.03).cut_corners([(1,.1)]) pcb.connectV(astar['A1'],R1[0],width=.03).cut_corners([(1,.05)]) #pcb += mounting_hole(width-.15,height-.15) #pcb += mounting_hole(.25,.1) cad.shapes = pcb.layout #cad.shape = pcb.traces+(pcb.cutout-pcb.cutout) #cad.shape = pcb.cutout