logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Nadajnik FM z RDSem na Raspberry Pi

ghost666 07 Lut 2017 22:53 20046 7
REKLAMA
  • 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ć:

    Kod: Bash
    Zaloguj się, aby zobaczyć kod


    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ć:

    Kod: Bash
    Zaloguj się, aby zobaczyć kod


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

    Kod: Bash
    Zaloguj się, aby zobaczyć kod


    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:

    Kod: Bash
    Zaloguj się, aby zobaczyć kod


    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:

    Kod: Bash
    Zaloguj się, aby zobaczyć kod


    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:

    Kod: Bash
    Zaloguj się, aby zobaczyć kod


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

    Kod: Bash
    Zaloguj się, aby zobaczyć kod


    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:

    Kod: Bash
    Zaloguj się, aby zobaczyć kod


    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

    Fajne? Ranking DIY
    O autorze
    ghost666
    Tłumacz Redaktor
    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.
    https://twitter.com/Moonstreet_Labs
    ghost666 napisał 11961 postów o ocenie 10264, pomógł 157 razy. Mieszka w mieście Warszawa. Jest z nami od 2003 roku.
  • REKLAMA
  • #2 16261252
    szymon122
    Poziom 38  
    Posty: 4091
    Pomógł: 302
    Ocena: 757
    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.
  • REKLAMA
  • #3 16261917
    Thenatoorat
    Poziom 13  
    Posty: 72
    Pomógł: 4
    Ocena: 19
    Nie chcę wiedzieć jakie harmoniczne to generuje...
  • #4 16263574
    komatssu
    Poziom 29  
    Posty: 1056
    Pomógł: 98
    Ocena: 166
    Thenatoorat napisał:
    Nie chcę wiedzieć jakie harmoniczne to generuje...

    Samo nadawanie w paśmie FM 88-108MHz zapewne odbywa się na jakiejś harmonicznej...
  • REKLAMA
  • #5 16284524
    papaj5
    Poziom 12  
    Posty: 53
    Ocena: 19
    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 16286945
    mkpl
    Poziom 37  
    Posty: 5671
    Pomógł: 306
    Ocena: 856
    @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
  • REKLAMA
  • #7 16297347
    Euzebiusz23091998
    Poziom 15  
    Posty: 334
    Pomógł: 1
    Ocena: 58
    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 16320527
    Kibzik
    Poziom 9  
    Posty: 34
    Ocena: 1
    Robię wszystko zgodnie z instrukcją.... W końcowym etapie:
    Cytat:
    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

Podsumowanie tematu

✨ Pi-FM-RDS to nadajnik radia FM działający na Raspberry Pi, umożliwiający transmisję z danymi RDS. Oprogramowanie, dostępne na GitHubie, generuje sygnał FM w czasie rzeczywistym, obsługując audio mono i stereo. Użytkownicy dyskutują o możliwościach wzmocnienia sygnału, zastosowaniu filtrów LC oraz odpowiednich antenach do nadawania. Wskazówki dotyczące instalacji obejmują podłączenie anteny do odpowiednich pinów Raspberry Pi oraz użycie prostych kabli do nadawania na krótkie odległości. Problemy z działaniem oprogramowania, takie jak zacięcia systemu, są również poruszane, a użytkownicy dzielą się doświadczeniami z realizacji projektu.
Podsumowanie wygenerowane przez AI na podstawie treści dyskusji.
REKLAMA