This commit is contained in:
Martin Quarda 2025-04-28 10:38:56 +02:00
parent 80653dfe11
commit a6bde07d33
39 changed files with 0 additions and 124469 deletions

Binary file not shown.

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@ -1,29 +0,0 @@
Designator,Footprint,Quantity,Value,LCSC Part #
BZ1,Buzzer_12x9.5RM7.6,1,Buzzer,
"C1, C10, C11, C12, C17, C2, C4, C5, C6, C7, C8, C9",0805,12,100n,
"C13, C14",0805,2,1u,
"C15, C16",0805,2,12p,
C3,0805,1,10n,
D1,WSON-6-1EP_3x3mm_P0.95mm,1,TPD3E001DRSR,
"D10, D11, D12, D3, D4, D5, D6, D7, D8, D9",LED_WS2812B_PLCC4_5.0x5.0mm_P3.2mm,10,WS2812B,
D2,1206,1,LED,
J1,USB_C_Receptacle_HRO_TYPE-C-31-M-12,1,USB_C_Receptacle_USB2.0_16P,
J2,PinHeader_1x02_P2.54mm_Vertical,1,Conn_01x02,
"J3, J8, J9",PinHeader_1x03_P2.54mm_Vertical,3,Conn_01x03,
J4,PinHeader_1x06_P2.54mm_Vertical,1,Conn_01x06,
"J5, J6",PinHeader_1x04_P2.54mm_Vertical,2,Conn_01x04,
J7,PinHeader_2x05_P2.54mm_Vertical,1,Conn_02x05_Odd_Even,
JP1,SolderJumper-2_P1.3mm_Open_RoundedPad1.0x1.5mm,1,Jumper_2_Open,
"Q1, Q3",SOT-23,2,BSS123T-HF,
Q2,TSOP-6_1.65x3.05mm_P0.95mm,1,PMN30XPEAX,
"R1, R7",0805,2,5k1,
"R10, R11, R12, R13, R15, R2, R4, R8",0805,8,10k,
R14,0805,1,560R,
"R3, R9",0805,2,1k,
"R5, R6",0805,2,27R,
SW1,SW_Cherry_MX_1.00u_PCB,1,SW_Push,
"SW2, SW3",SW_SPST_TL3342,2,SW_Push,
U1,QFN-56-1EP_7x7mm_P0.4mm_EP3.2x3.2mm,1,RP2040,
U2,SOIC-8_5.23x5.23mm_P1.27mm,1,W25Q128JVS,
U3,SOT-23-5_HandSoldering,1,SP6205EM5-L-3-3,
Y1,Crystal_SMD_5032-2Pin_5.0x3.2mm,1,12MHz,
1 Designator Footprint Quantity Value LCSC Part #
2 BZ1 Buzzer_12x9.5RM7.6 1 Buzzer
3 C1, C10, C11, C12, C17, C2, C4, C5, C6, C7, C8, C9 0805 12 100n
4 C13, C14 0805 2 1u
5 C15, C16 0805 2 12p
6 C3 0805 1 10n
7 D1 WSON-6-1EP_3x3mm_P0.95mm 1 TPD3E001DRSR
8 D10, D11, D12, D3, D4, D5, D6, D7, D8, D9 LED_WS2812B_PLCC4_5.0x5.0mm_P3.2mm 10 WS2812B
9 D2 1206 1 LED
10 J1 USB_C_Receptacle_HRO_TYPE-C-31-M-12 1 USB_C_Receptacle_USB2.0_16P
11 J2 PinHeader_1x02_P2.54mm_Vertical 1 Conn_01x02
12 J3, J8, J9 PinHeader_1x03_P2.54mm_Vertical 3 Conn_01x03
13 J4 PinHeader_1x06_P2.54mm_Vertical 1 Conn_01x06
14 J5, J6 PinHeader_1x04_P2.54mm_Vertical 2 Conn_01x04
15 J7 PinHeader_2x05_P2.54mm_Vertical 1 Conn_02x05_Odd_Even
16 JP1 SolderJumper-2_P1.3mm_Open_RoundedPad1.0x1.5mm 1 Jumper_2_Open
17 Q1, Q3 SOT-23 2 BSS123T-HF
18 Q2 TSOP-6_1.65x3.05mm_P0.95mm 1 PMN30XPEAX
19 R1, R7 0805 2 5k1
20 R10, R11, R12, R13, R15, R2, R4, R8 0805 8 10k
21 R14 0805 1 560R
22 R3, R9 0805 2 1k
23 R5, R6 0805 2 27R
24 SW1 SW_Cherry_MX_1.00u_PCB 1 SW_Push
25 SW2, SW3 SW_SPST_TL3342 2 SW_Push
26 U1 QFN-56-1EP_7x7mm_P0.4mm_EP3.2x3.2mm 1 RP2040
27 U2 SOIC-8_5.23x5.23mm_P1.27mm 1 W25Q128JVS
28 U3 SOT-23-5_HandSoldering 1 SP6205EM5-L-3-3
29 Y1 Crystal_SMD_5032-2Pin_5.0x3.2mm 1 12MHz

View File

@ -1,66 +0,0 @@
BZ1:1
C1:1
C10:1
C11:1
C12:1
C13:1
C14:1
C15:1
C16:1
C17:1
C2:1
C3:1
C4:1
C5:1
C6:1
C7:1
C8:1
C9:1
D1:1
D10:1
D11:1
D12:1
D2:1
D3:1
D4:1
D5:1
D6:1
D7:1
D8:1
D9:1
J1:1
J2:1
J3:1
J4:1
J5:1
J6:1
J7:1
J8:1
J9:1
JP1:1
Q1:1
Q2:1
Q3:1
R1:1
R10:1
R11:1
R12:1
R13:1
R14:1
R15:1
R2:1
R3:1
R4:1
R5:1
R6:1
R7:1
R8:1
R9:1
REF**:1
SW1:1
SW2:1
SW3:1
U1:1
U2:1
U3:1
Y1:1
1 BZ1:1
2 C1:1
3 C10:1
4 C11:1
5 C12:1
6 C13:1
7 C14:1
8 C15:1
9 C16:1
10 C17:1
11 C2:1
12 C3:1
13 C4:1
14 C5:1
15 C6:1
16 C7:1
17 C8:1
18 C9:1
19 D1:1
20 D10:1
21 D11:1
22 D12:1
23 D2:1
24 D3:1
25 D4:1
26 D5:1
27 D6:1
28 D7:1
29 D8:1
30 D9:1
31 J1:1
32 J2:1
33 J3:1
34 J4:1
35 J5:1
36 J6:1
37 J7:1
38 J8:1
39 J9:1
40 JP1:1
41 Q1:1
42 Q2:1
43 Q3:1
44 R1:1
45 R10:1
46 R11:1
47 R12:1
48 R13:1
49 R14:1
50 R15:1
51 R2:1
52 R3:1
53 R4:1
54 R5:1
55 R6:1
56 R7:1
57 R8:1
58 R9:1
59 REF**:1
60 SW1:1
61 SW2:1
62 SW3:1
63 U1:1
64 U2:1
65 U3:1
66 Y1:1

View File

@ -1,353 +0,0 @@
P CODE 00
P UNITS CUST 0
P arrayDim N
317GND VIA MD0157PA00X+052283Y-035827X0315Y0000R000S3
317GND VIA MD0157PA00X+053701Y-035827X0315Y0000R000S3
317GND VIA MD0157PA00X+057323Y-029921X0315Y0000R000S3
317GND VIA MD0157PA00X+053307Y-034409X0315Y0000R000S3
317GND VIA MD0157PA00X+054252Y-033622X0315Y0000R000S3
317+1V1 VIA MD0157PA00X+056929Y-033701X0315Y0000R000S3
317GND VIA MD0157PA00X+054882Y-044173X0315Y0000R000S3
317GND VIA MD0157PA00X+055433Y-043071X0315Y0000R000S3
317GND VIA MD0157PA00X+061181Y-028425X0315Y0000R000S3
317NET-(D2-A) VIA MD0157PA00X+053189Y-037165X0315Y0000R000S3
317NET-(D2-A) VIA MD0157PA00X+050945Y-036772X0315Y0000R000S3
317VCC VIA MD0157PA00X+061496Y-037083X0315Y0000R000S3
317/RST VIA MD0157PA00X+061969Y-036142X0315Y0000R000S3
317/RST VIA MD0157PA00X+060295Y-041142X0315Y0000R000S3
317+BATT VIA MD0157PA00X+055433Y-046530X0315Y0000R000S3
317/BUZZ VIA MD0157PA00X+062205Y-042520X0315Y0000R000S3
317/NEOPIXEL VIA MD0157PA00X+062598Y-042205X0315Y0000R000S3
317/NEOPIXEL VIA MD0157PA00X+060020Y-048957X0315Y0000R000S3
317/TX VIA MD0157PA00X+066772Y-036540X0315Y0000R000S3
317/RX VIA MD0157PA00X+066494Y-036262X0315Y0000R000S3
317/NEOPIXEL VIA MD0157PA00X+066260Y-035933X0315Y0000R000S3
317/BUZZ VIA MD0157PA00X+065938Y-035706X0315Y0000R000S3
317/SDA VIA MD0157PA00X+065660Y-035428X0315Y0000R000S3
317/SCL VIA MD0157PA00X+065382Y-035149X0315Y0000R000S3
317NET-(D8-DOUT) VIA MD0157PA00X+063848Y-029490X0315Y0000R000S3
317/CHRG VIA MD0157PA00X+051260Y-042520X0315Y0000R000S3
317NET-(D10-DOUT) VIA MD0157PA00X+070080Y-041182X0315Y0000R000S3
317NET-(D10-DOUT) VIA MD0157PA00X+068456Y-041433X0315Y0000R000S3
317NET-(D10-DIN) VIA MD0157PA00X+067879Y-035476X0315Y0000R000S3
317NET-(D10-DIN) VIA MD0157PA00X+067795Y-033622X0315Y0000R000S3
317NET-(D8-DOUT) VIA MD0157PA00X+060079Y-028425X0315Y0000R000S3
317NET-(D7-DOUT) VIA MD0157PA00X+058031Y-029055X0315Y0000R000S3
317NET-(D7-DOUT) VIA MD0157PA00X+058094Y-029780X0315Y0000R000S3
317NET-(D5-DOUT) VIA MD0157PA00X+047638Y-038504X0315Y0000R000S3
317NET-(D5-DOUT) VIA MD0157PA00X+049632Y-037346X0315Y0000R000S3
317NET-(D4-DOUT) VIA MD0157PA00X+050709Y-045197X0315Y0000R000S3
317NET-(D4-DOUT) VIA MD0157PA00X+050235Y-043244X0315Y0000R000S3
317/BOOT VIA MD0157PA00X+052480Y-035118X0315Y0000R000S3
317NET-(C16-PAD1) VIA MD0157PA00X+063071Y-034961X0315Y0000R000S3
317NET-(U1-XIN) VIA MD0157PA00X+063071Y-033465X0315Y0000R000S3
317VCC VIA MD0157PA00X+054252Y-032677X0315Y0000R000S3
317T-(U1-QSPI_SS) VIA MD0157PA00X+054488Y-030157X0315Y0000R000S3
317T-(U1-QSPI_SS) VIA MD0157PA00X+055669Y-030157X0315Y0000R000S3
317-(U1-QSPI_SD1) VIA MD0157PA00X+054961Y-030433X0315Y0000R000S3
317-(U1-QSPI_SD1) VIA MD0157PA00X+055948Y-030436X0315Y0000R000S3
317GND VIA MD0157PA00X+049741Y-038789X0315Y0000R000S3
317+5V VIA MD0157PA00X+049909Y-038433X0315Y0000R000S3
317NET-(D1-IO2) VIA MD0157PA00X+050000Y-039134X0315Y0000R000S3
317NET-(D1-IO1) VIA MD0157PA00X+050000Y-039606X0315Y0000R000S3
317VCC VIA MD0157PA00X+058031Y-032913X0315Y0000R000S3
317VCC VIA MD0157PA00X+057323Y-034316X0315Y0000R000S3
317+1V1 VIA MD0157PA00X+056378Y-032874X0315Y0000R000S3
317+1V1 VIA MD0157PA00X+055748Y-034316X0315Y0000R000S3
317VCC VIA MD0157PA00X+059372Y-031804X0315Y0000R000S3
317VCC VIA MD0157PA00X+058189Y-031811X0315Y0000R000S3
317NET-(J9-PIN_3) VIA MD0157PA00X+053251Y-036641X0315Y0000R000S3
317NET-(J9-PIN_2) VIA MD0157PA00X+053622Y-036772X0315Y0000R000S3
317/V_BATT VIA MD0157PA00X+054882Y-038110X0315Y0000R000S3
317/V_BATT VIA MD0157PA00X+054862Y-037480X0315Y0000R000S3
317VCC VIA MD0157PA00X+061102Y-038268X0315Y0000R000S3
317NET-(J8-PIN_2) VIA MD0157PA00X+059802Y-036648X0315Y0000R000S3
317NET-(J8-PIN_3) VIA MD0157PA00X+059409Y-036614X0315Y0000R000S3
317/CHRG VIA MD0157PA00X+059329Y-037049X0315Y0000R000S3
317VCC VIA MD0157PA00X+059449Y-033701X0315Y0000R000S3
317/CS VIA MD0157PA00X+061890Y-038268X0315Y0000R000S3
317/CS VIA MD0157PA00X+061890Y-036929X0315Y0000R000S3
317/MISO VIA MD0157PA00X+062283Y-038268X0315Y0000R000S3
317/MISO VIA MD0157PA00X+062283Y-036929X0315Y0000R000S3
317GND VIA MD0394PA00X+059055Y-032756X0787Y0000R000S3
317/RST VIA MD0157PA00X+061614Y-033391X0315Y0000R000S3
317/SWDIO VIA MD0157PA00X+060945Y-033268X0315Y0000R000S3
317/SWCLK VIA MD0157PA00X+061339Y-033110X0315Y0000R000S3
317VCC VIA MD0157PA00X+061890Y-034316X0315Y0000R000S3
317+1V1 VIA MD0157PA00X+060000Y-032992X0315Y0000R000S3
367N/C REF** D1260UA00X+062992Y-045669X1260Y0000R000S3
327GND C1 -1 A02X+058553Y-038189X0463Y0571R000S1
327ET-(U1-GPIO24) C1 -2 A02X+059370Y-038189X0463Y0571R000S1
327/RST SW3 -1 A02X+060295Y-041142X0669Y0394R180S1
327/RST SW3 -1 A02X+057815Y-041142X0669Y0394R180S1
327GND SW3 -2 A02X+057815Y-042638X0669Y0394R180S1
327GND SW3 -2 A02X+060295Y-042638X0669Y0394R180S1
327/BOOT SW2 -1 A02X+051443Y-033414X0669Y0394R315S1
327/BOOT SW2 -1 A02X+053197Y-031660X0669Y0394R315S1
327GND SW2 -2 A02X+052139Y-030602X0669Y0394R315S1
327GND SW2 -2 A02X+050385Y-032356X0669Y0394R315S1
327NET-(U1-XIN) Y1 -1 A01X+063071Y-033504X0787Y0945R090S2
327NET-(C16-PAD1) Y1 -2 A01X+063071Y-034961X0787Y0945R090S2
327+BATT U3 -1 A02X+056122Y-045748X0614Y0256R270S1
327GND U3 -2 A02X+055748Y-045748X0614Y0256R270S1
327+BATT U3 -3 A02X+055374Y-045748X0614Y0256R270S1
327NET-(U3-NC) U3 -4 A02X+055374Y-044685X0614Y0256R270S1
327VCC U3 -5 A02X+056122Y-044685X0614Y0256R270S1
327T-(U1-QSPI_SS) U2 -1 A02X+054289Y-029213X0630Y0236R090S1
327-(U1-QSPI_SD1) U2 -2 A02X+054789Y-029213X0630Y0236R090S1
327-(U1-QSPI_SD2) U2 -3 A02X+055289Y-029213X0630Y0236R090S1
327GND U2 -4 A02X+055789Y-029213X0630Y0236R090S1
327-(U1-QSPI_SD0) U2 -5 A02X+055789Y-032047X0630Y0236R090S1
327(U1-QSPI_SCLK) U2 -6 A02X+055289Y-032047X0630Y0236R090S1
327-(U1-QSPI_SD3) U2 -7 A02X+054789Y-032047X0630Y0236R090S1
327VCC U2 -8 A02X+054289Y-032047X0630Y0236R090S1
327VCC U1 -1 A02X+058031Y-031403X0344Y0079R090S1
327/TX U1 -2 A02X+058189Y-031403X0344Y0079R090S1
327/RX U1 -3 A02X+058346Y-031403X0344Y0079R090S1
327/NEOPIXEL U1 -4 A02X+058504Y-031403X0344Y0079R090S1
327/BUZZ U1 -5 A02X+058661Y-031403X0344Y0079R090S1
327/SDA U1 -6 A02X+058819Y-031403X0344Y0079R090S1
327/SCL U1 -7 A02X+058976Y-031403X0344Y0079R090S1
327ET-(J7-PIN_10) U1 -8 A02X+059134Y-031403X0344Y0079R090S1
327NET-(J7-PIN_8) U1 -9 A02X+059291Y-031403X0344Y0079R090S1
327VCC U1 -10 A02X+059449Y-031403X0344Y0079R090S1
327NET-(J7-PIN_6) U1 -11 A02X+059606Y-031403X0344Y0079R090S1
327NET-(J7-PIN_4) U1 -12 A02X+059764Y-031403X0344Y0079R090S1
327NET-(J7-PIN_2) U1 -13 A02X+059921Y-031403X0344Y0079R090S1
327NET-(J7-PIN_1) U1 -14 A02X+060079Y-031403X0344Y0079R090S1
327NET-(J7-PIN_3) U1 -15 A02X+060408Y-031732X0079Y0344R090S1
327NET-(J7-PIN_5) U1 -16 A02X+060408Y-031890X0079Y0344R090S1
327NET-(J7-PIN_7) U1 -17 A02X+060408Y-032047X0079Y0344R090S1
327NET-(J7-PIN_9) U1 -18 A02X+060408Y-032205X0079Y0344R090S1
327GND U1 -19 A02X+060408Y-032362X0079Y0344R090S1
327NET-(U1-XIN) U1 -20 A02X+060408Y-032520X0079Y0344R090S1
327NET-(U1-XOUT) U1 -21 A02X+060408Y-032677X0079Y0344R090S1
327VCC U1 -22 A02X+060408Y-032835X0079Y0344R090S1
327+1V1 U1 -23 A02X+060408Y-032992X0079Y0344R090S1
327/SWCLK U1 -24 A02X+060408Y-033150X0079Y0344R090S1
327/SWDIO U1 -25 A02X+060408Y-033307X0079Y0344R090S1
327/RST U1 -26 A02X+060408Y-033465X0079Y0344R090S1
327/MISO U1 -27 A02X+060408Y-033622X0079Y0344R090S1
327/CS U1 -28 A02X+060408Y-033780X0079Y0344R090S1
327/CLK U1 -29 A02X+060079Y-034109X0344Y0079R090S1
327/MOSI U1 -30 A02X+059921Y-034109X0344Y0079R090S1
327NET-(J8-PIN_1) U1 -31 A02X+059764Y-034109X0344Y0079R090S1
327NET-(J8-PIN_2) U1 -32 A02X+059606Y-034109X0344Y0079R090S1
327VCC U1 -33 A02X+059449Y-034109X0344Y0079R090S1
327NET-(J8-PIN_3) U1 -34 A02X+059291Y-034109X0344Y0079R090S1
327/CHRG U1 -35 A02X+059134Y-034109X0344Y0079R090S1
327ET-(U1-GPIO24) U1 -36 A02X+058976Y-034109X0344Y0079R090S1
327NET-(D2-A) U1 -37 A02X+058819Y-034109X0344Y0079R090S1
327/V_BATT U1 -38 A02X+058661Y-034109X0344Y0079R090S1
327NET-(J9-PIN_1) U1 -39 A02X+058504Y-034109X0344Y0079R090S1
327NET-(J9-PIN_2) U1 -40 A02X+058346Y-034109X0344Y0079R090S1
327NET-(J9-PIN_3) U1 -41 A02X+058189Y-034109X0344Y0079R090S1
327VCC U1 -42 A02X+058031Y-034109X0344Y0079R090S1
327VCC U1 -43 A02X+057702Y-033780X0079Y0344R090S1
327VCC U1 -44 A02X+057702Y-033622X0079Y0344R090S1
327+1V1 U1 -45 A02X+057702Y-033465X0079Y0344R090S1
327/DN U1 -46 A02X+057702Y-033307X0079Y0344R090S1
327/DP U1 -47 A02X+057702Y-033150X0079Y0344R090S1
327VCC U1 -48 A02X+057702Y-032992X0079Y0344R090S1
327VCC U1 -49 A02X+057702Y-032835X0079Y0344R090S1
327+1V1 U1 -50 A02X+057702Y-032677X0079Y0344R090S1
327-(U1-QSPI_SD3) U1 -51 A02X+057702Y-032520X0079Y0344R090S1
327(U1-QSPI_SCLK) U1 -52 A02X+057702Y-032362X0079Y0344R090S1
327-(U1-QSPI_SD0) U1 -53 A02X+057702Y-032205X0079Y0344R090S1
327-(U1-QSPI_SD2) U1 -54 A02X+057702Y-032047X0079Y0344R090S1
327-(U1-QSPI_SD1) U1 -55 A02X+057702Y-031890X0079Y0344R090S1
327T-(U1-QSPI_SS) U1 -56 A02X+057702Y-031732X0079Y0344R090S1
327GND U1 -57 A02X+059055Y-032756X1260Y1260R090S1
367N/C SW1 D1575UA00X+059055Y-039370X1575Y0000R000S0
367N/C SW1 D0669UA00X+057055Y-039370X0669Y0000R000S0
367N/C SW1 D0669UA00X+061055Y-039370X0669Y0000R000S0
317ET-(U1-GPIO24) SW1 -1 D0591PA00X+060055Y-037370X0866Y0000R000S0
317GND SW1 -2 D0591PA00X+057555Y-038370X0866Y0000R000S0
327/BUZZ R15 -1 A02X+058425Y-044646X0472Y0551R000S1
327GND R15 -2 A02X+059213Y-044646X0472Y0551R000S1
327NET-(D2-K) R14 -1 A02X+049055Y-036772X0472Y0551R180S1
327GND R14 -2 A02X+048268Y-036772X0472Y0551R180S1
327VCC R13 -1 A02X+061102Y-038268X0472Y0551R180S1
327ET-(U1-GPIO24) R13 -2 A02X+060315Y-038268X0472Y0551R180S1
327NET-(Q1-D) R12 -1 A02X+051496Y-041890X0472Y0551R000S1
327+5V R12 -2 A02X+052283Y-041890X0472Y0551R000S1
327/CHRG R11 -1 A02X+049134Y-042598X0472Y0551R270S1
327GND R11 -2 A02X+049134Y-041811X0472Y0551R270S1
327/V_BATT R10 -1 A02X+053465Y-044094X0472Y0551R000S1
327GND R10 -2 A02X+054252Y-044094X0472Y0551R000S1
327/BOOT R9 -1 A01X+054173Y-035118X0472Y0551R270S2
327T-(U1-QSPI_SS) R9 -2 A01X+054173Y-034331X0472Y0551R270S2
327T-(U1-QSPI_SS) R8 -1 A01X+055039Y-033465X0472Y0551R270S2
327VCC R8 -2 A01X+055039Y-032677X0472Y0551R270S2
327GND R7 -1 A02X+051732Y-037402X0472Y0551R090S1
327NET-(J1-CC2) R7 -2 A02X+051732Y-038189X0472Y0551R090S1
327/DP R6 -1 A02X+052756Y-038898X0472Y0551R180S1
327NET-(D1-IO2) R6 -2 A02X+051969Y-038898X0472Y0551R180S1
327NET-(D1-IO1) R5 -1 A02X+051969Y-039685X0472Y0551R000S1
327/DN R5 -2 A02X+052756Y-039685X0472Y0551R000S1
327/RST R4 -2 A01X+061811Y-033465X0472Y0551R090S2
327VCC R4 -1 A01X+061811Y-032677X0472Y0551R090S2
327NET-(C16-PAD1) R3 -1 A02X+062520Y-033937X0472Y0551R270S1
327NET-(U1-XOUT) R3 -2 A02X+062520Y-033150X0472Y0551R270S1
327+BATT R2 -1 A02X+051969Y-044094X0472Y0551R000S1
327/V_BATT R2 -2 A02X+052756Y-044094X0472Y0551R000S1
327GND R1 -1 A02X+051732Y-041181X0472Y0551R270S1
327NET-(J1-CC1) R1 -2 A02X+051732Y-040394X0472Y0551R270S1
327/BUZZ Q3 -1 A02X+058898Y-046181X0581Y0236R000S1
327GND Q3 -2 A02X+058898Y-045433X0581Y0236R000S1
327NET-(BZ1--) Q3 -3 A02X+059636Y-045807X0581Y0236R000S1
327+BATT Q2 -1 A02X+051843Y-043346X0276Y0201R000S1
327+BATT Q2 -2 A02X+051843Y-042972X0276Y0201R000S1
327NET-(Q1-D) Q2 -3 A02X+051843Y-042598X0276Y0201R000S1
327+5V Q2 -4 A02X+052756Y-042598X0276Y0201R000S1
327+BATT Q2 -5 A02X+052756Y-042972X0276Y0201R000S1
327+BATT Q2 -6 A02X+052756Y-043346X0276Y0201R000S1
327/CHRG Q1 -1 A02X+049970Y-042579X0581Y0236R000S1
327GND Q1 -2 A02X+049970Y-041831X0581Y0236R000S1
327NET-(Q1-D) Q1 -3 A02X+050709Y-042205X0581Y0236R000S1
327+5V JP1 -1 A02X+053543Y-042736X0394Y0197R090S1
327+BATT JP1 -2 A02X+053543Y-043248X0394Y0197R090S1
317NET-(J9-PIN_1) J9 -1 D0394PA00X+054094Y-037352X0669Y0669R000S0
317NET-(J9-PIN_2) J9 -2 D0394PA00X+054094Y-038352X0669Y0669R000S0
317NET-(J9-PIN_3) J9 -3 D0394PA00X+054094Y-039352X0669Y0669R000S0
317NET-(J8-PIN_1) J8 -1 D0394PA00X+055591Y-039323X0669Y0669R180S0
317NET-(J8-PIN_2) J8 -2 D0394PA00X+055591Y-038323X0669Y0669R180S0
317NET-(J8-PIN_3) J8 -3 D0394PA00X+055591Y-037323X0669Y0669R180S0
317NET-(J7-PIN_1) J7 -1 D0394PA00X+069299Y-038898X0669Y0669R090S0
317NET-(J7-PIN_2) J7 -2 D0394PA00X+069299Y-039898X0669Y0669R090S0
317NET-(J7-PIN_3) J7 -3 D0394PA00X+068299Y-038898X0669Y0669R090S0
317NET-(J7-PIN_4) J7 -4 D0394PA00X+068299Y-039898X0669Y0669R090S0
317NET-(J7-PIN_5) J7 -5 D0394PA00X+067299Y-038898X0669Y0669R090S0
317NET-(J7-PIN_6) J7 -6 D0394PA00X+067299Y-039898X0669Y0669R090S0
317NET-(J7-PIN_7) J7 -7 D0394PA00X+066299Y-038898X0669Y0669R090S0
317NET-(J7-PIN_8) J7 -8 D0394PA00X+066299Y-039898X0669Y0669R090S0
317NET-(J7-PIN_9) J7 -9 D0394PA00X+065299Y-038898X0669Y0669R090S0
317ET-(J7-PIN_10) J7 -10 D0394PA00X+065299Y-039898X0669Y0669R090S0
317VCC J6 -1 D0394PA00X+066535Y-041417X0669Y0669R000S0
317/RX J6 -2 D0394PA00X+066535Y-042417X0669Y0669R000S0
317/TX J6 -3 D0394PA00X+066535Y-043417X0669Y0669R000S0
317GND J6 -4 D0394PA00X+066535Y-044417X0669Y0669R000S0
317GND J5 -4 D0394PA00X+065118Y-044417X0669Y0669R000S0
317/SDA J5 -3 D0394PA00X+065118Y-043417X0669Y0669R000S0
317/SCL J5 -2 D0394PA00X+065118Y-042417X0669Y0669R000S0
317VCC J5 -1 D0394PA00X+065118Y-041417X0669Y0669R000S0
317VCC J4 -1 D0394PA00X+063701Y-036811X0669Y0669R000S0
317/MOSI J4 -2 D0394PA00X+063701Y-037811X0669Y0669R000S0
317/CLK J4 -3 D0394PA00X+063701Y-038811X0669Y0669R000S0
317/CS J4 -4 D0394PA00X+063701Y-039811X0669Y0669R000S0
317/MISO J4 -5 D0394PA00X+063701Y-040811X0669Y0669R000S0
317GND J4 -6 D0394PA00X+063701Y-041811X0669Y0669R000S0
317/SWCLK J3 -1 D0394PA00X+063278Y-029370X0669Y0669R090S0
317GND J3 -2 D0394PA00X+062278Y-029370X0669Y0669R090S0
317/SWDIO J3 -3 D0394PA00X+061278Y-029370X0669Y0669R090S0
317+BATT J2 -1 D0394PA00X+052701Y-044961X0669Y0669R270S0
317GND J2 -2 D0394PA00X+053701Y-044961X0669Y0669R270S0
367N/C J1 D0256UA00X+050236Y-038232X0256Y0000R270S0
367N/C J1 D0256UA00X+050236Y-040508X0256Y0000R270S0
327GND J1 -A1 A02X+050805Y-040650X0236Y0571R270S1
327+5V J1 -A4 A02X+050805Y-040335X0236Y0571R270S1
327NET-(J1-CC1) J1 -A5 A02X+050805Y-039862X0118Y0571R270S1
327NET-(D1-IO2) J1 -A6 A02X+050805Y-039469X0118Y0571R270S1
327NET-(D1-IO1) J1 -A7 A02X+050805Y-039272X0118Y0571R270S1
327J1-SBU1-PADA8) J1 -A8 A02X+050805Y-038878X0118Y0571R270S1
327+5V J1 -A9 A02X+050805Y-038406X0236Y0571R270S1
327GND J1 -A12 A02X+050805Y-038091X0236Y0571R270S1
327GND J1 -B1 A02X+050805Y-038091X0236Y0571R270S1
327+5V J1 -B4 A02X+050805Y-038406X0236Y0571R270S1
327NET-(J1-CC2) J1 -B5 A02X+050805Y-038681X0118Y0571R270S1
327NET-(D1-IO2) J1 -B6 A02X+050805Y-039075X0118Y0571R270S1
327NET-(D1-IO1) J1 -B7 A02X+050805Y-039665X0118Y0571R270S1
327J1-SBU2-PADB8) J1 -B8 A02X+050805Y-040059X0118Y0571R270S1
327+5V J1 -B9 A02X+050805Y-040335X0236Y0571R270S1
327GND J1 -B12 A02X+050805Y-040650X0236Y0571R270S1
317GND J1 -S1 D0236PA00X+048799Y-041071X0394Y0630R270S0
317GND J1 -S1 D0236PA00X+050445Y-041071X0394Y0827R270S0
317GND J1 -S1 D0236PA00X+050445Y-037669X0394Y0827R270S0
317GND J1 -S1 D0236PA00X+048799Y-037669X0394Y0630R270S0
327+BATT D12 -1 A01X+063909Y-047691X0591Y0354R324S2
327D12-DOUT-PAD2) D12 -2 A01X+064672Y-048742X0591Y0354R324S2
327GND D12 -3 A01X+066233Y-047608X0591Y0354R324S2
327NET-(D11-DOUT) D12 -4 A01X+065469Y-046557X0591Y0354R324S2
327+BATT D11 -1 A01X+067860Y-043268X0591Y0354R288S2
327NET-(D11-DOUT) D11 -2 A01X+069095Y-043669X0591Y0354R288S2
327GND D11 -3 A01X+069691Y-041835X0591Y0354R288S2
327NET-(D10-DOUT) D11 -4 A01X+068456Y-041433X0591Y0354R288S2
327+BATT D10 -1 A01X+068476Y-037311X0591Y0354R252S2
327NET-(D10-DOUT) D10 -2 A01X+069711Y-036910X0591Y0354R252S2
327GND D10 -3 A01X+069115Y-035075X0591Y0354R252S2
327NET-(D10-DIN) D10 -4 A01X+067879Y-035476X0591Y0354R252S2
327+BATT D9 -1 A01X+065477Y-032191X0591Y0354R216S2
327NET-(D10-DIN) D9 -2 A01X+066241Y-031140X0591Y0354R216S2
327GND D9 -3 A01X+064680Y-030006X0591Y0354R216S2
327NET-(D8-DOUT) D9 -4 A01X+063917Y-031057X0591Y0354R216S2
327+BATT D8 -1 A01X+060024Y-029780X0591Y0354R180S2
327NET-(D8-DOUT) D8 -2 A01X+060024Y-028480X0591Y0354R180S2
327GND D8 -3 A01X+058094Y-028480X0591Y0354R180S2
327NET-(D7-DOUT) D8 -4 A01X+058094Y-029780X0591Y0354R180S2
327+BATT D7 -1 A01X+054190Y-031049X0591Y0354R144S2
327NET-(D7-DOUT) D7 -2 A01X+053426Y-029998X0591Y0354R144S2
327GND D7 -3 A01X+051865Y-031132X0591Y0354R144S2
327NET-(D6-DOUT) D7 -4 A01X+052629Y-032183X0591Y0354R144S2
327+BATT D6 -1 A01X+050235Y-035484X0591Y0354R108S2
327NET-(D6-DOUT) D6 -2 A01X+048999Y-035083X0591Y0354R108S2
327GND D6 -3 A01X+048403Y-036917X0591Y0354R108S2
327NET-(D5-DOUT) D6 -4 A01X+049639Y-037319X0591Y0354R108S2
327+BATT D5 -1 A01X+049639Y-041409X0591Y0354R072S2
327NET-(D5-DOUT) D5 -2 A01X+048403Y-041811X0591Y0354R072S2
327GND D5 -3 A01X+048999Y-043646X0591Y0354R072S2
327NET-(D4-DOUT) D5 -4 A01X+050235Y-043244X0591Y0354R072S2
327+BATT D4 -1 A01X+052645Y-046530X0591Y0354R036S2
327NET-(D4-DOUT) D4 -2 A01X+051881Y-047581X0591Y0354R036S2
327GND D4 -3 A01X+053442Y-048715X0591Y0354R036S2
327NET-(D3-DOUT) D4 -4 A01X+054205Y-047663X0591Y0354R036S2
327+BATT D3 -1 A01X+058091Y-048957X0591Y0354R000S2
327NET-(D3-DOUT) D3 -2 A01X+058091Y-050256X0591Y0354R000S2
327GND D3 -3 A01X+060020Y-050256X0591Y0354R000S2
327/NEOPIXEL D3 -4 A01X+060020Y-048957X0591Y0354R000S2
327NET-(D2-A) D2 -2 A02X+050945Y-036772X0492Y0689R000S1
327NET-(D2-K) D2 -1 A02X+049843Y-036772X0492Y0689R000S1
327NET-(D1-IO1) D1 -1 A01X+049504Y-039557X0248Y0177R180S2
327NET-(D1-IO2) D1 -2 A01X+049504Y-039183X0248Y0177R180S2
327GND D1 -3 A01X+049504Y-038809X0248Y0177R180S2
327-(D1-IO3-PAD4) D1 -4 A01X+048449Y-038809X0248Y0177R180S2
327+5V D1 -5 A01X+048449Y-039183X0248Y0177R180S2
327N/C D1 -6 A01X+048449Y-039557X0248Y0177R180S2
327N/C D1 -7 A01X+049134Y-039390X0315Y0413R180S2
327N/C D1 -7 A01X+048819Y-038976X0315Y0413R180S2
327N/C D1 -7 A01X+048819Y-039390X0315Y0413R180S2
327N/C D1 -7 A01X+049134Y-038976X0315Y0413R180S2
327GND C17 -2 A01X+054252Y-033479X0463Y0571R090S2
327VCC C17 -1 A01X+054252Y-032662X0463Y0571R090S2
327NET-(C16-PAD1) C16 -1 A01X+064252Y-035290X0463Y0571R270S2
327GND C16 -2 A01X+064252Y-034473X0463Y0571R270S2
327NET-(U1-XIN) C15 -1 A01X+064252Y-032977X0463Y0571R090S2
327GND C15 -2 A01X+064252Y-033794X0463Y0571R090S2
327GND C14 -1 A01X+058110Y-035133X0463Y0571R270S2
327VCC C14 -2 A01X+058110Y-034316X0463Y0571R270S2
327GND C13 -1 A01X+054961Y-035133X0463Y0571R270S2
327+1V1 C13 -2 A01X+054961Y-034316X0463Y0571R270S2
327GND C12 -1 A01X+057323Y-035133X0463Y0571R270S2
327VCC C12 -2 A01X+057323Y-034316X0463Y0571R270S2
327GND C11 -1 A01X+056535Y-035133X0463Y0571R270S2
327VCC C11 -2 A01X+056535Y-034316X0463Y0571R270S2
327GND C10 -1 A01X+058583Y-032613X0463Y0571R270S2
327VCC C10 -2 A01X+058583Y-031796X0463Y0571R270S2
327GND C9 -1 A01X+061102Y-035133X0463Y0571R270S2
327+1V1 C9 -2 A01X+061102Y-034316X0463Y0571R270S2
327GND C8 -1 A01X+055748Y-035133X0463Y0571R270S2
327+1V1 C8 -2 A01X+055748Y-034316X0463Y0571R270S2
327GND C7 -1 A01X+059449Y-035133X0463Y0571R270S2
327VCC C7 -2 A01X+059449Y-034316X0463Y0571R270S2
327GND C6 -1 A01X+061890Y-035133X0463Y0571R270S2
327VCC C6 -2 A01X+061890Y-034316X0463Y0571R270S2
327VCC C5 -2 A01X+059370Y-031796X0463Y0571R270S2
327GND C5 -1 A01X+059370Y-032613X0463Y0571R270S2
327VCC C4 -1 A02X+056220Y-043873X0463Y0571R270S1
327GND C4 -2 A02X+056220Y-043056X0463Y0571R270S1
327NET-(U3-NC) C3 -1 A02X+055433Y-043873X0463Y0571R270S1
327GND C3 -2 A02X+055433Y-043056X0463Y0571R270S1
327+BATT C2 -1 A02X+054646Y-045827X0463Y0571R270S1
327GND C2 -2 A02X+054646Y-045010X0463Y0571R270S1
317VCC BZ1 -1 D0394PA00X+057559Y-045827X0787Y0787R000S0
317NET-(BZ1--) BZ1 -2 D0394PA00X+060551Y-045827X0787Y0000R000S0
999

