Terratec TStick USB DVB-T tuner jako SDR přijímač

Terratec TStick USB 2.0 DVB-T tuner
      21.9.2013 Vývoj číslicových obvodů a výpočetní techniky v posledních desetiletích dal vzniknout zcela nové koncepci radiového přijímače SDR (Software Defined Radio). Idea SDR je vykousnout požadovanou část rádiového spektra, zdigitalizovat, softwarově ji vyfiltrovat a zdemodulovat / zdekódovat. To přináší velkou flexibilitu - možnost pomocí jednoho hardwaru zpracovávat signály s různou modulací a kódováním, ať už existující nebo které bude teprve vymyšleno. Hardware SDR se typicky skládá ze vstupního VF obvodu, programovatelného PLL oscilátoru, směšovače a případně ještě dolní propusti a A/D převodníku. Pro úzkopásmové signály lze s výhodou použít jako A/D převodník běžnou zvukovou kartu v PC, která zvládne typicky vzorkování 44,1 - 192 kHz. Z navzorkovaného signálu se pak digitálně vyfiltruje vybraný kanál (FIR / IIR filtry) a dekóduje podle potřeby. Příklad takového jednoduchého SDR přijímače najdete zde.
      Poprvé jsem se s SDR seznámil v roce 2004, když jsme byli se školou na exkurzi v ASICentru, kde se mimo jiné zabývali vývojem přijímače pro DRM (Digital Radio Mondiale). To je digitální vysílání v pásmu DV, SV, KV využívající kodeku MPEG-4 AAC, díky němuž se vejdou do šířky pásma 10 - 20 kHz (šířka AM kanálu je 9 kHz, mezní frekvence 4,5 kHz) s podstatně lepší kvalitou zvuku než AM.
      Asi před rokem jsem se dozvěděl, že jako SDR přijímač lze znásilnit i některé DVB-T tunery založené na čipu Realtek RTL2832U, který byl vyhackován a vznikl tak projekt RTL-SDR, více zde. Jelikož lze dnes sehnat tyto USB DVB-T tunery za pár korun, koupil jsem si taky jeden na hraní, konkrétně typ Terratec TStick z DealExtreme za 16,90 $ (poštovné zdarma). Uvnitř najdeme zmiňovaný obvod Realtek RTL2832U taktovaný dle 28,8MHz krystalu, který obsahuje dva 8-bitové A/D převodníky max. 3,2 MS/s vzorkující I, Q baseband signál z tuneru, DVB-T COFDM demodulátor, podporu MPEG-2, USB 2.0 rozhraní, dekodér pro IR dálkové ovládání a další (datasheet není k dispozici). Vstupní signál z anténního konektoru zpracovává obvod tuneru Elonics E4000 schopný ladit v pásmech 52 - 1088 MHz a 1252 - 2174 MHz. Pro příjem vysílání na krátkých vlnách je možné si ubastlit jednoduchý UpConverter. Dále zde ještě najdeme 3,3V LDO a sériovou EEPROM 24C02B pro uložení USB VID a PID, příp. další konfigurace Realteku.

Terratec TStick spodek Terratec TStick vnitřek

      Zde je blokové schéma tuneru: vstupní VF signál je zesílen LNA s nastavitelným ziskem max. 30 dB (možno řídit i automaticky - AGC), projde programovatelným VF filtrem a ve směšovačích (max. zisk 12 dB) se smíchá se signálem z programovatelného PLL oscilátoru (resp. s 2 signály, kde druhý je fázově posunutý o 90°). Vzniklý komplexní signál (I - reálná část, Q - imaginární část) se dále zbaví SS složky a prožene programovatelnou dolní propustí na výstupní zesilovače (max. zisk 57 dB) se symetrickými výstupy max. 1 Vpp (z nich se též odvozuje signál pro řízení AGC). Obvod se konfiguruje pomocí sady programovatelných registrů po I2C sběrnici. Pro příjem slabších či vzdálených vysílačů je vhodné předřadit na vstup pásmový VF filtr, který potlačí mnohem silnější signály blízkých vysílačů či zdrojů rušení.

