Add DiSEqC motor control, QO-100 DATV reception, and carrier survey
Firmware v3.03.0: DiSEqC Manchester encoder (cmd 0x8D extended), parameterized spectrum sweep (0xBA), adaptive blind scan (0xBB), error code reporting (0xBC). All new function locals moved to XDATA to fit within FX2LP 256-byte internal RAM constraint. Motor control: DiSEqC 1.2 positioner with USALS GotoX, stored positions, interactive keyboard jog, 30-second safety auto-halt. QO-100 DATV: Es'hail-2 wideband transponder tools — LNB IF calculator, narrowband scan, tune, and TS-to-video pipe (ffplay/mpv). Carrier survey: six-stage pipeline (coarse sweep → peak detection → fine sweep → blind scan → TS sample → catalog). JSON catalog with differential analysis, QO-100 optimized mode, CSV/text export. TUI: F9 Motor screen (3-column layout with signal gauge), F10 Survey screen (Full Band + QO-100 tabs). Bridge, demo, and theme updated. Docs: motor.mdx, survey.mdx, qo100-datv.mdx guide, tui.mdx updated for 10 screens. Site builds 41 pages, all links valid.
This commit is contained in:
parent
0f4ba4766f
commit
cc3a0707a1
20 changed files with 5645 additions and 84 deletions
|
|
@ -114,12 +114,20 @@ export default defineConfig({
|
|||
{ label: 'Tuning', slug: 'tools/tuning' },
|
||||
{ label: 'SkyWalker RF Tool', slug: 'tools/skywalker' },
|
||||
{ label: 'SkyWalker TUI', slug: 'tools/tui' },
|
||||
{ label: 'Motor Control', slug: 'tools/motor' },
|
||||
{ label: 'Carrier Survey', slug: 'tools/survey' },
|
||||
{ label: 'EEPROM Utilities', slug: 'tools/eeprom-utilities' },
|
||||
{ label: 'Debugging', slug: 'tools/debugging' },
|
||||
{ label: 'TS Analyzer', slug: 'tools/ts-analyzer' },
|
||||
{ label: 'Spectrum Analysis', slug: 'tools/spectrum-analysis' },
|
||||
],
|
||||
},
|
||||
{
|
||||
label: 'Guides',
|
||||
items: [
|
||||
{ label: 'QO-100 DATV Reception', slug: 'guides/qo100-datv' },
|
||||
],
|
||||
},
|
||||
{
|
||||
label: 'Reference',
|
||||
items: [
|
||||
|
|
|
|||
175
site/src/content/docs/guides/qo100-datv.mdx
Normal file
175
site/src/content/docs/guides/qo100-datv.mdx
Normal file
|
|
@ -0,0 +1,175 @@
|
|||
---
|
||||
title: QO-100 DATV Reception
|
||||
description: Receiving amateur digital television from the Es'hail-2 geostationary satellite using the SkyWalker-1 DVB-S receiver.
|
||||
---
|
||||
|
||||
import { Tabs, TabItem, Steps, Aside, Badge, CardGrid, Card } from '@astrojs/starlight/components';
|
||||
|
||||
The Es'hail-2 satellite (25.9 degrees East) carries the first geostationary amateur radio transponders, designated QO-100. The wideband transponder at 10491-10499 MHz carries DATV (Digital Amateur Television) signals that the SkyWalker-1 can receive — with some important caveats about symbol rate limitations and LNB selection.
|
||||
|
||||
<Badge text="Requires custom firmware v3.03.0+" variant="caution" />
|
||||
|
||||
## Overview
|
||||
|
||||
<CardGrid>
|
||||
<Card title="Wideband Transponder" icon="rocket">
|
||||
10491.000 - 10499.500 MHz (8.5 MHz bandwidth). Carries DVB-S DATV stations from amateur operators worldwide.
|
||||
</Card>
|
||||
<Card title="Engineering Beacon" icon="star">
|
||||
10489.750 MHz CW/PSK beacon. Useful for dish pointing and LNB drift calibration.
|
||||
</Card>
|
||||
<Card title="Orbital Position" icon="sun">
|
||||
25.9 degrees East — visible from Europe, Africa, western Asia, and eastern Americas.
|
||||
</Card>
|
||||
<Card title="Minimum Dish Size" icon="setting">
|
||||
60 cm in central Europe, 1.2m+ at the edges of the footprint.
|
||||
</Card>
|
||||
</CardGrid>
|
||||
|
||||
## LNB Selection
|
||||
|
||||
The SkyWalker-1 accepts IF frequencies in the 950-2150 MHz range. The LNB's local oscillator frequency determines where the QO-100 signals appear in this window.
|
||||
|
||||
| LNB Type | LO Frequency | QO-100 IF Range | Compatible? |
|
||||
|----------|-------------|-----------------|-------------|
|
||||
| Universal (low band) | 9750 MHz | 741-749 MHz | No — below 950 MHz minimum |
|
||||
| Universal (high band) | 10600 MHz | -109 to -101 MHz | No — negative IF |
|
||||
| Modified universal | 9361 MHz | 1130-1138 MHz | Yes |
|
||||
| TCXO/PLL stabilized | 9750 MHz | 741-749 MHz | No — same issue |
|
||||
| Custom downconverter | varies | varies | Check IF range |
|
||||
|
||||
<Aside type="caution">
|
||||
A **standard universal LNB** at 9750 MHz places the QO-100 wideband transponder at 741-749 MHz IF, which is **below the SkyWalker-1's 950 MHz minimum**. You need either a modified LNB or an external downconverter to shift the IF into the 950-2150 MHz range.
|
||||
</Aside>
|
||||
|
||||
### Modified LNB Option
|
||||
|
||||
The most common approach among QO-100 operators is modifying a universal LNB by replacing the crystal oscillator (typically 25 MHz) with one that produces a different LO frequency. A 24.000 MHz crystal in a universal LNB that normally multiplies by 390 (9750 MHz) will produce 9360 MHz instead, placing QO-100 at 1131-1139 MHz IF.
|
||||
|
||||
Popular modified LO frequencies and their resulting IF ranges:
|
||||
|
||||
| Crystal | Multiplier | LO (MHz) | QO-100 IF (MHz) |
|
||||
|---------|-----------|----------|-----------------|
|
||||
| 24.000 MHz | x390 | 9360 | 1131-1139 |
|
||||
| 24.385 MHz | x384 | 9363 | 1128-1136 |
|
||||
| 25.000 MHz | x374 | 9350 | 1141-1149 |
|
||||
| 27.000 MHz | x348 | 9396 | 1095-1103 |
|
||||
|
||||
## Quick Start
|
||||
|
||||
<Steps>
|
||||
1. **Verify LNB compatibility** — check that your LO frequency places QO-100 in the 950-2150 MHz range:
|
||||
```bash
|
||||
python3 tools/qo100.py calc --lnb-lo 9361
|
||||
```
|
||||
|
||||
2. **Point the dish** — aim at 25.9 degrees East. Use the motor control tool or manual positioning:
|
||||
```bash
|
||||
sudo python3 tools/motor.py gotox --sat 25.9 --lon -97.5
|
||||
```
|
||||
|
||||
3. **Scan for carriers** — sweep the QO-100 IF range:
|
||||
```bash
|
||||
sudo python3 tools/qo100.py scan --lnb-lo 9361
|
||||
```
|
||||
|
||||
4. **Tune to a carrier** — lock onto a detected DATV station:
|
||||
```bash
|
||||
sudo python3 tools/qo100.py tune --freq 1135 --sr 1000 --lnb-lo 9361
|
||||
```
|
||||
|
||||
5. **Watch live video** — pipe the transport stream to a media player:
|
||||
```bash
|
||||
sudo python3 tools/qo100.py watch --freq 1135 --sr 1000 --lnb-lo 9361
|
||||
```
|
||||
</Steps>
|
||||
|
||||
## CLI Reference
|
||||
|
||||
### Calculate IF Frequencies
|
||||
|
||||
```bash
|
||||
python3 tools/qo100.py calc --lnb-lo 9361
|
||||
```
|
||||
|
||||
Displays the QO-100 wideband transponder IF range, known DATV frequencies with their IF equivalents, and the beacon frequency. No hardware required — pure calculation.
|
||||
|
||||
### Band Plan
|
||||
|
||||
```bash
|
||||
python3 tools/qo100.py band-plan --lnb-lo 9361
|
||||
```
|
||||
|
||||
Shows the complete QO-100 wideband transponder band plan with known station frequencies converted to your LNB's IF range. Includes both the wideband DATV segment and the engineering beacon.
|
||||
|
||||
### Scan
|
||||
|
||||
```bash
|
||||
sudo python3 tools/qo100.py scan --lnb-lo 9361
|
||||
```
|
||||
|
||||
Sweeps the QO-100 IF range with parameters tuned for narrowband DATV:
|
||||
- 250 kHz frequency steps (vs 5 MHz for broadcast)
|
||||
- 1000 ksps measurement symbol rate
|
||||
- Extended dwell time for weak signal detection
|
||||
|
||||
### Tune
|
||||
|
||||
```bash
|
||||
sudo python3 tools/qo100.py tune --freq 1135 --sr 1000 --lnb-lo 9361
|
||||
```
|
||||
|
||||
Tunes the BCM4500 to the specified IF frequency and symbol rate, then monitors lock status and signal quality. The `--freq` parameter is the IF frequency (after LNB downconversion), not the RF frequency.
|
||||
|
||||
### Watch
|
||||
|
||||
```bash
|
||||
sudo python3 tools/qo100.py watch --freq 1135 --sr 1000 --lnb-lo 9361
|
||||
```
|
||||
|
||||
Tunes, locks, and pipes the raw MPEG-2 transport stream to `ffplay` (or `mpv` if ffplay is not found). The video player receives the stream on stdin and renders it in real time.
|
||||
|
||||
| Flag | Default | Description |
|
||||
|------|---------|-------------|
|
||||
| `--freq` | — | IF frequency in MHz (required) |
|
||||
| `--sr` | 1000 | Symbol rate in ksps |
|
||||
| `--lnb-lo` | — | LNB local oscillator in MHz (required) |
|
||||
| `--player` | auto | Video player command (`ffplay` or `mpv`) |
|
||||
|
||||
## Hardware Limitations
|
||||
|
||||
### Minimum Symbol Rate
|
||||
|
||||
The BCM4500 demodulator has a minimum symbol rate of **256 ksps** (256,000 symbols per second). Many QO-100 DATV stations transmit at lower rates:
|
||||
|
||||
| Typical QO-100 SR | BCM4500 Support |
|
||||
|-------------------|----------------|
|
||||
| 125 ksps | Detectable as energy, cannot lock |
|
||||
| 250 ksps | Marginal — may lock with strong signal |
|
||||
| 333 ksps | Supported |
|
||||
| 500 ksps | Supported |
|
||||
| 1000 ksps | Supported |
|
||||
| 2000 ksps | Supported |
|
||||
|
||||
The survey tool distinguishes "carrier detected" (energy above noise floor) from "carrier locked" (BCM4500 achieved demodulator lock) in its output.
|
||||
|
||||
### Lock Acquisition Time
|
||||
|
||||
QO-100 signals are weaker than broadcast satellites. The BCM4500 may need 10-30 seconds to achieve lock at low symbol rates, compared to 1-2 seconds for typical broadcast transponders. The `qo100.py tune` command uses extended timeouts automatically.
|
||||
|
||||
### Frequency Stability
|
||||
|
||||
QO-100 DATV signals have tighter frequency tolerance requirements than the SkyWalker-1's default tuning resolution. A PLL-stabilized or TCXO LNB provides better frequency accuracy than a standard DRO LNB, reducing the chance of the demodulator losing lock due to LNB drift.
|
||||
|
||||
## Using the TUI
|
||||
|
||||
The SkyWalker TUI includes QO-100 as a tab within the Survey screen (<kbd>F10</kbd>). The QO-100 tab pre-fills the sweep parameters with values optimized for the wideband transponder and includes an info panel showing known station frequencies adjusted for your LNB's local oscillator.
|
||||
|
||||
See [SkyWalker TUI — Survey Screen](/tools/tui/#survey--qo-100) for details.
|
||||
|
||||
## See Also
|
||||
|
||||
- [Motor Control](/tools/motor/) — DiSEqC 1.2 positioner for dish pointing
|
||||
- [Carrier Survey](/tools/survey/) — automated carrier detection and cataloging
|
||||
- [LNB Control](/lnb-diseqc/lnb-control/) — LNB power and voltage configuration
|
||||
- [RF Specifications](/hardware/rf-specifications/) — SkyWalker-1 frequency range and sensitivity
|
||||
107
site/src/content/docs/tools/motor.mdx
Normal file
107
site/src/content/docs/tools/motor.mdx
Normal file
|
|
@ -0,0 +1,107 @@
|
|||
---
|
||||
title: Motor Control
|
||||
description: DiSEqC 1.2 positioner motor control with USALS GotoX, stored positions, and live signal feedback for dish alignment.
|
||||
---
|
||||
|
||||
import { Tabs, TabItem, Steps, Aside, Badge } from '@astrojs/starlight/components';
|
||||
|
||||
Command-line tool for driving a DiSEqC 1.2 positioner motor through the SkyWalker-1. Supports continuous jog, stored positions, USALS GotoX calculations, and an interactive keyboard-driven mode with live signal feedback for hands-free dish alignment.
|
||||
|
||||
<Badge text="Requires custom firmware v3.03.0+" variant="caution" />
|
||||
|
||||
## Usage
|
||||
|
||||
```bash title="Interactive motor jog with live signal"
|
||||
sudo python3 tools/motor.py interactive
|
||||
```
|
||||
|
||||
```bash title="Drive to a stored position"
|
||||
sudo python3 tools/motor.py goto 3
|
||||
```
|
||||
|
||||
```bash title="USALS GotoX (Es'hail-2 from central Texas)"
|
||||
sudo python3 tools/motor.py gotox --sat 25.9 --lon -97.5
|
||||
```
|
||||
|
||||
## Subcommands
|
||||
|
||||
| Command | Description |
|
||||
|---------|-------------|
|
||||
| `halt` | Emergency stop the motor |
|
||||
| `east [--steps N]` | Drive east (continuous or N steps) |
|
||||
| `west [--steps N]` | Drive west (continuous or N steps) |
|
||||
| `goto SLOT` | Recall stored position (0 = reference) |
|
||||
| `store SLOT` | Store current position in slot (1-255) |
|
||||
| `gotox --sat LON --lon LON` | USALS GotoX with calculated rotation angle |
|
||||
| `limit east\|west` | Set east or west movement limit |
|
||||
| `nolimits` | Disable movement limits |
|
||||
| `raw HEX` | Send raw DiSEqC bytes (e.g. `E0 31 60`) |
|
||||
| `interactive` | Keyboard-driven jog with live signal display |
|
||||
|
||||
## Interactive Mode
|
||||
|
||||
The `interactive` subcommand turns the terminal into a real-time motor controller optimized for dish alignment. No menus, no prompts — just directional input with instant signal feedback.
|
||||
|
||||
| Key | Action |
|
||||
|-----|--------|
|
||||
| <kbd>Left</kbd> / <kbd>h</kbd> | Jog west |
|
||||
| <kbd>Right</kbd> / <kbd>l</kbd> | Jog east |
|
||||
| <kbd>Space</kbd> | Halt motor |
|
||||
| <kbd>1</kbd>–<kbd>9</kbd> | Recall stored position |
|
||||
| <kbd>s</kbd> | Store current position (prompts for slot) |
|
||||
| <kbd>g</kbd> | USALS GotoX (prompts for coordinates) |
|
||||
| <kbd>q</kbd> | Quit (motor auto-halts on exit) |
|
||||
|
||||
Signal readings update at ~2 Hz, showing SNR, AGC power, and lock status. The display uses ANSI color to distinguish locked (green) from unlocked (red) states.
|
||||
|
||||
### Safety Features
|
||||
|
||||
- **30-second auto-halt** — continuous jog stops automatically after 30 seconds to prevent mechanical damage
|
||||
- **Exit handler** — motor is halted via `atexit` if the process terminates unexpectedly
|
||||
- **Limit enforcement** — DiSEqC 1.2 hardware limits are respected when set
|
||||
|
||||
<Aside type="caution">
|
||||
The motor continues to drive until explicitly halted. If the SkyWalker-1 loses USB power during a jog, the motor will keep moving until it hits a hardware limit. Always set east/west limits before extended use.
|
||||
</Aside>
|
||||
|
||||
## USALS GotoX
|
||||
|
||||
The `gotox` subcommand calculates the optimal motor rotation angle using the USALS (Universal Satellites Automatic Location System) algorithm and sends a DiSEqC 1.3 GotoX command.
|
||||
|
||||
```bash title="Calculate and drive to Es'hail-2 (QO-100)"
|
||||
sudo python3 tools/motor.py gotox --sat 25.9 --lon -97.5
|
||||
# Output: Angle: 72.4 deg East — sending GotoX
|
||||
```
|
||||
|
||||
The angle calculation accounts for:
|
||||
- Observer longitude (negative = West)
|
||||
- Satellite longitude (positive = East)
|
||||
- Geostationary orbit geometry at 35,786 km altitude
|
||||
|
||||
<Aside type="tip">
|
||||
For QO-100 reception from North America, the motor angle is extreme (~70+ degrees East). Verify your positioner has sufficient travel range before issuing the command.
|
||||
</Aside>
|
||||
|
||||
## DiSEqC 1.2 Protocol
|
||||
|
||||
All motor commands use DiSEqC 1.2 (EN 50494) framing transmitted through the SkyWalker-1's Manchester encoder. The firmware generates the 22 kHz modulated waveform with correct timing:
|
||||
|
||||
| Command | DiSEqC Bytes | Description |
|
||||
|---------|-------------|-------------|
|
||||
| Halt | `E0 31 60` | Stop motor movement |
|
||||
| Drive East | `E0 31 68 00` | Continuous east (00 = no step limit) |
|
||||
| Drive West | `E0 31 69 00` | Continuous west |
|
||||
| Store Position | `E0 31 6A NN` | Save current position to slot NN |
|
||||
| Goto Position | `E0 31 6B NN` | Drive to stored position NN |
|
||||
| Set East Limit | `E0 31 66 00` | Set current position as east limit |
|
||||
| Set West Limit | `E0 31 66 01` | Set current position as west limit |
|
||||
| Disable Limits | `E0 31 63` | Remove movement limits |
|
||||
| GotoX | `E0 31 6E HH LL` | USALS rotation (angle encoded as 2 bytes) |
|
||||
|
||||
The `raw` subcommand accepts any hex string for advanced DiSEqC messaging beyond the built-in commands.
|
||||
|
||||
## See Also
|
||||
|
||||
- [SkyWalker TUI — Motor Screen](/tools/tui/#motor-control) — graphical motor control with signal gauge
|
||||
- [DiSEqC Protocol](/lnb-diseqc/diseqc-protocol/) — protocol specification and Manchester encoding details
|
||||
- [QO-100 DATV Reception](/guides/qo100-datv/) — using motor control for QO-100 dish pointing
|
||||
160
site/src/content/docs/tools/survey.mdx
Normal file
160
site/src/content/docs/tools/survey.mdx
Normal file
|
|
@ -0,0 +1,160 @@
|
|||
---
|
||||
title: Carrier Survey
|
||||
description: Automated six-stage carrier detection, cataloging, and differential analysis across the full IF range or QO-100 narrowband transponder.
|
||||
---
|
||||
|
||||
import { Tabs, TabItem, Steps, Aside, Badge, CardGrid, Card } from '@astrojs/starlight/components';
|
||||
|
||||
Automated carrier survey tool that sweeps the IF range, detects signals above the noise floor, identifies locked transponders with blind scan, and catalogs results with service name extraction from the transport stream. Supports full-band surveys, quick scans, QO-100 narrowband sweeps, and differential analysis between survey snapshots.
|
||||
|
||||
<Badge text="Requires custom firmware v3.03.0+" variant="caution" />
|
||||
|
||||
## Quick Start
|
||||
|
||||
```bash title="Full six-stage survey"
|
||||
sudo python3 tools/survey.py full-scan
|
||||
```
|
||||
|
||||
```bash title="Quick sweep (no blind scan)"
|
||||
sudo python3 tools/survey.py quick-scan
|
||||
```
|
||||
|
||||
```bash title="QO-100 narrowband survey"
|
||||
sudo python3 tools/survey.py qo100 --lnb-lo 9750
|
||||
```
|
||||
|
||||
```bash title="Compare two surveys"
|
||||
python3 tools/survey.py diff survey-old.json survey-new.json
|
||||
```
|
||||
|
||||
## Subcommands
|
||||
|
||||
| Command | Description |
|
||||
|---------|-------------|
|
||||
| `full-scan` | Complete 6-stage survey with carrier identification |
|
||||
| `quick-scan` | Sweep + peak detection only (stages 1-2) |
|
||||
| `diff FILE1 FILE2` | Compare two survey catalogs |
|
||||
| `export FILE` | Export to CSV, JSON, or text |
|
||||
| `view [FILE]` | Display latest or specified survey |
|
||||
| `qo100 --lnb-lo LO` | QO-100 transponder survey with optimized parameters |
|
||||
|
||||
## Survey Pipeline
|
||||
|
||||
The full survey runs six stages sequentially. Each stage refines the previous stage's results.
|
||||
|
||||
<Steps>
|
||||
1. **Coarse sweep** — full IF range (950-2150 MHz default) at 5 MHz steps. Measures signal power at each frequency using the firmware's spectrum sweep command.
|
||||
|
||||
2. **Peak detection** — adaptive noise floor estimation using median + MAD (Median Absolute Deviation), followed by local maxima finding with -3 dB bandwidth estimation and peak merging.
|
||||
|
||||
3. **Fine sweep** — +/-10 MHz around each detected peak at 1 MHz steps. Refines center frequencies from the coarse sweep.
|
||||
|
||||
4. **Blind scan** — at each refined peak, tries symbol rates from 1-30 Msps in 1 Msps steps using the firmware's adaptive blind scan (AGC pre-check skips empty frequencies). Reports lock status with frequency and symbol rate.
|
||||
|
||||
5. **TS sample** — for locked carriers, captures 3 seconds of transport stream data and parses PAT, PMT, and SDT tables to extract program numbers, stream types, service names, and provider names.
|
||||
|
||||
6. **Catalog assembly** — aggregates all results into a `CarrierCatalog` with full metadata, saves to `~/.skywalker1/surveys/`.
|
||||
</Steps>
|
||||
|
||||
### Full Scan Options
|
||||
|
||||
| Flag | Default | Description |
|
||||
|------|---------|-------------|
|
||||
| `--start` | 950 | Start frequency (MHz) |
|
||||
| `--stop` | 2150 | Stop frequency (MHz) |
|
||||
| `--coarse-step` | 5.0 | Coarse sweep step (MHz) |
|
||||
| `--fine-step` | 1.0 | Fine sweep step (MHz) |
|
||||
| `--sr-min` | 1,000,000 | Min symbol rate (sps) |
|
||||
| `--sr-max` | 30,000,000 | Max symbol rate (sps) |
|
||||
| `--sr-step` | 1,000,000 | Symbol rate step (sps) |
|
||||
| `--pol` | — | Polarization label (H/V/L/R) |
|
||||
| `--band` | — | Band label (low/high) |
|
||||
| `--output` | auto | Output filename |
|
||||
|
||||
## Carrier Catalog
|
||||
|
||||
Survey results are stored as JSON in `~/.skywalker1/surveys/` with auto-generated filenames:
|
||||
|
||||
```
|
||||
~/.skywalker1/surveys/
|
||||
survey-2026-02-15-low-V.json
|
||||
survey-2026-02-16-high-H.json
|
||||
survey-2026-02-16-qo100-9750.json
|
||||
```
|
||||
|
||||
Each carrier entry records:
|
||||
- Frequency, symbol rate, modulation, FEC
|
||||
- Signal power, SNR, lock status
|
||||
- Detected services (names, types, PIDs)
|
||||
- Estimated bandwidth and carrier classification
|
||||
- First/last seen timestamps, scan count
|
||||
|
||||
### Differential Analysis
|
||||
|
||||
Compare two survey snapshots to detect changes over time:
|
||||
|
||||
```bash
|
||||
python3 tools/survey.py diff old-survey.json new-survey.json
|
||||
```
|
||||
|
||||
Output categorizes carriers as:
|
||||
|
||||
| Category | Description |
|
||||
|----------|-------------|
|
||||
| **NEW** | Carrier present in new survey but not old |
|
||||
| **MISSING** | Carrier present in old survey but not new |
|
||||
| **CHANGED** | Carrier exists in both but with differences (lock state, power >2 dB, modulation, services) |
|
||||
| **STABLE** | Carrier unchanged between surveys |
|
||||
|
||||
<Aside type="tip">
|
||||
Run surveys at the same time of day and with the same LNB configuration for meaningful differential analysis. Sun transit, rain fade, and LNB drift all affect signal levels.
|
||||
</Aside>
|
||||
|
||||
## QO-100 Mode
|
||||
|
||||
The `qo100` subcommand uses parameters optimized for the Es'hail-2 wideband transponder (10491-10499 MHz):
|
||||
|
||||
- **Step sizes**: 0.5 MHz coarse, 0.1 MHz fine (vs 5/1 MHz for broadcast)
|
||||
- **Symbol rate range**: 256 ksps - 2 Msps (vs 1-30 Msps for broadcast)
|
||||
- **Detection threshold**: 3.0 dB above noise floor (more sensitive)
|
||||
- **IF range**: auto-calculated from `--lnb-lo` parameter
|
||||
|
||||
```bash title="QO-100 with universal LNB low band"
|
||||
sudo python3 tools/survey.py qo100 --lnb-lo 9750
|
||||
# Scans IF: 741-749 MHz
|
||||
```
|
||||
|
||||
```bash title="QO-100 with modified LNB (9361 MHz LO)"
|
||||
sudo python3 tools/survey.py qo100 --lnb-lo 9361
|
||||
# Scans IF: 1130-1138 MHz
|
||||
```
|
||||
|
||||
<Aside type="caution">
|
||||
The BCM4500 demodulator has a minimum symbol rate of 256 ksps. QO-100 DATV stations transmitting below this rate will appear as detected energy in the sweep but cannot achieve signal lock. The survey distinguishes "carrier detected" from "carrier locked" in its output.
|
||||
</Aside>
|
||||
|
||||
## Signal Analysis
|
||||
|
||||
The survey engine uses enhanced signal analysis beyond the basic peak detection in `skywalker_lib`:
|
||||
|
||||
- **Adaptive noise floor** — median + MAD robust estimator, resistant to strong carriers biasing the baseline
|
||||
- **Bandwidth estimation** — walks from peak until -3 dB crossing on each side, with inter-bin interpolation
|
||||
- **Carrier classification** — heuristic mapping from estimated bandwidth to likely symbol rate range and modulation type
|
||||
- **Peak merging** — overlapping detections within one bandwidth are consolidated into a single carrier
|
||||
|
||||
## Export Formats
|
||||
|
||||
```bash title="Export to CSV"
|
||||
python3 tools/survey.py export survey.json --format csv --output carriers.csv
|
||||
```
|
||||
|
||||
```bash title="Export to formatted text"
|
||||
python3 tools/survey.py export survey.json --format text
|
||||
```
|
||||
|
||||
## See Also
|
||||
|
||||
- [SkyWalker TUI — Survey Screen](/tools/tui/#survey--qo-100) — graphical survey with spectrum plot and carrier table
|
||||
- [QO-100 DATV Reception](/guides/qo100-datv/) — complete guide to receiving amateur television via Es'hail-2
|
||||
- [Spectrum Analysis](/tools/spectrum-analysis/) — manual spectrum sweep techniques
|
||||
- [TS Analyzer](/tools/ts-analyzer/) — standalone transport stream analysis
|
||||
|
|
@ -5,9 +5,9 @@ description: Interactive terminal dashboard for spectrum analysis, transponder s
|
|||
|
||||
import { Tabs, TabItem, Steps, Aside, Badge } from '@astrojs/starlight/components';
|
||||
|
||||
The SkyWalker TUI is a full-screen terminal dashboard built on [Textual](https://textual.textualize.io/) that wraps all eight operating modes into a single interactive interface. Five RF signal modes (Spectrum, Scan, Monitor, L-Band, Track) plus Device management, Transport Stream analysis, and hardware Config — all with sidebar navigation, F-key shortcuts, real-time widget updates, and a dark/light theme toggle.
|
||||
The SkyWalker TUI is a full-screen terminal dashboard built on [Textual](https://textual.textualize.io/) that wraps all ten operating modes into a single interactive interface. Five RF signal modes (Spectrum, Scan, Monitor, L-Band, Track), Device management, Transport Stream analysis, hardware Config, DiSEqC Motor control, and an automated Carrier Survey with QO-100 DATV support — all with sidebar navigation, F-key shortcuts, real-time widget updates, and a dark/light theme toggle.
|
||||
|
||||
<Badge text="Requires custom firmware v3.02.0+" variant="caution" />
|
||||
<Badge text="Requires custom firmware v3.03.0+" variant="caution" />
|
||||
|
||||

|
||||
|
||||
|
|
@ -34,7 +34,7 @@ uv run skywalker-tui --demo
|
|||
| `--demo` | Synthetic signal data — no SkyWalker-1 USB device needed |
|
||||
| `--no-splash` | Skip the startup splash screen |
|
||||
| `--verbose, -v` | Verbose USB logging (hardware mode only) |
|
||||
| `MODE` | Initial mode: `spectrum` (default), `scan`, `monitor`, `lband`, `track`, `device`, `stream`, `config` |
|
||||
| `MODE` | Initial mode: `spectrum` (default), `scan`, `monitor`, `lband`, `track`, `device`, `stream`, `config`, `motor`, `survey` |
|
||||
|
||||
<Aside type="tip">
|
||||
Demo mode generates realistic-looking synthetic data for every screen, making it useful for familiarization, documentation, and development without satellite hardware.
|
||||
|
|
@ -54,6 +54,8 @@ Demo mode generates realistic-looking synthetic data for every screen, making it
|
|||
| <kbd>F6</kbd> | Device management |
|
||||
| <kbd>F7</kbd> | Transport stream |
|
||||
| <kbd>F8</kbd> | Hardware config |
|
||||
| <kbd>F9</kbd> | Motor control |
|
||||
| <kbd>F10</kbd> | Carrier survey |
|
||||
| <kbd>d</kbd> | Toggle dark/light theme |
|
||||
| <kbd>q</kbd> | Quit |
|
||||
| <kbd>Ctrl+W</kbd> | Easter egg |
|
||||
|
|
@ -208,6 +210,50 @@ LNB power control, DiSEqC switching, and modulation/FEC configuration — all th
|
|||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
### Motor Control <Badge text="F9" variant="note" />
|
||||
|
||||
DiSEqC 1.2 positioner motor control with three-column layout: jog/halt controls, stored positions, and USALS GotoX calculator. A live signal bar at the bottom provides real-time SNR, power, lock status, and motor position feedback for hands-free dish alignment.
|
||||
|
||||
- Continuous jog (east/west) with keyboard arrows or button controls
|
||||
- 3x3 stored position grid for quick satellite recall
|
||||
- USALS GotoX calculator with observer longitude input and satellite presets (QO-100, Galaxy 19, AMC-1)
|
||||
- 30-second auto-halt safety timer on continuous jog
|
||||
- Motor automatically halts when switching away from the screen
|
||||
- Live signal gauge updates at 2 Hz for alignment feedback
|
||||
|
||||
| Key | Action |
|
||||
|-----|--------|
|
||||
| <kbd>Left</kbd> | Jog west |
|
||||
| <kbd>Right</kbd> | Jog east |
|
||||
| <kbd>Space</kbd> | Halt motor |
|
||||
|
||||
<Aside type="caution">
|
||||
The motor continues to drive until explicitly halted or the 30-second safety timer triggers. Always set east/west limits via the Limits panel before extended use.
|
||||
</Aside>
|
||||
|
||||
### Survey + QO-100 <Badge text="F10" variant="note" />
|
||||
|
||||
Automated carrier survey with two tabs: Full Band sweep across the entire IF range, and a QO-100 DATV tab with parameters optimized for the Es'hail-2 wideband transponder.
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="Full Band">
|
||||
Six-stage survey pipeline: coarse sweep, peak detection, fine sweep, blind scan, TS sample, and catalog assembly. Results display as a spectrum plot and frequency table showing detected carriers with their symbol rate, modulation, lock status, and service names.
|
||||
|
||||
- Configurable start/stop frequency and step sizes
|
||||
- Full scan and quick scan modes
|
||||
- Carrier table with real-time status
|
||||
- Results auto-saved to `~/.skywalker1/surveys/`
|
||||
</TabItem>
|
||||
<TabItem label="QO-100 DATV">
|
||||
Narrowband sweep tuned for Es'hail-2's wideband transponder (10491-10499 MHz). Uses tighter frequency steps (0.5/0.1 MHz vs 5/1 MHz), lower symbol rate range (256 ksps - 2 Msps), and a more sensitive detection threshold (3.0 dB).
|
||||
|
||||
- LNB local oscillator input for IF calculation
|
||||
- Known QO-100 station frequencies displayed
|
||||
- Info panel explaining BCM4500 symbol rate limitations
|
||||
- Carriers classified as "detected" vs "locked"
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
---
|
||||
|
||||
## Easter Eggs
|
||||
|
|
@ -258,4 +304,7 @@ Use `--no-splash` to skip it.
|
|||
- [Tuning Tool](/tools/tuning/) — primary tuning, LNB control, and transport stream capture
|
||||
- [EEPROM Utilities](/tools/eeprom-utilities/) — standalone CLI for firmware updates (same safety protocol as F6 Device screen)
|
||||
- [TS Stream Analyzer](/tools/ts-analyzer/) — standalone TS packet analyzer (same engine as F7 Stream screen)
|
||||
- [Motor Control](/tools/motor/) — standalone CLI for DiSEqC 1.2 motor control (same engine as F9 Motor screen)
|
||||
- [Carrier Survey](/tools/survey/) — standalone CLI for automated carrier survey (same engine as F10 Survey screen)
|
||||
- [QO-100 DATV Reception](/guides/qo100-datv/) — complete guide to Es'hail-2 amateur television reception
|
||||
- [RF Coverage](/hardware/rf-coverage/) — frequency coverage and antenna considerations
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue