skywalker.py provides five alternative operating modes beyond satellite feed tuning. These modes repurpose the BCM4500’s AGC registers as a crude power detector across the 950—2150 MHz IF range, allowing spectrum sweeps, blind transponder scanning, real-time dish alignment, L-band direct input analysis, and carrier tracking — all without requiring demodulator lock.
Requires custom firmware v3.02.0+
Commands 0xB7 (SIGNAL_MONITOR), 0xB8 (TUNE_MONITOR), and 0xB9 (BLIND_SCAN) must be present in the FX2 firmware. See Custom v3.01 for the base firmware these commands build on.
Subcommand Purpose spectrumSweep spectrum analyzer (950—2150 MHz IF range) scanAutomated transponder scanner (sweep + blind scan) monitorReal-time signal strength / dish alignment lbandL-band direct input analyzer (no LNB) trackCarrier/beacon tracker with logging
Flag Description -v, --verboseShow raw USB traffic
Sweeps the IF range using TUNE_MONITOR (0xB8) at each step and renders an ASCII bar chart to the terminal. Optionally produces waterfall displays, matplotlib plots, and CSV exports.
Flag Description --start FLOATStart IF frequency in MHz (default: 950) --stop FLOATStop IF frequency in MHz (default: 2150) --step FLOATStep size in MHz (default: 5) --dwell INTDwell time per step in ms (default: 10) --lnb-lo FLOATLNB LO frequency in MHz; 0 = direct input (default: 0) --sr INTSymbol rate for measurement in ksps (default: 20000) --waterfallWaterfall display (time x frequency x power) --sweeps INTNumber of sweeps (default: 1) --threshold FLOATPeak detection threshold in dB above noise floor (default: 3) --plotShow matplotlib plot after sweep completes --csv FILESave sweep data to CSV
sudo python3 tools/skywalker.py spectrum
sudo python3 tools/skywalker.py spectrum --start 1200 --stop 1400 --step 2 --lnb-lo 9750 --csv sweep.csv
sudo python3 tools/skywalker.py spectrum --waterfall --sweeps 10 --step 10
sudo python3 tools/skywalker.py spectrum --plot --threshold 5
SkyWalker-1 Spectrum Sweep
==================================================
Range: 950.0 - 2150.0 MHz IF (step 5.0 MHz)
Dwell: 10 ms/step SR: 20000 ksps
Steps: 240 Est. time: ~2.9s
1120.0 | ████████████████████ -48.2 dBm
1125.0 | ██████████████████████████████████ -42.7 dBm << PEAK
1130.0 | ████████████████████ -48.5 dBm
1920.0 | █████████████████████████████ -44.1 dBm << PEAK
1925.0 | ████████████████████████████████████ -41.3 dBm << PEAK
1930.0 | ████████████████████████ -46.0 dBm
Peaks detected (>3.0 dB above floor):
1125.0 MHz IF -42.7 dBm (RF: 1125.0 MHz)
1925.0 MHz IF -41.3 dBm (RF: 1925.0 MHz)
Sweep complete: 240 steps in 2.88s
Performs a three-phase automated transponder search: coarse spectrum sweep, fine sweep around detected peaks, and blind scan at each refined peak across a range of symbol rates.
Coarse sweep at 10 MHz steps across the full IF range to identify candidate carriers.
Fine sweep at 2 MHz steps around each peak detected in the coarse pass.
Blind scan (0xB3) at each refined peak, trying symbol rates from --sr-min to --sr-max in --sr-step increments.
Flag Description --start FLOATStart IF frequency in MHz (default: 950) --stop FLOATStop IF frequency in MHz (default: 2150) --threshold FLOATPeak detection threshold in dB (default: 3) --sr-min INTMinimum symbol rate in ksps (default: 1000) --sr-max INTMaximum symbol rate in ksps (default: 30000) --sr-step INTSymbol rate step in ksps (default: 500) --lnb-lo FLOATLNB LO frequency in MHz (default: 9750) --pol H/V/L/RPolarization --band low/highLNB band --jsonJSON output --csv FILECSV output
sudo python3 tools/skywalker.py scan --pol H --band low
sudo python3 tools/skywalker.py scan --start 1100 --stop 1200 --sr-min 10000 --sr-max 30000 --sr-step 1000 --json
sudo python3 tools/skywalker.py scan --lnb-lo 5150 --pol V --csv cband_scan.csv
Tunes to a specified frequency and symbol rate, then polls SIGNAL_MONITOR (0xB7) at a configurable rate to display a continuously updating signal strength indicator. Designed for hands-free dish alignment.
Argument Description FREQ_MHZTransponder frequency in MHz SR_KSPSSymbol rate in ksps
Flag Description --pol H/V/L/RPolarization --band low/highLNB band --lnb-lo FLOATLNB LO frequency in MHz (default: 9750) --rate FLOATPoll rate in Hz (default: 10, max ~50) --audioPitch-proportional beep for hands-free alignment --peak-holdTrack and display maximum signal level --history INTSparkline history length in samples (default: 60) --plotShow matplotlib plot after stopping
sudo python3 tools/skywalker.py monitor 12520 27500 --pol H --band high
sudo python3 tools/skywalker.py monitor 11836 27500 --pol V --band low --audio --peak-hold
sudo python3 tools/skywalker.py monitor 12520 27500 --pol H --band high --rate 30 --history 120
[LOCK] SNR 8.2dB AGC 0x3A [████████████████░░░░░░░░░░░░░░░░░░░░░░░░] 42% ▁▃▅▇█▇▅▃▅▇█▇▅▃▁
[----] SNR 0.0dB AGC 0xFF [░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░] 0% ▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
The display updates in-place using terminal control codes. The sparkline at the right edge shows --history samples of recent signal strength. Press Ctrl-C to stop.
Identical to spectrum mode but with lnb_lo=0 and LNB power disabled. Intended for direct RF input in the 950—2150 MHz range (L-band). Annotates known L-band frequency allocations in the output.
Flag Description --start FLOATStart frequency in MHz (default: 950) --stop FLOATStop frequency in MHz (default: 2150) --step FLOATStep size in MHz (default: 2) --dwell INTDwell time per step in ms (default: 20) --23cmNarrow to 1240—1300 MHz with 500 kHz steps --band-infoPrint L-band allocation table and exit --waterfallWaterfall display --plotShow matplotlib plot --csv FILESave data to CSV
Range (MHz) Service 1240—1300 Amateur 23cm 1525—1559 Inmarsat downlink 1559—1610 GNSS (GPS L1, Galileo E1) 1610—1626 Iridium downlink 1670—1710 MetSat (GOES LRIT, NOAA HRPT) 1710—1785 LTE/AWS uplink 1920—2025 UMTS uplink
sudo python3 tools/skywalker.py lband
sudo python3 tools/skywalker.py lband --23cm
sudo python3 tools/skywalker.py lband --waterfall --csv lband_sweep.csv
sudo python3 tools/skywalker.py lband --band-info
Caution
Can detect carrier presence at any frequency even if the modulation is incompatible with the BCM4500 demodulator. The AGC power reading does not depend on demodulation — only on RF energy at the tuned frequency. This makes L-band mode useful for detecting GNSS, Inmarsat, Iridium, and other signals that the BCM4500 cannot decode.
Tunes to a single frequency and symbol rate, then polls SIGNAL_MONITOR continuously with timestamped logging. Detects lock/unlock transitions and optionally tracks frequency drift by periodically sweeping a narrow window around the target.
Argument Description FREQ_MHZCarrier frequency in MHz SR_KSPSSymbol rate in ksps
Flag Description --pol H/V/L/RPolarization --band low/highLNB band --lnb-lo FLOATLNB LO frequency in MHz (default: 9750) --rate FLOATPoll rate in Hz (default: 1) --duration FLOATDuration in seconds (default: until Ctrl-C) --log FILECSV log file --drift-trackSweep +/-5 MHz every 5s to measure frequency drift --plotShow matplotlib plot after stopping --json-lines FILEJSON-lines log file
sudo python3 tools/skywalker.py track 11700 27500 --pol V --band low --duration 3600 --log beacon.csv
sudo python3 tools/skywalker.py track 12520 27500 --pol H --band high --drift-track --json-lines drift.jsonl
sudo python3 tools/skywalker.py track 11836 27500 --pol V --band low --rate 5 --plot