Elonics E4000-blokové schéma

      Popis instalace software najdete na této české stránce věnované SDR, ze které jsem vycházel. Software se skládá ze 3 částí: Začal jsem tedy instalací ovladače. Zde jsem se dostal do problémů, když jsem zkoušel instalovat poslední verzi 1.5.1 balíčku ExtIO_USRP+FCD+RTL2832U+BorIP, která na mě vyplivla chybu "vstupní bod procedury _except_handler4_common se nepodařilo najít v knihovně msvcrt.dll" a ani po ruční instalaci exportovaných ovladačů se mi to nepodařilo rozchodit - tuner měl ve správci zařízení stále vykřičníky. Zkusil jsem tedy nainstalovat starší verzi 1.2 beta a ta fungovala. V programu Zadig jsem postupně vybral a nainstaloval obě detekovaná Bulk-In zařízení s USB VID: 0CCD, PID: 00D7 a v instalátoru odsouhlasil nakopírování libusb0.dll knihovny. Zjistil jsem, že pokud nainstaluju znovu verzi 1.5.1 a v programu Zadig přeinstaluju ovladače, tak to projde bez chyby. Doporučuji tedy instalovat v tomto pořadí, napřed 1.2 beta a pak poslední verzi. Balíček už v sobě obsahuje i plug-in knihovnu ExtIO_USRP.dll, ale existuje ještě alternativní verze ExtIO_RTL.dll, která mi přijde lepší. Knihovnu jsem rozbalil do stejného adresáře.
UPDATE: při pokusu rozběhnout HDSDR 2.80 pod Windows 10 x64 jsem narazil na problém, že výše zmíněné staré knihovny nefungovaly, resp. způsobily pád HDSDR při loadnutí DLLka. Našel jsem však novější funkční knihovnu ExtIO_RTL2832.dll (funguje i pod Windows XP), v programu Zadig jsem pro zařízení vybral instalaci driveru libusb-win32.

Zadig

      Pak už jen zbývá vybrat si vhodný ovládací a dekódovací program. Zde je přehled programů pro Windows a Linux. Vyzkoušel jsem několik windowsích programů a jako nejlepší se mi zdá HDSDR, který má hodně funkcí a je často aktualizovaný. HDSDR jsem nainstaloval do stejného adresáře jako balíček a plug-iny. Po spuštění se program zeptá, kterou knihovnu plug-inu má načíst, vybral jsem ExtIO_RTL.dll. V případě použití ExtIO_USRP.dll je nutné ještě v okně USRP do políčka Device hint: zadat parametr "RTL tuner=e4k". HDSDR se mě na knihovnu ptá při každém spuštění i když nechám v adresáři jen jednu, nikde jsem nenašel nastavení preferovaného plug-inu. Po spuštění je třeba jít do nastavení [F7] | Select Input a vybrat "Realtek". Otevře se okno RTL Settings, kde lze nastavit rychlost vzorkování, velikost bufferu a zisk LNA nebo zapnutí AGC. Také je zde možno kompenzovat chybu oscilátoru. Nejlépe tak, že si najdete nějaký úzkopásmový vysílač se známou frekvencí a v zobrazení spektra naklikáte korekci tak, aby peak odpovídal dané frekvenci.

RTL Settings

      Dále je třeba v nastavení zvukové karty [F5] vybrat vstupní a výstupní zařízení s největší podporovanou vzorkovací frekvencí (u mě na SB Audigy 2 je to RX Input: "kX Wave SB0240 10k2 [d000] HQ"). Pokud chcete poslouchat běžné FM rádio, bude potřeba ještě v nastavení šířky pásma [F6] vybrat výstupní vzorkovací frekvenci alespoň 96 kHz. Nakonec se spustí zpracovaní signálu tlačítkem Start [F2] a měl by se ozvat nějaký šum a rozběhnout zobrazení spektrogramu. A můžeme se vydat brázdit frekvenčním spektrem. Ladění frekvence tuneru se dělá kolečkem myši nad jednotlivými ciframi číselníku LO. Tím se nám zobrazí výsek spektra okolo této frekvence jehož šířka pásma je daná nastavenou vzorkovací frekvencí A/D převodníku Realteku. Na spektrogramu vidíme peaky jednotlivých vysílačů na které lze najet myší a se stisknutým levým tlačítkem posouvat kurzor nebo frekvenci nastavit přesně kolečkem na druhém číselníku Tune. Softwarový filtr pak z navzorkovaného výseku vyfiltruje jen vybraný kanál, jehož šířku pásma si určíme šoupátkem FM-BW. Režim demodulátoru se vybírá několika tlačítky nad číselníkem frekvence, program v současnosti podporuje: AM, ECSS, FM, SSB, CW a DRM. Vybrané frekvence si můžete uložit do seznamu pod tlačítkem FreqMgr. Přijímaný signál je též možno nahrávat a to jak z A/D převodníku, tak softwarově dekódovaný. Nahrávání si lze i časově naplánovat v kalendáři. Do jeho nastavení se dostanete kliknutím pravým myšítkem na tlačítko záznamu.
      Zde je pro zajímavost krátká ukázka záznamu vysílání neaktivního ATIS Vodochody [51 kB MP3] (Automatic Terminal Information Service) na frekvenci 123,025 MHz AM.

