Skip to the content
PCBKitNew board
2 layers85.6 × 54 mmWallet dmm, the printed circuit board in 3D

A multimeter the size of a credit card: DC volts, resistance, continuity and diode test, shown on a 0.91" OLED, with three buttons, an RGB LED and a piezo beeper.

Size
85.6 × 54 mm
Copper layers
2
Thickness
0.8 mm
Parts
70
Nets
58
Pads
217
Tracks, vias
499, 147
Pours
2
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
21 Jul 2024
Updated
2 Oct 2026

Overview

Wallet dmm is an open-source printed circuit board by ArgonautGit, from the ArgonautGit/wallet_dmm repository on GitHub. It is a 2-layer board of 85.6 × 54 mm with 70 parts on 58 nets, routed with 499 tracks and 147 vias.

It is built around the STM32L051K8T6, MCP73831T-2ACI/OT-HXY and TL431AIDBZR, with the XC6206P302MR-G, CC0603KRX7R9BB104 and BAV199,215-JSM among its other parts. Its parts include 30 resistors, 14 capacitors, 5 connectors, 5 switches and 4 ICs. It belongs with the STM32 boards of this library.

Main components

12

README

README.md

wallet_dmm

A multimeter the size of a credit card: DC volts, resistance, continuity and diode test, shown on a 0.91" OLED, with three buttons, an RGB LED and a piezo beeper. It runs from a small LiPo that charges over USB-C and is built around an STM32L051K8, with Rust firmware and a simulation of the whole thing.

The assembled board

This is revision 3. Rev 1 (the October 2024 JLCPCB order) is commit a01ea68; rev 2 is the v2 branch.

InputsCOM, V (10 MΩ) and Ω (resistance, continuity, diode) on a 2.54 mm header
Voltage−30 V to +31 V; negative readings through a 1.55 V mid-rail bias
Resistance0–200 kΩ against a 0.1 % 10 kΩ reference, 150 kΩ–10 MΩ against 1 MΩ, autoranging
Continuity, diode0.3 mA test current, open-circuit 3.0 V
Overloadboth inputs survive ±30 V DC; not for mains or anything above 30 V
Power3.7 V LiPo (protected cell), 100 mA USB-C charging, 3.0 V rail, about 5 µA off
Board85.6 × 54 mm (ID-1 card), 2 layers, 0.8 mm FR4

Changes from rev 1 and rev 2

  • Power. The CR1025 (rated 0.1 mA continuous) could not run an OLED. It is replaced by a LiPo charged from USB-C (MCP73831), a 1 µA 3.0 V LDO that stays on while the MCU sleeps in Stop mode, a slide switch that disconnects the battery, bulk decoupling, and a load switch (Q1/Q2) that cuts the OLED module's supply.
  • Piezo. The always-running 555 and its two MOSFETs are gone. The MCU drives the piezo push-pull from TIM22 CH1/CH2 on PB4/PB5, which gives 6 Vp-p from 3 V and draws nothing when silent.
  • Programming. SWD is on PA13/PA14 with NRST, with nothing else on those pins. USART1 (PA9/PA10, also the ROM bootloader) is on test pads.
  • Measurement. Separate V and Ω inputs. The V input is a 9.87 MΩ divider biased to a mid-rail reference, with a hold capacitor because the ADC wants a source below 50 kΩ. The Ω input has two reference ranges; its drive nodes are clamped to ground and the battery, so a voltage on it pushes at most 2.5 mA into the cell instead of into the MCU or the 3.0 V rail. What the MCU pins' own clamps still pass would lift the rail while the MCU sleeps (the LDO cannot sink current), so a TL431 (U4) holds it below 3.32 V.
  • Everything else. A resistor for each LED colour, with the anode on the battery so green and blue have headroom. The MCU's calibrated internal sensor replaces the TO-92 MCP9700. Decoupling sits at the pins. Every part is stocked by JLCPCB and carries its LCSC number. All libraries are in the repo.