View File

@ -1,65 +0,0 @@
Designator,Mid X,Mid Y,Rotation,Layer
BZ1,146.2,-116.4,0.0,top
C1,149.7625,-97.0,0.0,bottom
C10,148.8,-81.8,90.0,top
C11,143.6,-88.2,90.0,top
C12,145.6,-88.2,90.0,top
C13,139.6,-88.2,90.0,top
C14,147.6,-88.2,90.0,top
C15,163.2,-84.8,270.0,top
C16,163.2,-88.6,90.0,top
C17,137.8,-84.0,270.0,top
C2,138.8,-115.3625,90.0,bottom
C3,140.8,-110.4,90.0,bottom
C4,142.8,-110.4,90.0,bottom
C5,150.8,-81.8,90.0,top
C6,157.2,-88.2,90.0,top
C7,151.0,-88.2,90.0,top
C8,141.6,-88.2,90.0,top
C9,155.2,-88.2,90.0,top
D1,124.4,-99.525,180.0,top
D10,174.74,-91.93,108.0,top
D11,174.69,-108.08,72.0,top
D12,165.28,-121.03,36.0,top
D2,128.0,-93.4,0.0,bottom
D3,150.0,-126.0,0.0,top
D4,134.73,-120.96,324.0,top
D5,125.27,-108.02,288.0,top
D6,125.27,-91.95,252.0,top
D7,134.69,-78.97,216.0,top
D8,150.01,-73.99,180.0,top
D9,165.3,-78.99,144.0,top
J1,125.0,-100.0,90.0,bottom
J2,133.86,-114.2,90.0,top
J3,160.725,-74.6,270.0,top
J4,161.8,-93.5,0.0,top
J5,165.4,-105.2,0.0,top
J6,169.0,-105.2,0.0,top
J7,176.02,-98.8,270.0,top
J8,141.2,-99.88,180.0,top
J9,137.4,-94.875,0.0,top
Q1,127.8625,-107.2,0.0,bottom
Q2,132.84,-109.15,0.0,bottom
Q3,150.5375,-116.35,0.0,bottom
R1,131.4,-103.6,90.0,bottom
R10,136.8,-112.0,0.0,bottom
R11,124.8,-107.2,90.0,bottom
R12,131.8,-106.4,0.0,bottom
R13,154.2,-97.2,180.0,bottom
R14,123.6,-93.4,180.0,bottom
R15,149.4,-113.4,0.0,bottom
R2,133.0,-112.0,0.0,bottom
R3,158.8,-85.2,90.0,bottom
R4,157.0,-84.0,270.0,top
R5,133.0,-100.8,0.0,bottom
R6,133.0,-98.8,180.0,bottom
R7,131.4,-96.0,270.0,bottom
R8,139.8,-84.0,90.0,top
R9,137.6,-88.2,90.0,top
SW1,152.54,-94.92,0.0,top
SW2,131.55,-81.3,45.0,bottom
SW3,150.0,-106.4,180.0,bottom
U1,150.0,-83.2,270.0,bottom
U2,139.8,-77.8,270.0,bottom
U3,141.6,-114.85,90.0,bottom
Y1,160.2,-86.95,270.0,top
1 Designator Mid X Mid Y Rotation Layer
2 BZ1 146.2 -116.4 0.0 top
3 C1 149.7625 -97.0 0.0 bottom
4 C10 148.8 -81.8 90.0 top
5 C11 143.6 -88.2 90.0 top
6 C12 145.6 -88.2 90.0 top
7 C13 139.6 -88.2 90.0 top
8 C14 147.6 -88.2 90.0 top
9 C15 163.2 -84.8 270.0 top
10 C16 163.2 -88.6 90.0 top
11 C17 137.8 -84.0 270.0 top
12 C2 138.8 -115.3625 90.0 bottom
13 C3 140.8 -110.4 90.0 bottom
14 C4 142.8 -110.4 90.0 bottom
15 C5 150.8 -81.8 90.0 top
16 C6 157.2 -88.2 90.0 top
17 C7 151.0 -88.2 90.0 top
18 C8 141.6 -88.2 90.0 top
19 C9 155.2 -88.2 90.0 top
20 D1 124.4 -99.525 180.0 top
21 D10 174.74 -91.93 108.0 top
22 D11 174.69 -108.08 72.0 top
23 D12 165.28 -121.03 36.0 top
24 D2 128.0 -93.4 0.0 bottom
25 D3 150.0 -126.0 0.0 top
26 D4 134.73 -120.96 324.0 top
27 D5 125.27 -108.02 288.0 top
28 D6 125.27 -91.95 252.0 top
29 D7 134.69 -78.97 216.0 top
30 D8 150.01 -73.99 180.0 top
31 D9 165.3 -78.99 144.0 top
32 J1 125.0 -100.0 90.0 bottom
33 J2 133.86 -114.2 90.0 top
34 J3 160.725 -74.6 270.0 top
35 J4 161.8 -93.5 0.0 top
36 J5 165.4 -105.2 0.0 top
37 J6 169.0 -105.2 0.0 top
38 J7 176.02 -98.8 270.0 top
39 J8 141.2 -99.88 180.0 top
40 J9 137.4 -94.875 0.0 top
41 Q1 127.8625 -107.2 0.0 bottom
42 Q2 132.84 -109.15 0.0 bottom
43 Q3 150.5375 -116.35 0.0 bottom
44 R1 131.4 -103.6 90.0 bottom
45 R10 136.8 -112.0 0.0 bottom
46 R11 124.8 -107.2 90.0 bottom
47 R12 131.8 -106.4 0.0 bottom
48 R13 154.2 -97.2 180.0 bottom
49 R14 123.6 -93.4 180.0 bottom
50 R15 149.4 -113.4 0.0 bottom
51 R2 133.0 -112.0 0.0 bottom
52 R3 158.8 -85.2 90.0 bottom
53 R4 157.0 -84.0 270.0 top
54 R5 133.0 -100.8 0.0 bottom
55 R6 133.0 -98.8 180.0 bottom
56 R7 131.4 -96.0 270.0 bottom
57 R8 139.8 -84.0 90.0 top
58 R9 137.6 -88.2 90.0 top
59 SW1 152.54 -94.92 0.0 top
60 SW2 131.55 -81.3 45.0 bottom
61 SW3 150.0 -106.4 180.0 bottom
62 U1 150.0 -83.2 270.0 bottom
63 U2 139.8 -77.8 270.0 bottom
64 U3 141.6 -114.85 90.0 bottom
65 Y1 160.2 -86.95 270.0 top

