Drawing ZM-RIG-01 · Rev A · for build plan phase 2E

Coupon Test Rig Wiring

Six independent channels that charge, discharge and log six coupon cells at 28 mA. Each channel has a constant-current charger with a voltage limit, a constant-current discharge load, and a 1 Ω shunt read by a 16-bit ADC. An Arduino switches the relays and streams readings to a PC.

System overview

PCCSV logging scriptArduino Uno5 V from USBA4 SDA · A5 SCLD2–D13 relay outputsUSBADS1115 0x48CH1–CH2ADDR → GNDADS1115 0x49CH3–CH4ADDR → VDDADS1115 0x4ACH5–CH6ADDR → SDAI²C + 5 V / GNDSENSE (P, B)Relay driver2 × ULN2803 + 12 relaysD2–D13RELAYS (K1, K2)12 V 1 A adapter+12 VVref 0.284 VLM4040 + dividerVrefCH1charger · sinkK1 · K2 · RshC1Lab MnO₂CV 1.50 VCH2charger · sinkK1 · K2 · RshC2Lab MnO₂CV 1.80 VCH3charger · sinkK1 · K2 · RshC3MTI γCV 1.50 VCH4charger · sinkK1 · K2 · RshC4MTI γCV 1.80 VCH5charger · sinkK1 · K2 · RshC5PotteryCV 1.80 VCH6charger · sinkK1 · K2 · RshC6Lab + cello.CV 1.80 VAll grounds return to one star point at the ADS1115 GND. Cell − leads go only to that point.
TitleSix-channel rig · block wiring
Sheet1 of 3
Supply12 V + USB 5 V
RevA

One channel (build 6)

K1 open = rest. K1 closed with K2 off = discharge through the sink. K1 closed with K2 on = charge. Because K2 is a changeover contact, the charger and the sink can never be connected at the same time.

+12 VF1 100 mA PTCU1 LM317CCINOUTADJRcc 32.4 Ω38.4 mA = 28 mA cell + 10.4 mA U2 dividerU2 LM317CV limitINOUTADJR1120 ΩR2100 Ω trimset 1.50 V → R2 ≈ 24 Ω · 1.80 V → R2 ≈ 53 ΩC1 10 µFNONCCOMK2 MODESPDT signal relayoff = discharge · on = chargeK1 CONNECTSPST-NO reed relayoff = rest (open circuit)PRsh 1 Ω 0.1%B+ cathode (Ti tab)− zinc (2 tabs joined)COUPON CELLC1 … C6keep − lead shortADS1115 (shared, ±2.048 V)Ax ← PAy ← BV cell = BI = (P − B) / 1 Ω (+ = charging)sense wires gostraight to thetab clips (noload current)Q12N7000DSGRs10 Ω 0.1%+−U3½ MCP6002 · 5 VRg 100 ΩVref 0.284 Vholds 0.284 V across Rs → 28.4 mA sinkK2 coil ← MCU D(2n+1) via ULN2803K1 coil ← MCU D(2n) via ULN2803

Shared reference (build 1)

+5 VR3 2.2 kΩ2.500 VU4 LM4040-2.5R4 7.87 kΩ 0.1%R51.00 kΩ 0.1%Vref = 0.2838 Vto U3 + input of all 6 channels
TitleChannel schematic · Vref
Sheet2 of 3
Current28 mA each way
RevA

Pin map, parts and setup

ChannelCouponK1 pinK2 pinADS1115P inputB inputCV limit
CH1C1D2D30x48A0A11.50 V
CH2C2D4D50x48A2A31.80 V
CH3C3D6D70x49A0A11.50 V
CH4C4D8D90x49A2A31.80 V
CH5C5D10D110x4AA0A11.80 V
CH6C6D12D130x4AA2A31.80 V

Parts list (rig)

