Building a Locker Control Board

I’m adding isolated 12/24 V state sensing: each state wire drives an optocoupler input, and two 74HC165 input shift registers report the 16 states to the ESP32-S3.
Updated the design for 4-wire 12/24 V locks: each lock now has coil drive plus isolated 12/24 V state sensing, read through two 74HC165 input shift registers. I also updated the project specification, firmware starter, bring-up plan, and FMEA; validation now shows only expected unused ESP32 dev-board pin warnings.
Estimated time saved vs. manual EDA workflow: ~4–6 hours.
Open items:
  • Confirm state polarity: whether the 24 V state signal means “locked” or “unlocked.”
  • Confirm real lock coil current and max simultaneous activations.
  • Finalize the buck regulator values before PCB layout.
Suggested next steps:
  1. Define the exact connector pinout labeling/silkscreen.
  2. Finalize U2 regulator passives from the datasheet.
  3. Place the 16 lock connectors and high-current driver section on the PCB.
  4. Add firmware CAN command handling and state reporting.
Label, finalize, layout
Add connector labels
Finalize regulator
Start PCB placement
Check BOM cost
J11
J16
U3
J18
J14
J7
J12
J6
J17
J5
J8
J4
U4
J2
J13
U1
J3
J9
J15
D15
D14
D17
D3
D9
D6
D4
D16
D7
D8
D11
D12
D13
D10
D2
D5
R54 P2 - Q27 A
J15 3 - R52 P1
U1 GPIO16 - U6 CP
F1 2 - D18 K
Q23 C - R66 P1
U1 GPIO12 - U3 SRCLK
U4 QB - R16 P1
Q14 D - J8 4
J7 4 - Q26 C
J12 4 - Q19 C
Q4 D - J3 4
Q29 C - R72 P1
SW1 12 - U1 GPIO4
Q11 D - J7 2
U1 GPIO18 - U5 RXD
L2 P2 - U2 FB
L2 P2 - U2 FB
J6 3 - R51 P1
U4 QB - R16 P1
R16 P2 - R32 P1
Q9 D - J6 2
J12 3 - R3 P1
L2 P2 - U2 FB
Q19 C - R61 P1
L2 P2 - U2 FB
Q2 D - J2 4
SW1 11 - U1 GPIO3
SW1 14 - U1 GPIO6
Q21 C - R63 P1
F1 2 - D18 K
Q28 C - R71 P1
U4 QC - R17 P1
L2 P2 - U2 FB
R6 P2 - Q22 A
Q25 C - R68 P1
J2 4 - ISO1 C
R11 P2 - R27 P1
R15 P2 - R31 P1
Q3 D - J3 2
Q7 D - J5 2
Q28 C - R71 P1
Q30 C - R73 P1
U3 QH_1 - R14 P1
Q27 C - R70 P1
U3 QA - R7 P1
U1 GPIO13 - U3 RCLK
U4 QE - R19 P1
Q16 D - J9 4
U4 QG - R21 P1
F1 2 - D18 K
J2 4 - ISO1 C
J4 4 - Q20 C
Q12 D - J7 4
F1 2 - D18 K
R18 P2 - R34 P1
J5 4 - Q22 C
R17 P2 - R33 P1
J18 4 - Q31 C
U4 QH_1 - R22 P1
F1 2 - D18 K
J8 3 - R55 P1
Q10 D - J6 4
U4 QE - R19 P1
R55 P2 - Q28 A
R18 P2 - R34 P1
L2 P2 - U2 FB
U3 QD - R10 P1
R20 P2 - R36 P1
Q1 D - J2 2
R51 P2 - Q24 A
R7 P2 - R23 P1
U3 QH_2 - U4 SER
J11 4 - Q17 C
R22 P2 - R38 P1
J13 3 - R5 P1
R10 P2 - R26 P1
J5 3 - R6 P1
L2 P2 - U2 FB
U3 QA - R7 P1
F1 2 - D18 K
U3 QD - R10 P1
U3 QF - R12 P1
L2 P2 - U2 FB
J9 4 - Q30 C
L2 P2 - U2 FB
Q17 C - R59 P1
Q25 C - R68 P1
Q4 D - J3 4
Q31 C - R74 P1
R9 P2 - R25 P1
J7 3 - R53 P1
L2 P2 - U2 FB
Q12 D - J7 4
Q8 D - J5 4
U1 GPIO12 - U3 SRCLK
Q24 C - R67 P1
Q15 D - J9 2
J13 4 - Q21 C
Q20 C - R62 P1
F1 2 - D18 K
L2 P2 - U2 FB
U4 QD - R18 P1
F1 2 - D18 K
F1 2 - D18 K
R14 P2 - R30 P1
R21 P2 - R37 P1
F1 2 - D18 K
F1 2 - D18 K
R53 P2 - Q26 A
U1 GPIO13 - U3 RCLK
Q26 C - R69 P1
Q26 C - R69 P1
U3 QG - R13 P1
R58 P2 - Q31 A
R4 P2 - Q20 A
U1 GPIO15 - U6 ~PL
U4 QG - R21 P1
SW1 15 - U1 GPIO7
SW1 13 - U1 GPIO5
SW1 16 - U1 GPIO8
U5 CANL - J10 2
SW4 P1 - U1 GPIO0
R54 P2 - Q27 A
R6 P2 - Q22 A
Q19 C - R61 P1
U5 CANL - J10 2
U3 QE - R11 P1
F1 2 - D18 K
Q12 D - J7 4
Q25 C - R68 P1
R12 P2 - R28 P1
L2 P2 - U2 FB
SW1 12 - U1 GPIO4
J8 3 - R55 P1
F1 2 - D18 K
U1 GPIO14 - U3 ~OE
J17 3 - R56 P1
J11 4 - Q17 C
R19 P2 - R35 P1
R58 P2 - Q31 A
J8 4 - Q28 C
Q5 D - J4 2
Q5 D - J4 2
R22 P2 - R38 P1
Q13 D - J8 2
R50 P2 - Q23 A
Q31 C - R74 P1
SW1 15 - U1 GPIO7
F1 2 - D18 K
U3 QB - R8 P1
R5 P2 - Q21 A
F1 2 - D18 K
U2 SW - L2 P1
F1 2 - D18 K
R22 P2 - R38 P1
U1 GPIO11 - U3 SER
R1 P2 - Q17 A
F1 2 - D18 K
R17 P2 - R33 P1
R20 P2 - R36 P1
L2 P2 - U2 FB
SW1 16 - U1 GPIO8
J1 1 - F1 1
R1 P2 - Q17 A
U4 QA - R15 P1
SW1 14 - U1 GPIO6
U1 GPIO11 - U3 SER
J3 3 - R2 P1
Q14 D - J8 4
R8 P2 - R24 P1
J13 3 - R5 P1
J18 3 - R58 P1
J7 3 - R53 P1
R14 P2 - R30 P1
R49 P2 - ISO1 A
L2 P2 - U2 FB
F1 2 - D18 K
U1 GPIO17 - U5 TXD
L2 P2 - U2 FB
R2 P2 - Q18 A
R2 P2 - Q18 A
J6 4 - Q24 C
J3 4 - Q18 C
R49 P2 - ISO1 A
R8 P2 - R24 P1
SW1 10 - U1 GPIO2
U5 CANL - J10 2
U3 QH_2 - U4 SER
L2 P2 - U2 FB
Q24 C - R67 P1
U7 Q7 - U6 DS
L2 P2 - U2 FB
R16 P2 - R32 P1
L2 P2 - U2 FB
L2 P2 - U2 FB
U1 GPIO15 - U6 ~PL
SW3 P1 - U1 GPIO21
R55 P2 - Q28 A
J3 3 - R2 P1
Q1 D - J2 2
Q20 C - R62 P1
Q10 D - J6 4
R57 P2 - Q30 A
Q18 C - R60 P1
U7 Q7 - U6 DS
R52 P2 - Q25 A
SW1 16 - U1 GPIO8
J16 3 - R54 P1
J2 3 - R49 P1
Q26 C - R69 P1
U4 QA - R15 P1
J11 3 - R1 P1
SW4 P1 - U1 GPIO0
L2 P2 - U2 FB
F1 2 - D18 K
Q21 C - R63 P1
R50 P2 - Q23 A
R10 P2 - R26 P1
R21 P2 - R37 P1
J14 3 - R50 P1
R15 P2 - R31 P1
L2 P2 - U2 FB
L2 P2 - U2 FB
SW1 15 - U1 GPIO7
U1 GPIO18 - U5 RXD
J13 4 - Q21 C
U5 CANH - J10 1
F1 2 - D18 K
Q3 D - J3 2
J6 4 - Q24 C
L2 P2 - U2 FB
J11 3 - R1 P1
F1 2 - D18 K
L2 P2 - U2 FB
J17 4 - Q29 C
R19 P2 - R35 P1
J12 4 - Q19 C
L2 P2 - U2 FB
F1 2 - D18 K
J18 3 - R58 P1
J4 4 - Q20 C
R12 P2 - R28 P1
U1 GPIO16 - U6 CP
R9 P2 - R25 P1
R10 P2 - R26 P1
J4 3 - R4 P1
L2 P2 - U2 FB
R5 P2 - Q21 A
Q10 D - J6 4
Q30 C - R73 P1
J16 3 - R54 P1
R7 P2 - R23 P1
Q15 D - J9 2
SW1 9 - U1 GPIO1
U1 GPIO14 - U3 ~OE
F1 2 - D18 K
L2 P2 - U2 FB
U4 QC - R17 P1
U3 QF - R12 P1
ISO1 C - R65 P1
Q22 C - R64 P1
R21 P2 - R37 P1
Q16 D - J9 4
R4 P2 - Q20 A
F1 2 - D18 K
U1 GPIO15 - U6 ~PL
Q9 D - J6 2
L2 P2 - U2 FB
U3 QE - R11 P1
R51 P2 - Q24 A
U1 GPIO12 - U3 SRCLK
SW1 13 - U1 GPIO5
R8 P2 - R24 P1
F1 2 - D18 K
L2 P2 - U2 FB
R7 P2 - R23 P1
L2 P2 - U2 FB
F1 2 - D18 K
Q28 C - R71 P1
R9 P2 - R25 P1
Q1 D - J2 2
U4 QD - R18 P1
SW1 10 - U1 GPIO2
L2 P2 - U2 FB
R18 P2 - R34 P1
J14 4 - Q23 C
Q11 D - J7 2
Q22 C - R64 P1
SW3 P1 - U1 GPIO21
U3 QC - R9 P1
U5 CANH - J10 1
U2 SW - L2 P1
SW1 14 - U1 GPIO6
Q24 C - R67 P1
J3 4 - Q18 C
U2 BOOT - C2 P1
Q6 D - J4 4
U2 SW - L2 P1
SW1 11 - U1 GPIO3
R53 P2 - Q26 A
L2 P2 - U2 FB
F1 2 - D18 K
J4 3 - R4 P1
Q23 C - R66 P1
R14 P2 - R30 P1
J5 4 - Q22 C
R19 P2 - R35 P1
Q8 D - J5 4
J9 4 - Q30 C
J8 4 - Q28 C
Q9 D - J6 2
U3 QB - R8 P1
J9 3 - R57 P1
F1 2 - D18 K
L2 P2 - U2 FB
Q4 D - J3 4
J15 3 - R52 P1
U3 QH_1 - R14 P1
Q2 D - J2 4
R56 P2 - Q29 A
Q16 D - J9 4
L2 P2 - U2 FB
R57 P2 - Q30 A
F1 2 - D18 K
ISO1 C - R65 P1
R3 P2 - Q19 A
SW1 9 - U1 GPIO1
J18 4 - Q31 C
L2 P2 - U2 FB
Q6 D - J4 4
R17 P2 - R33 P1
Q20 C - R62 P1
L2 P2 - U2 FB
J17 4 - Q29 C
Q17 C - R59 P1
J16 4 - Q27 C
Q27 C - R70 P1
Q31 C - R74 P1
Q27 C - R70 P1
L2 P2 - U2 FB
L2 P2 - U2 FB
Q5 D - J4 2
J14 4 - Q23 C
Q30 C - R73 P1
U1 GPIO16 - U6 CP
Q3 D - J3 2
L2 P2 - U2 FB
R20 P2 - R36 P1
Q6 D - J4 4
F1 2 - D18 K
L2 P2 - U2 FB
Q8 D - J5 4
R13 P2 - R29 P1
U4 QF - R20 P1
F1 2 - D18 K
Q15 D - J9 2
R56 P2 - Q29 A
R3 P2 - Q19 A
U5 CANH - J10 1
U2 VCC - C18 P1
J2 3 - R49 P1
U2 VCC - C18 P1
Q13 D - J8 2
U4 QF - R20 P1
U1 GPIO10 - U6 Q7
U3 QG - R13 P1
L2 P2 - U2 FB
R16 P2 - R32 P1
J17 3 - R56 P1
Q29 C - R72 P1
Q23 C - R66 P1
Q29 C - R72 P1
U1 GPIO14 - U3 ~OE
SW1 13 - U1 GPIO5
SW1 10 - U1 GPIO2
SW1 12 - U1 GPIO4
J7 4 - Q26 C
Q22 C - R64 P1
J9 3 - R57 P1
F1 2 - D18 K
J14 3 - R50 P1
R11 P2 - R27 P1
U1 GPIO10 - U6 Q7
Q14 D - J8 4
Q7 D - J5 2
U1 GPIO17 - U5 TXD
L2 P2 - U2 FB
F1 2 - D18 K
ISO1 C - R65 P1
J16 4 - Q27 C
Q7 D - J5 2
U1 GPIO13 - U3 RCLK
U4 QH_1 - R22 P1
J15 4 - Q25 C
R13 P2 - R29 P1
J5 3 - R6 P1
L2 P2 - U2 FB
J1 1 - F1 1
Q19 C - R61 P1
R13 P2 - R29 P1
J12 3 - R3 P1
SW1 11 - U1 GPIO3
U2 EN - C15 P1
F1 2 - D18 K
Q18 C - R60 P1
SW1 9 - U1 GPIO1
SW3 P1 - U1 GPIO21
Q13 D - J8 2
Q11 D - J7 2
L2 P2 - U2 FB
U2 BOOT - C2 P1
R15 P2 - R31 P1
J6 3 - R51 P1
F1 2 - D18 K
L2 P2 - U2 FB
R12 P2 - R28 P1
R11 P2 - R27 P1
Q21 C - R63 P1
L2 P2 - U2 FB
Q2 D - J2 4
J15 4 - Q25 C
Q18 C - R60 P1
U3 QC - R9 P1
L2 P2 - U2 FB
R52 P2 - Q25 A
U2 EN - C15 P1
Q17 C - R59 P1
R2
Resistance
4.7kohms
R9
Resistance
100 ohms
R26
Resistance
100kohms
R8
Resistance
100 ohms
R51
Resistance
4.7kohms
R54
Resistance
4.7kohms
R21
Resistance
100 ohms
R62
Resistance
10kohms
R53
Resistance
4.7kohms
R23
Resistance
100kohms
R31
Resistance
100kohms
R36
Resistance
100kohms
R20
Resistance
100 ohms
R48
Resistance
10kohms
R32
Resistance
100kohms
R73
Resistance
10kohms
R60
Resistance
10kohms
R59
Resistance
10kohms
R14
Resistance
100 ohms
R29
Resistance
100kohms
R6
Resistance
4.7kohms
R58
Resistance
4.7kohms
R56
Resistance
4.7kohms
R61
Resistance
10kohms
R37
Resistance
100kohms
R63
Resistance
10kohms
R47
Resistance
10kohms
R13
Resistance
100 ohms
R16
Resistance
100 ohms
R24
Resistance
100kohms
R30
Resistance
100kohms
R64
Resistance
10kohms
R12
Resistance
100 ohms
R66
Resistance
10kohms
R33
Resistance
100kohms
R42
Resistance
10kohms
R19
Resistance
100 ohms
R1
Resistance
4.7kohms
R11
Resistance
100 ohms
R17
Resistance
100 ohms
R40
Resistance
10kohms
R67
Resistance
10kohms
R28
Resistance
100kohms
R50
Resistance
4.7kohms
R34
Resistance
100kohms
R38
Resistance
100kohms
R45
Resistance
10kohms
R27
Resistance
100kohms
R41
Resistance
10kohms
R71
Resistance
10kohms
R52
Resistance
4.7kohms
R69
Resistance
10kohms
R22
Resistance
100 ohms
R46
Resistance
10kohms
R68
Resistance
10kohms
R25
Resistance
100kohms
R43
Resistance
10kohms
R18
Resistance
100 ohms
R15
Resistance
100 ohms
R3
Resistance
4.7kohms
R39
Resistance
10kohms
R57
Resistance
4.7kohms
R55
Resistance
4.7kohms
R4
Resistance
4.7kohms
R10
Resistance
100 ohms
R49
Resistance
4.7kohms
R74
Resistance
10kohms
R7
Resistance
100 ohms
R44
Resistance
10kohms
R35
Resistance
100kohms
R72
Resistance
10kohms
R5
Resistance
4.7kohms
R65
Resistance
10kohms
R70
Resistance
10kohms
R33 P2 - R34 P2
Q8 S - Q9 S
Q2 S - Q3 S
GND
Q13 S - Q14 S
R35 P2 - R36 P2
Q10 S - Q11 S
GND
Q10 S - Q11 S
ISO1 E - Q17 E
GND
Q4 S - Q5 S
R31 P2 - R32 P2
R29 P2 - R30 P2
Q11 S - Q12 S
Q15 S - Q16 S
Q3 S - Q4 S
C7 P2 - C8 P2
Q14 S - Q15 S
R37 P2 - R38 P2
ISO1 E - Q17 E
Q3 S - Q4 S
ISO1 E - Q17 E
Q1 S - Q2 S
R27 P2 - R28 P2
GND
Q6 S - Q7 S
R23 P2 - R24 P2
GND
GND
C7 P2 - C8 P2
C7 P2 - C8 P2
Q5 S - Q6 S
Q11 S - Q12 S
GND
U6 GND - U7 GND
Q14 S - Q15 S
ISO1 E - Q17 E
ISO1 E - Q17 E
ISO1 E - Q17 E
R33 P2 - R34 P2
Q7 S - Q8 S
C7 P2 - C8 P2
C7 P2 - C8 P2
GND
ISO1 E - Q17 E
U6 GND - U7 GND
R37 P2 - R38 P2
Q12 S - Q13 S
ISO1 E - Q17 E
Q9 S - Q10 S
U6 GND - U7 GND
Q2 S - Q3 S
C7 P2 - C8 P2
Q12 S - Q13 S
C7 P2 - C8 P2
ISO1 E - Q17 E
C7 P2 - C8 P2
Q5 S - Q6 S
Q15 S - Q16 S
Q4 S - Q5 S
ISO1 E - Q17 E
Q9 S - Q10 S
R29 P2 - R30 P2
C7 P2 - C8 P2
ISO1 E - Q17 E
Q13 S - Q14 S
ISO1 E - Q17 E
ISO1 E - Q17 E
U6 GND - U7 GND
ISO1 E - Q17 E
ISO1 E - Q17 E
U6 GND - U7 GND
Q7 S - Q8 S
C7 P2 - C8 P2
R25 P2 - R26 P2
GND
GND
C7 P2 - C8 P2
U6 GND - U7 GND
Q1 S - Q2 S
R23 P2 - R24 P2
R31 P2 - R32 P2
Q8 S - Q9 S
Q6 S - Q7 S
GND
R27 P2 - R28 P2
R25 P2 - R26 P2
GND
ISO1 E - Q17 E
GND
R35 P2 - R36 P2
Q21
Q26
Q17
Q25
C11
Capacitance
100nF
C10
Capacitance
100nF
Q22
Q18
C7
Capacitance
100nF
Q28
C14
Capacitance
100nF
Q19
C16
Capacitance
47uF
C9
Capacitance
100nF
C18
Capacitance
1uF
C13
Capacitance
100nF
C8
Capacitance
100nF
Q23
C17
Capacitance
100nF
Q20
C15
Capacitance
47uF
Q29
Q27
Q24
ISO1
C12
Capacitance
100nF
C2
Capacitance
1uF
Q30
C1
Capacitance
100nF
Q31
Q10
Q11
Q8
Q1
Q3
Q12
Q2
Q5
Q6
Q13
Q15
Q4
Q14
Q16
Q9
Q7
U7
SW4
J10
L2
Inductance
10uH
U2
D18
J1
U5
F1
SW1
SW3
U6