File diff suppressed because it is too large Load Diff

View File

@ -1,77 +0,0 @@
{
"board": {
"active_layer": 0,
"active_layer_preset": "",
"auto_track_width": false,
"hidden_netclasses": [],
"hidden_nets": [],
"high_contrast_mode": 0,
"net_color_mode": 1,
"opacity": {
"images": 0.6,
"pads": 1.0,
"tracks": 1.0,
"vias": 1.0,
"zones": 0.6
},
"selection_filter": {
"dimensions": true,
"footprints": true,
"graphics": true,
"keepouts": true,
"lockedItems": false,
"otherItems": true,
"pads": true,
"text": true,
"tracks": true,
"vias": true,
"zones": true
},
"visible_items": [
0,
1,
2,
3,
4,
5,
8,
9,
10,
11,
12,
13,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30,
32,
33,
34,
35,
36,
39,
40
],
"visible_layers": "ffffdff_ffffffff",
"zone_display_mode": 0
},
"meta": {
"filename": "timer_button.kicad_prl",
"version": 3
},
"project": {
"files": []
}
}

View File

@ -1,492 +0,0 @@
{
"board": {
"3dviewports": [],
"design_settings": {
"defaults": {
"board_outline_line_width": 0.09999999999999999,
"copper_line_width": 0.19999999999999998,
"copper_text_italic": false,
"copper_text_size_h": 1.5,
"copper_text_size_v": 1.5,
"copper_text_thickness": 0.3,
"copper_text_upright": false,
"courtyard_line_width": 0.049999999999999996,
"dimension_precision": 4,
"dimension_units": 3,
"dimensions": {
"arrow_length": 1270000,
"extension_offset": 500000,
"keep_text_aligned": true,
"suppress_zeroes": false,
"text_position": 0,
"units_format": 1
},
"fab_line_width": 0.09999999999999999,
"fab_text_italic": false,
"fab_text_size_h": 1.0,
"fab_text_size_v": 1.0,
"fab_text_thickness": 0.15,
"fab_text_upright": false,
"other_line_width": 0.15,
"other_text_italic": false,
"other_text_size_h": 1.0,
"other_text_size_v": 1.0,
"other_text_thickness": 0.15,
"other_text_upright": false,
"pads": {
"drill": 3.2,
"height": 3.2,
"width": 3.2
},
"silk_line_width": 0.15,
"silk_text_italic": false,
"silk_text_size_h": 1.0,
"silk_text_size_v": 1.0,
"silk_text_thickness": 0.15,
"silk_text_upright": false,
"zones": {
"min_clearance": 0.5
}
},
"diff_pair_dimensions": [
{
"gap": 0.0,
"via_gap": 0.0,
"width": 0.0
}
],
"drc_exclusions": [],
"meta": {
"version": 2
},
"rule_severities": {
"annular_width": "error",
"clearance": "error",
"connection_width": "warning",
"copper_edge_clearance": "error",
"copper_sliver": "warning",
"courtyards_overlap": "error",
"diff_pair_gap_out_of_range": "error",
"diff_pair_uncoupled_length_too_long": "error",
"drill_out_of_range": "error",
"duplicate_footprints": "warning",
"extra_footprint": "warning",
"footprint": "error",
"footprint_type_mismatch": "ignore",
"hole_clearance": "error",
"hole_near_hole": "error",
"invalid_outline": "error",
"isolated_copper": "warning",
"item_on_disabled_layer": "error",
"items_not_allowed": "error",
"length_out_of_range": "error",
"lib_footprint_issues": "warning",
"lib_footprint_mismatch": "warning",
"malformed_courtyard": "error",
"microvia_drill_out_of_range": "error",
"missing_courtyard": "ignore",
"missing_footprint": "warning",
"net_conflict": "warning",
"npth_inside_courtyard": "ignore",
"padstack": "warning",
"pth_inside_courtyard": "ignore",
"shorting_items": "error",
"silk_edge_clearance": "warning",
"silk_over_copper": "warning",
"silk_overlap": "warning",
"skew_out_of_range": "error",
"solder_mask_bridge": "error",
"starved_thermal": "error",
"text_height": "warning",
"text_thickness": "warning",
"through_hole_pad_without_hole": "error",
"too_many_vias": "error",
"track_dangling": "warning",
"track_width": "error",
"tracks_crossing": "error",
"unconnected_items": "error",
"unresolved_variable": "error",
"via_dangling": "warning",
"zones_intersect": "error"
},
"rules": {
"max_error": 0.005,
"min_clearance": 0.0,
"min_connection": 0.0,
"min_copper_edge_clearance": 0.0,
"min_hole_clearance": 0.25,
"min_hole_to_hole": 0.25,
"min_microvia_diameter": 0.19999999999999998,
"min_microvia_drill": 0.09999999999999999,
"min_resolved_spokes": 2,
"min_silk_clearance": 0.0,
"min_text_height": 0.7999999999999999,
"min_text_thickness": 0.08,
"min_through_hole_diameter": 0.3,
"min_track_width": 0.0,
"min_via_annular_width": 0.09999999999999999,
"min_via_diameter": 0.5,
"solder_mask_clearance": 0.0,
"solder_mask_min_width": 0.0,
"solder_mask_to_copper_clearance": 0.0,
"use_height_for_length_calcs": true
},
"teardrop_options": [
{
"td_allow_use_two_tracks": true,
"td_curve_segcount": 5,
"td_on_pad_in_zone": false,
"td_onpadsmd": true,
"td_onroundshapesonly": false,
"td_ontrackend": false,
"td_onviapad": true
}
],
"teardrop_parameters": [
{
"td_curve_segcount": 0,
"td_height_ratio": 1.0,
"td_length_ratio": 0.5,
"td_maxheight": 2.0,
"td_maxlen": 1.0,
"td_target_name": "td_round_shape",
"td_width_to_size_filter_ratio": 0.9
},
{
"td_curve_segcount": 0,
"td_height_ratio": 1.0,
"td_length_ratio": 0.5,
"td_maxheight": 2.0,
"td_maxlen": 1.0,
"td_target_name": "td_rect_shape",
"td_width_to_size_filter_ratio": 0.9
},
{
"td_curve_segcount": 0,
"td_height_ratio": 1.0,
"td_length_ratio": 0.5,
"td_maxheight": 2.0,
"td_maxlen": 1.0,
"td_target_name": "td_track_end",
"td_width_to_size_filter_ratio": 0.9
}
],
"track_widths": [
0.0,
0.2,
0.4
],
"via_dimensions": [
{
"diameter": 0.0,
"drill": 0.0
}
],
"zones_allow_external_fillets": false
},
"layer_presets": [],
"viewports": []
},
"boards": [],
"cvpcb": {
"equivalence_files": []
},
"erc": {
"erc_exclusions": [],
"meta": {
"version": 0
},
"pin_map": [
[
0,
0,
0,
0,
0,
0,
1,
0,
0,
0,
0,
2
],
[
0,
2,
0,
1,
0,
0,
1,
0,
2,
2,
2,
2
],
[
0,
0,
0,
0,
0,
0,
1,
0,
1,
0,
1,
2
],
[
0,
1,
0,
0,
0,
0,
1,
1,
2,
1,
1,
2
],
[
0,
0,
0,
0,
0,
0,
1,
0,
0,
0,
0,
2
],
[
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
2
],
[
1,
1,
1,
1,
1,
0,
1,
1,
1,
1,
1,
2
],
[
0,
0,
0,
1,
0,
0,
1,
0,
0,
0,
0,
2
],
[
0,
2,
1,
2,
0,
0,
1,
0,
2,
2,
2,
2
],
[
0,
2,
0,
1,
0,
0,
1,
0,
2,
0,
0,
2
],
[
0,
2,
1,
1,
0,
0,
1,
0,
2,
0,
0,
2
],
[
2,
2,
2,
2,
2,
2,
2,
2,
2,
2,
2,
2
]
],
"rule_severities": {
"bus_definition_conflict": "error",
"bus_entry_needed": "error",
"bus_to_bus_conflict": "error",
"bus_to_net_conflict": "error",
"conflicting_netclasses": "error",
"different_unit_footprint": "error",
"different_unit_net": "error",
"duplicate_reference": "error",
"duplicate_sheet_names": "error",
"endpoint_off_grid": "warning",
"extra_units": "error",
"global_label_dangling": "warning",
"hier_label_mismatch": "error",
"label_dangling": "error",
"lib_symbol_issues": "warning",
"missing_bidi_pin": "warning",
"missing_input_pin": "warning",
"missing_power_pin": "error",
"missing_unit": "warning",
"multiple_net_names": "warning",
"net_not_bus_member": "warning",
"no_connect_connected": "warning",
"no_connect_dangling": "warning",
"pin_not_connected": "error",
"pin_not_driven": "error",
"pin_to_pin": "warning",
"power_pin_not_driven": "error",
"similar_labels": "warning",
"simulation_model_issue": "ignore",
"unannotated": "error",
"unit_value_mismatch": "error",
"unresolved_variable": "error",
"wire_dangling": "error"
}
},
"libraries": {
"pinned_footprint_libs": [],
"pinned_symbol_libs": []
},
"meta": {
"filename": "timer_button.kicad_pro",
"version": 1
},
"net_settings": {
"classes": [
{
"bus_width": 12,
"clearance": 0.2,
"diff_pair_gap": 0.25,
"diff_pair_via_gap": 0.25,
"diff_pair_width": 0.2,
"line_style": 0,
"microvia_diameter": 0.3,
"microvia_drill": 0.1,
"name": "Default",
"pcb_color": "rgba(0, 0, 0, 0.000)",
"schematic_color": "rgba(0, 0, 0, 0.000)",
"track_width": 0.25,
"via_diameter": 0.8,
"via_drill": 0.4,
"wire_width": 6
}
],
"meta": {
"version": 3
},
"net_colors": null,
"netclass_assignments": null,
"netclass_patterns": []
},
"pcbnew": {
"last_paths": {
"gencad": "",
"idf": "",
"netlist": "",
"specctra_dsn": "",
"step": "",
"vrml": ""
},
"page_layout_descr_file": ""
},
"schematic": {
"annotate_start_num": 0,
"drawing": {
"dashed_lines_dash_length_ratio": 12.0,
"dashed_lines_gap_length_ratio": 3.0,
"default_line_thickness": 6.0,
"default_text_size": 50.0,
"field_names": [],
"intersheets_ref_own_page": false,
"intersheets_ref_prefix": "",
"intersheets_ref_short": false,
"intersheets_ref_show": false,
"intersheets_ref_suffix": "",
"junction_size_choice": 3,
"label_size_ratio": 0.375,
"pin_symbol_size": 25.0,
"text_offset_ratio": 0.15
},
"legacy_lib_dir": "",
"legacy_lib_list": [],
"meta": {
"version": 1
},
"net_format_name": "",
"page_layout_descr_file": "",
"plot_directory": "",
"spice_current_sheet_as_root": false,
"spice_external_command": "spice \"%I\"",
"spice_model_current_sheet_as_root": true,
"spice_save_all_currents": false,
"spice_save_all_voltages": false,
"subpart_first_id": 65,
"subpart_id_separator": 0
},
"sheets": [
[
"4c88d864-5558-4972-998d-a249c51e3544",
""
]
],
"text_variables": {}
}

