Tier 1: Software
±2-5ms timing
Parallel async execution via software. Works with any firmware, no modifications needed.
Best for: Antenna comparison, SWR checks, signal level surveys
mcnanovna can control multiple NanoVNA devices simultaneously, enabling measurements that a single 2-port VNA can’t perform. This page explains the three synchronization tiers and when to use each.
A single NanoVNA provides 2 ports—enough for S11 (reflection) and S21 (transmission) through one device. Multiple VNAs expand your measurement capability:
| VNAs | Ports | Enables |
|---|---|---|
| 1 | 2 | S11, S21 (standard) |
| 2 | 4 | True 4-port, A/B comparison, long path loss |
| 3+ | 2N | Phased arrays, MIMO, multi-element antennas |
When measuring across multiple VNAs, timing matters:
mcnanovna provides three tiers to match your precision needs.
Tier 1: Software
±2-5ms timing
Parallel async execution via software. Works with any firmware, no modifications needed.
Best for: Antenna comparison, SWR checks, signal level surveys
Tier 2: Hardware Trigger
±10-50µs timing
One VNA triggers the others via GPIO. Requires custom firmware and trigger wiring.
Best for: Transfer functions, differential S21, timing-sensitive measurements
Tier 3: Phase Coherent
±1° phase alignment
All VNAs share a 26 MHz clock reference plus hardware trigger.
Best for: Antenna arrays, MIMO, beamforming, phase noise comparison
mcnanovna sends scan commands to all VNAs in parallel using Python’s asyncio. The timing depends on USB latency and OS scheduling.
| Tool | Description |
|---|---|
sync_sweep | Parallel sweep across devices |
multi_antenna_compare | Compare S11 metrics |
differential_s21 | Two-VNA transmission |
sync_sweep( device_ids=["0001234567", "0009876543"], start_hz=144000000, stop_hz=148000000, points=101)One VNA (leader) pulses a GPIO at sweep start. Other VNAs (followers) wait for this trigger before beginning their sweep.
trig_mode, trig_out)| Tool | Description |
|---|---|
set_trigger_mode | Configure leader/follower |
hardware_sync_sweep | Hardware-triggered sweep |
hardware_sync_sweep( leader_device_id="0001234567", follower_device_ids=["0009876543"], start_hz=144000000, stop_hz=148000000, points=101)All VNAs receive the same 26 MHz reference clock from an external source (OCXO, GPS-DO). Combined with hardware trigger, sweeps are phase-aligned.
| Tool | Description |
|---|---|
set_clock_reference | Switch internal/external |
phase_coherent_sweep | Phase-aligned sweep |
phase_coherent_sweep( device_ids=["0001234567", "0009876543", "0005555555"], start_hz=430000000, stop_hz=440000000, points=101)Don’t want to think about tiers? Use coordinated_sweep:
coordinated_sweep( start_hz=144000000, stop_hz=148000000, points=101)It automatically selects the best method based on detected capabilities:
┌─────────────────────┐ │ coordinated_sweep() │ └──────────┬──────────┘ │ ┌───────────────┼───────────────┐ │ │ │ ▼ │ ▼ ┌─────────────────┐ │ ┌─────────────────┐ │ All have │ │ │ All have │ │ external_clock? │───Yes──┘ │ hardware_trigger?│ └────────┬────────┘ │ └────────┬────────┘ │No │ │Yes └────────────┐ │ ┌────────┘ ▼ ▼ ▼ ┌─────────────────┐ │ Use Tier 3 │ │ phase_coherent │ └─────────────────┘ │No ▼ ┌─────────────────┐ │ Use Tier 2 │ │hardware_trigger │ └─────────────────┘ │No ▼ ┌─────────────────┐ │ Use Tier 1 │ │ software │ └─────────────────┘list_devices()Returns all connected VNAs with their capabilities:
{ "devices": [ { "device_id": "0001234567", "port": "/dev/ttyACM0", "board": "NanoVNA-H4", "connected": true, "capabilities": { "hardware_trigger": true, "external_clock": false } } ], "default": "0001234567"}Default device: When one VNA is connected, it’s automatically the default. With multiple, set one:
set_default_device(device_id="0001234567")Explicit targeting: Override default with device_id on any tool:
scan(device_id="0009876543", start_hz=144e6, stop_hz=148e6)After connecting/disconnecting VNAs:
refresh_devices()Connect two antennas to two VNAs, then:
multi_antenna_compare( device_ids=["antenna_a_vna", "antenna_b_vna"], start_hz=144000000, stop_hz=148000000)Returns:
| Metric | Antenna A | Antenna B |
|---|---|---|
| Min SWR | 1.15 | 1.32 |
| Resonance | 145.2 MHz | 144.8 MHz |
| Bandwidth | 4.1 MHz | 3.2 MHz |
Measure a cable too long to keep both ends near one VNA:
differential_s21( source_device_id="near_end_vna", receiver_device_id="far_end_vna", start_hz=1000000, stop_hz=500000000)The source VNA outputs CW while the receiver measures. Returns S21 magnitude at each frequency.
mcnanovna includes prompts for multi-VNA workflows:
| Prompt | Description |
|---|---|
multi_device_setup | Initial device discovery and configuration |
hardware_trigger_setup | Tier 2 wiring and testing guide |
phase_coherent_setup | Tier 3 clock reference setup |