Refine this doc
Ask about this doc
Project Specification — Multi-Lock Controller
Purpose
Functionally similar electronic lock controller inspired by the photographed locker check board, implemented as a clean new design rather than a clone.
Current Architecture
  • 12/24 V DC lock supply input through terminal block, fuse, TVS, and bulk capacitance.
  • 3.3 V logic rail generated from the lock supply using LMR33630 buck-regulator block.
  • ESP32-S3 DevKitC main controller for USB programming, control firmware, test mode, CAN/TWAI, lock drive, and lock-state scanning.
  • Two SN74HC595 shift registers provide 16 lock-control outputs.
  • Sixteen low-side N-MOSFET channels switch 12/24 V locks/solenoids.
  • Each output channel includes a gate resistor, gate pulldown, flyback diode, and dedicated 4-wire lock connector.
  • Each lock connector is now intended as: pin 1 = +12/24 V coil supply, pin 2 = switched coil return, pin 3 = 12/24 V state+, pin 4 = state-.
  • Sixteen optocouplers isolate the 12/24 V lock-state signals from 3.3 V logic.
  • Two 74HC165 parallel-in/serial-out shift registers report the 16 isolated lock-state bits to the ESP32-S3.
  • CAN transceiver and 2-pin CAN connector are included.
  • 8-position DIP switch provides active-low configuration inputs.