File diff suppressed because it is too large Load Diff

View File

@ -1,100 +0,0 @@
{
"1": {
"name": "Michal_Dolezal",
"time": 59686.214496,
"laps": 3,
"lap_time": {
"0": 1570.6283019999973,
"1": 1714.182087000001,
"2": 1446.9299450000035
}
},
"2": {
"name": "David_Hubalek",
"time": 61285.385381,
"laps": 3,
"lap_time": {
"0": 1378.498722999997,
"1": 1902.1900959999984,
"2": 2436.201885000002
}
},
"9": {
"name": "Lucie_Ponocna",
"time": 60148.765882,
"laps": 3,
"lap_time": {
"0": 1481.6570529999954,
"1": 1371.9764339999965,
"2": 1392.5671650000004
}
},
"8": {
"name": "Jan_Cada",
"time": 60218.945151,
"laps": 3,
"lap_time": {
"0": 1293.8216450000036,
"1": 1341.646053000004,
"2": 1402.6441269999996
}
},
"10": {
"name": "Jenda",
"time": 61880.872883,
"laps": 3,
"lap_time": {
"0": 1365.9300070000027,
"1": 1959.2283549999993,
"2": 1957.2417010000063
}
},
"4": {
"name": "Vojta_Flekr",
"time": 61567.55196,
"laps": 3,
"lap_time": {
"0": 1447.2361820000006,
"1": 1654.6209919999965,
"2": 1696.5821589999978
}
},
"7": {
"name": "Lukas_Bouchal",
"time": 61356.658114,
"laps": 3,
"lap_time": {
"0": 1456.207137999998,
"1": 1405.8979709999985,
"2": 1365.8517150000043
}
},
"3": {
"name": "Adam_Krejsa",
"time": 61475.209162,
"laps": 3,
"lap_time": {
"0": 1313.4791200000036,
"1": 1358.869869999995,
"2": 1402.3635040000008
}
},
"6": {
"name": "David_Bedrnicek",
"time": 62894.44809,
"laps": 3,
"lap_time": {
"0": 1480.398721999998,
"1": 1721.0690019999965,
"2": 1939.8222899999964
}
},
"11": {
"name": "Nacelnik",
"time": 64679.27699,
"laps": 1,
"lap_time": {
"0": 2533.054164000001
}
}
}

