Skip to content

About

Touchscreen QO-100 (Es'hail-2) DATV receiver for Raspberry Pi — spectrum display, tap-to-tune, live video, wideband chat

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Latest commit

 

History

178 Commits

Folders and files

Repository files navigation

QO-100 DATV Receiver (Raspberry Pi 4/5)

A standalone QO-100 (Es'hail-2) digital amateur TV receiver. Runs on a Raspberry Pi 4 or 5, driving a MiniTiouner (or, experimentally, a BATC PicoTuner) tuner, with a fullscreen touchscreen app that shows the spectrum, decodes the video, lets you tap to tune, and connects to the QO-100 wideband chat. Everything is operated by touch — no keyboard or mouse needed once it's set up.

QO-100 DATV Receiver screenshot Watch the demo video on YouTube
▶ Tap to play video

⚡ Quick start

On your Raspberry Pi (with the MiniTiouner plugged in and the Pi online), open a terminal and paste:

cd ~
git clone https://github.com/HB9IIU/QO100-RASPI-RECEIVER.git DATVreceiver
cd ~/DATVreceiver
scripts/initialSetup.sh

That installs everything, builds the app, sets it to start at boot, and reboots the Pi at the end. It asks for your password and one Enter keypress along the way. More detail is in Setup, step by step.

🆕 WHAT'S NEW!!!

Watch in VLC on any computer — now over HTTP

The SET page shows an address such as http://192.168.0.189:8091/ under Watch in VLC. Open VLC on a computer on the same home network, choose Media → Open Network Stream (on a Mac: File → Open Network), paste the address and play — several computers can watch at the same time.

Until now this was a udp://@239.1.x.y:5600 multicast address, which many home routers and Wi-Fi networks don't pass on to other devices, so VLC often showed nothing. The multicast address still works where it did before. Not available in local RTL-SDR mode, where the stream stays on the Pi.

PicoTuner support (experimental)

The receiver can now also use a BATC PicoTuner — the Raspberry Pi Pico–based USB interface for the MiniTiouner V3 — in place of a MiniTiouner. Just plug it in: the app finds it by itself and shows it in the start-up DETECTED TUNER message. If both are connected, the MiniTiouner is used.

The receiver locked on the beacon through a PicoTuner emulator, showing its test card

Please note:

  • Not yet tested with a real PicoTuner. It was developed and tested with a PicoTuner emulator (an ordinary Pico that behaves like a PicoTuner): detection, tuning, lock and video all work. Real reception, LNB power and long-term running still need a real one. If you own a PicoTuner, please try it and tell me how it went — good or bad.
  • Only the PicoTuner's first tuner is used, the same single receiver as with a MiniTiouner.
  • The PicoTuner uses USB 1.1, so it is meant for the low symbol rates used on QO-100 (the beacon's 1500 kS/s and below).
  • Already installed? An update from the app's own popup can't install the new USB permission the PicoTuner needs. Until you do it once by hand, the app shows TUNER NOT ENABLED when a PicoTuner is plugged in. Open a Terminal and type ~/DATVreceiver/scripts/initialSetup.sh — it asks for your password and restarts the Pi at the end. Sorry for the inconvenience.

Adjustable return to beacon after signal loss

When a tuned signal disappears, the receiver can automatically return to the QO-100 beacon after a delay chosen by the user. Open SET → SIGNAL LOSS and use the − and + buttons to select anything from OFF to 60 seconds. The default remains 5 seconds.

If the signal locks again before the delay expires, the pending return is cancelled. This responds to tuner lock loss; a temporary loss of video alone does not retune the receiver. Existing installations keep their current five-second behaviour until a different value is saved.

Frequency Offset Calibration — no more entering offsets by hand

You no longer have to work out your LNB's frequency error and type an offset into the settings yourself. The receiver now measures it by itself, using the QO-100 wideband beacon (which sits at exactly 10491.500 MHz) as the reference, and uses the result for all tuning and for the spectrum.

Frequency Offset Calibration page with both corrections found

Why it matters. Every LNB's oscillator is a few tens of kHz away from its nominal 9750 MHz (a typical one: about +30 kHz). Wide signals still lock, but the narrowest QO-100 signals have a lock window of only tens of kHz, so an uncorrected error can stop them locking at all. With the correction in place, tapping a signal on the spectrum tunes the MiniTiouner to where that signal really arrives.

Two corrections, measured one after the other:

  1. LNB oscillator — measured with the MiniTiouner. Each measurement tunes away from the beacon and locks onto it again from scratch; ten of them are combined into the result.
  2. RTL-SDR display shift — only if you use a local RTL-SDR for the spectrum. The page also measures how far that spectrum is shifted and shifts it back onto the true frequency axis. It shows how much of the shift is your stick's own error and how much is the LNB's.

How to run it

  • At startup, if nothing has been calibrated yet, the app asks CALIBRATION NEEDED — tap CALIBRATE. It asks at most once per run.
  • Any time later: SET → LNB CAL → START (it says REDO once you have a calibration).
  • It takes about a minute and a half (about two minutes with the RTL-SDR step). The video and the spectrum pause while it runs, and the beacon must be receivable.
  • For the best result, measure after the LNB has been powered for 15–30 minutes — the oscillator drifts while it warms up, so a repeat measurement a couple of kHz away from the first is normal.
  • SET now shows the LNB LO as a read-only value (calibrated, or nominal – not calibrated if you have not run it yet); the manual −/+ editor is gone.

Existing installations: just update as usual. The first time the app starts it offers to calibrate.

Second RF input: A / B

The MiniTiouner has two RF inputs, and you can now choose between them on the TUNE page with the new RF port buttons, next to the symbol rate (see the picture of the page just below).

  • A is the top connector — the default, and where your QO-100 LNB belongs. B is the bottom connector.
  • Each favourite remembers its port. Tapping a favourite switches the port as well as the frequency; pressing and holding one saves the current port with it. The port button matching the selected favourite lights up.
  • Everything on the QO-100 side always uses A: the beacon, tapping the spectrum, SCAN, the calibration, and the QO-100 button, which brings you back to the beacon on port A.
  • On port B there is no LNB, so the number on the dial is the real frequency (for example 437.000), not an IF. The LNB bias voltage setting is not changed by the port choice.
  • New default favourites: the QO-100 beacon (A), then the DATV calling frequencies 146.500 MHz (2 m), 437.000 MHz (70 cm), 1249.000 MHz and 1280.000 MHz (23 cm) on B. They only apply to a fresh install: the favourites you already have keep working and stay on port A.

Manual Tune

A new TUNE page lets you dial in any frequency the MiniTiouner can reach (144–2450 MHz) instead of only what happens to show up on the spectrum — handy for checking a specific transponder, a local test signal, or anything else off the beaten path.

Manual Tune page, locked on a test card

  • Tap TUNE on the main screen to open it — it starts you on Preset 1 for a known-good, live signal.
  • Drag a digit up or down to change it, like spinning the dial on a real frequency counter — no keyboard involved.
  • Tap the Symbol Rate to cycle through the standard rates.
  • Presets (the row of frequency buttons): tap one to load it instantly, or press and hold one to save whatever you're currently tuned to into that slot — a "Pre-set Saved" banner confirms it.
  • Tap the picture to go fullscreen, tap it again to come back.
  • Tap QO-100 to leave the Tune page — this always retunes straight back to the beacon, so you can't wander off and lose track of where you left the dial.

Local spectrum with an RTL-SDR (No internet needed — ideal for field operations)

The spectrum display can now be generated locally with an RTL-SDR instead of using the remote BATC spectrum feed. At startup, the app detects compatible Realtek RTL2832U sticks (0bda:2838 or 0bda:2832) and asks whether to use the local receiver. This includes the usual USB identity used by RTL-SDR Blog V3 and V4 sticks; unusually programmed or differently branded devices may use another identity and are not detected yet.

Choose YES to start the bundled spectrum server. It scans the complete QO-100 wideband transponder in overlapping sections and supplies the spectrum directly to the touchscreen app. Choose NO to keep using BATC. If the local server cannot start, the app reports the failure and returns to the remote feed automatically. The RTL-SDR provides the spectrum only — the MiniTiouner still receives and decodes DATV signals.

An RTL-SDR cannot power the satellite LNB. The local-spectrum connection therefore needs an external bias tee/power injector, normally supplying 18 V for the horizontally polarised QO-100 wideband transponder. Use a proper satellite bias tee that passes RF to the RTL-SDR while blocking its DC supply from reaching the stick. If the LNB is already powered elsewhere in the receive system, do not add a second power source.

The setup script installs the required USB permissions and reserves RTL2832U devices for SDR use by blacklisting Linux's conflicting DVB-TV driver. This means those sticks will no longer work as conventional Linux DVB-T tuners on that Pi. A reboot at the end of setup applies the change.

Existing installations: rerun the full installer once to enable local RTL-SDR support:

cd ~/DATVreceiver
scripts/initialSetup.sh

What you need

  • Raspberry Pi 4 Model B or Raspberry Pi 5, running Raspberry Pi OS (Bookworm or newer) with a desktop.
  • A MiniTiouner tuner. Tested with the Pro TS2 and the S — other variants (Express, original) likely work too but haven't been tried. Or, experimentally, a BATC PicoTuner (see What's NEW!!! above).
  • Optionally, an RTL2832U RTL-SDR stick for a locally generated spectrum. Without one, the app continues to use the BATC spectrum feed. The RTL-SDR cannot power an LNB, so local reception also requires a suitable external bias tee/power injector (normally 18 V for the QO-100 wideband transponder) unless the LNB is already powered elsewhere.
  • A touchscreen or HDMI screen: 800x480 (the official Raspberry Pi 7" touchscreen), 1024x600 (common 7" DSI/HDMI panels) or 1280x720 (e.g. the Raspberry Pi Touch Display 2, rotated to landscape). The app picks the largest layout that fits on first start; it can be switched any time from SET. A bigger screen shows the 1280x720 layout centred.
  • Something to play audio through. The Pi 5 has no 3.5mm audio jack (the Pi 4 does); either way, a DSI touchscreen has no speaker of its own, so there's no built-in audio output for a Pi 5 kiosk setup like this one — a Bluetooth speaker is the easiest fix, pair it once in Raspberry Pi OS's Bluetooth settings and it just works. A USB audio adapter or an HDMI-connected display with speakers works too, if you'd rather avoid Bluetooth.
  • Internet access on the Pi — needed for setup and chat. It is also needed for the spectrum unless you select a local RTL-SDR at startup.

Setup, step by step

Everything below is done by typing commands into a terminal — a text-based command window. On the Raspberry Pi desktop, open one from the taskbar (look for a black screen icon) or the applications menu, usually under Accessories > Terminal. Each step below shows exactly what to type; type or paste it in, then press Enter to run it.

1. Get the code and run the setup script

Paste this whole block in at once — it puts the project in a DATVreceiver folder in your home folder, then runs its setup script.

cd ~
git clone https://github.com/HB9IIU/QO100-RASPI-RECEIVER.git DATVreceiver
cd ~/DATVreceiver
scripts/initialSetup.sh

The setup script does everything: installs all the software this app needs, downloads one small third-party library it depends on, builds the app, sets it up to start automatically at boot, and reboots the Pi at the end — that last part matters because USB permissions and the RTL-SDR driver blacklist take effect reliably after reboot. It will ask for your password along the way, and asks for one Enter keypress up front to confirm before it starts. Safe to re-run (from cd ~/DATVreceiver && scripts/initialSetup.sh) if something goes wrong partway through.

Plug the MiniTiouner (or PicoTuner) and optional RTL-SDR into USB ports before or during this step, if they are not already connected.

2. Check it worked

Once the Pi finishes rebooting and you're logged back in, the receiver should appear on its own, fullscreen, tuned to the QO-100 beacon. If it doesn't:

systemctl --user status qo100datv.service

This shows whether it's running, and if not, why. If it says "No MiniTiouner or PicoTuner detected on USB" on screen: check the tuner is properly plugged in. If it says TUNER NOT ENABLED: the tuner's USB permission is missing — rerun scripts/initialSetup.sh (it restarts the Pi at the end). If it doesn't lock onto a signal: make sure the antenna/LNB is actually pointed at QO-100, and check the SET page for the LNB settings (LO offset, bias voltage) match your hardware.

If an RTL-SDR is connected, the app asks whether to use it after startup. If it reports that the local spectrum is unavailable, check qo100_sdl/rtl-sdr-server.log. LIBUSB_ERROR_BUSY means the Linux DVB driver or another SDR program owns the stick; rerun scripts/initialSetup.sh and reboot. LIBUSB_ERROR_ACCESS means its USB permissions are missing; rerunning the installer and rebooting fixes that as well.

Updating

The app checks for updates on its own each time it starts, and offers to install one right from the touchscreen if it finds one - no keyboard or computer needed. This covers routine code updates (pulls the latest version and rebuilds); it doesn't touch system packages, udev rules, or reboot, so it never needs a password.

If an update ever needs more than that (a new dependency, a udev rule change — PicoTuner support was one), do a full update by hand instead:

cd ~/DATVreceiver
scripts/initialSetup.sh

Same script as the initial install (now pulls the latest version itself before rebuilding), safe to re-run any time.

Using the app

  • Tap anywhere on the spectrum display to tune to that signal.
  • The small L or R marker on the spectrum identifies the selected source: local RTL-SDR or remote BATC.
  • CHAT — opens the QO-100 wideband chat.
  • SET — LNB bias voltage and the frequency offset calibration (LNB CAL), screen resolution, what EXIT does (see below), and whether the app auto starts at boot. The SET page's own EXIT button just closes the SET page and returns to the main screen — a different action from the main screen's EXIT button described next, despite sharing the name.
  • SCAN — automatically hops between detected signals.
  • TUNE — opens the Manual Tune page (see What's NEW!!! above) to dial in any frequency by hand.
  • EXIT — closes the app; it restarts itself a few seconds later by default. SET has an Exit Button Behaviour option to change this to Full Stop instead, where EXIT closes it for good until you start it again yourself (from the desktop icon).

Optional: photo album on your LAN

A small gallery you can browse from any device on your home network, including a Take Screenshot button on the page itself (useful when the app is fullscreen with no touch access — it captures whatever's currently on screen, not just this app). To turn it on:

cd ~/DATVreceiver
scripts/setup_photo_album.sh

This prints a web address to open in a browser (e.g. http://<pi's IP address>:8090/). Keeps the most recent 300 screenshots by default; delete individual photos or select several for bulk delete right from the page.

Uninstalling

cd ~/DATVreceiver
scripts/uninstall.sh

Undoes everything the setup steps above did — stops and removes both background services, the desktop shortcut, MiniTiouner/PicoTuner/RTL-SDR USB rules, the RTL-SDR driver blacklist, and the UDP-buffer system tweak — then deletes the DATVreceiver folder itself, screenshots and saved settings included. No confirmation prompt; back up anything you want to keep first. Installed software packages (apt) are left alone — see the script's own comments for why.

Repo layout

Path What it is
longmynd_ws/ The tuner driver (a modified version of an existing open-source project), talks to the MiniTiouner (or PicoTuner) over USB.
qo100_sdl/ The actual app — the touchscreen UI you see and use.
qo100_sdl/tools/rtl-sdr-server Bundled local RTL-SDR spectrum server.
rtl-sdr-server-source/ Source, tests, documentation, and build tooling for the bundled spectrum server.
screenshots/ Where the photo album keeps screenshots.
scripts/ The setup scripts described above.

Default tuning at startup is the QO-100 beacon: 741474 kHz, 1500 ksps.

License

GPLv3, matching Longmynd (longmynd_ws/), the tuner driver this project is built on and vendors directly.

Thanks

I put this together for fun, after finding a couple of unused Raspberry Pis with displays sitting around and wanting to do something with them — I didn't invent any of the real engineering here, I just assembled it. Real thanks are owed to:

  • Heather Lomond, who wrote Longmynd, the actual driver talking to the MiniTiouner hardware and doing the real DVB-S/S2 work underneath this whole receiver.
  • Phil Crump, whose fork of Longmynd adds the websocket status/control server this project builds on.
  • Colin Durbridge, G4EML, who designed the PicoTuner and wrote its firmware.
  • BATC (British Amateur Television Club), whose live wideband spectrum feed and QO-100 chat this app connects to.
  • Andy Green, author of libwebsockets, used throughout for all of the above.
  • Tom, ZR6TG, whose OpenTuner interface was the spark that got me wanting to build this in the first place.
  • Steve, GH7VHG, for testing the first release.
  • Benno, PA3FBX, for all his testing, and for always coming up with new ideas and challenges.
  • Claude, who helped me build, debug, and optimize this — patiently, over a lot of iterations.

Feel free to use, copy, and modify any of this for your own QO-100 setup. If you get stuck, open an issue and I'll try to help when I can, though I can't promise a quick turnaround.

About

Touchscreen QO-100 (Es'hail-2) DATV receiver for Raspberry Pi — spectrum display, tap-to-tune, live video, wideband chat

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages