Kurs Raspberry Pi, projekty – #4 – nadajnik radiowy FM z RDS

Kurs Raspberry Pi, projekty – #4 – nadajnik radiowy FM z RDS

Pora na uruchomienie własnego radia FM. Tym razem wykorzystamy GPIO do generowania fal radiowych, które będą mogły być odbierane na dowolnym odbiorniku.

Jest to jeden tych z projektów na Raspberry Pi, który naprawdę zaskakuje efektem końcowym.

Artykuł ten jest częścią serii wpisów opisujących praktyczne wykonanie różnych projektów bazujących na Raspberry Pi (popularnym komputerze jednopłytkowym). W tym artykule skupiamy się na wykonaniu konkretnego projektu. Jeśli nie znasz podstaw tego układu (instalacja, konfiguracja, praca z Linuksem) to niezbędne informacje znajdziesz w poprzednim kursie podstaw Raspberry Pi.

Czego nauczysz się z tego poradnika?

Tym razem wykorzystamy Raspberry Pi do budowy nadajnika radiowego i wcale nie chodzi o stację nadającą przez internet. Będziemy transmitować pliki mp3 na falach FM. Dzięki temu muzykę będzie można odebrać nawet na bardzo starym radiu.

Projekt jest bardzo prosty, cała część sprzętowa ogranicza się do podłączenia jednego przewodu. Malinka nie ma wbudowanych żadnych nadajników radiowych, więc projekt pozornie wydaje się wręcz absurdalny. Sami z zaciekawieniem testowaliśmy ten projekt - efekt przerósł nasze oczekiwania.

Muzyka z Raspberry Pi odbierana na zwykłym radiu.

Po co tworzyć nadajnik FM na Raspberry Pi?

Jest kilka praktycznych zastosowań takiego projektu. Po pierwsze można dzięki niemu "ożywić" sprzęt. Jeśli macie stare radio to będziecie mogli na nim teraz odbierać Wasze ulubione utwory. Taka metoda komunikacji jest często spotykana w formie samochodowych transmiterów FM.

Po drugie, za pomocą fal radiowych można łatwo stworzyć system bezprzewodowej komunikacji. Idealnym przykładem może być muzeum, w którym każdy odwiedzający otrzymuje swój odbiornik i na słuchawkach może odsłuchiwać informacje o eksponatach znajdujących się w danej sali.

Jeśli powyższe zastosowania własnego nadajnika FM Was nie przekonały to gorąco zachęcamy do wykonania tego projektu dla samego poznania bardzo oryginalnej możliwości malinki.

Zestaw elementów do kursu

Gwarancja pomocy na forum Błyskawiczna wysyłka

Elementy niezbędne do wykonania wszystkich ćwiczeń z kursu podstaw Rasberry Pi dostępne są w formie gotowych zestawów!

Kup w Botland.com.pl

Podłączenie anteny do Raspberry Pi

Zaczynamy od przygotowania sprzętu. Musimy do Raspberry Pi podłączyć antenę nadawczą. Anteną będzie przewód, który używaliśmy do łączenia GPIO z płytką stykową - potrzebujemy odcinka o długości ~20 cm. Zależnie od posiadanych przewodów połączeniowych bierzemy jeden lub (dla uzyskania pożądanej długości) łączymy dwa krótsze. Antenę podłączamy do pinu do 4 pinu GPIO i tyle, przewód zostawiamy "wiszący w powietrzu" (czyli robimy coś czego najczęściej się unika).

Czerwona zworka na powyższym zdjęciu chroni nas jedynie przed uszkodzeniem RPi poprzez zwarcie jakiegoś sygnału z 5V. Więcej o tym rozwiązaniu pisaliśmy w tym artykule:

Kurs Raspberry Pi  – #5 – instalacja/komunikacja przez UART
Kurs Raspberry Pi – #5 – instalacja/komunikacja przez UART

W poprzedniej części kursu poznaliśmy prostą metodę rozpoczęcia pracy z… Czytaj dalej »

Jak uruchomić radio na Raspberry Pi?

Poniższy opis działa na 100% na czystej instalacji najnowszego Raspbiana. Jeśli macie na Raspberry Pi zainstalowane już jakieś oprogramowanie, które korzysta z GPIO to niestety mogą tutaj pojawić się problemy. Przykładowo nadajnik ten nie zadziała poprawnie jeśli na malince macie opisanego poprzednio Domoticza. W tym konkretnie przypadku należy go zatrzymać:

A następnie wyłączyć obsługę 1-wire!

Gdy system jest gotowy możemy zacząć od instalacji trzech poniższych pakietów (jeden po drugim). Nie są one bezpośrednio związane z naszym nadajnikiem, ale wykorzystamy je do obsługi plików mp3.

Instalacja niezbędnych pakietów na Raspberry Pi.

Następnie możemy przejść do instalacji właściwego programu PiFmRds. Na początku kopiujemy kod źródłowy z repozytorium:

