Kursy • Poradniki • Inspirujące DIY • Forum
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.
Zaczniemy od nadawania pojedynczego pliku umieszczonego na malince, sprawdzimy też jak transmitować pliki znajdujące się na podłączonym pendrivie.
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.
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.
Podczas zabaw z nadajnikami FM należy uważać. Ustawiając złą częstotliwość można przypadkiem podmienić sąsiadowi jego ulubioną stację radiową. Odradzamy takie zabawy - więcej o kwestiach legalności budowy własnego nadajnika FM w dalszej części artykułu.
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.
Gotowe zestawy do kursów Forbota
Komplet elementów Gwarancja pomocy Wysyłka w 24h
Elementy niezbędne do wykonania wszystkich ćwiczeń z kursu podstaw Rasberry Pi dostępne są w formie gotowych zestawów!
Zamów 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
W poprzedniej części kursu poznaliśmy prostą metodę rozpoczęcia pracy z Raspberry Pi. Do pracy z systemem wykorzystaliśmy tradycyjny monitor,... 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ć:
1 |
sudo /etc/init.d/domoticz.sh stop |
A następnie wyłączyć obsługę 1-wire!
Przed przejściem dalej upewnij się, że w raspi-config wyłączony jest interfejs 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.
1 2 3 |
sudo apt-get install sox libsox-fmt-all sudo apt-get install libsox-fmt-mp3 sudo apt-get install libsndfile1-dev |
Następnie możemy przejść do instalacji właściwego programu PiFmRds. Na początku kopiujemy kod źródłowy z repozytorium:
1 |
git clone https://github.com/ChristopheJacquet/PiFmRds.git |
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:
1 2 3 |
cd PiFmRds/src make clean make |
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.
Więcej informacji o kwestiach bezpieczeństwa w dokumentacji projektu.
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:
1 2 |
cd PiFmRds/src sudo ./pi_fm_rds -audio sound.wav |
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.
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:
1 |
sudo ./pi_fm_rds -audio sound.wav -freq 88.1 |
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:
1 |
sudo ./pi_fm_rds -audio stereo_44100.wav |
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:
1 |
sudo ./pi_fm_rds -audio stereo_44100.wav -ps "FORBOT" -rt "Najlepszy kurs Raspberry Pi w praktyce!" |
Efekt na telefonie z radiem FM i włączoną funkcją RDS:
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:
1 |
sox -t mp3 /home/pi/PiFmRds/muzyka/demo.mp3 -t wav - | sudo /home/pi/PiFmRds/src/pi_fm_rds -freq 88.1 -audio - |
Możemy uruchomić też wszystkie pliki z danego katalogu (będą transmitowane jeden po drugim):
1 |
sox -t mp3 /home/pi/PiFmRds/muzyka/*.mp3 -t wav - | sudo /home/pi/PiFmRds/src/pi_fm_rds -freq 88.1 -audio - |
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:
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:
Jeśli podczas montowania pamięci pojawiły się jakieś problemy to warto sprawdzić wynik polecenia sudo dmesg, które może zwrócić informacje pomocne przy rozwiązaniu problemu.
Gdy pamięć jest już poprawnie zamontowana to możemy zacząć transmisję:
1 |
sox -t mp3 /mnt/usb/*.mp3 -t wav - | sudo /home/pi/PiFmRds/src/pi_fm_rds -freq 88.1 -audio - |
Gdy zakończymy testy naszego nadajnika powinniśmy odmontować pamięć zewnętrzną:
1 |
sudo umount /mnt/usb |
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.
Wzór ten można oczywiście przekształcić i podając długość posiadanej anteny obliczyć jaka będzie optymalna częstotliwość nadawania.
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).
Dla większej wydajności wykorzystywana jest tu jednak bardziej zaawansowana metoda generowania sygnału PWM z użyciem DMA.
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.
Więcej szczegółów na temat działania programu oraz użytych technologii znaleźć można w dokumentacji (sekcja poświęcona szczegółom technicznym).
Dodatkowe artykuły, które mogą Cię zainteresować:
- Kurs Raspberry Pi, projekty – #3 – Domoticz, kamera, GPIO
- Kurs Raspberry Pi – #14 – podstawy Pythona, GPIO
- Kurs Raspberry Pi – #16 – PWM, wejścia, kamera w Pythonie
- 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
Powiązane wpisy
DMA, fm, kurs, kursRPiProjekty, nadajnik, projekt, PWM, radio, raspberrypi, sox
Trwa ładowanie komentarzy...