program HDSDR v akci
program HDSDR 2.63 v akci

      12.12.2013 jsem zkusil zprovoznit tuner pod Linuxem. V novém debianím kernelu 3.12.6 je už driver k dispozici (moduly rtl2832.ko, dvb-usb-rtl28xxu.ko, v menuconfigu musí být vybraná položka "Realtek RTL28xxU DVB USB support"). S tímto jádrem jsem po drobné úpravě rozběhnul i svůj starší tuner Asus U3100 Mini plus. Na notebooku jsem použil kernel 3.13.0-rc1 z linuxtv.org.

Linux kernel menuconfig

Po připojení tuneru by se měl objevit podobný výpis:


 usb 1-2: new high-speed USB device number 13 using ehci-pci
 usb 1-2: dvb_usb_v2: found a 'TerraTec Cinergy T Stick+' in warm state
 usb 1-2: dvb_usb_v2: will pass the complete MPEG2 transport stream to the software demuxer
 DVB: registering new adapter (TerraTec Cinergy T Stick+)
 usb 1-2: DVB: registering adapter 0 frontend 0 (Realtek RTL2832 (DVB-T))...
 i2c i2c-4: e4000: Elonics E4000 successfully identified
 Registered IR keymap rc-empty
 input: TerraTec Cinergy T Stick+ as /devices/pci0000:00/0000:00:1d.7/usb1/1-2/rc/rc1/input27
 rc1: TerraTec Cinergy T Stick+ as /devices/pci0000:00/0000:00:1d.7/usb1/1-2/rc/rc1
 input: MCE IR Keyboard/Mouse (dvb_usb_rtl28xxu) as /devices/virtual/input/input28
 rc rc1: lirc_dev: driver ir-lirc-codec (dvb_usb_rtl28xxu) registered at minor = 0
 usb 1-2: dvb_usb_v2: schedule remote query interval to 400 msecs
 usb 1-2: dvb_usb_v2: 'TerraTec Cinergy T Stick+' successfully initialized and connected

