-------
Raspberry Pi jako odbiornik internetowych stacji radiowych

Raspberry Pi (http://www.raspberrypi.org/) to miniaturowy komputer jednopłytkowy o bardzo dużych możliwościach. Komputer znajduje się na płycie głównej o wymiarach 8,5x5,5 cm i oprócz podstawowych złączy potrzebnych do pracy posiada również bardziej zaawansowane złącze wejść/wyjść (2x13 styków) umożliwiające bezpośrednie sterowanie dowolnymi urządzeniami zewnętrznymi.
Zastosowania Raspberry Pi są praktycznie nieograniczone. Jednym z nich jest przystosowanie komputera do obioru internetowych stacji radiowych. Gotowe zestawy audio z możliwością odbioru stacji internetowych nadal nie są powszechne, a ich ceny są wysokie. Zamiast wydawać kilkaset złotych na fabryczny odbiornik radia internetowego, lepiej będzie wydać znacznie niższą kwotę na Raspberry Pi, który oprócz odbioru stacji internetowych będzie mógł robić znacznie więcej!

Opisane rozwiązanie działa, ale należy zdawać sobie sprawę z jego prostoty. Sterowanie odbiorem zostało ograniczone tylko do jednego przycisku, a sam program sterujący jest napisany tylko w skrypcie powłoki. Tą konfigurację można jednak w dowolny sposób rozwijać, a szczególnie dodawać kolejne przyciski i rozwijać program sterujący. Przedstawiona konstrukcja to tylko pierwsze podejście!

Podstawowe założenia konfiguracji Raspberry Pi jako radia internetowego

  - na karcie SD zainstalowany jest system Raspbian Wheezy
  - praca wyłącznie w linii poleceń, bez uruchamiania środowiska graficznego
  - wykorzystanie złącza I/O 2x13 do podłączenia przycisków sterujących i diod wskazujących stan urządzenia
  - praca na sieci przewodowej, później również na bezprzewodowej
  - automatyczne uruchmienie programu sterującego, obsługa radia ogranicza się do włączania kolejnych stacji

Widok komputera Raspberry Pi jako odbiornika radia internetowego
Rys. 1. Widok podstawowej konfiguracji Raspberry Pi jako odbiornika radia internetowego

Praktyczna realizacja odbiornika

1. Automatyczne logowanie użytkownika root

Praca na koncie root nie jest zalecana, świadomi zagrożeń decydujemy się jednak na nią, ponieważ ułatwia m.in. dostęp do portów I/O z poziomu skryptów powłoki. Aby automatycznie zalogować użytkownika root należy edytować plik /etc/inittab. Do edycji możemy posłużyć się programem nano, który jest już zainstalowany w systemie Raspbian. Wydajemy polecenie:

sudo nano /etc/inittab

W pliku odnajdujemy linię:

1:2345:respawn:/sbin/getty --noclear 38400 tty1

"Komentujemy" tą linie dodając przed nią #, a poniżej dodajemy nową linię, która automatyczne zaloguje użytkownika root:

1:2345:respawn:/bin/login -f root tty1 </dev/tty1 >/dev/tty1 2>&1

Przy następnym uruchomieniu użytkownik root zostanie automatycznie zalogowany.

2. Instalacja odtwarzacza vlc i modyfikacja do pracy z konta root

vlc to odtwarzacz o dużych możliwościach z opcją pracy z linii poleceń. Zakładając, że Raspberry jest podłączony do internetu, instalujemy vlc poleceniem:

apt-get install vlc

Zainstalowany vlc ma jednak pewną wadę - zablokowaną pracę z konta root. Usuwamy to utrudnienie przez modyfikację binarnego pliku vlc (opis tu). Zakładając, że plik znajduje się w katalogu /usr/bin (sprawdzić!) wydajemy polecenia:

cd /usr/bin
sed -i 's/geteuid/getppid/g' `which vlc`


Należy zwrócić uwagę, że which vlc zamkniety jest wewnątrz tzw. backticks. Po wykonaniu tego polecenia vlc nie zgłasza błędu przy uruchamianiu z konta root.

3. Konfiguracja wejść/wyjść (złącze 2x13)

Do sterowania radiem wykorzystamy złącze 2x13, na które wyprowadzone są porty wejść/wyjść procesora. Dostęp do tych portów możliwy jest z poziomu skryptu powłoki (pliki i katalogi w /sys/class/gpio). Szczegółowy opis pracy z portami wejść/wyjść Raspberry Pi znajdują się tu. Szczegółowe umiejscowienie sygnałów w złączu 2x13 wygląda następująco:
Rozmieszczenie sygnałów w złączu 2x13 Raspberry Pi
Rys. 2. Rozmieszczenie sygnałów w złączu 2x13. Widok z góry.

Przy projektowaniu połączeń należy zwrócić uwagę, że dla płytek drukowanych w wersji 2.0 (z otworami do mocowania) rozmieszczenie sygnałów jest odmienne. Szczegóły można znaleźć w linku powyżej.

Założenia do sterowania są następujące:

  - jeden przycisk sterujący odtwarzaniem. Naciśnięcie przycisku P1 (schemat poniżej) włącza stację. Ponowne naciśnięcie zatrzymuje odtwarzanie i jednocześnie przygotowuje do odtwarzania kolejnej stacji. Kolejna stacja zostaje włączona po ponownym naciśnięciu przycisku. Itd., itd.
  - drugi przycisk (P2), kontrolny, umożliwia przerwanie pracy skryptów sterujących odtwarzaniem i powrót do linii poleceń Raspberry Pi
  - dioda zielona D2 sygnalizuje uruchomienie skryptów sterujących radiem i gotowość do rozpoczęcia odtwarzania
  - dioda czerwona D1 sygnalizuje odtwarzanie stacji radiowej

Schemat podłączenia elementów sterujących do złacza 2x13
Rys. 3. Schemat podłączenia przycisków sterujących i diod wskazujących stan urządzenia.

Sygnały GPIO2 i GPIO3 przy ustawieniu jako wejścia podłączone są przez rezystory i normalnie odczytywane są jako 1. Po naciśnięciu przycisku odczytywane są jako 0. Sygnały GPIO4 i GPIO17 są ustawione jako wyjścia. Konfiguracja wejść/wyjść odbywa się poprzez skrypt uruchamiający radio (opis w dalszej części). Do uzyskania potrzebnej konfiguracji niezbędne są następujące ustawienia:

# ustawienie GPIO2 jako wejscia
echo "2" > /sys/class/gpio/export
echo "in" > /sys/class/gpio/gpio2/direction

# ustawienie GPIO3 jako wejscia
echo "3" > /sys/class/gpio/export
echo "in" > /sys/class/gpio/gpio3/direction

# ustawienie GPIO4 jako wyjscia
echo "4" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio4/direction

# ustawienie GPIO17 jako wyjscia
echo "17" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio17/direction


Zapis i odczyt odbywa się odpowiednio przy pomocy poleceń:

# zapis do portu
echo "1" > /sys/class/gpio/gpio4/value

# odczyt z portu
cat /sys/class/gpio/gpio2/value


4. Skrypty sterujące oraz dodatkowe pliki potrzebne do pracy jako radio internetowe

Wszystkie pliki sterujące umieszczone zostały w katalogu /usr/bin (oprócz pliku uradio, który znajduję sie w katalogu /etc/init.d). Do pracy jako radio internetowe używane są następujące pliki:

Nazwa pliku Opis działania
uradio Skrypt uruchamiający radio internetowe, znajdujący się w katalogu /etc/init.d
killrad Skrypt procesu kontrolnego pracującego w tle, umożliwia w każdej chwili przerwanie pracy wszystkich skryptów radia i powrót do linii poleceń. Uruchamiany przyciskiem P2
startrad Skrypt uruchamiający radio internetowe. Po uruchomieniu skrypt oczekuje na naciśnięcie przycisku P1. Po naciśnięciu pobiera numer stacji do odtwarzania z pliku stacja, z pliku o tym numerze pobierany jest adres stacji radiowej i ten adres jest przekazywany do uruchomienia do programu vlc.
killvlc Skrypt kończący odtwarzanie stacji. Po naciśnięciu przycisku P1 (przy włączonej stacji) następuje przerwanie odtwarzania i przejście do kolejnego numeru stacji. Odtwarzanie kolejnej stacji jest uruchamiane po kolejnym naciśnięciu przycisku P1
stacja Plik zawierający numer stacji do odtwarzania
1, 2, 3, 4, 5, 6 ... Każdy plik zawiera adres jednej internetowej stacji radiowej.

Skrypt uradio

Skrypt uruchamiający radio internetowe. Skrypt należy umieścić w katalogu /etc/init.d, dzięki czemu będzie automatycznie uruchamiany przy starcie systemu.

#!/bin/bash
echo "Uruchamianie modulu radia"
# konfiguracja wejsc/wyjsc
echo "2" > /sys/class/gpio/export
echo "3" > /sys/class/gpio/export
echo "4" > /sys/class/gpio/export
echo "17" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio4/direction
echo "out" > /sys/class/gpio/gpio17/direction
echo "in" > /sys/class/gpio/gpio3/direction
echo "in" > /sys/class/gpio/gpio2/direction
cd /usr/bin
sleep 1
# uruchmienie procesu kontrolnego, ktory umozliwia zatrzymanie wszystkich skryptow
killrad &
sleep 1
# wlaczenie diody zielonej sygnalizujacej gotowosc do pracy
echo "1" > /sys/class/gpio/gpio17/value
# ustawienie pierwszej stacji do odtwarzania
echo "1" > /usr/bin/stacja
# uruchomienie procesu radia internetowego
startrad


Dodanie znaku & po nazwie skryptu powoduje uruchomienie tego skryptu w tle. Taki proces nie jest widoczny w linii poleceń. Po stworzeniu pliku uradio w katalogu /etc/init.d należy pamiętać o nadaniu mu uprawnień poleceniem:

chmod 755 uradio

Teraz trzeba jeszcze uaktualnić systemową listę programów, które mają być uruchamiane przy starcie systemu. W tym celu wydajemy polecenie:

update-rc.d uradio defaults 99

Liczba 99 powoduje uruchomienie skryptu w ostatniej kolejności, dzięki czemu unikniemy problemu z uruchomieniem radia przed np. procesem sshd, co uniemożliwi zdalny dostęp do komputera.
Gdybyśmy z jakichś powodów chcieli usunąć skrypt z listy automatycznego uruchamiania wydajemy polecenie:

update-rc.d -f uradio remove

Skrypt killrad

Skrypt pracuje w tle, sprawdzając regularnie czy został naciśnięty przycisk P2. Jeśli tak, to przerywa aktywne procesy odtwarzania stacji internetowych, wyłącza diody kontrolne i wraca do linii poleceń. Skrypt ten to rodzaj "hamulca bazpieczeństwa", który umożliwia powrót do linii poleceń w razie problemów:

#!/bin/bash
sleep 5
wylacznik3=0
# sprawdzanie stanu przycisku P2
while [ $wylacznik3 == 0 ]
do
var3=`cat /sys/class/gpio/gpio3/value`
if [ "$var3" == 0 ]; then
wylacznik3=1
else
sleep 1
fi
done
# jesli wcisniety konczymy procesy
killall vlc
killall startrad
echo "0" > /sys/class/gpio/gpio17/value
echo "0" > /sys/class/gpio/gpio4/value
echo "1" > /usr/bin/stacja


Skrypt startrad

Skrypt uruchamiający odtwarzanie stacji internetowych. Po wywołaniu skrypt uruchamia proces killvlc, który działa w tle i sprawdza stan naciśnięcia przycisku P1 w celu wyłączenia odtwarzania. Następnie skrypt włącza diodę sygnalizującą odtwarzanie, odczytuje numer stacji z pliku stacja, numer pobrany z tego pliku służy do odczytania zawartości pliku z adresami stacji i ten adres jest przekazywany do programu vlc. Odtwarzanie programem vlc następuje wyłącznie w linii poleceń:

#!/bin/bash
cd /usr/bin
echo "Gotowy da wlaczenia stacji!"
wylacznik=0
# testowanie stanu przycisku P1 wlaczajacego odtwarzanie
while [ $wylacznik == 0 ]
do
var=`cat /sys/class/gpio/gpio2/value`
if [ "$var" == 0 ]; then
sudo echo "1" > /sys/class/gpio/gpio4/value
wylacznik=1
sleep 1
else
sudo echo "0" > /sys/class/gpio/gpio4/value
fi
done
# odczyt numeru stacji z pliku stacja
nrstacji=`cat /usr/bin/stacja`
# odczyt sciezki z pliku o numerze odczytanym z pliku stacja
stacjaodb=`cat $nrstacji`
# uruchomienie procesu wylaczajacego odtwarzanie
killvlc &
sleep 1
vlcn --volume 300 $stacjaodb
# po zakonczeniu odtwarzania wywolanego przyciskiem P1 (proces killvlc) ponowne uruchomienie odtwarzacza
startrad


Skrypt killvlc

Skrypt umożliwia zatrzymanie odtwarzania i przejście do następnej stacji. Skrypt uruchamiany jest przez startrad i działa w tle. Po wykryciu naciśnięcia przycisku P1 zatrzymuje odtwarzanie i zwiększa liczbę w pliku stacja o 1 (aż do maksymalnej wartości, wtedy wraca do 1).

#!/bin/bash
sleep 3
dodajstac=0
wylacznik2=0
# sprawdzanie stanu przycisku P1
while [ $wylacznik2 == 0 ]
do
var2=`cat /sys/class/gpio/gpio2/value`
if [ "$var2" == 0 ]; then
wylacznik2=1
fi
done
echo "0" > /sys/class/gpio/gpio4/value
# powiekszenie numeru stacji w tym przypadku ilosc stacji = 5
dodajstac=`cat /usr/bin/stacja`
dodajstac=`expr $dodajstac + 1`
if [ "$dodajstac" == 6 ]; then
dodajstac=1
fi
echo $dodajstac > /usr/bin/stacja
# zatrzymanie odtwarzania
killall vlc


Plik stacja

Plik zawiera liczbę odpowiadającą numerowi stacji do odtwarzania. Liczba ta jest modyfikowana przez skrypty sterujące. Liczba jest nastęnie używana do odczytu adresu stacji internetowej (patrz poniżej).

Pliki 1, 2, 3 ... (adresy stacji radiowych)

Każdy plik ma w nazwie tylko unikalną liczbę. Ilość plikow odpowiada ilości stacji do odtwarzania. Pliki muszą być nazywane (numerowane) po kolei. Przy zwiekszaniu ilości plików należy odpowiednio zwiększyć maksymalną ilość stacji w pliku killvlc (do usprawnienia). W treści pliku znajduje się TYLKO adres strumienia audio, który ma być odtwarzany.

Obsługa sieci bezprzewodowych w Raspberry Pi

Komputer Raspberry Pi nie posiada wbudowanej obsługi sieci bezprzewodowych. Chcąc podłączyć Raspberry do sieci bezprzewodowej należy zaopatrzyć się w bezprzewodową kartę sieciową USB. Należy jednak pamiętać, że nie może to być dowolna karta. Gniazdo USB Raspberry posiada ograniczoną wydajność prądową i bezpośrednio do gniazda w komputerze można podłączać TYLKO karty o niewielkim poborze prądu (inne przez hub USB). Jedną z takich kart jest karta D-Link DWA-131. Działanie tej karty zostało potwierdzone przez użytkowników Raspberry.

Podłączanie do sieci bezprzewodowej

Przy wyłączonym Raspberry podłączamy kartę DWA-131 do gniazda USB. Po uruchomieniu karta zostanie automatycznie wykryta, nie jest potrzebne żadne instalowanie sterowników (przynajmniej dla Raspbien Wheezy). Karta powinna zainstalować się jako interfejs wlan0. Następnie musimy dodać kartę do listy /etc/network/interfaces. Wydajemy polecenie:

nano /etc/network/interfaces

W edytorze dodajemy polecenia:

auto wlan0
iface wlan0 inet dhcp
wpa-conf /etc/wpa.conf


Plik wpa.conf odpowiada za konfigurację sieci. Plik ten musimy stworzyć poleceniem:

nano /etc/wpa.conf

Natępnie dodajemy do niego treść:

network={
(wciskamy TAB) ssid="Nazwa naszej sieci"
(wciskamy TAB) key_mgmt=WPA-PSK # zalezy oczywiscie od typu szyfrowania: none (dla braku szyfrowania i WEP); WPA-PSK
(wciskamy TAB) psk="Haslo sieci"
}


Restartujemy Raspberry. Komputer powinien automatycznie podłączyć się do wskazanej sieci.

Do zrobienia!

1. Uproszczenie skryptów - zdaję sobie sprawę z toporności skryptów sterujących. Na pewno będą poprawiane i upraszczane
2. Dodanie zdalnego sterowania, najlepiej typowym pilotem RTV.

Oczywiście wszelkie prace czytelnik wykonuje na własną odpowiedzialność! Życzę miłego eksperymentowania z Raspberry Pi!

Dodatkowe informacje (wszystkie w jęz. angielskim):

Skarbnica wiedzy na temat Raspberry Pi
Tu kupisz Raspberry Pi
10 sposobów wykorzystania Raspberry Pi

Opracował: Marek Sawistowski; wersja 1.0; 29.09.2012
-------