View File

@ -1,32 +0,0 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Sat Oct 21 17:19:11 2023
@author: angoosh
"""
import json
FILE = './Alkator.json'
data_dict = ''
results = {}
with open(FILE,'r') as f:
file_content = f.read()
data_dict = json.loads(file_content)
for id in data_dict:
laps = int(data_dict[id]['laps'])
time = 0
for i in range(0,laps):
time += float(data_dict[id]['lap_time'][str(i)])
time = (time - (600*laps)) / 60
print(data_dict[id]['name'],time)
data_dict[id]['total_time'] = time
results[data_dict[id]['name']] = time
print(results)
dict(sorted(results.items(), key=lambda item: item[0]))
print(results)

View File

@ -1,7 +0,0 @@
{
"station_id": 2,
"host": "https://beta.alkator.cz",
"login": "station_register@alkator.cz",
"password": "password_heslo",
"countdown_seconds": 60
}

View File

@ -1 +0,0 @@
[]

View File

@ -1,4 +0,0 @@
{
"1": 3619716179,
"2": 3620062547
}

View File

@ -1,51 +0,0 @@
import usb.core
import usb.util
import time
import requests
import json
USB_IF = 0 # Interface
USB_TIMEOUT = 5 # Timeout in MS
USB_VENDOR = 0xffff # Vendor-ID:
USB_PRODUCT = 0x0035 # Product-ID
# Find the HID device by vender/product ID
dev = usb.core.find(idVendor=USB_VENDOR, idProduct=USB_PRODUCT)
# Get and store the endpoint
endpoint = dev[0][(0,0)][0]
if dev.is_kernel_driver_active(USB_IF) is True:
dev.detach_kernel_driver(USB_IF)
# Claim the device
usb.util.claim_interface(dev, USB_IF)
receivedNumber = 0
while True:
control = None
try:
# Read a character from the device
control = dev.read(endpoint.bEndpointAddress, endpoint.wMaxPacketSize, USB_TIMEOUT)
# Here you have to analyze what's coming in.
# In my case you had to check the first byte (command)
if (control[2] != 40) & (control[2] != 0):
# Convert ascii to a number, there's probably better ways to do so.
receivedDigit = control[2] - 29
if receivedDigit == 10:
receivedDigit = 0
# Append the digit to the number
receivedNumber = 10 * receivedNumber + receivedDigit
# Check if the received character is CRLF
if (( control[0] == 0 )) & (( control[2] == 40 )) & (( not receivedNumber == 0 )):
print('cardNumber:', receivedNumber)
except KeyboardInterrupt:
exit()
except:
pass
time.sleep(0.001) # Let CTRL+C actually exit

View File

@ -1,110 +0,0 @@
import threading
import time
import usb.core
import usb.util
import requests
import json
import datetime
DEBUG = False
if DEBUG == True:
index = 2
else:
index = 1
activeCards = []
TIME = 600
USB_IF = 0 # Interface
USB_TIMEOUT = 5 # Timeout in ms
USB_VENDOR = 0xffff # Vendor-ID:
USB_PRODUCT = 0x0035 # Product-ID
with open('people.json', 'r') as f:
db = json.load(f)
try:
times = {}
with open('times.json', 'r') as f:
times_json = json.load(f)
for i in times_json:
times[i] = {}
times[i]['start'] = datetime.datetime.strptime(times_json[i]['start'],"%d/%m/%Y, %H:%M:%S")
try:
times[i]['end'] = datetime.datetime.strptime(times_json[i]['end'],"%d/%m/%Y, %H:%M:%S")
times[i]['duration'] = times[i]['end'] - times[i]['start']
except:
print(i, "Not finished yet")
print(times)
except Exception as e: print(e)
#except:
# times = {}
# times_json = {}
class UsbCardReader():
def __init__(self, **kargs):
# Find the HID device by vendor/product ID
self.dev = usb.core.find(idVendor=USB_VENDOR, idProduct=USB_PRODUCT)
# Get and store the endpoint
self.endpoint = self.dev[0][(0,0)][0]
if self.dev.is_kernel_driver_active(USB_IF) is True:
self.dev.detach_kernel_driver(USB_IF)
# Claim the device
usb.util.claim_interface(self.dev, USB_IF)
self.receivedNumber = 0
cardread=threading.Thread(target=self.read)
cardread.start()
def read(self):
global activeCards, db, times, times_json
print("Waiting for card")
receivedNumber = 0
while True:
control = None
try:
control = self.dev.read(self.endpoint.bEndpointAddress, self.endpoint.wMaxPacketSize, USB_TIMEOUT)
if (control[2] != 40) & (control[2] != 0):
receivedDigit = control[2] - 29
if receivedDigit == 10:
receivedDigit = 0
receivedNumber = 10 * receivedNumber + receivedDigit
if (( control[0] == 0 )) & (( control[2] == 40 )) & (( not receivedNumber == 0 )):
try:
with open('people.json', 'r') as f:
db = json.load(f)
for i in db:
if db[i] == receivedNumber:
print("Runner:", i)
print(db)
runner_found = False
for j in times:
if j == i:
runner_found = True
times[j]['end'] = datetime.datetime.now()
times[j]['duration'] = times[j]['end'] - times[j]['start']
times_json[j]['end'] = times[j]['end'].strftime("%d/%m/%Y, %H:%M:%S")
times_json[j]['duration'] = str(times[j]['duration'])
if runner_found == False:
times[i] = {}
times[i]['start'] = datetime.datetime.now()
times_json[i] = {}
times_json[i]['start'] = times[i]['start'].strftime("%d/%m/%Y, %H:%M:%S")
with open("times.json", 'w') as f:
f.write(json.dumps(times_json, indent = 4))
print(times)
except Exception as e: print(e)
receivedNumber = 0
except KeyboardInterrupt:
exit()
except:
pass
time.sleep(0.001)
UsbCardReader()

View File

@ -1,20 +0,0 @@
#lightgrid {
background-color: #F0F0F0;
}
#darkgrid {
background-color: #D0D0D0;
}
#lredgrid {
background-color: #FF8888;
}
#dredgrid {
background-color: #FF6666;
}
#gridlabel {
font-size: 16pt;
font-weight: bold;
}

View File

@ -1,12 +0,0 @@
{
"1": {
"start": "25/02/2025, 18:06:16",
"end": "25/02/2025, 18:06:31",
"duration": "0:00:14.553644"
},
"2": {
"start": "25/02/2025, 18:15:08",
"end": "25/02/2025, 18:15:27",
"duration": "0:00:19.543765"
}
}

View File

@ -1,84 +0,0 @@
import time
import usb.core
import usb.util
import requests
import json
import threading
USB_IF = 0 # Interface
USB_TIMEOUT = 5 # Timeout in ms
USB_VENDOR = 0xffff # Vendor-ID:
USB_PRODUCT = 0x0035 # Product-ID
activeCards = {}
try:
with open('people.json', 'r') as f:
activeCards = json.load(f)
except:
print("No people.json found")
class UsbCardReader():
def __init__(self, **kargs):
# Find the HID device by vendor/product ID
self.dev = usb.core.find(idVendor=USB_VENDOR, idProduct=USB_PRODUCT)
# Get and store the endpoint
self.endpoint = self.dev[0][(0,0)][0]
if self.dev.is_kernel_driver_active(USB_IF) is True:
self.dev.detach_kernel_driver(USB_IF)
# Claim the device
usb.util.claim_interface(self.dev, USB_IF)
self.receivedNumber = 0
def read(self):
global activeCards
print("Priloz kartu")
while True:
control = None
try:
control = self.dev.read(self.endpoint.bEndpointAddress, self.endpoint.wMaxPacketSize, USB_TIMEOUT)
if (control[2] != 40) & (control[2] != 0):
receivedDigit = control[2] - 29
if receivedDigit == 10:
receivedDigit = 0
self.receivedNumber = 10 * self.receivedNumber + receivedDigit
if (( control[0] == 0 )) & (( control[2] == 40 )) & (( not self.receivedNumber == 0 )):
try:
cardPresent = False
for i in activeCards:
if activeCards[i] == self.receivedNumber:
cardPresent = True
break
if cardPresent == False:
assign=threading.Thread(target=self.assign)
assign.start()
else:
print("Naramek jiz zaregistrovan")
self.receivedNumber = 0
print("Priloz kartu")
except Exception as e: print(e)
except KeyboardInterrupt:
exit()
except:
pass
time.sleep(0.001)
def assign(self):
global activeCards
n = input("Cislo zavodnika: ")
activeCards[str(n)] = self.receivedNumber
with open('people.json', 'w') as f:
f.write(json.dumps(activeCards, indent = 4))
self.receivedNumber = 0
print("Ulozeno, priloz kartu")
if __name__ == "__main__":
reader = UsbCardReader()
print("Zapis zavodniku ready")
reader.read()

View File

@ -1,100 +0,0 @@
#!/usr/bin/python
import serial
import json
from datetime import datetime
JSON_PATH = './Alkator.json'
data_dict = ''
try:
with open(JSON_PATH, 'r') as file:
file_content = file.read()
data_dict = json.loads(file_content)
print('json_exists')
except:
data_dict = {}
def get_seconds():
current_time = datetime.now()
hours = current_time.hour
mins = current_time.minute
secs = current_time.second
us = current_time.microsecond
seconds = hours*3600 + mins*60 + secs
seconds = float(str(seconds) + '.' + str(us))
return seconds
def read(ser):
while True:
mes = ser.read_until(b'\r')
if b'Reading ntag' in mes:
print('reading')
if b'Data' in mes:
data = mes.decode('utf-8')
data = data[6:].replace('\x00', '').replace('\r', '').split(' ')
print('data read done')
try:
lap_secs = get_seconds() - data_dict[data[0]]['time']
print(lap_secs)
lap = data_dict[data[0]]['laps']
try:
data_dict[data[0]]['lap_time'][lap] = lap_secs
except:
data_dict[data[0]]['lap_time'] = {lap: lap_secs}
lap += 1
data_dict[data[0]]['laps'] = lap
data_dict[data[0]]['time'] = get_seconds()
except:
data_dict[data[0]] = {'name': data[1]}
data_dict[data[0]]['time'] = get_seconds()
data_dict[data[0]]['laps'] = 0
data_json = json.dumps(data_dict, indent=4)
print(data_json)
with open(JSON_PATH, 'w') as file:
file.write(data_json)
def write(ser):
while True:
data = input('ID:')
data = data + '\r'
ser.write(data.encode())
while True:
mes = ser.read_until(b'\r')
if b'Waiting' in mes:
print('Waiting for card')
if b'Erasing' in mes:
print('Erasing card')
if b'Writing' in mes:
print('Writing data to card')
if b'done' in mes:
print('Write done')
break
def main():
s = serial.Serial(port="/dev/ttyACM3", parity=serial.PARITY_EVEN, stopbits=serial.STOPBITS_ONE, timeout=1)
s.flush()
rw = input('Read or Write tags? [R/w]')
rw = rw.lower()
if rw == 'w':
s.write('w\r'.encode())
write(s)
elif rw == 'r':
s.write('r\r'.encode())
read(s)
elif rw == '':
s.write('r\r'.encode())
read(s)
else:
print('Invalid option')
if __name__ == "__main__":
main()

View File

@ -1,163 +0,0 @@
import neopixel
import time
import sys
import select
from machine import Pin, SPI
#neopixel
ws_pin = 2
led_num = 10
BRIGHTNESS = 0.2 # Adjust the brightness (0.0 - 1.0)
led_strip = neopixel.NeoPixel(Pin(ws_pin), led_num)
push_button = Pin(24, Pin.IN, Pin.PULL_UP)
buzzer = Pin(3, Pin.OUT)
led = Pin(25, Pin.OUT)
pushbutton_pressed = 0
blink_interrupted = 0
def set_neopixel_brightness(color):
r, g, b = color
r = int(r * BRIGHTNESS)
g = int(g * BRIGHTNESS)
b = int(b * BRIGHTNESS)
return (r, g, b)
def set_neopixel_color(r,g,b):
color = (r,g,b)
color = set_neopixel_brightness(color)
led_strip.fill(color)
led_strip.write()
set_neopixel_color(0,0,0)
def loop_neopixel():
# Display red
color = (255, 0, 0) # Red color
color = set_neopixel_brightness(color)
led_strip.fill(color)
led_strip.write()
time.sleep(1)
# Display green
color = (0, 255, 0) # Green color
color = set_neopixel_brightness(color)
led_strip.fill(color)
led_strip.write()
time.sleep(1)
# Display blue
color = (0, 0, 255) # Blue color
color = set_neopixel_brightness(color)
led_strip.fill(color)
led_strip.write()
time.sleep(1)
neopix_loop_dot_pos = 0
def neopixel_loop_dot():
global neopix_loop_dot_pos
color = (255, 0, 0)
black = (0, 0, 0)
color = set_neopixel_brightness(color)
led_strip[neopix_loop_dot_pos] = black
neopix_loop_dot_pos += 1
if neopix_loop_dot_pos > 9:
neopix_loop_dot_pos = 0
led_strip[neopix_loop_dot_pos] = color
led_strip.write()
time.sleep(0.2)
def lightup_led(index, color):
led_strip[index] = color
led_strip.write()
def blink_and_beep(times):
global pushbutton_pressed, blink_interrupted
blink_delay = 0.2
#insert beep
buzzer.value(1)
for i in range(0, times):
set_neopixel_color(255, 0, 0)
buzzer.value(0)
time.sleep(blink_delay)
set_neopixel_color(0, 0, 0)
buzzer.value(1)
time.sleep(blink_delay)
if pushbutton_pressed == 1:
pushbutton_pressed = 0
blink_interrupted = 1
i = times
buzzer.value(0)
return
buzzer.value(0)
ten_min_timer = 0
ten_min_timer_led_index = 11
def count_10_min():
global ten_min_timer, ten_min_timer_led_index, pushbutton_pressed, blink_interrupted
red = (255, 0, 0)
red = set_neopixel_brightness(red)
green = (0, 255, 0)
green = set_neopixel_brightness(green)
if ten_min_timer_led_index == 11:
return
if (ten_min_timer % 60) == 0:
if ten_min_timer_led_index == 10:
pushbutton_pressed = 0
blink_and_beep(15)
if blink_interrupted == 1:
blink_interrupted = 0
return
ten_min_timer_led_index = 11
led_strip[0] = green
led_strip[2] = green
led_strip[4] = green
led_strip[6] = green
led_strip[8] = green
led_strip.write()
return
lightup_led(ten_min_timer_led_index, red)
ten_min_timer_led_index += 1
ten_min_timer += 1
def button_callback(push_button):
global ten_min_timer, ten_min_timer_led_index, pushbutton_pressed
pushbutton_pressed = 1
ten_min_timer = 0
ten_min_timer_led_index = 0
set_neopixel_color(0,0,0)
count_10_min()
set_neopixel_color(0,0,0)
push_button.irq(trigger=Pin.IRQ_FALLING, handler=button_callback)
green = (0, 255, 0)
green = set_neopixel_brightness(green)
led_strip[0] = green
led_strip[2] = green
led_strip[4] = green
led_strip[6] = green
led_strip[8] = green
led_strip.write()
led_state = False
while True:
count_10_min()
time.sleep(1)
if led_state:
led.low()
led_state = False
else:
led.high()
led_state = True

View File

@ -1,408 +0,0 @@
# @Author: carlosgilgonzalez
# @Date: 2019-10-15T16:13:47+01:00
# @Last modified by: carlosgilgonzalez
# @Last modified time: 2019-10-15T16:56:27+01:00
# Original work:
# Adafruit PN532 NFC/RFID control library.
# Author: Tony DiCola
# Partial Port to Micropython:
# Micropython PN532 NFC/RFID control library.
# Author: Carlos Gil Gonzalez
"""
Micropython PN532 NFC/RFID control library (SPI)
https://github.com/Carglglz/NFC_PN532_SPI
"""
import time
from machine import Pin
from micropython import const
# __version__ = "0.0.0-auto.0"
# __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_PN532.git"
# pylint: disable=bad-whitespace
_PREAMBLE = const(0x00)
_STARTCODE1 = const(0x00)
_STARTCODE2 = const(0xFF)
_POSTAMBLE = const(0x00)
_HOSTTOPN532 = const(0xD4)
_PN532TOHOST = const(0xD5)
# PN532 Commands
_COMMAND_DIAGNOSE = const(0x00)
_COMMAND_GETFIRMWAREVERSION = const(0x02)
_COMMAND_GETGENERALSTATUS = const(0x04)
_COMMAND_SETSERIALBAUDRATE = const(0x10)
_COMMAND_SETPARAMETERS = const(0x12)
_COMMAND_SAMCONFIGURATION = const(0x14)
_COMMAND_INLISTPASSIVETARGET = const(0x4A)
_COMMAND_INDATAEXCHANGE = const(0x40)
_COMMAND_INCOMMUNICATETHRU = const(0x42)
_RESPONSE_INDATAEXCHANGE = const(0x41)
_RESPONSE_INLISTPASSIVETARGET = const(0x4B)
_WAKEUP = const(0x55)
_MIFARE_ISO14443A = const(0x00)
# Mifare Commands
MIFARE_CMD_AUTH_A = const(0x60)
MIFARE_CMD_AUTH_B = const(0x61)
MIFARE_CMD_READ = const(0x30)
MIFARE_CMD_WRITE = const(0xA0)
MIFARE_ULTRALIGHT_CMD_WRITE = const(0xA2)
# Known keys
KEY_DEFAULT_B = bytes([0xFF]*6)
_ACK = b'\x00\x00\xFF\x00\xFF\x00'
_FRAME_START = b'\x00\x00\xFF'
# pylint: enable=bad-whitespace
_SPI_STATREAD = const(0x02)
_SPI_DATAWRITE = const(0x01)
_SPI_DATAREAD = const(0x03)
_SPI_READY = const(0x01)
def _reset(pin):
"""Perform a hardware reset toggle"""
pin.init(Pin.OUT)
pin.value(True)
time.sleep(0.1)
pin.value(False)
time.sleep(0.5)
pin.value(True)
time.sleep(0.1)
class BusyError(Exception):
"""Base class for exceptions in this module."""
pass
def reverse_bit(num):
"""Turn an LSB byte to an MSB byte, and vice versa. Used for SPI as
it is LSB for the PN532, but 99% of SPI implementations are MSB only!"""
result = 0
for _ in range(8):
result <<= 1
result += (num & 1)
num >>= 1
return result
class PN532:
"""Driver for the PN532 connected over SPI. Pass in a hardware or bitbang
SPI device & chip select digitalInOut pin. Optional IRQ pin (not used),
reset pin and debugging output."""
def __init__(self, spi, cs_pin, irq=None, reset=None, debug=False):
"""Create an instance of the PN532 class using SPI"""
self.debug = debug
self._irq = irq
self.CSB = cs_pin
self._spi = spi
self.CSB.on()
if reset:
if debug:
print("Resetting")
_reset(reset)
try:
self._wakeup()
# self.get_firmware_version() # first time often fails, try 2ce
return
except (BusyError, RuntimeError):
pass
# self.get_firmware_version()
def _wakeup(self):
"""Send any special commands/data to wake up PN532"""
time.sleep(1)
self.CSB.off()
time.sleep_ms(2)
self._spi.write(bytearray([0x00]))
time.sleep_ms(2)
self.CSB.on() # pylint: disable=no-member
time.sleep(1)
def _wait_ready(self, timeout=1000):
"""Poll PN532 if status byte is ready, up to `timeout` milliseconds"""
status_query = bytearray([reverse_bit(_SPI_STATREAD), 0])
status = bytearray([0, 0])
timestamp = time.ticks_ms()
while time.ticks_diff(time.ticks_ms(), timestamp) < timeout:
time.sleep(0.02) # required
self.CSB.off()
time.sleep_ms(2)
self._spi.write_readinto(status_query, status)
time.sleep_ms(2)
self.CSB.on()
if reverse_bit(status[1]) == 0x01: # LSB data is read in MSB
return True # Not busy anymore!
else:
time.sleep(0.01) # pause a bit till we ask again
# Timed out!
return False
def _read_data(self, count):
"""Read a specified count of bytes from the PN532."""
# Build a read request frame.
frame = bytearray(count+1)
# Add the SPI data read signal byte, but LSB'ify it
frame[0] = reverse_bit(_SPI_DATAREAD)
time.sleep(0.02) # required
self.CSB.off()
time.sleep_ms(2)
self._spi.write_readinto(frame, frame)
time.sleep_ms(2)
self.CSB.on()
for i, val in enumerate(frame):
frame[i] = reverse_bit(val) # turn LSB data to MSB
if self.debug:
print("DEBUG: _read_data: ", [hex(i) for i in frame[1:]])
return frame[1:] # don't return the status byte
def _write_data(self, framebytes):
"""Write a specified count of bytes to the PN532"""
# start by making a frame with data write in front,
# then rest of bytes, and LSBify it
rev_frame = [reverse_bit(x)
for x in bytes([_SPI_DATAWRITE]) + framebytes]
if self.debug:
print("DEBUG: _write_data: ", [hex(i) for i in rev_frame])
time.sleep(0.02) # required
self.CSB.off()
time.sleep_ms(2)
self._spi.write(bytes(rev_frame)) # pylint: disable=no-member
time.sleep_ms(2)
self.CSB.on()
def _write_frame(self, data):
"""Write a frame to the PN532 with the specified data bytearray."""
assert data is not None and 1 < len(
data) < 255, 'Data must be array of 1 to 255 bytes.'
# Build frame to send as:
# - Preamble (0x00)
# - Start code (0x00, 0xFF)
# - Command length (1 byte)
# - Command length checksum
# - Command bytes
# - Checksum
# - Postamble (0x00)
length = len(data)
frame = bytearray(length+8)
frame[0] = _PREAMBLE
frame[1] = _STARTCODE1
frame[2] = _STARTCODE2
checksum = sum(frame[0:3])
frame[3] = length & 0xFF
frame[4] = (~length + 1) & 0xFF
frame[5:-2] = data
checksum += sum(data)
frame[-2] = ~checksum & 0xFF
frame[-1] = _POSTAMBLE
# Send frame.
if self.debug:
print('DEBUG: _write_frame: ', [hex(i) for i in frame])
self._write_data(bytes(frame))
def _read_frame(self, length):
"""Read a response frame from the PN532 of at most length bytes in size.
Returns the data inside the frame if found, otherwise raises an exception
if there is an error parsing the frame. Note that less than length bytes
might be returned!
"""
# Read frame with expected length of data.
response = self._read_data(length+8)
if self.debug:
print('DEBUG: _read_frame:', [hex(i) for i in response])
# Swallow all the 0x00 values that preceed 0xFF.
offset = 0
while response[offset] == 0x00:
offset += 1
if offset >= len(response):
raise RuntimeError(
'Response frame preamble does not contain 0x00FF!')
if response[offset] != 0xFF:
raise RuntimeError(
'Response frame preamble does not contain 0x00FF!')
offset += 1
if offset >= len(response):
raise RuntimeError('Response contains no data!')
# Check length & length checksum match.
frame_len = response[offset]
if (frame_len + response[offset+1]) & 0xFF != 0:
raise RuntimeError(
'Response length checksum did not match length!')
# Check frame checksum value matches bytes.
checksum = sum(response[offset+2:offset+2+frame_len+1]) & 0xFF
if checksum != 0:
raise RuntimeError(
'Response checksum did not match expected value: ', checksum)
# Return frame data.
return response[offset+2:offset+2+frame_len]
def call_function(self, command, response_length=0, params=[], timeout=1000): # pylint: disable=dangerous-default-value
"""Send specified command to the PN532 and expect up to response_length
bytes back in a response. Note that less than the expected bytes might
be returned! Params can optionally specify an array of bytes to send as
parameters to the function call. Will wait up to timeout seconds
for a response and return a bytearray of response bytes, or None if no
response is available within the timeout.
"""
# Build frame data with command and parameters.
data = bytearray(2+len(params))
data[0] = _HOSTTOPN532
data[1] = command & 0xFF
for i, val in enumerate(params):
data[2+i] = val
# Send frame and wait for response.
try:
self._write_frame(data)
except OSError:
self._wakeup()
return None
if not self._wait_ready(timeout):
if(self.debug):
print('DEBUG: _wait_ready timed out waiting for ACK')
return None
# Verify ACK response and wait to be ready for function response.
if not _ACK == self._read_data(len(_ACK)):
raise RuntimeError('Did not receive expected ACK from PN532!')
if not self._wait_ready(timeout):
if(self.debug):
print('DEBUG: _wait_ready timed out waiting for response')
return None
# Read response bytes.
response = self._read_frame(response_length+2)
if(self.debug):
print('DEBUG: call_function response:', [hex(i) for i in response])
# Check that response is for the called function.
if not (response[0] == _PN532TOHOST and response[1] == (command+1)):
raise RuntimeError('Received unexpected command response!')
# Return response data.
return response[2:]
def get_firmware_version(self):
"""Call PN532 GetFirmwareVersion function and return a tuple with the IC,
Ver, Rev, and Support values.
"""
response = self.call_function(
_COMMAND_GETFIRMWAREVERSION, 4, timeout=500)
if response is None:
raise RuntimeError('Failed to detect the PN532')
return tuple(response)
def SAM_configuration(self): # pylint: disable=invalid-name
"""Configure the PN532 to read MiFare cards."""
# Send SAM configuration command with configuration for:
# - 0x01, normal mode
# - 0x14, timeout 50ms * 20 = 1 second
# - 0x01, use IRQ pin
# Note that no other verification is necessary as call_function will
# check the command was executed as expected.
self.call_function(_COMMAND_SAMCONFIGURATION,
params=[0x01, 0x14, 0x01])
def read_passive_target(self, card_baud=_MIFARE_ISO14443A, timeout=1000):
"""Wait for a MiFare card to be available and return its UID when found.
Will wait up to timeout seconds and return None if no card is found,
otherwise a bytearray with the UID of the found card is returned.
"""
# Send passive read command for 1 card. Expect at most a 7 byte UUID.
try:
response = self.call_function(_COMMAND_INLISTPASSIVETARGET,
params=[0x01, card_baud],
response_length=19,
timeout=timeout)
except BusyError:
return None # no card found!
# If no response is available return None to indicate no card is present.
if response is None:
return None
# Check only 1 card with up to a 7 byte UID is present.
if response[0] != 0x01:
raise RuntimeError('More than one card detected!')
if response[5] > 7:
raise RuntimeError('Found card with unexpectedly long UID!')
# Return UID of card.
return response[6:6+response[5]]
def ntag2xx_write_block(self, block_number, data):
"""Write a block of data to the card. Block number should be the block
to write and data should be a byte array of length 4 with the data to
write. If the data is successfully written then True is returned,
otherwise False is returned.
"""
assert data is not None and len(
data) == 4, 'Data must be an array of 4 bytes!'
# Build parameters for InDataExchange command to do NTAG203 classic write.
params = bytearray(3+len(data))
params[0] = 0x01 # Max card numbers
params[1] = MIFARE_ULTRALIGHT_CMD_WRITE
params[2] = block_number & 0xFF
params[3:] = data
# Send InDataExchange request.
response = self.call_function(_COMMAND_INDATAEXCHANGE,
params=params,
response_length=1)
return response[0] == 0x00
def ntag2xx_read_block(self, block_number):
"""Read a block of data from the card. Block number should be the block
to read. If the block is successfully read a bytearray of length 16 with
data starting at the specified block will be returned. If the block is
not read then None will be returned.
"""
return self.mifare_classic_read_block(block_number)[0:4] # only 4 bytes per page
def mifare_classic_read_block(self, block_number):
"""Read a block of data from the card. Block number should be the block
to read. If the block is successfully read a bytearray of length 16 with
data starting at the specified block will be returned. If the block is
not read then None will be returned.
"""
# Send InDataExchange request to read block of MiFare data.
response = self.call_function(_COMMAND_INDATAEXCHANGE,
params=[0x01, MIFARE_CMD_READ,
block_number & 0xFF],
response_length=17)
# Check first response is 0x00 to show success.
if response[0] != 0x00:
return None
# Return first 4 bytes since 16 bytes are always returned.
return response[1:]
def mifare_classic_authenticate_block(self, uid, block_number, key_number=MIFARE_CMD_AUTH_B, key=KEY_DEFAULT_B): # pylint: disable=invalid-name
"""Authenticate specified block number for a MiFare classic card. Uid
should be a byte array with the UID of the card, block number should be
the block to authenticate, key number should be the key type (like
MIFARE_CMD_AUTH_A or MIFARE_CMD_AUTH_B), and key should be a byte array
with the key data. Returns True if the block was authenticated, or False
if not authenticated.
"""
# Build parameters for InDataExchange command to authenticate MiFare card.
uidlen = len(uid)
keylen = len(key)
params = bytearray(3 + uidlen + keylen)
params[0] = 0x01 # Max card numbers
params[1] = key_number & 0xFF
params[2] = block_number & 0xFF
params[3 : 3 + keylen] = key
params[3 + keylen :] = uid
# Send InDataExchange request and verify response is 0x00.
response = self.call_function(
_COMMAND_INDATAEXCHANGE, params=params, response_length=1
)
return response[0] == 0x00

View File

@ -1,214 +0,0 @@
import NFC_PN532 as nfc
import neopixel
import time
import sys
import select
from machine import Pin, SPI
#neopixel
ws_pin = 0
led_num = 8
BRIGHTNESS = 0.2 # Adjust the brightness (0.0 - 1.0)
led_strip = neopixel.NeoPixel(Pin(ws_pin), led_num)
def set_neopixel_brightness(color):
r, g, b = color
r = int(r * BRIGHTNESS)
g = int(g * BRIGHTNESS)
b = int(b * BRIGHTNESS)
return (r, g, b)
def set_neopixel_color(r,g,b):
color = (r,g,b)
color = set_neopixel_brightness(color)
led_strip.fill(color)
led_strip.write()
set_neopixel_color(0,0,0)
# SPI
spi_dev = SPI(0, baudrate=1000000)
cs = Pin(17, Pin.OUT)
cs.on()
# SENSOR INIT
pn532 = nfc.PN532(spi_dev,cs)
ic, ver, rev, support = pn532.get_firmware_version()
#print('Found PN532 with firmware version: {0}.{1}'.format(ver, rev))
# Configure PN532 to communicate with MiFare cards
pn532.SAM_configuration()
# FUNCTION TO READ NFC
def read_nfc(dev, tmot):
"""Accepts a device and a timeout in millisecs """
print('Reading...')
uid = dev.read_passive_target(timeout=tmot)
if uid is None:
print('CARD NOT FOUND')
else:
numbers = [i for i in uid]
string_ID = '{}-{}-{}-{}'.format(*numbers)
print('Found card with UID:', [hex(i) for i in uid])
print('Number_id: {}'.format(string_ID))
def loop_neopixel():
# Display red
color = (255, 0, 0) # Red color
color = set_neopixel_brightness(color)
led_strip.fill(color)
led_strip.write()
time.sleep(1)
# Display green
color = (0, 255, 0) # Green color
color = set_neopixel_brightness(color)
led_strip.fill(color)
led_strip.write()
time.sleep(1)
# Display blue
color = (0, 0, 255) # Blue color
color = set_neopixel_brightness(color)
led_strip.fill(color)
led_strip.write()
time.sleep(1)
def read_nfc_loop():
sys.stdout.write('Waiting for RFID/NFC card to read!\r')
set_neopixel_color(255,0,0)
while True:
# Check if a card is available to read
uid = pn532.read_passive_target(timeout=0.5)
# Try again if no card is available.
if uid is not None:
break
set_neopixel_color(255,255,0)
ntag_string = 'Data: '
sys.stdout.write('Reading ntag \r')
leds_on = 0
for page in range(20,40):
try:
ntag2xx_page = pn532.ntag2xx_read_block(page)
if (page % 2) == 0:
if page == 0:
pass
elif page == 2:
pass
else:
led_strip[leds_on] = (0,0,255)
leds_on += 1
if leds_on > 7:
leds_on = 7
led_strip.write()
if ntag2xx_page is not None:
for char in ntag2xx_page:
ntag_string += chr(char)
else:
sys.stdout.write('Error reading card\r')
return 1
except:
sys.stdout.write('Error reading card\r')
return 1
set_neopixel_color(0,255,0)
sys.stdout.write(ntag_string + '\r')
time.sleep(3)
return 0
#print('PAGE ',page,': ',[chr(x) for x in ntag2xx_page])
def write_nfc_loop(data):
content = data.encode('utf-8')
length = len(content)
pages = int(length / 4)
if (length % 4) != 0:
pages += 1
sys.stdout.write("Waiting for RFID/NFC card to write to!\r")
set_neopixel_color(255,0,0)
while True:
# Check if a card is available to read
uid = pn532.read_passive_target(timeout=0.5)
# Try again if no card is available.
if uid is not None:
break
set_neopixel_color(255,255,0)
sys.stdout.write('Erasing card\r')
for page in range(20,41):
content_erase = b'\x00\x00\x00\x00'
pn532.ntag2xx_write_block(page, content_erase)
sys.stdout.write('Writing card\r')
for page in range(20,20 + pages):
content_slice = bytearray(4)
for i in range(0,4):
try:
content_slice[i] = (content[i + 4 * (page - 20)])
except:
content_slice[i] = 0
#content_slice.append(content[i + 4 * (page - 20)])
print(content_slice)
pn532.ntag2xx_write_block(page, content_slice)
sys.stdout.write('Write done\r')
set_neopixel_color(0,255,0)
def loop():
poll_results = poll_obj.poll(1)
if poll_results:
rw = sys.stdin.readline().strip()
sys.stdout.write("received data: " + rw + "\r")
rw = rw.lower()
if rw == 'w':
while True:
sys.stdout.write('ID: \r')
poll_results = poll_obj.poll(1)
data = sys.stdin.readline().strip()
write_nfc_loop(data)
elif rw == 'r':
while True:
ret = read_nfc_loop()
if ret == 255:
set_neopixel_color(0,0,255)
rw = None
return 1
elif rw == '':
while True:
ret = read_nfc_loop()
if ret == 255:
set_neopixel_color(0,0,255)
rw = None
return 1
else:
sys.stdout.write('Invalid option\r')
poll_obj = select.poll()
poll_obj.register(sys.stdin, select.POLLIN)
set_neopixel_color(0,0,255)
while True:
poll_results = poll_obj.poll(1)
if poll_results:
while True:
try:
ret = loop()
if ret == 1:
poll_results = None
break
except:
set_neopixel_color(0,0,255)
break
else:
continue
#except:
# set_neopixel_color(0,0,0)

View File

@ -1,11 +0,0 @@
Jan_Cada 37.30186375000012
Adam_Krejsa 37.911874899999994
Lukas_Bouchal 40.46594706666668
Lucie_Ponocna 40.77001086666654
Michal_Dolezal 48.86233890000003
Vojta_Flekr 49.97398888333325
David_Bedrnicek 55.68816689999985
David_Hubalek 65.28151173333329
Jenda 78.040001050000136
Nacelnik 31.216666667