Raspberry Pi–based control and data-acquisition system for a plasma laboratory. Logs vacuum and plasma parameters, controls gas flow via MFCs, and runs a closed-loop PID on plasma current. Built and operated by one principal developer over six years, with contributions from students and lab-mates passing through.
The box exists. It sits in a multi-chamber plasma lab. It is used today.
| Function | State |
|---|---|
| ADC acquisition via I²C (AIO-32/0RA-IRC, 10 Hz) | live |
| MFC gas control — H₂ + O₂ via DAC8532 | live |
| Plasma current PID via galvanically isolated MCP4725 | live (Apr 2026) |
| GPIO sync signal for external loggers (QMS, others) | live |
| Kikusui LAN voltage/current recording | optional, timestamped CSV with Qt and full WebUI readouts; setup |
| Membrane temperature control via MAX6675 + SSR | dormant — migrated to NI/Windows |
Hardware: Raspberry Pi 4 (8 GB) + custom PCB. Runs on-rig; also boots on Windows/macOS with dummy hardware stubs.
On the lab Pi:
python -m controlunit.mainpigpiod is started automatically. GPIO access requires the daemon to have
been started with appropriate permissions — on the rig this is handled by
controlunit/start_gpio.py.
Off-rig (Windows/macOS — GUI only, no hardware):
python -m controlunit.mainMissing hardware libraries (pigpio, smbus, RPi.GPIO, spidev) are
automatically replaced with no-op stubs from controlunit/devices/dummy.py.
Add --web and the same process also answers a browser, so the rig can be
read from a laptop on the lab network:
python -m controlunit.main --web --host 127.0.0.1 --port 4187It listens on loopback and port 4187 unless told otherwise, and it is
read-only: a Lab page showing this service, the PIHTI journal and the PIHTI
vacuum diagram with the state of each, plus GET /api/health for the two
neighbours to read back. The neighbours' addresses come from a Neighbours:
block in the machine-local ~/.controlunit/settings.yml, which this
repository never carries. Without --web nothing about the program changes.
Full documentation is at https://queezz.github.io/ControlUnit/
| Page | Contents |
|---|---|
| Home | Overview and navigation |
| Archaeology | Forensic reconstruction of the full codebase history — primary technical reference |
| Qt Threading | Thread ownership, data flow, and shutdown safety diagrams |
| Channel Map | ADC channels, signal names, conversion functions |
| Related Projects | Ecosystem: echelle_spectra, pihtivacuum, TemperatureControl, tclogger |
Hardware documentation lives in the lab-wide knowledge base: aklab-howto.
controlunit/ Python package — acquisition, control, UI
devices/ per-device worker threads + chip drivers
ui/ pyqtgraph docks and widgets
settings.yml channel map + conversion function registry (canonical)
docs/ MkDocs source
Archaeology.md primary historical document
archive/pdoc3/ legacy pdoc3-generated HTML (2022 snapshot, preserved)
images/ screenshots and physical box photos
tests/ minimal CI tests
examples/ scratch notebooks from development
| Controls | Settings |
|---|---|
![]() |
![]() |
| Front panel | Back panel |
|---|---|
![]() |
![]() |
This codebase has accreted over six years: a 2020 monolithic worker
template-copied from an earlier spectrograph application (echelle_spectra),
extended by students, gradually refactored during experimental downtime,
and still running in the lab. The full story — contributor history, threading
evolution, design decisions, dormant capabilities, and ecosystem context —
is documented in Archaeology.md.