Layout of the repository

  • hardware/: KiCad 10 project (schematic, board, project rules, footprints for the RGB LED and the OLED module, 3D models for every part)
  • scripts/: generators for the schematic, board and 3D models, the autorouter wrapper, the fab-file export and the renders
  • fab/: Gerbers, drill files, BOM and pick-and-place for JLCPCB, schematic and assembly PDFs
  • firmware/: Rust firmware and its simulation (see firmware/README.md)
  • docs/: renders of the board and the simulation results

Building

Everything runs in the dev shell (nix develop, or direnv).

sh
./scripts/build.sh          # schematic -> ERC -> board -> DRC -> fab/

The schematic and board are generated by scripts/gen_schematic.py and scripts/gen_pcb.py; edit those rather than the KiCad files, or the next build will overwrite the change. Tracks come from hardware/routes.json. After moving parts or changing the netlist, route again with Freerouting:

sh
kicad-cli sch export netlist --format kicadsexpr -o build/wallet_dmm.net hardware/wallet_dmm.kicad_sch
python3 scripts/autoroute.py build/wallet_dmm.net

The build stops on any ERC or DRC error and checks that the board matches the schematic.

The renders in docs/renders/ and a GLB of the populated board (build/wallet_dmm.glb, for any glTF viewer) come from:

sh
./scripts/render.sh

Most parts use KiCad's own 3D models; the switches, buzzer, USB-C socket and RGB LED use the manufacturers' models (via EasyEDA). The OLED module and the battery are drawn by scripts/gen_models.py, which lights the OLED's pixels with the firmware's volts screen:

sh
nix develop .#models -c uv run --with cadquery python scripts/gen_models.py

Ordering from JLCPCB

Upload fab/wallet_dmm-gerbers.zip: 2 layers, 0.8 mm, 1 oz, any colour, HASL lead-free or ENIG. For assembly, choose top side and upload fab/bom-jlcpcb.csv and fab/cpl-jlcpcb.csv. In the placement preview, check the orientation of U1 (pin 1 dot), U2, U3, Q1, Q2, D2, D3, D1 (cathode) and D4 (anode corner, the dot in the silkscreen) before confirming.

Solder these by hand afterwards:

  • J3: a 0.91" 128×32 SSD1306 I2C module, flat on the board, header pins cut short. Match the module's pin labels to the silkscreen (GND VCC SCL SDA).
  • J2: a 3-pin header or the probe leads (COM, V, Ω).
  • J5: the battery wires from the back, BAT+ to the square pad.
  • J4 stays empty; hold a header in it for an ST-Link, or solder one while developing.

Battery

A LiPo pouch cell with its own protection circuit, up to 30 × 40 × 4 mm, taped to the marked area on the back (no pins poke through there). Charging runs at 100 mA, so use 150 mAh or more; R3 sets the current (1000 V / R3).

Bring-up

  1. Before connecting anything, check that BAT and 3V0 (TP3, TP4) are not shorted to GND.
  2. Connect the battery and slide SW5 to ON. TP4 reads 2.94–3.06 V. If it reads 0 V, the switch is the other way round from the silkscreen: fix the labels in scripts/gen_pcb.py.
  3. Plug in USB-C: the CHG LED lights while the cell charges and goes out when it is full.
  4. Flash over SWD (ST-Link on J4: 3V0, SWDIO, SWCLK, NRST, GND). Holding RESET while connecting works if firmware has put the MCU to sleep.
  5. With the firmware running (firmware/README.md): short V to COM in DC V and hold C for 3 s to store the zero; do the same with the Ω leads in Ω mode. Then put 5–30 V on the V input, measure it with another meter, and send cal <volts> over the UART (TP2) to set the gain.

Firmware

The firmware is in firmware/: Rust and Embassy, with all the maths and the UI in a host-tested crate. Its README covers the buttons, calibration, flashing and the simulation. The pins:

