112 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			112 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| #!/usr/bin/env python
 | |
| 
 | |
| # depends on kicad-skip (https://github.com/psychogenic/kicad-skip)
 | |
| 
 | |
| # tested with led:SK6805-EC15 (https://partdb.alfter.us/en/part/168/info#attachments)
 | |
| # should be adaptable to similar addressable LED footprints
 | |
| 
 | |
| # start with three symbols: the LED to use, and GND and +5V power symbols
 | |
| 
 | |
| from skip import Symbol, Schematic
 | |
| 
 | |
| array_width=48
 | |
| array_height=12
 | |
| basename=f"rgb-led-matrix-{array_width}x{array_height}"
 | |
| base_prefix="D"
 | |
| base_width=6 # this connects DOUT to DIN directly within each row
 | |
| base_height=8
 | |
| gndlabel="GND"
 | |
| pwrlabel="+5V"
 | |
| 
 | |
| gridOrigin = (18, 14)
 | |
| unitspace = 2.54
 | |
| 
 | |
| def units_to_mm(u:int):
 | |
|     return u*unitspace
 | |
| 
 | |
| def to_grid(xunits:int, yunits:int):
 | |
|     global unitspace, gridOrigin
 | |
|     return ( (gridOrigin[0]*unitspace)+(xunits*unitspace), 
 | |
|             (gridOrigin[1]*unitspace)+(yunits*unitspace))
 | |
|             
 | |
| def add_parts(basedOn:Symbol, width:int, height:int, start_ref_count:int=1):
 | |
|     dcount=start_ref_count
 | |
|     table=[]
 | |
|     for y in range(height):
 | |
|         row_leds=[]
 | |
|         for x in range(width):
 | |
|             new_part=basedOn.clone()
 | |
|             coords=to_grid(x*base_width, y*base_height)
 | |
|             new_part.move(coords[0], coords[1])
 | |
|             new_part.setAllReferences(f"{base_prefix}{dcount}")
 | |
|             row_leds.append(new_part)
 | |
|             dcount+=1
 | |
|         table.append(row_leds)
 | |
|     return table
 | |
|             
 | |
| def make_grid(sch:Schematic, basedOn:Symbol, width:int, height:int, start_ref_count:int=1):
 | |
|     for i in sch.symbol:
 | |
|         if i.Value.value==gndlabel:
 | |
|             gnd=i
 | |
|         if i.Value.value==pwrlabel:
 | |
|             pwr=i
 | |
|     grid=add_parts(basedOn, width, height, start_ref_count)
 | |
|     y=0
 | |
|     for row in grid:
 | |
|         x=0
 | |
|         for led in row:
 | |
|             if x==0:
 | |
|                 wire=sch.wire.new() # add a GND symbol and connect to it
 | |
|                 wire.start_at(led.pin.VSS)
 | |
|                 wire.delta_y=0
 | |
|                 wire.delta_x=-units_to_mm(base_width)
 | |
|                 sym=gnd.clone()
 | |
|                 sym.move(wire.end)
 | |
|             if x==array_width-1:
 | |
|                 wire=sch.wire.new() # add a +5V symbol and connect to it
 | |
|                 wire.start_at(led.pin.VDD)
 | |
|                 wire.delta_y=0
 | |
|                 wire.delta_x=units_to_mm(base_width)
 | |
|                 sym=pwr.clone()
 | |
|                 sym.move(wire.end)
 | |
|             if x==0 and y>0:
 | |
|                 lwire=sch.wire.new() # inter-row connect on left
 | |
|                 lwire.start_at(led.pin.DIN)
 | |
|                 lwire.delta_y=-units_to_mm(base_height/2)
 | |
|                 lwire.delta_x=0
 | |
|                 wire=sch.wire.new()
 | |
|                 wire.start_at(lwire.end)
 | |
|                 wire.delta_y=0
 | |
|                 wire.delta_x=units_to_mm(array_width*base_width)
 | |
|             if x==array_width-1 and y<array_height-1:
 | |
|                 rwire=sch.wire.new() # inter-row connect on right
 | |
|                 rwire.start_at(led.pin.DOUT)
 | |
|                 rwire.delta_y=units_to_mm(base_height/2)
 | |
|                 rwire.delta_x=0
 | |
|             if x<array_width-1:
 | |
|                 wire=sch.wire.new() # ground
 | |
|                 wire.start_at(led.pin.VSS)
 | |
|                 wire.delta_y=0
 | |
|                 wire.delta_x=units_to_mm(base_width)
 | |
|                 if x<array_width-2:
 | |
|                     junc=sch.junction.new()
 | |
|                     junc.move(wire.end.value[0],wire.end.value[1])
 | |
|                 wire=sch.wire.new() # power
 | |
|                 wire.start_at(led.pin.VDD)
 | |
|                 wire.delta_y=0
 | |
|                 wire.delta_x=units_to_mm(base_width)
 | |
|                 if x<array_width-2:
 | |
|                     junc=sch.junction.new()
 | |
|                     junc.move(wire.end.value[0],wire.end.value[1])
 | |
|             x+=1
 | |
|         y+=1
 | |
|     gnd.delete()
 | |
|     pwr.delete()
 | |
| 
 | |
| if __name__=="__main__":
 | |
|     sch=Schematic(f"{basename}.kicad_sch")
 | |
|     base_comp=sch.symbol.reference_startswith(base_prefix)[0]
 | |
|     make_grid(sch, base_comp, array_width, array_height, 1)
 | |
|     base_comp.delete()
 | |
|     sch.write(f"{basename}.kicad_sch")
 | |
|      |