Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Nadajnik FM z RDSem na Raspberry Pi

ghost666 07 Feb 2017 22:53 14724 7
  • Nadajnik FM z RDSem na Raspberry Pi
    Pi-FM-RDS to nadajnik radia FM wyposażony w RDS, działający na Raspberry Pi. Program do pobrania z GirHuba odpowiedzialny jest za generację przebiegu zmodulowanego częstotliwościowo (FM) z zakodowanymi danymi RDS (system do przesyłania danych wraz z transmisją audio). Wszystko to działa w czasie rzeczywistym i jest w stanie współpracować z sygnałem audio mono- i stereofonicznym.

    Układ oparty jest na nadajniku FM stworzonym przez Olivera Marrosa i Oskara Weigla, do którego później Richard Hirst dodał obsługę DMA, a Christophe Jacquet generator i modulator RDS. Do działania nadajnik wykorzystuje generator sygnału PWM, wbudowany w Raspberry Pi.

    Oprogramowanie to jest kompatybilne z Raspberry Pi 1 wersji pierwszej, drugiej jak i trzeciej.

    Uwaga!

    Oprogramowanie to jest rozwijane i dystrybuowane tylko i wyłącznie w celach szkoleniowych. Układ nie powinien być wykorzystywany jako element mediacenter, nadawanie w zakresie FM może być nielegalne.

    Korzystanie

    Pi-FM-RDS wykorzystuje bibliotekę sndfile. Aby ją zainstalować na każdej maszynie z systemem z rodziny Debiana (np. Raspbianie) wystarczy w terminalu wpisać:

    Code: bash
    Log in, to see the code


    Program zależny jest także od linuksowych sterowników rpi-mailbox, więc potrzebne jest dosyć świeży jądro Linuxa. Zasadniczo każde po sierpniu 2015 roku powinno mieć ten sterownik w sobie.

    Uwaga

    Binarki skompilowane na Raspberry Pi 1 nie są kompatybilne z maszynami w wersji 2 i 3. Zawsze rekompiluj źródła po zmianie platformy sprzętowej (polecenie make clean w poniższym opisie).

    Instalację rozpoczynamy od sklonowania źródeł z repozytorium i juz możemy kompilować:

    Code: bash
    Log in, to see the code


    A następnie możemy uruchomić nasz nadajnik:

    Code: bash
    Log in, to see the code


    Bez dodatkowych parametrów system rozpocznie transmisję FM przy częstotliwości 107,9 MHz, bez audio z domyślnymi danymi RDS: nazwą stacji (PS), radiotekstem (RT) i kodem PI. Sygnał nadawany jest na pinie GPIO 4, czyli pin 7 na wyprowadzeniu z RPi.

    Możemy dodać do transmisji dźwięk. W przypadku monofonicznego pliku sound.wav (dołączony do źródeł do testowania) w terminalu piszemy:

    Code: bash
    Log in, to see the code


    Do przetestowania transmisji stereo służy z kolei plik stereo_44100.wav, także dołączony do programu.

    W ogólności składania Pi-FM-RDS wygląda następująco:

    Code: bash
    Log in, to see the code


    gdzie:

    -freq to częstotliwość nośnej w MHz domyślnie -freq 107.9.
    -audio specyfikuje plik audio, który będzie odtwarzany. Nieistotna jest częstotliwość próbkowania pliku, program i tak go przesampluje. Jeśli plik jest stereo to transmisja także taka będzie. Akceptowalne formaty audio zależne są od biblioteki libsndfile. Są to pliki WAV oraz Ogg/Vorbis. Pliki MP3 nie są wspierane.
    -pi to kod PI transmisji RDS. Są to cztery cyfry w kodzie szesnastkowym, na przykład: -pi FFFF.
    -ps to nazwa stacji w kodzie RDS, nie dłuższa niż osiem znaków; na przyład: -ps RASP-PI.
    -rt to tzw. radiotekst. Jest to wiadomość wysyłana RDSem o długości do 64 znaków. Na przykład: -rt 'Hello, world!'.
    -ctl specyfikuje wykorzystany kanał FIFO do kontroli PS oraz RT podczas odtwarzania (patrz niżej).
    -ppm specyfikuje błąd oscylatora Raspberry Pi w częściach na milion (patrz niżej).

    Wszystkie argumenty są opcjonalne.

    Domyślnie PS zmienia się cyklicznie pomiędzy Pi-FmRds a rosnącą liczbą, zaczynając od 00000000. PS zmienia się około raz na sekundę.

    Kalibracja zegara

    Kalibracji dokonać należy tylko, jeśli mamy problemy z odbiorem i dekodowaniem sygnału RDS. Standard tego systemu mówi, że maksymalny błąd dla podnośnej 57 kHz nie może być większy niż ±6 Hz, czyli musi być poniżej 105 ppm±. Oscylator naszej 'Maliny' może być powyżej tej wartości, wtedy konieczne jest wykorzystanie parametru -ppm w programie po uprzedniej kalibracji.

    W praktyce w większości przypadków Pi-FM-RDS działa poprawnie, bez wykorzystywania tego przełącznika. Wszystko wskazuje, że odbiorniki RDS są bardziej tolerancyjne niż wymaga od nich specyfikacja.

    Jednym ze sposobów na pomiar błędu częstotliwości jest nadawanie dźwięku z pliku pulses.wav. Są to impulsy nadawane równo przez jedną sekundę, a następnie sekundowy odcinek ciszy. Musimy teraz odebrać transmisję z pomocą odbiornika FM i nagrać ją wykorzystując kartę dźwiękową dobrej jakości. Jeśli teraz otworzymy nagranie w dowolnym programie do obróbki audio możemy wyznaczyć błąd licząc zebrane próbki. Jeśli wiemy, że nagrywaliśmy z częstotliwością próbkowania równą 44,1 kHz, to w okresie jednej sekundy powinniśmy mieć 441000 próbek. Autor podczas kalibracji swojego układu policzył, że w nagraniu było 441132 próbki w czasie jednego okres nadawania. Teraz wyznaczyć możemy błąd:

    $$\frac {441132 - 44100} {441000} \times 10^6 = 299 ppm$$


    Wartość ta jest oczywiście prawdziwa przy założeniu,że wejście karty dźwiękowej nie ma żadnego błędu częstotliwości próbkowania.

    Kanały komunikacyjne

    Jeśli korzystamy z przełącznika -audio - to program odczytuje dźwięk z wejścia standardowego. Pozwala to na przekierowywanie strumieni do Pi-FM-RDS z innych programów. W ten sposób możemy przekierować dźwięk z np. odtwarzacz plików MP3 Sox:

    Code: bash
    Log in, to see the code


    Albo wejście AUX karty dźwiękowej:

    Code: bash
    Log in, to see the code


    Zmiana parametrów PS, RT i TA podczas nadawania

    Do kontroli parametrów PS, RT oraz TA w transmisji RDSA wykorzystana jest kolejka FIFO, którą możemy uruchomić przełącznikiem -ctl podczas uruchamiania Pi-FM-RDS.

    Przykład:

    Code: bash
    Log in, to see the code


    Komendy jakie możemy wysyłać poprzez kolejkę FIFO do zmiany PS, RT i TA to:

    cat >rds_ctl
    PS MyText
    RT Radiotekst do wysłania
    TA ON
    PS OtherTxt
    TA OFF
    ...

    Każda linia zaczynać się musi od komendy: PS, RT bądź TA, spacji i wartości jaką chcemy nastawić. Każda inna linia zostanie zignotowana.

    Testy

    Pi-FM-RDS został z powodzeniem przetestowany z szeregiem urządzeń obsługujących transmisję RDS:

    * Zegarek Sony ICF-C20RDS z 1995,
    * Przenośne radio Sangean PR-D1 z 1998, i ATS-305 z1999,
    * Telefon Samsung Galaxy S2 z 2011,
    * Wieża Philips MBD7020 z 2012,
    * Radio na USB Silicon Labs USBFMRADIO-RD z układem Si4701,
    * Chiński klon powyższego pod nazwą“PCear Fm Radio”,

    We wszystkich przypadkach odbiór był wysokiej jakości, a RDS nie pokazywał żadnych błędów.

    Nadajnik FM z RDSem na Raspberry Pi


    Wykorzystanie procesora

    Wykorzystanie procesora przez oprogramowanie na RPi1 wygląda następująco:

    * Bez podanego sygnału audio: 9%.
    * Z monofonicznym audio: 33%.
    * Z stereofonicznym audio: 40%.

    Jak łatwo zrozumieć, obciążenie procesora wzrasta po podaniu sygnału audio, gdyż musi on zostać w czasie rzeczywistym upsamplowany do 228 kHz - częstotliwości z jaką pracuje system nadajnika. Jest to zrealizowane m.in. przy pomocy filtra FIR, co jest kosztowne obliczeniowo.

    Projekt

    Kod odpowiedzialny za generację danych RDS znajduje się w pliku rds.c. Program generuje cyklicznie cztery grupy 0A (do nadawania PS) i jedną 2A (do nadawania RT). Dodatkowo, co minutę, dodaje jedną grupę 4A - CT, czyli zegar. Funkcja get_rds_group generuje jedną grupę i korzysta z CRC do obliczenia sum kontrolnych.

    Aby dalej uzyskać próbki sygnału RDS, wywoływana jest funkcja get_rds_samples, która wywołuje funkcję get_rds_group, koduje sygnał różnicowo i generuje próbki, które filtrowane są filtrem RRC, według standardów RDS i kodowane w impulsy z wykorzystaniem enkodowania typu Manchester.

    Sygnały potrzebne do działania są wcześniej jednorazowo generowane przez program w Pythonie - generate_waveforms.py - którzy korzysta przy tym z biblioteki Pydemod. W wersji pobranej z repozytorium nie ma potrzeby korzystać z tego skryptu, gdyż generowane przezeń pliki waveforms.c i waveforms.h są już w repo.

    Próbki sygnału RDS mają częstotliwość próbkowania równą 228 kHz - cztery raz 57 kHz, czyli podnośną sygnału RDS.

    Mupltipleksowaniem sygnału FM zajmuje się fm_mpx.c, który najpierw upsampluje audio do 228 kHz, potem generuje sumę sygnałów z obu kanałów (o pasmie ograniczonym do 15 kHz) plus ewentualny sygnał stereo na 19 kHz, sygnały kodowania stereo modulowane amplituowo na 38 kHz oraz finalnie dodaje próbki sygnału RDS.

    Źródło: https://github.com/ChristopheJacquet/PiFmRds

    Cool! Ranking DIY
    Can you write similar article? Send message to me and you will get SD card 64GB.
    About Author
    ghost666
    Translator, editor
    Offline 
    Fizyk z wykształcenia. Po zrobieniu doktoratu i dwóch latach pracy na uczelni, przeszedł do sektora prywatnego, gdzie zajmuje się projektowaniem urządzeń elektronicznych i programowaniem. Od 2003 roku na forum Elektroda.pl, od 2008 roku członek zespołu redakcyjnego.
    ghost666 wrote 10554 posts with rating 8909, helped 157 times. Live in city Warszawa. Been with us since 2003 year.
  • #2
    szymon122
    Level 38  
    A czy jest możliwość wzmocnienia sygnału który RPi podaje na swoim pinie do którego jest podpięta antena? Raz, że na wyjściu będziemy mieli pojedyncze mW, dwa, że RPi może łatwo ucierpieć w przypadku zwarcia / przepięcia.
  • #3
    Thenatoorat
    Level 13  
    Nie chcę wiedzieć jakie harmoniczne to generuje...
  • #4
    komatssu
    Level 29  
    Thenatoorat wrote:
    Nie chcę wiedzieć jakie harmoniczne to generuje...

    Samo nadawanie w paśmie FM 88-108MHz zapewne odbywa się na jakiejś harmonicznej...
  • #5
    papaj5
    Level 11  
    Jakoś nie do końca zrozumiałem: Biorę RPI, instaluję Raspbiana, instaluję te dodatkowe składniki, doczepiam kabelki-anteny (RDS do pina 7, a właśnie - do jakiego pinu doczepiam kable od FM, i czy to mają być specjalne jakieś anteny, czy wystarczą zwykłe kable jeśli nadaję tylko na dom), dorzucam jakiś zewnętrzny lub sieciowy dysk z muzą i każę odtwarzaczowi non stop SHUFFLE'ować i REPEAT'ować, i mam własną mini domową stację radiową? Czy dobrze rozumuję czy coś pokręciłem???
    I w temacie tych antenek to mógł by ktoś się wypowiedzieć. Chodzi mi o nadawanie na domek jednorodzinny, żeby najdalej poszło za bramę, i nie dalej. Czy wystarczą jakieś druciki elektryczne, krótkie, czy mus jechać na specjalnych antenach?
  • #6
    mkpl
    Level 37  
    @papaj5 wystarczy 70cm przewodu. Można opcjonalnie też dodać filtr LC by wytłumić pozostałe harmoniczne. Co do całej reszty dokładnie jest tak jak piszesz.

    Osobiście uruchamiałem ten projekt jakiś rok temu i działał bezproblemowo. Zasięg to max 10m
  • #7
    Euzebiusz23091998
    Level 15  
    A jakby do tego dorzucić wzmacniacz FM, to mamy małą stację nadawczą? Czy nie nadaje się do tego? :)

    Widział kto jakieś podobne cudo, tyle że nadające DVB-T? :D
  • #8
    Kibzik
    Level 8  
    Robię wszystko zgodnie z instrukcją.... W końcowym etapie:
    Quote:
    Starting to transmit on 100.00 MHz.

    I tutaj klapa. raczej nic nie nadaje, bo próbowałem na kilka sposobów. Co gorsze gdy kliknę na terminal system się "zacina". Pomaga jedynie odłączenie zasilania.
    Proszę o pomoc . Dopiero zaczynam zabawę z raspberry (mam v. 3) i wydawało mi się to być dobrym pomysłem, projektem na początek.

    Pozdrawiam JKR