Nyní je možné naladit a přehrávat DVB-T stanice, jak už jsem popisoval dříve zde. Pro první test SDR jsem nainstaloval základní toolkit rtl-sdr - v mém případě debianí balíčky rtl-sdr 0.5.0.4.4914-2 a librtlsdr0 0.5.0.4.4914-2, které jsou pouze v repozitáři testing a unstable. Při instalaci hlásil DPKG problém se starší verzí libc6 2.13 v mojí distribuci Wheezy (stable), protože program rtl_tcp (TCP server pro streamování samplovaných I/Q dat) vyžaduje verzi libc6 2.15 a vyšší, ale ten zrovna nepotřebuju, takže jsem hlášení ignoroval. Později jsem si bez problémů přeložil rtl-sdr ze zdrojáků na GitHubu. Balíček dále obsahuje programy:
Tyto programy si obsluhují tuner přímým přístupem a vyžadují, aby nebyl aktivní kernel modul dvb_usb_rtl28xxu, tak jsem ho dynamicky unloadnul. Zde je ukázka krátkého testu, který skončil úspěšným příjmem blízkého FM vysílače:


 root@MR:~# rtl_test -t

 Found 1 device(s):
   0:  Terratec T Stick PLUS

 Using device 0: Terratec T Stick PLUS

 Kernel driver is active, or device is claimed by second instance of librtlsdr.
 In the first case, please either detach or blacklist the kernel module
 (dvb_usb_rtl28xxu), or enable automatic detaching at compile time.

 usb_claim_interface error -6
 Failed to open rtlsdr device #0.

 root@MR:~# lsmod |grep rtl
 rtl2832                 6331  1
 dvb_usb_rtl28xxu       10096  0
 rtl2830                 5321  1 dvb_usb_rtl28xxu
 dvb_usb_v2              9782  1 dvb_usb_rtl28xxu
 dvb_core               58991  3 rtl2830,rtl2832,dvb_usb_v2

 root@MR:~# rmmod dvb_usb_rtl28xxu
 usbcore: deregistering interface driver dvb_usb_rtl28xxu
 usb 1-2: dvb_usb_v2: 'TerraTec Cinergy T Stick+' successfully deinitialized and disconnected

 root@MR:~# rtl_eeprom
 Found 1 device(s):
   0:  Terratec T Stick PLUS

 Using device 0: Terratec T Stick PLUS
 Found Elonics E4000 tuner

 Current configuration:
 __________________________________________
 Vendor ID:              0x0ccd
 Product ID:             0x00d7
 Manufacturer:           Realtek
 Product:                RTL2838UHIDIR
 Serial number:          00000001
 Serial number enabled:  yes
 IR endpoint enabled:    yes
 Remote wakeup enabled:  no
 __________________________________________

 root@MR:~# rtl_test -t
 Found 1 device(s):
   0:  Terratec T Stick PLUS

 Using device 0: Terratec T Stick PLUS
 Found Elonics E4000 tuner
 Supported gain values (14): -1.0 1.5 4.0 6.5 9.0 11.5 14.0 16.5 19.0 21.5 24.0 29.0 34.0 42.0
 Benchmarking E4000 PLL...
 [E4K] PLL not locked for 51000000 Hz!
 [E4K] PLL not locked for 2216000000 Hz!
 [E4K] PLL not locked for 1109000000 Hz!
 [E4K] PLL not locked for 1244000000 Hz!
 E4K range: 52 to 2215 MHz
 E4K L-band gap: 1109 to 1244 MHz

 root@MR:~# rtl_fm -f 97200000 -s 192k | aplay -r 192k -f S16_LE -t raw -c 1
 Found 1 device(s):
   0:  Realtek, RTL2838UHIDIR, SN: 00000001

 Using device 0: Terratec T Stick PLUS
 Found Elonics E4000 tuner
 Oversampling input by: 6x.
 Oversampling output by: 1x.
 Buffer size: 7.11ms
 Tuned to 97488000 Hz.
 Sampling at 1152000 Hz.
 Output at 192000 Hz.
 Tuner gain set to automatic.
 Playing raw data 'stdin' : Signed 16 bit Little Endian, Rate 192000 Hz, Mono

      Dále jsem hledal nějaký pokročilejší program podobný windowsímu HDSDR, ale nenašel jsem nic, co by šlo snadno nainstalovat. Základem většiny linuxových programů je GNU Radio, jehož balíček gnuradio 3.5.3.2-1 má spoustu závislostí (včetně molocha QT) a vyžadovalo to po mě stáhnout dalších skoro 400 MB, což se mi zrovna moc nechtělo si zasírat systém. Jeho instalaci popisuje tutoriál zde. Hledal jsem i další alternativy, ale toto :( mě odradilo...

      25.12.2013 Nakonec jsem se rozhodl aktualizovat svoji distribuci Debian Wheezy na Jessie (testing), protože problémů kvůli starší verzi libc6 přibývalo (kde je novější verze libc6 2.17). Nejprve jsem upravil seznam repozitářů v /etc/apt/sources.list a pak spustil apt-get update a apt-get dist-upgrade, dopadlo to dobře. Nyní jsem mohl vyzkoušet program GQRX 2.1.251, který je k dispozici i jako binárka s potřebnými knihovnami. Bohužel novější verze je už kompilovaná jen pro 64-bitový systém. Při prvním spuštění na mě program vybafl chybovou hlášku: "../pulseaudio/pa_sink.cc: pa_simple_new() failed: Connection refused" a zůstal viset. Jak jsem záhy zjistil, neměl jsem v systému nainstalovaný zvukový server PulseAudio. To jsem napravil instalací balíčků pulseaudio 4.0-6 a pavucontrol 1.0-1, akorát že mi přestal fungovat zvuk v celém systému. Prošel jsem troubleshooting a upravil nastavení v mixéru pavucontrol - zabralo nastavit "Vnitřní zvukový systém" na vypnuto:

pavucontrol - nastavení

pavucontrol - výstupní zařízení

      Po té už se GQRX bez problémů spustil. Při prvním spuštění je třeba vybrat tuner, zvukovku, nastavit vzorkovací frekvence a můžeme vesele ladit. Sem tam se blbě vykreslují některá tlačítka. K dispozici jsou demodulátory AM, FM a SSB. Program zvládá i nastavení zisku a AGC vstupního LNA. Oproti windowsímu HDSDR je to takový chudý příbuzný, ale lepší než drátem do oka...

GQRX - nastavení I/O

program GQRX v akci
program GQRX 2.1.251 v akci

      RTL-SDR lze také provozovat na minipočítači Raspberry Pi a na připojeném TFT displeji zobrazovat spektrum. Pokud chcete skenovat širší rozsah spektra, než co zvládne převodník naráz, můžete vyzkoušet pythoní program RTLSDR Scanner pro Windows/Linux/MAC OS.

      19.10.2016 jsem zkusil zprovoznit tuner na smartphonu Samsung Galaxy S3 s OS Android 6.0.1 připojený pomocí USB OTG kablíku. Nainstaloval jsem program SDR Touch a RTL2832U driver a vše hned fungovalo bez dalšího nastavování. SDR Touch využívá OpenSource rtl_tcp server, s nímž komunikuje přes TCP/IP. Podporuje demodulaci FM, AM, SSB, CW a dekódování RDS. Základní free verze má řadu omezení, např. zobrazování spektra funguje pouze 1 minutu, pak se musí tuner vypnout a zapnout nebo ladit naslepo. Dá se však stáhnout medicínka v podobě modifikovaného balíčku SDR Touch Key 1.03 :) Funkčnost jsem ověřil i na novějším Anroidu 9.0 Pie (LineageOS 16.0) na smartphonu Sony Xperia Z1 Compact D5503.