Klonowanie projektu z GITa na Raspberry Pi.

Później przechodzimy do katalogu ze źródłami. Program domyślnie skompilowany jest na starszą wersję Raspberry Pi, więc musimy skompilować go samodzielnie:

Ponowna kompilacja programu na Raspberry Pi.

Testowa transmisja

Przed pierwszą transmisją należy raz jeszcze zaznaczyć, że to program przygotowany wyłącznie z myślą o nauce i domowych eksperymentach. W większości krajów transmitowanie sygnału radiowego bez licencji jest niezgodne z prawem. Oczywiście nikt raczej nie będzie ścigał osoby, która w warsztacie testuje taki mały "nadajnik". Należy jednak szczególnie uważać, aby nie zakłócać żadnych transmisji.

Zaczniemy od transmisji pliku testowego, który jest dołączonany do programu. W tym celu w katalogu PiFmRds/src wydajemy poniższe polecenie, które uruchomi testową transmisję na 107,9 MHz. Jest to częstotliwość domyślna. Przed startem sprawdźcie na radiu czy w Waszej lokalizacji ta częstotliwość jest wolna i przypadkiem nie zagłuszycie w swoim otoczeniu jakiegoś radia. Jeśli częstotliwość ta jest zajęta to przejdźcie od razu do kolejnego podpunktu.

Reasumując, uruchomienie transmisji testowej na 107,9 MHz przebiega następująco:

Po wydaniu powyższych poleceń na ekranie powinna zostać wyświetlona stosowna informacja wraz z dopiskiem na temat aktualnej częstotliwości. Transmisję przerwać można standardową kombinacją klawiszy CTRL+C.

Pierwsza transmisja naszego radia.

Co ważniejsze, radio powinno zacząć odbierać sygnał testowy:

Sygnał powinny być wyraźny i bardo dobrze słyszalny. Nie ma żadnej możliwości, aby go nie zauważyć. Nawet przy testach na starym radiu "z pokrętłem". Jeśli mimo działającego programu nie słyszycie tego sygnału to znak, że coś zostało źle zrobione lub jakiś inny program korzysta z GPIO.

Radio na Raspberry Pi - zmiana częstotliwości

Częstotliwość, na której nadajemy możemy zmienić za pomocą parametru freq. Poniższy przykład uruchomi transmisję testową na częstotliwości 88,1 MHz:

Podczas testów najlepiej znaleźć ręcznie na radiu częstotliwość, na której słychać tylko szum i następnie uruchomić własną transmisję testową właśnie na takich ustawieniach.

Radio na Raspberry Pi - mono i stereo

Do tej pory nadawaliśmy sygnał mono, czas na stereo. Uruchamiamy więc transmisję innego pliku, który zawiera oddzielne ścieżki dźwiękowe dla obu kanałów:

W wyniku działania powyższej linijki dźwięk powinien dobiegać naprzemiennie z lewego i prawego głośnika (oczywiście jeśli nasz odbiornik obsługuje stereo). Jest to spowodowane tylko i wyłącznie tym, że transmitowany plik został odpowiednio przygotowany przez autora.

Radio na Raspberry Pi - nazwa stacji radiowej i tekst

Jak pewnie kojarzycie niektóre radia potrafią wyświetlić nazwę stacji radiowej oraz krótki dodatkowy tekst. Aby było to możliwe odbiornik musi wspierać RDS (Radio Data System). Opcja ta jest szczególnie popularna w odbiornikach samochodowych oraz w telefonach.

Nasz nadajnik również może rozgłaszać takie informacje. Dwa najważniejsze parametry to:

  • ps - dla nazwy stacji (limit 8 znaków),
  • rt - dla dodatkowego tekstu (limit 64 znaki).

Przykład:

Efekt na telefonie z radiem FM i włączoną funkcją RDS:

Nazwa stacji oraz dodatkowy tekst.

Nadawanie pliku mp3

Obecnie najpopularniejszym formatem dla muzyki jest mp3, sprawdźmy jak wygodnie przesyłać takie pliki. Dla testów można wykorzystać jakieś darmowe pliki testowe (Google > mp3 free samples). My, aby YouTube nie ocenzurował filmu wykorzystaliśmy plik kupiony w specjalnej bazie audio.

MP3 przenosimy na Raspberry Pi np. przez WinSCP do katalogu PiFmRds/muzyka/. Transmisja pliku demo.mp3 na częstotliwości 88,1 MHz będzie wyglądała następująco:

Możemy uruchomić też wszystkie pliki z danego katalogu (będą transmitowane jeden po drugim):

Używany tutaj sox (Sound eXchange) zainstalowaliśmy na samym początku wraz z innymi bibliotekami. Program ten konwertuje mp3 do wav, które następnie transmitujemy przez PiFmRds.

Radio na Raspberry Pi - transmisja z pendrive'a

