Add RF test bench tool for CW injection tests with NanoVNA + HMC472A
New tool (tools/rf_testbench.py) automates five test sequences using a NanoVNA as a CW source and HMC472A digital attenuator (0-31.5 dB, 0.5 dB steps via REST API) to characterize the SkyWalker-1 receiver: - AGC linearity mapping across 64 attenuation steps - IF band flatness sweep (950-1500 MHz) - Frequency accuracy via peak detection - Minimum detectable signal search - BPSK mode 9 CW probe (Viterbi rate 1/2 K=7) Includes SKYWALKER_MOCK=1 mode, path-loss calibration from NanoVNA S21 sweeps, and safe-state cleanup (attenuator to max on exit, LNB power never enabled in direct-input mode). Also adds Applications & Use Cases guide, RF Test Bench docs page, fixes h21cm cable loss (was 3x too high), and updates sidebar.
This commit is contained in:
parent
1df2be8a43
commit
d117782dcf
5 changed files with 1473 additions and 2 deletions
322
site/src/content/docs/guides/applications.mdx
Normal file
322
site/src/content/docs/guides/applications.mdx
Normal file
|
|
@ -0,0 +1,322 @@
|
|||
---
|
||||
title: Applications & Use Cases
|
||||
description: What can the SkyWalker-1 actually do? Satellite TV, multi-standard signal analysis, radio astronomy, RF measurement, and more.
|
||||
---
|
||||
|
||||
import { Aside, Badge, Card, CardGrid, Tabs, TabItem } from '@astrojs/starlight/components';
|
||||
|
||||
The SkyWalker-1 shipped as a DVB-S satellite TV receiver. With [custom firmware](/firmware/custom-v305/) and
|
||||
the reverse-engineered USB/I2C interface, it becomes something more interesting: a programmable RF instrument
|
||||
covering 950-2150 MHz with ten demodulation modes, 256 Ksps to 30 Msps symbol rates, and full Python control.
|
||||
|
||||
Here's what you can actually do with it.
|
||||
|
||||
## Satellite TV Reception
|
||||
|
||||
The obvious one. The SkyWalker-1 receives free-to-air (FTA) DVB-S content — unencrypted satellite television
|
||||
and radio that anyone with a dish can watch.
|
||||
|
||||
### What's Up There
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="Ku-Band">
|
||||
Most FTA content in North America lives on Ku-band satellites. A standard 30-36 inch dish and
|
||||
universal LNB is all you need.
|
||||
|
||||
| Satellite | Position | What's On It |
|
||||
|-----------|----------|-------------|
|
||||
| Galaxy 19 | 97.0°W | The FTA motherlode. ~135+ channels: Chinese, Korean, South Asian, religious, shopping, some English |
|
||||
| Galaxy 16 | 99.0°W | Religious programming, international |
|
||||
| SES-2 | 87.0°W | International, government |
|
||||
| AMC-18 | 105.0°W | Mixed FTA and encrypted |
|
||||
|
||||
Typical tuning parameters: 11836 MHz V-pol, 20770 ksps, DVB-S QPSK FEC 3/4.
|
||||
</TabItem>
|
||||
<TabItem label="C-Band">
|
||||
C-band requires a larger dish (6-12 feet) and a C-band LNB, but carries content that never made it
|
||||
to Ku-band — including DigiCipher II muxes that the SkyWalker-1 uniquely supports.
|
||||
|
||||
| Satellite | Position | What's On It |
|
||||
|-----------|----------|-------------|
|
||||
| AMC-18 | 105.0°W | DCII cable distribution, some FTA |
|
||||
| SES-2 | 87.0°W | International, government feeds |
|
||||
| Galaxy 16 | 99.0°W | Mixed distribution |
|
||||
|
||||
The FCC C-band transition compressed services into the upper 3.98-4.2 GHz range. Additional
|
||||
spectrum auctions are proposed for 2027 — C-band FTA is on borrowed time.
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
### FTA Resources
|
||||
|
||||
Current channel listings change frequently. These sites track what's active:
|
||||
|
||||
- [LyngSat](https://www.lyngsat.com/) — comprehensive transponder and channel database
|
||||
- [SatExpat](https://www.satexpat.com/) — FTA channel listings with satellite footprints
|
||||
- [FTAList](https://ftalist.com/) — North American FTA community and channel guide
|
||||
|
||||
<Aside type="caution" title="DVB-S2 is not supported">
|
||||
An increasing percentage of satellite content uses **DVB-S2**, which relies on LDPC forward error correction
|
||||
instead of the Reed-Solomon/Viterbi scheme the BCM4500 implements. The SkyWalker-1 can detect DVB-S2
|
||||
carriers as RF energy (they show up in spectrum sweeps), but it cannot demodulate or decode them.
|
||||
|
||||
If a transponder listing says "DVB-S2" or "8PSK" (in the DVB-S2 sense, not Turbo 8PSK), it won't work.
|
||||
</Aside>
|
||||
|
||||
## Multi-Standard Signal Analysis
|
||||
|
||||
This is where the SkyWalker-1 becomes genuinely rare hardware. The BCM4500 demodulates standards that are
|
||||
nearly extinct in available consumer equipment — standards that are still actively broadcasting.
|
||||
|
||||
<CardGrid>
|
||||
<Card title="DigiCipher II" icon="rocket">
|
||||
Cable headend distribution format (Comcast HITS, Motorola). One of very few modern devices with DCII
|
||||
support. "Zero Key" unencrypted services are directly receivable.
|
||||
</Card>
|
||||
<Card title="DSS" icon="star">
|
||||
Digital Satellite Service — legacy DirecTV format with 127-byte transport packets (vs 188-byte DVB).
|
||||
Extraordinarily rare outside DirecTV hardware.
|
||||
</Card>
|
||||
<Card title="Turbo 8PSK" icon="setting">
|
||||
DISH Network transponder format. Encrypted content, but demodulator lock and transport stream capture
|
||||
work — useful for signal analysis and protocol research.
|
||||
</Card>
|
||||
<Card title="Turbo QPSK" icon="open-book">
|
||||
Earlier turbo-coded variant. Better spectral efficiency than standard DVB-S QPSK, still used on
|
||||
some distribution paths.
|
||||
</Card>
|
||||
</CardGrid>
|
||||
|
||||
### Why This Matters
|
||||
|
||||
These standards are still active on-air, but the hardware to receive them is disappearing. Off-the-shelf
|
||||
satellite receivers dropped DCII and DSS support years ago. The SkyWalker-1, through its BCM4500 demodulator,
|
||||
retains these capabilities — making it a **preservation and research tool** for signal formats that will
|
||||
eventually go silent.
|
||||
|
||||
The [TS Analyzer](/tools/ts-analyzer/) can parse transport streams from all supported modulation types,
|
||||
making it possible to compare DVB-S, DCII, and DSS packet structures side by side.
|
||||
|
||||
See [BCM4500 Demodulator](/bcm4500/demodulator/) for register-level details on how each modulation type
|
||||
is configured.
|
||||
|
||||
## Wild Feed & Backhaul Hunting
|
||||
|
||||
Satellite transponders carry more than scheduled programming. Temporary unencrypted uplinks — "wild feeds" —
|
||||
appear and disappear throughout the day:
|
||||
|
||||
- **Live news remotes**: Raw camera feeds from field reporters, unedited and uncensored
|
||||
- **Sports backhauls**: Stadium camera feeds before production mixing
|
||||
- **Network distribution**: Programs fed to affiliates before air time
|
||||
- **Event coverage**: Press conferences, hearings, launches
|
||||
|
||||
The SkyWalker-1's blind scan capability and wide symbol rate range (256 Ksps - 30 Msps) make it well-suited
|
||||
for finding these transient signals. The [Carrier Survey](/tools/survey/) tool automates the sweep-and-lock
|
||||
cycle across a full satellite.
|
||||
|
||||
<Aside type="tip" title="Community resource">
|
||||
[Rick's Satellite Wildfeed Forum](https://www.satelliteguys.us/xen/forums/wild-feeds.42/) on SatelliteGuys
|
||||
is the primary community hub for reporting and tracking wild feeds on North American satellites.
|
||||
</Aside>
|
||||
|
||||
## Radio Astronomy
|
||||
|
||||
The 950-2150 MHz IF range — or, without an LNB, the direct input range — overlaps with several
|
||||
astrophysically interesting frequencies. The BCM4500's AGC registers respond to any RF energy at the
|
||||
tuned frequency, regardless of whether it carries a demodulatable signal.
|
||||
|
||||
### Hydrogen 21 cm
|
||||
|
||||
<Badge text="tools/h21cm.py" variant="note" />
|
||||
|
||||
Neutral hydrogen emits at **1420.405 MHz** — directly in the IF range with no LNB. Connect an L-band
|
||||
antenna (patch, helical, or horn) to the F-connector and the SkyWalker-1 becomes a hydrogen line
|
||||
radiometer. The velocity-dispersed emission from the Milky Way's spiral arms is detectable even
|
||||
with the BCM4500's ~346 kHz resolution bandwidth.
|
||||
|
||||
See [Hydrogen 21 cm Radiometer](/tools/h21cm/) for the full tool reference.
|
||||
|
||||
### Ku-Band Solar Observation
|
||||
|
||||
Point a standard satellite dish + LNB at the Sun. At 10-12 GHz, solar thermal emission produces a
|
||||
detectable **6+ dB rise** above the cold-sky background. Solar flares produce wideband bursts that
|
||||
are even more dramatic.
|
||||
|
||||
The SkyWalker-1's advantage over an RTL-SDR here is bandwidth: the 30 Msps sweep capability covers
|
||||
a much wider swath of spectrum (~30 MHz effective) compared to the RTL-SDR's ~2.4 MHz, making it
|
||||
easier to detect and characterize broadband solar events.
|
||||
|
||||
Use the [Spectrum Analysis](/tools/spectrum-analysis/) sweep mode to build solar emission profiles.
|
||||
|
||||
### Moon Thermal Emission
|
||||
|
||||
The Moon is a calibrated thermal source at microwave frequencies. Measuring its emission relative to
|
||||
cold sky provides a reference point for system noise temperature estimation — a standard radio
|
||||
astronomy calibration technique.
|
||||
|
||||
## RF Test & Measurement
|
||||
|
||||
The custom firmware turns the SkyWalker-1 into a basic but useful L-band test instrument.
|
||||
|
||||
### L-Band Spectrum Analyzer
|
||||
|
||||
<Badge text="tools/skywalker.py spectrum" variant="note" />
|
||||
|
||||
Sweep 950-2150 MHz in configurable steps, recording AGC power at each frequency. Not calibrated
|
||||
to absolute dBm, but relative measurements are consistent enough for transponder identification,
|
||||
interference detection, and comparative analysis.
|
||||
|
||||
See [Spectrum Analysis](/tools/spectrum-analysis/) for sweep techniques and interpretation.
|
||||
|
||||
### CW Injection Test Bench
|
||||
|
||||
<Badge text="tools/rf_testbench.py" variant="note" />
|
||||
|
||||
Connect a NanoVNA as a CW source through an [HMC472A digital attenuator](https://hmc472.l.zmesh.systems/)
|
||||
to the SkyWalker-1's F-connector. The `rf_testbench.py` tool automates five test sequences:
|
||||
AGC linearity mapping, IF band flatness, frequency accuracy, minimum detectable signal, and
|
||||
BPSK mode 9 probing. The HMC472A provides 0-31.5 dB of programmable attenuation in 0.5 dB
|
||||
steps via its REST API, giving precision level control without swapping fixed pads.
|
||||
|
||||
See [RF Test Bench](/tools/rf-testbench/) for hardware setup, calibration, and test descriptions.
|
||||
|
||||
### LNB Characterization
|
||||
|
||||
Measure gain flatness across the IF band by sweeping a known satellite's transponder plan and
|
||||
comparing received power levels. Track LO drift over temperature by monitoring a stable carrier's
|
||||
frequency offset over 24 hours with the [Beacon Logger](/tools/beacon-logger/).
|
||||
|
||||
The I2C-exposed tuner and demodulator registers make internal signal chain parameters directly
|
||||
readable — something most consumer receivers hide completely.
|
||||
|
||||
### Transponder Fingerprinting
|
||||
|
||||
Each satellite transponder has unique RF characteristics: center frequency, symbol rate, rolloff,
|
||||
power level, modulation type. The [Carrier Survey](/tools/survey/) tool builds a catalog of these
|
||||
parameters. Over time, this creates a fingerprint database useful for satellite identification
|
||||
and change detection.
|
||||
|
||||
### 5G Interference Monitoring
|
||||
|
||||
The FCC's C-band auction reallocated 3.7-3.98 GHz to 5G operators. Spillover from 5G base stations
|
||||
into the satellite C-band (3.98-4.2 GHz) is an increasing concern for satellite operators and
|
||||
earth station licensees. With a C-band LNB, the SkyWalker-1 can sweep the IF band and detect
|
||||
interference signatures.
|
||||
|
||||
## Propagation Science & Weather
|
||||
|
||||
Long-duration signal monitoring produces datasets that map directly to atmospheric physics.
|
||||
|
||||
### Rain Fade Analysis
|
||||
|
||||
<Badge text="tools/beacon_logger.py" variant="note" />
|
||||
|
||||
Lock onto a stable Ku-band transponder and log SNR at 1 Hz for days or weeks. Ku-band signals
|
||||
attenuate predictably in rain — the ITU-R P.618 model describes the relationship between rainfall
|
||||
rate and attenuation at specific frequencies. Real measurement data validates (or challenges)
|
||||
these models for your specific location and dish geometry.
|
||||
|
||||
### Diurnal Thermal Effects
|
||||
|
||||
LNB gain varies with temperature. A 24-hour beacon log correlated with ambient temperature data
|
||||
reveals the thermal gain coefficient of your specific LNB — useful for separating real propagation
|
||||
events from equipment drift.
|
||||
|
||||
### Link Budget Validation
|
||||
|
||||
Compare long-term average received signal levels against calculated link budgets (EIRP, free space
|
||||
loss, atmospheric absorption, antenna gain, system noise temperature). The gap between prediction
|
||||
and measurement is where engineering meets reality.
|
||||
|
||||
See [Beacon Logger](/tools/beacon-logger/) for unattended multi-day logging with auto-relock.
|
||||
|
||||
## Education & Research
|
||||
|
||||
The SkyWalker-1 exposes the complete satellite signal chain from RF input to MPEG-2 transport stream
|
||||
output, with every intermediate stage accessible over I2C.
|
||||
|
||||
### University Lab Platform
|
||||
|
||||
A single SkyWalker-1 + dish + LNB covers a semester of satellite communications topics with
|
||||
live signals:
|
||||
|
||||
| Topic | What's Observable |
|
||||
|-------|------------------|
|
||||
| QPSK/8PSK demodulation | Lock status, constellation quality via SNR |
|
||||
| Forward error correction | Viterbi, Reed-Solomon, Turbo code — switchable by modulation type |
|
||||
| Link budgets | Real measurements vs. theoretical calculations |
|
||||
| MPEG-2 transport streams | Live PSI/SI table parsing, PID analysis |
|
||||
| Spectrum analysis | Transponder identification from raw power sweeps |
|
||||
| Antenna pointing | Signal strength vs. azimuth/elevation in real time |
|
||||
|
||||
### Transport Stream Protocol Research
|
||||
|
||||
The SkyWalker-1's multi-standard support makes it uniquely suited for comparative protocol analysis:
|
||||
|
||||
- **DVB-S**: 188-byte MPEG-2 TS packets, standard PID structure
|
||||
- **DigiCipher II**: Motorola proprietary transport, conditional access
|
||||
- **DSS**: 127-byte packets — shorter than DVB, different header format
|
||||
|
||||
Tools like [TSDuck](https://tsduck.io/) and dvbsnoop can parse captured streams. The [TS Analyzer](/tools/ts-analyzer/)
|
||||
handles the initial capture and PSI extraction.
|
||||
|
||||
### Accessible Signal Chain
|
||||
|
||||
The I2C bus provides direct read access to tuner, demodulator, and FEC status registers. Students can
|
||||
observe the AGC settling, watch the demodulator acquire lock, and read error correction statistics —
|
||||
the internal workings of the signal chain, visible in real time. See [I2C Bus Architecture](/i2c/bus-architecture/)
|
||||
and [Signal Monitoring](/bcm4500/signal-monitoring/) for register details.
|
||||
|
||||
## What's NOT Compatible
|
||||
|
||||
Setting honest expectations is more valuable than overselling.
|
||||
|
||||
<Aside type="danger" title="Hardware limitations">
|
||||
The following are common requests that the SkyWalker-1 **cannot** fulfill. Understanding these
|
||||
boundaries prevents wasted time and money on incompatible setups.
|
||||
</Aside>
|
||||
|
||||
| Signal / Application | Why Not |
|
||||
|---------------------|---------|
|
||||
| **DVB-S2** | Incompatible FEC — uses LDPC instead of Reed-Solomon/Viterbi. This is a growing percentage of satellite content. |
|
||||
| **GOES weather satellite imagery** | LRIT uses BPSK/CCSDS (not DVB-S), GRB uses DVB-S2. Cannot decode imagery. However, the BCM4500's BPSK mode 9 uses the same inner FEC (Viterbi rate 1/2 K=7) as LRIT — the signal chain gets four stages deep before breaking at RS decoder block size and CCSDS framing. The LRIT carrier at 1694.1 MHz is within the [direct input range](/tools/h21cm/#antenna-setup) and can be used for antenna alignment and propagation monitoring. See [RF Test Bench](/tools/rf-testbench/) for BPSK mode 9 probing. |
|
||||
| **QO-100 from North America** | Es'hail-2 is at 25.9°E — visible from Europe, Africa, and the Middle East, but not North America. See [QO-100 DATV Reception](/guides/qo100-datv/) for coverage details. |
|
||||
| **Military/government feeds** | Encrypted and increasingly DVB-S2 or proprietary modulation. |
|
||||
| **ATSC / DVB-T terrestrial** | Completely different modulation family (OFDM), different frequency band. |
|
||||
| **Analog satellite TV** | The BCM4500 is a digital demodulator. Analog satellite is also effectively extinct. |
|
||||
|
||||
## Modulation Support Reference
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="By Standard">
|
||||
| Modulation | Standard | Typical Use | FTA Content? |
|
||||
|-----------|----------|-------------|-------------|
|
||||
| DVB-S QPSK | DVB-S EN 300 421 | Free-to-air satellite TV worldwide | Yes — most FTA content |
|
||||
| Turbo QPSK | Proprietary (Comstream) | Distribution, some DISH | Rare |
|
||||
| Turbo 8PSK | Proprietary | DISH Network | No — encrypted |
|
||||
| DCII Combo | Motorola DigiCipher II | Cable headend distribution | Some ("Zero Key") |
|
||||
| DCII Split I | Motorola DigiCipher II | Cable headend distribution | Some |
|
||||
| DCII Split Q | Motorola DigiCipher II | Cable headend distribution | Some |
|
||||
| DCII Offset QPSK | Motorola DigiCipher II | Cable headend distribution | Some |
|
||||
| DSS QPSK | Hughes DSS | Legacy DirecTV | No — service winding down |
|
||||
</TabItem>
|
||||
<TabItem label="By Receiver Use">
|
||||
| What You Want to Do | Modulation to Select | Symbol Rate Range |
|
||||
|--------------------|--------------------|------------------|
|
||||
| Watch FTA satellite TV | DVB-S QPSK | 2-30 Msps |
|
||||
| Analyze DISH Network signals | Turbo 8PSK | 20-30 Msps |
|
||||
| Receive DCII cable distribution | DCII Combo/Split/Offset | 2-30 Msps |
|
||||
| Study DSS transport format | DSS QPSK | 20 Msps typical |
|
||||
| Hydrogen 21 cm (no LNB) | N/A — AGC power only | Any (for carrier lock attempt) |
|
||||
| Spectrum sweep / signal detection | N/A — AGC power only | Set during tune, not critical |
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
## See Also
|
||||
|
||||
- [RF Specifications](/hardware/rf-specifications/) — frequency range, symbol rate limits, LNB power
|
||||
- [BCM4500 Demodulator](/bcm4500/demodulator/) — register-level modulation configuration
|
||||
- [Spectrum Analysis](/tools/spectrum-analysis/) — sweep techniques and transponder scanning
|
||||
- [RF Test Bench](/tools/rf-testbench/) — CW injection testing with NanoVNA + HMC472A
|
||||
- [Experimenter's Roadmap](/guides/experimenter-roadmap/) — future experiment tiers and creative applications
|
||||
- [MCP Server](/tools/mcp-server/) — programmatic access to all hardware functions
|
||||
|
|
@ -3,13 +3,63 @@ title: Hydrogen 21 cm Radiometer
|
|||
description: Detect neutral hydrogen emission at 1420.405 MHz using the SkyWalker-1 as an L-band radiometer.
|
||||
---
|
||||
|
||||
import { Aside, Steps, Tabs, TabItem } from '@astrojs/starlight/components';
|
||||
import { Aside, Card, CardGrid, Steps, Tabs, TabItem } from '@astrojs/starlight/components';
|
||||
|
||||
The `h21cm.py` tool turns the SkyWalker-1 into a hydrogen line radiometer. Neutral hydrogen
|
||||
atoms emit radiation at **1420.405 MHz** when the electron's spin flips relative to the proton —
|
||||
the most fundamental spectral line in radio astronomy, and it falls directly in the IF range.
|
||||
|
||||
No LNB is needed. Connect an L-band antenna directly to the F-connector.
|
||||
## Antenna Setup
|
||||
|
||||
The SkyWalker-1 normally receives satellite TV through an LNB (Low Noise Block downconverter) mounted
|
||||
at the focal point of a dish. For hydrogen line work, the LNB must be **removed or bypassed entirely** —
|
||||
it would block the signal. An LNB's waveguide feed is dimensioned for Ku-band wavelengths (~2.5 cm)
|
||||
and its internal filters reject everything outside the 10.7-12.75 GHz range. At 1420 MHz (wavelength
|
||||
~21 cm), nothing gets through.
|
||||
|
||||
Instead, connect an L-band antenna directly to the SkyWalker-1's F-connector with coaxial cable.
|
||||
The tool disables LNB power automatically, so there's no voltage on the cable.
|
||||
|
||||
### Antenna Options
|
||||
|
||||
<CardGrid>
|
||||
<Card title="Horn Antenna" icon="rocket">
|
||||
The classic radio astronomy choice. A tin-can "cantenna" or sheet-metal pyramidal horn provides
|
||||
10-15 dBi gain with predictable, calculable performance. Easy to build from hardware store materials.
|
||||
A circular waveguide horn from a ~15 cm diameter can works well at 1420 MHz.
|
||||
</Card>
|
||||
<Card title="Dish + L-Band Feed" icon="star">
|
||||
Reuse your satellite dish — replace the LNB with a 1420 MHz feed (dipole + reflector, or a small
|
||||
horn at the focal point). The dish surface accuracy matters less at 21 cm wavelength than at Ku-band,
|
||||
so even mesh dishes work fine. This gives the highest gain of any option here.
|
||||
</Card>
|
||||
<Card title="Helical Antenna" icon="setting">
|
||||
A helical antenna is circularly polarized and offers good gain in a compact package. Hydrogen emission
|
||||
is unpolarized, so a circularly-polarized antenna captures half the power (~3 dB penalty vs linear),
|
||||
but helix construction is forgiving and well-documented for L-band.
|
||||
</Card>
|
||||
<Card title="Patch Antenna" icon="open-book">
|
||||
Commercial L-band patch antennas (GPS antennas at 1575 MHz are close) are compact and cheap. Lower
|
||||
gain than the other options (~5-7 dBi), and narrow bandwidth may not cover the full hydrogen emission
|
||||
profile. Fine for a first detection attempt.
|
||||
</Card>
|
||||
</CardGrid>
|
||||
|
||||
<Aside type="note" title="Impedance mismatch">
|
||||
The SkyWalker-1's F-connector is 75Ω. Most L-band antennas and amateur radio feedlines are 50Ω.
|
||||
The resulting 1.5:1 VSWR costs about **0.2 dB** of mismatch loss — negligible for AGC power detection.
|
||||
No matching network is needed. Use an SMA-to-F adapter if your antenna has an SMA connector.
|
||||
</Aside>
|
||||
|
||||
### Cable and Connectors
|
||||
|
||||
Run 75Ω coax (RG-6 is standard satellite TV cable) from the antenna to the SkyWalker-1. At 1420 MHz,
|
||||
cable loss matters more than impedance mismatch — keep runs under 10 meters if possible. RG-6 loses
|
||||
roughly **0.2 dB per meter** at 1.4 GHz (about 6 dB per 100 feet), so a 10m run costs ~2 dB.
|
||||
Shorter is better.
|
||||
|
||||
If your antenna uses 50Ω connectors (SMA, N-type), a simple adapter to F-type is fine. The 0.2 dB
|
||||
impedance mismatch is far less than a meter of extra cable.
|
||||
|
||||
## Quick Start
|
||||
|
||||
|
|
|
|||
260
site/src/content/docs/tools/rf-testbench.mdx
Normal file
260
site/src/content/docs/tools/rf-testbench.mdx
Normal file
|
|
@ -0,0 +1,260 @@
|
|||
---
|
||||
title: RF Test Bench
|
||||
description: Automated CW injection testing with NanoVNA, HMC472A digital attenuator, and SkyWalker-1 receiver.
|
||||
---
|
||||
|
||||
import { Aside, Badge, Card, CardGrid, Steps, Tabs, TabItem } from '@astrojs/starlight/components';
|
||||
|
||||
<Badge text="tools/rf_testbench.py" variant="note" />
|
||||
|
||||
The `rf_testbench.py` tool turns a NanoVNA, an HMC472A digital attenuator, and the SkyWalker-1 into
|
||||
an automated RF test bench. It injects CW signals at known frequencies and power levels, then
|
||||
measures the receiver's response — characterizing AGC linearity, IF band flatness, frequency
|
||||
accuracy, sensitivity, and BPSK mode 9 behavior.
|
||||
|
||||
## Hardware Setup
|
||||
|
||||
<Steps>
|
||||
1. **NanoVNA CH0 output** (SMA) connects to a **DC blocker** (SMA inline, required)
|
||||
2. **DC blocker output** connects to the **HMC472A RF IN** (SMA)
|
||||
3. **HMC472A RF OUT** (SMA) connects via **SMA-to-F adapter** to the **SkyWalker-1 F-connector**
|
||||
4. **HMC472A ESP32-S2 controller** connected to your network (WiFi) — reachable at `http://attenuator.local`
|
||||
5. **NanoVNA** connected via USB (for mcnanovna automation) or operated via touchscreen (manual mode)
|
||||
</Steps>
|
||||
|
||||
```
|
||||
NanoVNA CH0 ──→ DC Blocker ──→ HMC472A (0-31.5 dB) ──→ SMA-to-F ──→ SkyWalker-1
|
||||
(SMA) (SMA) REST API control adapter (F-type)
|
||||
http://attenuator.local
|
||||
```
|
||||
|
||||
### Components
|
||||
|
||||
| Component | Purpose | Notes |
|
||||
|-----------|---------|-------|
|
||||
| NanoVNA-H (9 kHz-1.5 GHz) | CW signal source | Output ~-15 dBm at max power. Overlaps SkyWalker-1 IF band at 950-1500 MHz |
|
||||
| DC Blocker (SMA inline) | Protect NanoVNA from LNB voltage | Required — even though the tool disables LNB power, this prevents accidental damage |
|
||||
| HMC472A attenuator module | Precision level control | 0-31.5 dB in 0.5 dB steps, controlled via ESP32-S2 REST API |
|
||||
| SMA-to-F adapter | Connector transition | 50-to-75 ohm mismatch is ~0.2 dB — negligible |
|
||||
|
||||
<Aside type="danger" title="DC blocker is required">
|
||||
The SkyWalker-1 can supply 13-18V DC through the F-connector for LNB power. Although `rf_testbench.py`
|
||||
disables LNB power on startup, a bug, power glitch, or running a different tool without disconnecting
|
||||
could send DC voltage backward through the signal path. The DC blocker prevents this from reaching
|
||||
the HMC472A and NanoVNA.
|
||||
</Aside>
|
||||
|
||||
### HMC472A Attenuator
|
||||
|
||||
The [HMC472A digital attenuator](https://hmc472.l.zmesh.systems/) provides programmable signal level
|
||||
control via its ESP32-S2 REST API:
|
||||
|
||||
- **Range**: 0 to 31.5 dB in 0.5 dB steps (64 discrete settings)
|
||||
- **Bandwidth**: DC to 3.8 GHz (covers the full SkyWalker-1 IF range)
|
||||
- **Insertion loss**: 1.4-1.9 dB typical
|
||||
- **Control**: HTTP REST — `POST /set {"attenuation_db": 10.5}`
|
||||
- **Switching speed**: 60 ns (faster than any measurement cycle)
|
||||
|
||||
The tool communicates with the attenuator at `http://attenuator.local` by default. Override with
|
||||
`--attenuator http://10.0.0.50` if your device has a different address.
|
||||
|
||||
### NanoVNA Frequency Overlap
|
||||
|
||||
The NanoVNA-H (HW3.7) covers 9 kHz to 1.5 GHz. The SkyWalker-1's IF range is 950-2150 MHz.
|
||||
The **overlapping usable range is 950-1500 MHz** — the lower portion of the IF band. This is
|
||||
sufficient for characterizing the tuner and AGC, and includes the 1420 MHz hydrogen line region.
|
||||
|
||||
For testing above 1500 MHz, a different signal source (bladeRF, signal generator) would be needed.
|
||||
|
||||
## Calibration
|
||||
|
||||
Before running quantitative tests, characterize the signal path loss:
|
||||
|
||||
<Steps>
|
||||
1. Disconnect the SkyWalker-1 end of the cable
|
||||
2. Connect: **NanoVNA CH0** → DC blocker → HMC472A (set to 0 dB) → cable → **NanoVNA CH1**
|
||||
3. Run an S21 sweep from 950 to 1500 MHz using mcnanovna or the NanoVNA touchscreen
|
||||
4. Export as CSV with columns `freq_mhz` and `s21_db` (or `frequency_hz` and `loss_db`)
|
||||
5. Pass to `rf_testbench.py` with `--cal path_loss.csv`
|
||||
</Steps>
|
||||
|
||||
The tool interpolates the measured path loss at each test frequency and subtracts it from AGC
|
||||
readings. Without a calibration file, raw AGC values are still reported — useful for relative
|
||||
measurements but not calibrated to absolute power.
|
||||
|
||||
<Aside type="tip" title="HMC472A insertion loss">
|
||||
The HMC472A adds 1.4-1.9 dB of insertion loss even at 0 dB attenuation setting. The calibration
|
||||
sweep captures this automatically since the signal passes through the attenuator during the S21
|
||||
measurement.
|
||||
</Aside>
|
||||
|
||||
## Prerequisites
|
||||
|
||||
- **SkyWalker-1** with [custom firmware v3.02+](/firmware/custom-v302/) (for `tune_monitor` command)
|
||||
- **HMC472A** attenuator with ESP32-S2 controller on the network
|
||||
- **NanoVNA-H** (manual mode works with any VNA; auto mode requires [mcnanovna](https://git.supported.systems/rf/mcnanovna))
|
||||
- **Python 3.10+** with `pyusb` installed
|
||||
- **DC blocker** (SMA inline)
|
||||
- **SMA-to-F adapter**
|
||||
|
||||
## Test Descriptions
|
||||
|
||||
### AGC Power Linearity
|
||||
|
||||
```bash
|
||||
python tools/rf_testbench.py agc-linearity --freq 1200
|
||||
```
|
||||
|
||||
Injects CW at a fixed frequency while sweeping the HMC472A from 0 to 31.5 dB in 0.5 dB steps.
|
||||
At each attenuation level, the SkyWalker-1 reports AGC1, AGC2, and derived power. This maps the
|
||||
**AGC transfer function** — how the receiver's automatic gain control responds to known changes
|
||||
in input power.
|
||||
|
||||
The output shows whether the AGC is linear, where it saturates, and its effective dynamic range.
|
||||
With 64 measurement points across 31.5 dB, the resolution is high enough to reveal nonlinearities
|
||||
in the BCM3440 tuner's gain control loop.
|
||||
|
||||
### IF Band Flatness
|
||||
|
||||
```bash
|
||||
python tools/rf_testbench.py band-flatness --start 950 --stop 1500 --step 10
|
||||
```
|
||||
|
||||
Sweeps the NanoVNA CW frequency across the IF band while keeping the HMC472A at a fixed
|
||||
attenuation (10 dB default). At each frequency, the SkyWalker-1 tunes and reads AGC power.
|
||||
|
||||
The result reveals:
|
||||
- **Tuner gain slope**: the BCM3440 may have more gain at some frequencies than others
|
||||
- **Passband ripple**: resonances or nulls in the IF filter chain
|
||||
- **Cable/path frequency response**: if a calibration file is loaded, this is subtracted out
|
||||
|
||||
### Frequency Accuracy
|
||||
|
||||
```bash
|
||||
python tools/rf_testbench.py freq-accuracy --freqs 1000,1100,1200,1300,1400
|
||||
```
|
||||
|
||||
At each test frequency, the NanoVNA injects CW while the SkyWalker-1 runs a narrow spectrum
|
||||
sweep (+/- 5 MHz) around the expected frequency. The detected power peak is compared against the
|
||||
injected frequency.
|
||||
|
||||
This characterizes the **BCM3440 tuner's frequency accuracy** — how much the actual tuned
|
||||
frequency differs from the commanded frequency. The error may be systematic (constant offset)
|
||||
or frequency-dependent.
|
||||
|
||||
### Minimum Detectable Signal
|
||||
|
||||
```bash
|
||||
python tools/rf_testbench.py mds --freq 1200
|
||||
```
|
||||
|
||||
First measures the noise floor with maximum attenuation (31.5 dB). Then injects CW and steps
|
||||
the HMC472A from 0 dB upward in 1 dB increments until the signal drops below 3-sigma above
|
||||
the noise floor.
|
||||
|
||||
The attenuation level where the signal disappears, combined with the NanoVNA output power
|
||||
(~-15 dBm), gives an approximate **minimum detectable signal level** in dBm.
|
||||
|
||||
### BPSK Mode 9 CW Probe
|
||||
|
||||
```bash
|
||||
python tools/rf_testbench.py bpsk-probe --freq 1200
|
||||
```
|
||||
|
||||
An exploratory test that tunes the SkyWalker-1 in **BPSK mode (index 9)** — the same Viterbi
|
||||
rate 1/2 K=7 inner FEC used by GOES LRIT. A CW carrier has no modulation, so the demodulator
|
||||
shouldn't acquire lock, but the AGC and carrier recovery behavior is informative.
|
||||
|
||||
Tests several symbol rates (293,883 sps matching LRIT, plus 500K, 1M, and 5M) and compares
|
||||
against QPSK mode 0 at the same frequency. This establishes a baseline for what mode 9 reports
|
||||
with an unmodulated carrier — useful context for future modulated-signal experiments with a
|
||||
bladeRF.
|
||||
|
||||
## Options
|
||||
|
||||
| Flag | Default | Description |
|
||||
|------|---------|-------------|
|
||||
| `--attenuator` | `http://attenuator.local` | HMC472A REST API base URL |
|
||||
| `--nanovna` | `auto` | NanoVNA control: `auto` (mcnanovna) or `manual` (prompted) |
|
||||
| `--cal` | — | Path loss calibration CSV file |
|
||||
| `--settle` | 200 | Settle time in ms after changing attenuation |
|
||||
| `--output` / `-o` | — | CSV output file |
|
||||
| `--verbose` / `-v` | — | Show raw USB traffic |
|
||||
|
||||
### Per-Test Options
|
||||
|
||||
| Test | Flag | Default | Description |
|
||||
|------|------|---------|-------------|
|
||||
| `agc-linearity` | `--freq` | 1200 | Test frequency in MHz |
|
||||
| `band-flatness` | `--start` | 950 | Start frequency in MHz |
|
||||
| `band-flatness` | `--stop` | 1500 | Stop frequency in MHz |
|
||||
| `band-flatness` | `--step` | 10 | Frequency step in MHz |
|
||||
| `freq-accuracy` | `--freqs` | 1000,1100,1200,1300,1400 | Comma-separated test frequencies |
|
||||
| `mds` | `--freq` | 1200 | Test frequency in MHz |
|
||||
| `bpsk-probe` | `--freq` | 1200 | Test frequency in MHz |
|
||||
|
||||
## CSV Output Format
|
||||
|
||||
All tests write the same CSV format when `--output` is specified:
|
||||
|
||||
| Column | Description |
|
||||
|--------|-------------|
|
||||
| `timestamp` | ISO 8601 UTC timestamp |
|
||||
| `test_name` | Test identifier (agc_linearity, band_flatness, freq_accuracy, mds, bpsk_probe) |
|
||||
| `freq_mhz` | Frequency in MHz |
|
||||
| `atten_db` | HMC472A attenuation setting in dB |
|
||||
| `agc1` | BCM3440 AGC1 register value |
|
||||
| `agc2` | BCM3440 AGC2 register value |
|
||||
| `power_db` | Derived power estimate in dB (relative) |
|
||||
| `snr_raw` | Raw SNR register value |
|
||||
| `snr_db` | SNR in dB |
|
||||
| `locked` | Demodulator lock status |
|
||||
| `lock_raw` | Raw lock status byte |
|
||||
| `status` | Status byte |
|
||||
| `notes` | Test-specific metadata |
|
||||
|
||||
## Interpreting Results
|
||||
|
||||
### AGC Linearity Curves
|
||||
|
||||
A well-behaved AGC should show a roughly linear relationship between attenuation (dB) and AGC
|
||||
register value. Look for:
|
||||
|
||||
- **Linear region**: Where AGC tracks input power changes 1:1 in dB — this is the useful
|
||||
measurement range
|
||||
- **Saturation**: Where adding more signal doesn't change AGC — the tuner's front end is
|
||||
compressing
|
||||
- **Noise floor**: Where reducing signal doesn't change AGC — the receiver's internal noise
|
||||
dominates
|
||||
|
||||
### Band Flatness
|
||||
|
||||
Ideal response is flat across the band. In practice:
|
||||
- **1-3 dB variation** across 950-1500 MHz is typical for a consumer-grade tuner
|
||||
- **Sharp dips** may indicate cable resonances or connector issues
|
||||
- **Systematic slope** (gain increasing or decreasing with frequency) is common and can be
|
||||
corrected in post-processing
|
||||
|
||||
### Frequency Error
|
||||
|
||||
Consumer satellite tuners typically have **50-200 kHz frequency accuracy**. A consistent offset
|
||||
suggests LO error in the BCM3440. Frequency-dependent error suggests tuning nonlinearity.
|
||||
|
||||
## Mock Mode
|
||||
|
||||
Run with `SKYWALKER_MOCK=1` for testing without hardware:
|
||||
|
||||
```bash
|
||||
SKYWALKER_MOCK=1 python tools/rf_testbench.py agc-linearity --freq 1200 --nanovna manual
|
||||
```
|
||||
|
||||
Mock mode uses built-in simulated responses for the SkyWalker-1 and HMC472A. The NanoVNA prompts
|
||||
are skipped. Useful for verifying command structure and CSV output format.
|
||||
|
||||
## See Also
|
||||
|
||||
- [Spectrum Analysis](/tools/spectrum-analysis/) — frequency sweep techniques
|
||||
- [Hydrogen 21 cm](/tools/h21cm/) — direct L-band input mode (same RF path concept)
|
||||
- [Signal Monitoring](/bcm4500/signal-monitoring/) — AGC and SNR register details
|
||||
- [HMC472A Documentation](https://hmc472.l.zmesh.systems/) — attenuator module reference
|
||||
- [Applications & Use Cases](/guides/applications/) — RF test and measurement context
|
||||
Loading…
Add table
Add a link
Reference in a new issue