Dosing chambers and how the device tells them apart
Status: decided 10.08.2026. Supersedes the "electrical chamber keying" requirement in
earlier revisions of docs/HAL_SPEC.md §4b.3 and test F4 of the acceptance plan.
Confidential under NDA · YAVU → Shenzhen Smart Mold.
The short version
There are two dosing chambers. Both hold 0.3 ml and both screw into the same thread, so the device cannot tell them apart mechanically. We are not adding a coding element to the chamber. The operator states which chamber is fitted; the firmware then checks her answer against the plunger travel of every shot.
Nothing is required from you here except a presence contact and one measurement.
Why there is no coding element
The dosing chamber is the nozzle — the outlet bore is moulded into the chamber, not into the device. It is a proven, tooled part, and it is not being changed. A coding resistor or a Hall magnet would have to sit inside that part: new tool, new sealing validation, new qualification, on the one component of this device that already works.
The failure mode does not justify that. Injection pressure is force divided by plunger area and is independent of the nozzle, so a wrong selection cannot produce an over- pressure. What it produces is a shot that is delivered too slowly or too quickly — a poor treatment result, not a hazard — and the mechanical hard stop at 60 µl bounds the volume either way.
The two chambers
0.3 ml (Chamber::STD_0V3) |
0.3 ml + 5 ml syringe (Chamber::REFILL_5ML) |
|
|---|---|---|
| Volume | 0.3 ml | 0.3 ml |
| Supply | filled once — five shots of up to 60 µl | a 5 ml syringe sits on top; the substance is drawn in again between shots |
| Product | crosslinked hyaluronic acid | thin fluids |
| Nozzle bore | 0.18 mm, measured (measured 2022) | believed narrower — never measured |
| Thread | identical | identical |
What a narrower nozzle actually changes
It needs more time per microlitre, not less pressure:
t = V / (A_nozzle · v_jet) v_jet = sqrt(2p/rho)
Pressure comes from the drive force and the plunger area (10.18 mm², measured). The nozzle
only sets how fast that volume leaves. So the one parameter that differs per chamber is
us_per_ul — see src/core/chamber.h. The firing force is left alone.
How the device handles it
- After every power-up it asks. The selection itself is stored in NVS and survives a power cycle; the confirmation deliberately does not. Until the question is answered the guards deny firing. On the front panel the dose keys select and the confirm key accepts — no extra button is needed in the HAL, and the HAL contract stays at v0.5.
- It applies that chamber's delivery timing to every shot.
- It checks the answer. After each shot the firmware compares the actual plunger travel with the travel the commanded dose should have produced. Outside 0.85–1.25 it raises W-201 "check chamber setting" — a warning, not a stop: the product did leave the nozzle and the shot is still billed. Three implausible shots in a row escalate to fault F-130 and the device stops. One key press clears the warning.
A single outlier is normal (an air bubble, a stiff product). A run of them is a wrong setting, and then the device would otherwise mis-dose quietly all day.
What we ask of you
- Chamber presence detection at the seat — one switch or contact, "fitted / not fitted", feeding the mechanical dry-fire block. Not a coding element.
- Leave room, fit nothing. Please provide space at the chamber seat for two spring contacts or a small magnet pocket without populating it. It costs nothing in the design and keeps electrical keying available if practice shows the manual selection is not reliable enough.
- Measure the nozzle bore of the 5 ml refill chamber when the reference unit reaches
you (pin gauges — a caliper will not do it). Firmware currently carries 260 µs/µl as a
placeholder, derived from an assumed 0.15 mm bore. Once measured, the value is written
to the device at runtime via
setChamberCalibration()— no firmware rebuild. - A colour difference between the two chambers would help more than any electronics. Different granulate at moulding costs nothing and the operator sees it before she picks one up. Please quote it as an option.
Where this lives in the code
src/core/chamber.h |
the two chambers, their timing, the plausibility band |
src/core/device_controller.cpp |
loadChamber(), setChamber(), checkChamber(), the boot dialog in serviceUserInput() |
src/core/vc_shot.cpp |
lastTravelRatio() — the measured travel the check runs on |
test/host/test_main.cpp §19 |
the whole behaviour, executable on a PC in about a second |
Source: firmware repo docs/CHAMBER_SELECTION.md · confidential · NDA