Karta SD to nie najlepsze miejsce do trzymania muzyki. Dużo wygodniej będzie wykorzystać pamięć zewnętrzną. W tym celu pliki mp3 wgrywamy na pendrive'a (sformatowanego jako FAT32) i podłączamy go do dowolnego USB malinki:

Raspberry Pi z pamięcią zewnętrzną.

Po podłączeniu pamięci sprawdzamy czy została ona wykryta przez system. Wykorzystujemy do tego polecenie ls /dev/sd*. Jeśli widać tam podłączoną pamięć (na poniższym zrzucie: /dev/sda) oraz partycję z danymi (poniżej: /dev/sda1) to możemy przejść dalej, czyli utworzyć folder /usb w katalogu /mnt. Kolejny krok to zamontowanie pamięci w danym folderze. Na koniec dla pewności warto sprawdzić czy w nowo utworzonym folderze są widoczne pliki z pendrive'a. Cały proces widoczny jest poniżej:

Montowanie pamięci zewnętrznej.

Gdy pamięć jest już poprawnie zamontowana to możemy zacząć transmisję:

Gdy zakończymy testy naszego nadajnika powinniśmy odmontować pamięć zewnętrzną:

Na koniec warto zapamiętać, że folder /mnt/usb tworzymy tylko raz. W przyszłości, podczas kolejnego montowania pendrive'a nie trzeba już go tworzyć.

To tylko jedna z bardzo wielu metod korzystania z zasobów umieszczonych na pamięci zewnętrznej. Ile osób, tyle metod montowania pendrive'a i każdy ma "swoją rację". Jeśli ktoś z Was ma ochotę, aby rozpisywać się dlaczego "jego metoda" jest lepsza to bardzo proszę o założenie odpowiedniego tematu na naszym forum - w komentarzach do kursu skupmy się na głównej tematyce odcinka.


To tyle z podstawowych informacji, które są potrzebne do uruchomienia własnego nadajnika. Więcej szczegółów oraz opis wszystkich parametrów PiFmRds znaleźć można w dokumentacji projektu.

Dobór odpowiedniej anteny

Na samym początku (dla uproszczenia) przyjęliśmy, że antena ma mieć około 20 cm. Oczywiście można to dokładnie wyliczyć. Wystarczy wykorzystać wzór:  L = (300 / X) / 16 * 100, gdzie za X podstawiamy częstotliwość nadawania, a w wyniku otrzymujemy długość anteny w centymetrach.

Przykładowa "antena" o długości około 20 cm.

Jak to działa?

Na pewno sporo osób zastanawia się jak to dokładnie działa. Szczególnie, że Raspberry Pi nie posiada żadnego osprzętu, który mógłby być domyślnie wykorzystywany jako nadajnik FM. Dodatkowo antena wcale nie musi być świetnie wymierzona - co więcej, właściwie może jej nie być (wtedy odbiornik musi być bardzo blisko RPi).

Cały program napisany został w C oraz Pythonie, więc zainteresowani mogą przeanalizować go bardzo dokładnie. W projekcie tym sprytnie wykorzystano sygnał PWM, który używaliśmy np. do regulacji jasności świecenia diody (pisaliśmy takie skrypty w Pythonie).

Szybkie zmiany sygnałów na wyjściu GPIO zostały wykorzystane do generowania fal VHF (Very high frequency). Odpowiadają za to głównie pliki fm_mpx.c oraz pi_fm_rds.c. Cały proces przygotowania transmisji oraz jej wygenerowania jest dość trudy (jak na ten etap eksperymentów z RPi), daleko wykracza poza taki kurs i nie będziemy się nim tutaj zajmować. Osoby zainteresowane przetwarzaniem sygnałów na pewno jednak znajdą w źródłach tego programu wiele ciekawych informacji.


Dodatkowe artykuły, które mogą Cię zainteresować:

  1. Kurs Raspberry Pi, projekty – #3 – Domoticz, kamera, GPIO
  2. Kurs Raspberry Pi – #14 – podstawy Pythona, GPIO
  3. Kurs Raspberry Pi – #16 – PWM, wejścia, kamera w Pythonie
  4. Kurs elektroniki II – #6 – sterowanie sygnałem PWM

Podsumowanie

Za nami kolejny praktyczny projekt wykorzystujący niesamowite możliwości Raspberry Pi. Pozornie nadawanie fal radiowych za pomocą GPIO wydaje się dość szalonym pomysłem. Efekt końcowy tego projektu może jednak zadziwić (jakość dźwięku jest naprawdę bardzo dobra). Dajcie znać w komentarzu czy udało Wam się uruchomić nadajnik i czy nie mieliście problemów z odbiorem!

Nawigacja kursu

Autor: Damian Szymański
Przykłady: Piotr Adamczyk
Konsultacja: Piotr Bugalski

DMA, fm, kurs, kursRPiProjekty, nadajnik, projekt, PWM, radio, raspberrypi, sox