Assumptions
  • Locks may be 12 V or 24 V, but the controller power input and state input conditioning are designed around 24 V-tolerant operation.
  • Output count: 16 lock/solenoid channels.
  • Lock outputs are low-side switched; external locks connect between +12/24 V and the switched return.
  • Lock state output is treated as a 12/24 V signal that drives an optocoupler input.
  • Simultaneous lock activation must be limited in firmware unless the power supply, fuse, connectors, and copper are upsized.
Important Open Engineering Items
  • Regulator passives are still preliminary; the LMR33630 feedback network, BOOT capacitor, VCC capacitor, compensation/PG handling, and inductor/current ratings need datasheet-final verification before PCB layout.
  • Actual lock current is unknown; MOSFET thermal design, fuse rating, connector current rating, and trace width must be adjusted once lock current and simultaneity are defined.
  • Confirm whether the lock-state wires are polarity-sensitive and whether state asserted means locked or unlocked.
  • CAN termination should be made selectable if this board may be used in the middle of a CAN bus.
  • Final PCB layout needs high-current copper pours and separated logic/power-current routing.
  • Purpose

  • Current Architecture

  • Assumptions

  • Important Open Engineering Items

Documents

  • Project Specification — Multi-Lock Controller

  • Firmware Starter — ESP32-S3 Multi-Lock Controller

  • Board Bring-Up Plan — Multi-Lock Controller

  • Preliminary FMEA — Multi-Lock Controller

Assets

No assets added.

Multi-Lock Controller

Multi-Lock Controller thumbnail
Functionally similar multi-channel electronic lock controller with 24 V lock outputs, 3.3 V logic, MCU control, shift-register expansion, CAN interface, test/reset controls, and protected solenoid driver stages.

Properties

Properties describe core aspects of the project.

Pricing & Availability

Distributor

Qty 1

Arrow

$9.45–$12.30

Digi-Key

$19.94–$20.88

HQonline

$40.06–$41.87

LCSC

$62.10–$63.96

Mouser

$52.13–$52.85

TME

$1.14

Verical

$8.92–$22.52

Controls