PinUse
PA0 ADC_IN0E_LO: the low-range drive node, through R18
PA1 ADC_IN1VMID, the bias under the V divider
PA2VMID_EN: high while measuring volts
PA3OHM_HI: high-range drive (1 MΩ), analog otherwise
PA4 ADC_IN4V input divider
PA5 ADC_IN5Ω input, through R21 into C13
PA6OHM_LO: low-range drive (10 kΩ), analog otherwise
PA7VBUS present (high on USB)
PB1 ADC_IN9switched battery ÷ 2
PA8, PA15, PB3LED blue, red, green (low = on; PA15/PB3 are TIM2 CH1/CH2)
PB4, PB5piezo, TIM22 CH1/CH2 in antiphase, about 4 kHz
PB6, PB7I2C1 to the OLED (address 0x3C)
PC15OLED power: high = on
PA11, PA12, PC14buttons A, B, C to GND (enable pull-ups)
PA9, PA10USART1 TX/RX on TP1/TP2

Simulation

firmware/simulate.sh runs the front end in ngspice, feeds it through a model of the ADC into the firmware's own maths, and runs the release binary in Renode on an emulated STM32L051. Across 200 simulated boards with 1 % parts, calibrated volts are within ±4 mV up to ±5 V and ±33 mV at ±30 V, and ohms within ±0.34 % from 1 kΩ to 100 kΩ. The details and plots are in firmware/README.md and docs/simulation/.

The firmware's display in Renode, step by step

Renders

FrontBack, with the battery
FrontBack

Parts

70
QtyValueFootprintReferences
51kResistor_SMD:R_0603_1608MetricR4, R15, R16, R19, R25
4100nFCapacitor_SMD:C_0603_1608MetricC5, C6, C7, C10
410kResistor_SMD:R_0603_1608MetricR3, R5, R9, R18
41MResistor_SMD:R_0603_1608MetricR7, R8, R20, R30
41uFCapacitor_SMD:C_0603_1608MetricC3, C8, C12, C14
35.1kResistor_SMD:R_0603_1608MetricR1, R2, R14
2100kResistor_SMD:R_0603_1608MetricR22, R23
2220Resistor_SMD:R_0603_1608MetricR27, R28
24.7MResistor_SMD:R_1206_3216MetricR10, R11
24.7uFCapacitor_SMD:C_0603_1608MetricC1, C2
2BAV199Package_TO_SOT_SMD:SOT-23D2, D3
110k 0.1%Resistor_SMD:R_1206_3216MetricR17
110nFCapacitor_SMD:C_0603_1608MetricC9
110uFCapacitor_SMD:C_0603_1608MetricC4
115kResistor_SMD:R_0603_1608MetricR6
122nFCapacitor_SMD:C_0603_1608MetricC13
12N7002Package_TO_SOT_SMD:SOT-23Q2
1330Resistor_SMD:R_0603_1608MetricR26
1330kResistor_SMD:R_0603_1608MetricR29
13V0TestPoint:TestPoint_Pad_D1.5mmTP4
14.7kResistor_SMD:R_0603_1608MetricR13
1470kResistor_SMD:R_0603_1608MetricR12
147kResistor_SMD:R_0603_1608MetricR21
147nFCapacitor_SMD:C_0603_1608MetricC11
1680Resistor_SMD:R_0603_1608MetricR24
1AO3401APackage_TO_SOT_SMD:SOT-23Q1
1BATTTestPoint:TestPoint_Pad_D1.5mmTP3
1BUTTON AButton_Switch_SMD:SW_Push_1P1T_XKB_TS-1187ASW1
1BUTTON BButton_Switch_SMD:SW_Push_1P1T_XKB_TS-1187ASW2
1BUTTON CButton_Switch_SMD:SW_Push_1P1T_XKB_TS-1187ASW3
1CHG redLED_SMD:LED_0603_1608MetricD1
1GNDTestPoint:TestPoint_Pad_D1.5mmTP5
1LiPo 3.7 VConnector_Wire:SolderWire-0.25sqmm_1x02_P4.5mm_D0.65mm_OD2mmJ5
1MCP73831T-2ACI/OTPackage_TO_SOT_SMD:SOT-23-5U2
1OLED 0.91in 128x32 I2Cwallet_dmm:OLED_0.91in_128x32_ModuleJ3
1PKLCS1212E4001Buzzer_Beeper:Buzzer_Murata_PKLCS1212EBZ1
1POWERButton_Switch_SMD:SW_SPDT_Shouhan_MSK12C02SW5
1PROBESConnector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_VerticalJ2
1RESETButton_Switch_SMD:SW_Push_1P1T_XKB_TS-1187ASW4
1RGBwallet_dmm:LED_RGB_1615_CAD4
1STM32L051K8T6Package_QFP:LQFP-32_7x7mm_P0.8mmU1
1SWDConnector_PinHeader_2.54mm:PinHeader_1x05_P2.54mm_VerticalJ4
1TL431AIDBZRPackage_TO_SOT_SMD:SOT-23U4
1UART_RXTestPoint:TestPoint_Pad_D1.5mmTP2
1UART_TXTestPoint:TestPoint_Pad_D1.5mmTP1
1USB-C (charge only)Connector_USB:USB_C_Receptacle_HRO_TYPE-C-31-M-12J1
1XC6206P302MR (3.0 V)Package_TO_SOT_SMD:SOT-23-3U3