SDR Touch spectrum
program SDR Touch 2.65 v akci

      28.8.2017 Kamarád mě v Holicích namotivoval, že bych si mohl snadno trochu vylepšit svůj USB RTL-SDR tuner výměnou běžného krystalu za TCXO (Temperature Compensated Crystal Oscillator), které tam jeden pán prodával za 50 Kč. Je též možné si ho objednat na Digi-Key, ale z toho poštovného z USA se vám protočí panenky. TCXO má asi o řád lepší frekvenční stabilitu, což by mělo zlepšit příjem úzkopásmových vysílačů. Některé novější RTL-SDR tunery prý mají pod THT krystalem už připravený footprint na SMD pouzdro, ale to nebyl můj případ. Koupený SMD TCXO velikosti 3,2 x 2,5 mm nese označení WTL3C22961ML 28,800 MHz, avšak na webu čínského výrobce WTL International Limited jsem k němu žádnou dokumentaci nenašel, pouze k podobnému typu WTL3TN2600001. V jeho datasheetu je zmínka o existenci varianty TCXO a VC-TCXO (lze doladit napětím o pár ppm). Podle zapojení pinů by měl mít TCXO dva GND piny, což nemá, takže buď jde o VC-TCXO nebo koupený TCXO má jeden pin nezapojený.

TCXO WTL3C22961ML 28,800MHz Terratec TStick USB 2.0 DVB-T tuner TCXO mod

      Než jsem odpájel původní krystal, osahal jsem si osciloskopem jeho piny a zjistil, který z nich je připojený na vstup čipu (nižší amplituda signálu, na fotce je to ten vlevo). Po odpájení jsem na jeho místo kápnul trochu tavňáku a přilepil tam TCXO ploškama nahoru. Přímo mezi VCC a GND plošky jsem připájel keramický blokovací SMD kondenzátor 10 nF 0603 a propojil TCXO s deskou tenkými drátky. Neznámý pin jsem spojil s GND. Na osciloskopu jsem změřil průběhy výstupního napětí TCXO bez zátěže a dále po připojení DC vazbou a AC vazbou přes kondík 10 nF. Nakonec jsem nechal přímé připojení DC vazbou. Je vidět, že obvody RTL-SDR výstup TCXO docela zatěžují, amplituda poklesla z 1,3 Vpp na 0,8 Vpp, ale pro funkci to stačí. Původní krystal dával na vstupu asi 1,2 Vpp. Další odvážnější úpravy RTL-SDR tuneru naleznete zde a zde. Novější verzi RTL-SDR s obvodem tuneru R820T lze též předělat na laditelný VF generátor.

TCXO Vout-unloaded TCXO Vout DC-coupling TCXO Vout AC-coupling via 10nF
Vout unloaded Vout DC-coupling Vout AC-coupling

      17.2.2020 Můj známý Franta Ryšánek napsal jednoduchý prográmek RTL-SDR Skyline, který slouží jako přehledový spektrák s automatickým přelaďováním pásem tuneru. Umožňuje nastavit skenovaný rozsah frekvencí, velikost FFT okna a počet průměrovaných oken. Program využívá knihovnu librtlsdr a běží na Windows XP - 10.

RTL-SDR Skyline

      18.9.2020 Další zajímavou OpenSource aplikací je rtl_433, která umožňuje přijímat a dekódovat digitální signál různých dálkových ovladačů a meteostanic vysílajících převážně v pásmu 433 a 868 MHz s modulací FSK/ASK/OOK. Program je k dispozici pro Linux i Windows 7 - 10. Jedna starší verze, která ještě funguje pod Windows XP je zde.




Zpět

Aktualizováno 21.9.2020 v 6:45