Limonchito working document, published as-is. Prices and lead times are estimates from September 2026 and change often.
Lemon — electronics revision B
Status: 2026-09-17. Owner: electronics stream. This file is the reference for rev B hardware.
Where it disagrees with an older document, this file and lemon_totem.kicad_sch (regenerated
from gen_kicad_sch.py) win.
0. Firmware interface (read this first)
nRF9151 GPIO port 0, VDD_GPIO = 3.4 V (TPS62849 "3V3" rail). Pin numbers are nRF9151-LACA LGA pad numbers (taken from a shipping nRF9151 design, see §9 risk 1).
| GPIO | LGA pad | Net | Direction / electrical | DT alias (firmware already uses it) |
|---|---|---|---|---|
| P0.10 | 69 | SQZ_A | in, dome to GND, 1 MΩ pull-up, 100 nF, active low | sqz-a (unchanged) |
| P0.11 | 70 | SQZ_B | in, same as A | sqz-b (unchanged) |
| P0.12 | 72 | HAPT_EN | out, DRV2605L EN | haptic-en (unchanged) |
| P0.13 | 73 | AIN0 | analog, VBAT/2 via 1 MΩ/1 MΩ (after the reverse-polarity FET) | zephyr,user io-channels (unchanged) |
| P0.14 | 74 | CHG_STAT | in, now from BQ51013B CHG (open drain, 100 kΩ pull-up), low = on a Qi pad and power transfer active | chg-stat (unchanged, still active low; meaning changed, see note 2) |
| P0.15 | 75 | LED_HUG | out, active high, 1.0 kΩ series to D1 (≈1.5 mA at 100 %), PWM capable | led-hug → pwm-leds child on PWM0 ch0 |
| P0.16 | 77 | ACC_INT1 | in, LIS2DW12 INT1, push-pull, active high, no pull needed | accel → st,lis2dw12 node, irq-gpios |
| P0.17 | 78 | CHG_DONE | in, MCP73831 STAT via 68 k/150 k divider, high = charge complete. Resistors DNP by default (pin floats: firmware must not configure it without a pull, or leave it unused) | none (optional) |
| P0.28 | 47 | UART_RX | factory pads only | unchanged |
| P0.29 | 48 | UART_TX | factory pads only | unchanged |
| P0.30 | 49 | I2C_SDA | DRV2605L 0x5A + LIS2DW12 0x19, 4k7 pull-ups | i2c2 |
| P0.31 | 50 | I2C_SCL | same | i2c2 |
| SWDIO/SWDCLK/nRESET | 4 / 3 / 9 | factory test pads only, APPROTECT locked in production |
Battery detection: no dedicated pin. The cell is on a keyed connector (J2) behind a P-MOSFET reverse-polarity switch. The firmware sees the cell only through AIN0 (P0.13) and the charger state through CHG_STAT (P0.14). A missing or reversed cell means the board is unpowered, so there is nothing for firmware to detect; a swapped cell simply looks like a cold boot (Battery Reg. Art. 11(8): firmware must accept any compatible cell, so no cell ID/authentication exists).
Notes for the firmware stream:
1. Accelerometer: STMicroelectronics LIS2DW12TR. SA0 and CS are tied to 3V3, so the I²C
address is 0x19 (not 0x18). Tying SA0 to GND would burn ~170 µA through its internal
20 kΩ pull-up, so do not change the strap. INT2 is not connected.
2. CHG_STAT meaning changed. Rev A wired MCP73831 STAT to the GPIO with a pull-up to 3V3.
That was a bug: MCP73831 STAT is a push-pull tri-state output that drives 5 V (its VDD) when
charge is complete, which exceeds the nRF9151's 3.6 V GPIO limit. Rev B uses the BQ51013B CHG
pin instead (open drain, 20 V tolerant, no current when the Qi receiver is unpowered). It is
low whenever the lemon sits on a working charger, including after the cell is full. If firmware
needs "full", populate R15/R16 and read P0.17.
3. LED: the firmware's led.c supports pwm-leds or gpio-leds. Use PWM. Standard drive is
enough at 1.5 mA; do not set high drive.
4. Wake from System OFF: SQZ_A (level low) and CHG_STAT (level low), as main.c already does.
ACC_INT1 can also be a SENSE wake source (level high) if ever needed.
Devicetree fragment for firmware/lemon.overlay (the electronics stream does not edit firmware;
paste it there):
/ {
aliases {
led-hug = &led_hug;
accel = &lis2dw12;
};
pwmleds {
compatible = "pwm-leds";
led_hug: led_hug { pwms = <&pwm0 0 PWM_MSEC(2) PWM_POLARITY_NORMAL>; };
};
};
&pwm0 {
status = "okay";
pinctrl-0 = <&pwm0_lemon>;
pinctrl-1 = <&pwm0_lemon_sleep>;
pinctrl-names = "default", "sleep";
};
&pinctrl {
pwm0_lemon: pwm0_lemon { group1 { psels = <NRF_PSEL(PWM_OUT0, 0, 15)>; }; };
pwm0_lemon_sleep: pwm0_lemon_sleep { group1 { psels = <NRF_PSEL(PWM_OUT0, 0, 15)>; low-power-enable; }; };
};
&i2c2 {
lis2dw12: lis2dw12@19 {
compatible = "st,lis2dw12";
reg = <0x19>;
irq-gpios = <&gpio0 16 GPIO_ACTIVE_HIGH>;
int-pin = <1>;
};
};
1. What changed from rev A
| # | Change | Parts | Reason |
|---|---|---|---|
| 1 | Missed-hug LED with a light pipe to the skin | D1 APHHS1005SYCK, R13 1.0 k, TP14 | Rev B feature |
| 2 | Accelerometer, wake on motion | U8 LIS2DW12TR, C26, C27, TP12 | Rev B feature (pick-up clears the LED) |
| 3 | Battery on a keyed connector with reverse-polarity protection | J2 BM02B-GHS-TBT, Q1 AO3401A, R14 10 k, D2 PESD5V0S1BL, TP8 | Battery Reg. 2023/1542 Art. 11 (user-replaceable from 18 Feb 2027) |
| 4 | Final Qi resonant capacitors | C7A/C7B 47 nF C0G, C7C trim (DNP), C8 1.0 nF C0G, C8B trim (DNP) | §4 |
| 5 | BQ51013B ILIM corrected, FOD populated, CLAMP caps corrected | R7 1.10 k, R8 196 Ω, R11 20 k, C11/C12 470 nF | Rev A's "≈100 kΩ" ILIM set the limit to about 2.6 mA, so the lemon could never have charged |
| 6 | Temperature cut-off on Qi power | RT1 NCP15XH103F03RC (10 k NTC) under the cell, R12 750 Ω | No cell NTC before. BQ51013B stops power transfer outside about 0–50 °C |
| 7 | CHG_STAT taken from BQ51013B CHG (open drain) | R3 100 k | MCP73831 STAT drives 5 V into a 3.6 V-max GPIO (rev A bug). Optional R15/R16 divider gives "charge done" on P0.17 |
| 8 | Removed the 32.768 kHz crystal and its load caps | −XTAL1, −CXL1, −CXL2 | The nRF91 SiP has its clocks inside and no XL1/XL2 pads. Rev A misread the Product Spec |
| 9 | nRF9151 ENABLE pad tied to VDD, ferrite + reference decoupling, SIM from SIM_1V8 | FB1, C1–C3, C5, C6 | ENABLE was missing (the SiP would never have started) |
| 10 | Debug/UART as factory pads only, 2×4 grid under the coil, plus test pads | J1, TP8–TP15 | EN 18031 (no exposed debug). The old 1×7 row was 15.2 mm long and did not fit the board edge |
| 11 | Schematic regenerated from a script with a pin-position self-check | gen_kicad_sch.py |
Rev A's file placed pins mirrored in Y, so in KiCad most pins sat on the wrong nets |
Net BOM effect per unit (qty 500, estimates): LIS2DW12 $0.76, LED $0.09, GH connector about $0.10–0.25, AO3401A $0.03, ESD $0.05, NTC $0.03, FB1 $0.02, extra passives about $0.10, minus crystal and caps about $0.45. About +$0.9 per unit. The mating plug on the cell (GHR-02V-S + 2× SSHL-002T-P0.2) is fitted by the cell supplier, about $0.10–0.15, and is part of the cell spec (§3).
2. Missed-hug LED and light path
Part: Kingbright APHHS1005SYCK, 0402 (1.0 × 0.5 × 0.35 mm), 590 nm AlGaInP, top-emitting, wide angle. It is yellow to match the lemon; lemon-yellow PU passes 590 nm well. At 1–2 mA, Vf is about 1.8–1.9 V.
Drive: P0.15 → R13 1.0 kΩ → D1 → GND. I_max = (3.4 − 1.85) / 1000 ≈ 1.5 mA at 100 % PWM, inside
the nRF9151's standard GPIO drive, so no transistor is needed. The firmware breath pattern
(led.c: 12-step ramp, 50 ms steps, 1.2 s swell every 8 s) gives an equivalent on-time of
2 × Σramp/1000 × 50 ms = 486 ms per 8 s = 6.1 % duty. If prototypes are too dim, first reduce
R13 to 470 Ω (3.3 mA) and enable high drive (NRF_GPIO_DRIVE_H0H1). Current then doubles; see §7.
Position (PCB coordinates, DESIGN.md frame: origin at body centre, X along the lemon):
D1 at x = 10.0, y = 11.0, top side. This is the mechanical rev B position (lemon_geom.py LED_XY), where the
clear rod is part of the battery hatch plate. The emitting face is 0.35 mm above the PCB top. Why this spot works
electrically:
- It is outside the cell footprint in the mechanical rev B layout (26 × 20 mm cell centred at (−0.5, −2.0):
x −13.5…12.5, y −12…8), so a straight vertical rod clears the cell by ≥1.7 mm.
- It is inside the copper boundary (x < 15) and clear of the +Y dome carrier (|x| ≤ 6.25).
- R13 sits beside it (11.6, 10.0), and TP14 (LED anode) is on the bottom.
Light path requirement (the mechanical design already follows it: ROD_D 2.5, ROD_GAP 0.5, WINDOW_SKIN 0.6):
- A clear rod Ø2.5–3.0 mm (clear SLA resin, PMMA or PC) runs in +Z from ≤0.5 mm above D1 to the skin window.
Flat bottom face; frosted (bead-blasted) top face so it glows evenly.
- Opaque around the rod inside the core (black paint or the core wall), so the whole lemon does not glow.
- Skin window 0.6–0.8 mm of unpigmented or lightly pigmented PU, Ø ≥3.4 mm, or a clear PU plug. Diffuse
transmission at 590 nm is plausibly 30–60 %. Check it on the first cast. It is the main visibility risk.
- Keep-out on the PCB: nothing taller than 0.5 mm within 2.0 mm of D1 (the rod base).
- If the mechanical design moves the rod, D1 can go anywhere on the top side outside the cell footprint with
x < 14.5. Re-run gen_kicad_sch.py after changing ANCH["D1"].
3. Replaceable battery: J2, Q1 and what the cell must be
Connector J2: JST GH, BM02B-GHS-TBT (1.25 mm pitch, 2 pins, top entry, SMT, keyed, positive latch; LCSC C161690). Distributor figures give 5.75 × 4.05 mm including tabs and about 4.3 mm tall. Check against the JST drawing when you make the footprint. Mating plug on the cell: GHR-02V-S housing with SSHL-002T-P0.2 crimps (AWG 26–30). Rated 1 A, which covers modem bursts of 0.25–0.5 A. This follows production/SOURCING.md (latching GH survives repeated user swaps and drops), replacing the side-entry JST SH first considered. Top entry means the user unplugs straight up through the battery hatch.
Placement: top side, centre x = −1.0, y = 10.3, rotation 0 (pins along X). The body spans x −3.9…1.9,
y 8.3…12.3. That is 0.3 mm from the cell edge (y = 8.0) and inside the hatch opening (HATCH_CLEAR). The mechanical
model had (−1.0, 10.55). Rev B pulls it 0.25 mm toward the centre so the body stays ≥0.7 mm from the PCB edge
where the +Y dome carrier's castellations sit (x ±6.25, y 12.2–13.0). What mechanical must provide:
- about 4.3 mm connector height plus about 6 mm above it to lift the plug out (hatch open);
- no hatch rib or foam over the plug latch; the user presses the latch and pulls the housing, never the wires
(put this in the instructions);
- cell lead length about 30–40 mm from the cell's PCM end to the plug.
Reverse polarity (Q1, R14): Q1 is an AO3401A P-FET in the + line, drain to the connector, source to VBAT+, gate 10 kΩ to GND. - Correct cell: the body diode conducts, Vgs ≈ −Vbat, the channel turns on. Drop ≤ 20 mV at a 250 mA burst. Charging current flows back through the channel. - Reversed cell, no charger: Vgs = 0 and the body diode is reverse biased. VBAT+ stays at 0 V, no current, no damage. - Reversed cell on a Qi pad (abnormal, for the IEC 62368-1 review): once the MCP73831 raises VBAT+ above Q1's threshold (about 1 V), Q1 conducts into the reversed cell and pulls VBAT+ back down. The node settles near the threshold, with the charger in pre-conditioning (10 % = 10 mA). The reversed cell is discharged at ≤10 mA until its PCM opens. Q1 dissipates ≤50 mW. The SiP and the rest of the board never see reverse voltage. Accept, and include it in the abnormal-operation tests. The keyed housing limits this to a miswired third-party cell. - D2 PESD5V0S1BL (bidirectional ±5 V) clamps ESD on the user-touchable connector. Being bidirectional, it does not conduct with a reversed 4.2 V cell. - Why the charger is not also gated on "cell present": a PCM that has tripped on over-discharge only recovers when the charger puts voltage on the pack. A "no cell, no charge" interlock stops that recovery and bricks a deeply flat lemon. The plain P-FET has no such lockout.
Battery detection: no GPIO (see §0). Cell voltage comes from AIN0. Presence follows from the board being powered. Firmware must accept any cell in spec (Art. 11(8)).
Spare-cell specification (publish it; spares required for 5 years by Art. 11(7)): Li-ion polymer 602025 (≤6.2 × 20.5 × 26 mm), 3.7 V nominal, 250–270 mAh, integrated PCM (overcharge 4.25–4.30 V, over-discharge 2.5–3.0 V, overcurrent ≥1.5 A), leads AWG 28–30, 30–40 mm, red = +, terminated in JST GHR-02V-S, pin 1 = + (red), IEC 62133-2 and UN38.3 reports, battery DoC. Charge 100 mA (0.4 C), cut-off 4.20 V.
4. Qi receiver resonant capacitors (BQ51013B + Würth 760308101214)
Datasheet inputs: - Coil 760308101214: L = 26 µH ±10 % (125 kHz), RDC 420 mΩ typ / 520 mΩ max, rated current 1.1 A, SRF 11 MHz, Ø19 × 0.8 mm, ferrite backed. - BQ51013B (TI SLUSB62D §9.2.1.2.2, from WPC v1.2 Vol. 1): C1 (series, Cs) = 1 / [(2π·fS)² · Ls′] and C2 (parallel, Cd) = 1 / [(2π·fD)² · Ls − 1/C1], with fS = 100 kHz +5 / −10 % and fD = 1 MHz ±10 %. Ls′ is measured on the WPC fixture (50 × 50 × 1 mm PC44 ferrite, dz = 3.4 mm, with the real housing and battery). Ls is free-space. Q = 2π·fD·Ls / R must be > 77. Cap rating ≥ 25 V (50 V chosen).
The lemon's coil-to-charger distance is about 3.3 mm (DESIGN.md §2), almost exactly the WPC fixture's 3.4 mm, so the fixture's Ls′ is the right number. Ls′ has not been measured (the coil datasheet gives only free-air L). For a ferrite-backed receiver coil 3.4 mm above a ferrite plate, Ls′/Ls is typically 1.05–1.15. TI's table shows 1.3–1.45 for large unshielded phone coils; a small shielded coil gains less. Design point: Ls′ = 1.08 × 26 = 28 µH.
Series cap: the ideal value at exactly 100 kHz would be 1 / [(2π·100 kHz)² · 28 µH] = 90.5 nF. The allowed window is asymmetric (90–105 kHz), so aim near 97.5 kHz for the most headroom: 1 / [(2π·97.5 kHz)² · 28 µH] = 95.2 nF → C1 = 47 nF + 47 nF = 94 nF (C7A + C7B, C0G 50 V 0805). C7C is a third parallel 0805 footprint, DNP, for trimming after measurement.
Check of fS = 1 / (2π·√(Ls′ · 94 nF)) across coil tolerance and the Ls′/Ls uncertainty:
| Ls′/Ls | coil −10 % | coil nominal | coil +10 % |
|---|---|---|---|
| 1.00 | 107.3 kHz (out) | 101.8 kHz | 97.1 kHz |
| 1.05 | 104.7 kHz | 99.4 kHz | 94.7 kHz |
| 1.08 | 103.3 kHz | 98.0 kHz | 93.4 kHz |
| 1.10 | 102.3 kHz | 97.1 kHz | 92.6 kHz |
| 1.15 | 100.1 kHz | 94.9 kHz | 90.5 kHz |
Everything lands inside 90–105 kHz except a −10 % coil with no inductance gain at all, which is unlikely over a ferrite plate. C0G ±5 % moves fS by ±2.5 %, so the corners are marginal. Measure Ls′ on 5 coils in a real core on a prototype and trim with C7C (for example, +4.7 nF lowers fS by about 2.4 %).
Parallel cap, with Ls = 26 µH and C1 = 94 nF: C2 = 1 / [(2π·1 MHz)² · 26 µH − 1/94 nF] = 1 / (1.0265×10⁹ − 1.0638×10⁷) = 0.984 nF → C8 = 1.0 nF C0G 50 V. Check: fD = 1 / (2π·√(Ls · C1C2/(C1+C2))) = 992 kHz at 26 µH, 946 kHz at 28.6 µH, 1046 kHz at 23.4 µH, all within ±10 %. C8B is a DNP trim footprint.
Q = 2π · 1 MHz · 26 µH / 0.42 Ω = 389 (314 at RDC max), well above 77.
Other BQ51013B values (datasheet §9.2.1.2.4–7): BOOT 10 nF/50 V; CLAMP 470 nF/25 V (rev A had 10 nF); COMM 22 nF/50 V (raise to 47 nF if a pad drops communication); RECT 10 µF/25 V + 100 nF; OUT 1 µF, plus the 4.7 µF on the charger input. AD → GND (wireless only), AD-EN open, EN1/EN2 → GND.
Current limit: R_ILIM = K_IMAX / I_MAX with K_IMAX = 262 Ω·A. I_MAX = 200 mA (100 mA charge plus headroom) → 1310 Ω. R_ILIM = R1 + R_FOD = 1.10 kΩ + 196 Ω = 1296 Ω → I_MAX 202 mA, hardware limit I_ILIM = 1.2 × K_IMAX / R_ILIM ≈ 243 mA.
FOD: TI defaults are R_OS = 20 kΩ (RECT → FOD) and R_FOD = 196 Ω (FOD → GND). Certified Qi v1.2+ pads compare received with transmitted power to find foreign objects, so an uncalibrated receiver can cause false FOD trips (charging stops) or miss a coin. Run TI's FOD calibration tool on a prototype in the real housing with the chosen cradle puck, then fix R_OS/R_FOD. The layout brief asks for two series footprints for each.
TS/CTRL: NTC network per SLUSB62D Figure 8-12 (R2 = 20 k internal pull-up, R3 open, R1 = R12 in series with RT1). %V_HOT = 19.6 % → R_net = 4.876 kΩ; %V_COLD = 58.7 % → R_net = 28.43 kΩ. With RT1 = 10 k β3380 and R12 = 750 Ω: hot cut-off 50 °C (47.8–52.9 °C over the threshold spread) and cold cut-off 0 °C (−1.5…+2.5 °C). Beyond these the BQ51013B ends power transfer. RT1 sits on the PCB top under the cell (x −8, y 3), in contact through the foam tape. A 0–45 °C window cannot be reached with one NTC in this network (at R3 = open the span is already at its maximum), so 50 °C at the PCB is the compromise. The 100 mA (0.4 C) charge rate keeps self-heating low.
5. Accelerometer (U8 LIS2DW12TR)
| Candidate | Wake-on-motion current | Price (qty 500) | JLC assembly | Verdict |
|---|---|---|---|---|
| ST LIS2DW12TR | 1 µA LP1 at 12.5 Hz, 0.38 µA at 1.6 Hz, 50 nA power-down | $0.76 (LCSC C189624, ~15k stock) | yes (extended) | chosen: price, JLC, Zephyr driver with wake-up trigger |
| ADI ADXL367 | 0.18 µA motion-activated | ≈$5.12 | not in JLC library | 6× the price for ≈7 mAh/year |
| Bosch BMA400 | ≈0.8 µA | n/a | DigiKey restock ~Dec 2026 | supply risk |
Pinout (LGA-12, ST datasheet Table 2): 1 SCL; 2 CS → 3V3 (I2C mode); 3 SDO/SA0 → 3V3 (address 0x19); 4 SDA; 5 NC → GND; 6 GND; 7 RES → GND; 8 GND; 9 VDD → 3V3; 10 VDD_IO → 3V3; 11 INT2 open; 12 INT1 → P0.16. Decoupling: 100 nF each on VDD and VDD_IO. The datasheet's 10 µF bulk is covered by C21 on the 3V3 rail. There is no conflict with DRV2605L at 0x5A. SA0 and CS have internal pull-ups of about 20 kΩ at 3.6 V, so they are strapped high. Strapping low would cost about 170 µA each.
Position: top side at (−9.0, −8.5) (the mechanical placeholder), under the cell (0.7 mm tall, under the 1.2 mm limit). Position does not matter for pick-up detection.
6. EN 18031 hardware provisions
| EN 18031 topic | Rev B hardware provision | Finished in |
|---|---|---|
| Secure boot, immutable root of trust | nRF9151: NSIB (b0) immutable bootloader + MCUboot. Public key hashes are written once into UICR OTP at the fixture. No external part | Firmware (image signing), TEST_FIXTURES.md step 3 |
| Secure storage of per-device keys | Keys stay inside the SiP: TF-M ITS / PSA persistent key (LEMON_KEY_ID), CryptoCell-310 TRNG and KMU. No external secure element, and no secret ever crosses I2C/SPI |
Firmware lemon_key_import() |
| Debug access disabled in production | No debug connector footprint. SWD, nRESET and UART exist only as 1.0 mm copper pads (J1) on the PCB bottom, under the Qi coil and core, not reachable from the battery bay. The fixture sets APPROTECT + SECURE APPROTECT as the last step, and firmware enforces the lock on every boot (CONFIG_NRF_APPROTECT_LOCK, CONFIG_NRF_SECURE_APPROTECT_LOCK). The only way back in is a full erase, which destroys keys and application |
TEST_FIXTURES.md step 14 |
| No unused interfaces | Trace pins P0.21–P0.25 not routed. UART shell dead after factory lock, UART RX suspended (lemon_console_off) |
Firmware |
| ERASEPROTECT | Not enabled: it would make RMA units unrecoverable and adds nothing once erase removes the keys | Decision |
| Physical access | The battery bay must expose only J2 and the cell, not J1, TPs or U1 | Mechanical |
The layout designer must not add any debug connector, header or tag-connect footprint.
7. Power budget with the LED and accelerometer
Usable cell: 250 mAh × 0.85 = 212 mAh. Baseline from DESIGN.md §8 (eDRX 20.48 s, PSM off):
| Item | Current | Per day |
|---|---|---|
| eDRX floor, good coverage | 60–120 µA | 1.44–2.88 mAh |
| 30 squeezes/hugs × ≈0.1 mAh | – | 3.0 mAh |
| VBAT divider R9/R10, always on | 1.9–2.1 µA | 0.05 mAh |
| TPS62849 Iq, DRV2605L shutdown, leakage | ≈4 µA max | ≈0.1 mAh |
| LIS2DW12 power-down (not armed) | 50 nA | 0.001 mAh |
| LIS2DW12 armed, LP1 12.5 Hz (only while a hug waits) | 1 µA | ≤0.024 mAh |
| Q1 gate, D2 leakage, BQ51013B CHG off-state leakage at 3.4 V | < 0.1 µA | ≈0 |
| NTC network | only biased by the Qi receiver while on a pad | 0 from the cell |
| LED breathing: LED 1.5 mA × 6.1 % = 0.091 mA, plus PWM/HF clock and 50 ms work items during the 1.2 s swell (≈0.6 mA × 15 % = 0.09 mA, estimate) | ≈0.18 mA while breathing | 0.18 mAh per breathing hour; 4.4 mAh for a full 24 h |
| LED with R13 = 470 Ω + high drive | ≈0.28 mA while breathing | 6.7 mAh per 24 h |
| Scenario | Per day | Days per charge |
|---|---|---|
| Rev A (no LED or accel) | 4.6–6.1 mAh | 35–47 |
| Rev B typical: 30 hugs, one missed hug noticed after 2 h | 4.9–6.4 mAh | 33–43 |
| Rev B worst: a missed hug breathes for the full 24 h every day | 9.0–10.5 mAh | 20–24 |
The LED only dominates when nobody picks the lemon up, and firmware stops breathing below 3.5 V
(LED_CUTOFF_MV). The PWM overhead is an estimate: measure it with a PPK2 on the DK before fixing R13.
If it is much higher, use gpio-leds blink mode (≈0.02 mA average).
8. Brief for the freelance PCB layout designer
Job: route the Lemon main PCB rev B, from the existing schematic and placement to fabrication and assembly files for JLCPCB Standard PCBA. Estimate 12–20 h (€600–1,200 at typical EU freelance rates). Fixed price preferred.
Inputs: lemon_totem.kicad_sch (KiCad 8, generated); gen_kicad_sch.py (the netlist source; ask us to
change it instead of hand-editing the schematic); drawings/pcb_placement.csv (x/y/side/rotation, sizes,
heights, MPNs); drawings/pcb_outline.dxf (44 × 26 mm superellipse, n = 3); NETLIST.md; ROUTING.md
(stack-up and priorities); this document.
First tasks, before routing: 1. Replace U1 with Nordic's official nRF9151 symbol and footprint. Check every pad number in NETLIST.md against Nordic's pin table and report any mismatch. 2. Assign footprints. Map U6 (TPS62849DLCR, VSON-HR "DLC" 8) and U2 (NSIM-2-C) function-named pins to the datasheet land patterns. Check the DRV2605L DGS pin order and the BQ51013B RHL exposed-pad via pattern. 3. Create the custom footprints: J1 (2×4 grid, 2.54 mm, Ø1.0 mm pads, position 8 empty, no paste); TP8–TP15 (Ø1.0 mm, no paste); ANT1 feed/ground pads at x = 15…16; dome carrier edge pads; LRA lead pads; Qi coil lead pads next to U4.
Hard constraints: - 4 layers, 1.0 mm, JLC04161H-7628 (or JLC's current equivalent). L2 solid GND, L3 power. - Antenna keep-out x > 15 mm: no copper on any layer except the ANT1 feed. 50 Ω grounded microstrip from U1 pad 35 through the pi match (LANT/CANT1/CANT2, tight to U1) to the feed pad. Get the width from JLC's impedance calculator. - Parts under the cell (top side, x −13.5…12.5, y −12…8, mechanical rev B) must be ≤1.2 mm tall. - J2 (top-entry GH, about 4.3 mm), D1 and the dome carrier edges are fixed by the mechanical design. Move them ≤0.5 mm at most, and say so. - No debug connector, header or tag-connect footprint (EN 18031). J1 is pads only, on the bottom. - VBAT+ path J2 → Q1 → C1/FB1 → U1 pad 14: ≥0.5 mm or pours (modem bursts about 0.5 A). C2/C3 tight at pad 14, CDEC0 tight at pad 24, each with its own GND via. - Qi AC loop (L2 pads → C7A/B/C → U4 AC1/AC2, C8 across): short, ≥0.4 mm, symmetric, far from the RF section. U4 exposed pad: ≥6 vias to GND. - Two 0402 resistors in series for each of R11 (R_OS) and R8 (R_FOD), for FOD calibration. Ask us to add R8B/R11B (0 Ω) to the generator. - RT1 on top under the cell, not on a large pour that pulls heat away from the cell. - I2C, SQZ, CHG, LED and ACC_INT1 are slow. Route them last. - Light pipe: nothing taller than 0.5 mm within 2.0 mm of D1's centre on the top side. - Test pads ≥1.5 mm centre-to-centre from any part taller than 1 mm, all probed from the bottom. - TP12 (ACC_INT1) sits on the trace at the U1 end, and TP14 (LED_A) between R13 and D1, so the fixture checks prove continuity (TEST_FIXTURES.md steps 5b and 6).
Deliverables: KiCad project (sch + pcb), ERC/DRC clean against JLC rules; Gerbers, drill, JLC BOM and CPL;
STEP of the assembled board (for the mechanical stream); PDF of all layers; a note listing any
placement or net change. Acceptance: netlist export matches gen_kicad_sch.py; keep-outs respected;
JLC DFM check passed.
9. Open risks
- nRF9151 pad numbers come from a real third-party nRF9151 board (makerdiary nRF9151 Connect Kit schematic rev A, 2024-12-25), not Nordic's own pin table (Nordic's pages were unreachable this session). That design also shows: no external 32 kHz crystal, DEC0 4.7 µF, ENABLE driven high, SIM powered from SIM_1V8. The layout designer checks against Nordic's footprint (§8 task 1).
- LED visibility through an 11 mm pipe, 0.8 mm PU and yellow pigment. Check on the first cast. Fallbacks: R13 470 Ω, a thinner window, a clear plug.
- Qi tuning: Ls′ not measured yet. Trim footprints C7C/C8B exist. FOD calibration is needed with the chosen puck.
- Connector choice depends on GH dimensions: footprint and height of BM02B-GHS-TBT to be confirmed on JST's drawing. The latch must stay reachable through the hatch.
- 1.8 V SIM only: the nRF9151 supplies SIM_1V8. 1NCE industrial SIMs are normally 1.8/3 V (class B/C). Confirm on the card's datasheet before ordering 500.
- Accelerometer INT1 continuity is not proven by
factory accel: registering a trigger succeeds even with an open INT1 trace. TEST_FIXTURES.md adds a pad-level check. Request to the firmware stream: afactory accel irqsubcommand (arm, wait for a tap, report whether INT1 fired). - U6 and U2 pin mapping, and the DRV2605L pin order, still need checking against datasheets (§8 task 2).
- A reversed third-party cell on a charger is slowly discharged until its PCM opens (§3). Record it in the risk assessment.