Questions

How big is the Wallet dmm PCB?

It measures 85.6 × 54 mm and has 2 copper layers, 0.8 mm thick.

What parts does the Wallet dmm use?

70 parts, built around the STM32L051K8T6, MCP73831T-2ACI/OT-HXY, TL431AIDBZR and XC6206P302MR-G. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.

Where can I download the Wallet dmm KiCad files?

From the ArgonautGit/wallet_dmm repository on GitHub, at the commit this page was made from: the board is hardware/wallet_dmm.kicad_pcb and its schematic hardware/wallet_dmm.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Wallet dmm design in my own project?

Its repository states no licence, so its author keeps all rights: ask ArgonautGit before reusing the design.

Similar boards

  • 2 layers112 × 202 mmRIAA, the printed circuit board in 3D

    RIAA

    leicht-io/BeoGram-4002-RIAA

    Open-source RIAA phono preamp for the Bang & Olufsen BeoGram 4002/4004 turntable (KiCad)

    63 parts5CERN-OHL-S-2.0
  • 2 layers100 × 100 mmIo card, the printed circuit board in 3D

    Io card

    czalinski/ThlHats

    Test devices with Raspberry PI HAT form factor

    139 partsMIT
  • 2 layers64 × 46 mmWeatherframe, the printed circuit board in 3D

    Weatherframe

    amselgesang/weatherframe_v01

    My weather station hardver

    50 partsMIT
  • 2 layers54.6 × 14 mmSlotag v0p1, the printed circuit board in 3D

    Slotag v0p1

    lab11/slocalization

    High-Fidelity Localization of Slow Energy-Harvesting Tags

    28 parts8
  • 4 layers60.7 × 27.2 mmKyberBoard, the printed circuit board in 3D

    KyberBoard

    lowdrant/kyber

    Extending/Retracting Lightsaber CAD/FW/EDA

    71 parts2AGPL-3.0
  • 4 layers66.1 × 66.5 mmLight Doorbell KiCad, the printed circuit board in 3D

    Light Doorbell KiCad

    Estylos/Light-Doorbell-HW

    KiCad project for a custom, battery-powered doorbell with dual-color LED feedback and 4-layer circular PCB design. Optimized for low power and compact integration

    87 parts1MIT
  • 2 layers101 × 101.5 mmSensor panels, the printed circuit board in 3D

    Sensor panels

    pluyckx/SensorPcb

    A repository for the Kicad project of the sensor pcb

    316 parts