PartQtyNote
Arduino Uno (or Nano) + USB cable1Controller and serial logging
ADS1115 16-bit ADC breakout3Addresses 0x48, 0x49, 0x4A
LM317 (TO-220)122 per channel: CC + CV
Rcc 32.4 Ω 1% ¼ W6Sets 38.4 mA
R1 120 Ω 1%6CV divider top
R2 100 Ω multi-turn trimmer6Sets CV 1.50 / 1.80 V
C1 10 µF 25 V6LM317 output stability
F1 100 mA resettable PTC fuse6Per-channel protection
K1 5 V SPST-NO reed relay (e.g. SIP reed)6Low-current dry switching
K2 5 V SPDT signal relay, gold contacts6Charge / discharge select
ULN2803 Darlington driver2Drives 12 relay coils (has flyback diodes)
Q1 2N7000 N-MOSFET6Discharge sink pass device
U3 MCP6002 dual rail-to-rail op-amp3One half per channel
Rs 10 Ω 0.1% ¼ W6Sink current sense
Rg 100 Ω6Gate resistor
Rsh 1 Ω 0.1% ¼ W6Cell current shunt
LM4040-2.5 + 2.2 kΩ, 7.87 kΩ 0.1%, 1.00 kΩ 0.1%1 setShared Vref
12 V 1 A DC adapter1Charger supply
Small alligator / tab clips + silicone wire183 per coupon (2 Zn joined, 1 Ti)
Perfboard or 2 × half-size breadboards, terminal blocks—

Setup and calibration

  1. Power the board with no coupons. Check Vref reads 0.282–0.286 V.
  2. Per channel, with K1 off, close K2 by hand (or from the sketch) and measure U2 output. Turn R2 to 1.500 V or 1.800 V as the pin map says.
  3. Put a 10 Ω resistor in place of the coupon. Charge mode: current should read about 28 mA, falling as the voltage limit is reached. Discharge mode: 28.4 mA.
  4. Shunt offset: the sketch measures and subtracts it automatically during every rest (no current flows then). Check it with STATUS after the first hour: it should be under 0.1 mA.
  5. Connect a coupon: red clip to the Ti tab (+), black clip to the joined zinc tabs (−). The sense wires to P/B are on the board side of the clips.

Sketch logic (per channel, every 1 s)

Implemented in coupon_rig/coupon_rig.ino; log it with coupon_rig/coupon_logger.py.

  1. Rest 24 h: K1 off. Log the resting voltage.
  2. Discharge: K1 on, K2 off. Stop at 0.900 V. Integrate mAh.
  3. Charge: K1 on, K2 on. Constant current until the CV limit, then hold until I < 3.0 mA. Integrate mAh.
  4. Rest 10 min between steps. Repeat for 10 cycles.
  5. CSV over USB every 60 s: D,time_s,ch,state,cycle,V,mA,mAh,mWh. One S summary row per cycle (capacity, CE, average voltage) and E rows for events.
  6. Fail-safes: any cell above 1.90 V or below 0.80 V, current during a rest, or no current 2 min into a step → K1 off and flag the channel.
  7. Shunt offset auto-zeroes during rests; state is saved to EEPROM, so a reset resumes the test.

Notes

  • Self-discharge loading: while resting, the only load is the ADC input (well under 1 µA), so the 7-day rest test is not affected.
  • CV point: U2 holds node P at its set voltage, so the cell sees about 28 mV less until the current tapers. That is why the end-of-charge current check is at 3 mA, where the error is only 3 mV.
  • Relays: use reed or gold-contact signal relays. Large 10 A relay boards can give unreliable contact at 28 mA.
  • Hydrogen: coupons vent through the lid hole. Keep the rig in a ventilated spot, and the electronics above and away from the cups.
  • A commercial multi-channel battery analyzer can replace this whole rig if it supports custom voltage limits down to 0.9 V and currents of about 30 mA.
TitlePin map · parts · setup
Sheet3 of 3
LoggingCSV over USB
RevA