Digitální střepiny


Drobnosti, které se někomu můžou hodit

Vlastní vyhledávání Googlem na stránkách cestuji.info

Google


Digitální střepiny - stránka zaměřená na drobné rady z oblasti výpočetní techniky


Rádio z Raspberry Pi
Zveřejněno v roce 2014

Rozhodl jsem se, že si postavím internetové rádio, založené na Raspberry Pi.
Stanovil jsem si podmínku, že musí fungovat bez monitoru a klávesnice, prostě po zapnutí musí začít hrát poslední poslouchaná stanice a nějakými tlačítky se bude přepínat mezi několika předprogramovanými stanicemi. Rádio nemusí obsahovat výkonový zesilovač, protože ho budu provozovat ve spojení s mikrověží.
Inspiraci jsem čerpal ze stránky http://www.jan-holst.dk/pi-radio/pi-radio.html, ale nakonec skoro nezůstal kámen na kameni.

Rádio z Rasberry Pi s mikrověží JVC Radio Rasberry Pi

  • Nejprve jsem si sehnal vhodnou plastovou krabičku, která svou šířkou a hloubkou bude odpovídat mikrověži, pod kterou bude stát a jejíž výška bude přiměřená, aby se do ní vešly všechny komponenty, z nichž nejvyšší je displej.
    Volba padla na krabičku KP 28 (Z-37) s rozměry 127x257x49 milimetrů (gme.cz 622-477). Výrobcem je firma http://www.maszczyk.pl. Nechápu, proč se u nás prodává pod označením KP 28, když originální označení vylisované na krabičce je Z-37. U výrobce je k dispozici jak dobře čitelný výkres, tak 3D IGS model. https://www.maszczyk.pl/pokaz_produkt/obudowy-z-panelem-z-37.html
    .
  • Hlavním komponentem je Raspberry Pi, pořídil jsem si model B (s ethernetovým portem) v provedení 2.0.
  • Dále je potřeba dostatečně dimenzovaný napájecí zdroj, doporučuji 5V / 2A. (První pokusy jsem dělal s jednoampérovým zdrojem od telefonu a ten nestačil, nefungovala wifi-karta, vypadávala klávesnice...). Koupil jsem ho na Ebay z Číny.
    Dále:
  • SD-karta 4GB nebo větší
  • USB wifi-karta Edimax EW-7811Un (Může to být samozřejmě i jiná karta, optimálně s čipsetem Realtek, protože ovladače jsou už přímo v Debianu.) Poštovné je u TS-Bohemia při objednávce nad 500Kč zdarma.
  • displej LCD 16x2 (1602, HD44780, koupil jsem ho na Ebay.com za necelých padesát korun i s poštovným). Volil jsem modrý, protože i mikrověž má modré podsvícení.
  • prodlužovací USB kablík s konektorem na panel (optimálně 2 kusy) z Ebay.com (25cm USB 2.0 A female panel mount to USB A male left angled plug extension cable), ca 50 Kč/kus. Obrázek
  • síťový vypínač Izostat se třemi kontakty (2x spínací, 1x rozpínací) a tlačítko Izostat včetně hmatníků. Pokud byste měli síťový Izostat v provedení s 2x spínacím kontaktem, jde použít taky, museli byste změnit skript zobraz.py a testovali byste nikoliv rozepnutí, ale sepnutí kontaktu.
  • 26-ti pólový dvouřadý konektor pro plochý kabel PLF26 (gme.cz 800-011) a kus plochého kablíku (třeba ze starého počítače, obdobné širší se používaly k ATA harddiskům nebo koupit u GME 650-048). Konektor jde nalisovat třeba ve svěráku, jeden kamarád ho lisoval pod nohou židle... Po nalisování jsem plochý kabel "rozcupoval" na jednotlivé vodiče.
  • Relé 5V s kontaktem dimenzovaným na 230V, například Takamisawa JS5-K
  • Samoblikací LED, já jsem použil blikající led o průměru 3mm červenou L-36BID ze sortimentu gme.cz (kód u GMe 511-282). Poznámka: tato blikající LED nepotřebuje předřadný rezistor.
  • drobné součástky (tranzistory, rezistory, kondenzátory, trimr 10K, kousek univerzálního plošného spoje - viz schema
  • panelové zásuvky CINCH, konektor JACK stereo 3,5mm a kus stíněného kablíku pro vývod zvuku, jehlové kontaktové lišty samec a samice s roztečí 2.54mm (16 jehel) pro připojení LCD displeje k plošnému spoji. Můžete koupit lišty s více jehlami a zkrátit je (GME 832-039 a 832-017).
  • mechanické montážní díly (šrouby, matice, vruty, distanční sloupky, držáky vypínačů...) - nemá cenu přesně vypisovat, určitě to nebudete stavět do stejné krabičky, jako já, tedy budete potřebovat jiné části.
  • nezapomeňte si pořídit nějaké NEKLOUZAVÉ PLASTOVÉ NOŽIČKY (já jsem použil nalepovací) - zdá se to jako zbytečný detail, ale pokud použijete stejně jako já síťové Izostaty, tak ty se zatlačují pomerně velkou silou a pak se posouvá celé rádio, i když je zatížené tunerem.

    Rozmístětí v krabičce je jasné z následujícího obrázku:

    Raspberry PI radio - rozložení součástí v krabičce

    Do předního panelu je vyfrézovaná obdélníková díra pro displej a vyvrtané dvě díry pro tlačítka a menší pro blikací LED diodu. Za panelem je subpanel, ke kterému je upevněný displej a tlačítka. Ten jsem vytiskl na 3D tiskárně, ale to je samozřejmě jedna z mnoha možných způsobů výroby. Do displeje je zapájená kontaktní jehlová lišta a na ni je nastrčen plošný spoj, na kterém je trimr pro regulaci kontrastu displeje a tranzistory pro řízení podsvícení displeje a ovládání samoblikací LED. Plošný spoj jsem improvizovaně vytvořil z kousku univerzálního plošného spoje.


    Raspberry PI radio - rozložení součástí v krabičce, přední část

    V té perforované krabičce je umístěný napájecí zdroj, původně to byl ten typ na zastrčení do zásuvky, ale já ho chci vypínat vypínačem, tedy jsem ho z krabičky vykuchal a umístil dovnitř rádia. Je tam i to relé, které zajišťuje zpožděné vypínání.

    Raspberry je upevněno na distančních sloupcích. Samo o sobě není velké, ale konektory z něj trčí na všechny strany. Nejlepší umístění mi připadalo, jako je na obrázku. Konektor na připojení monitoru je dost nelogicky v levém boku krabičky, ale připojuji ho jenom občas na programování, takže mi to nevadí.

    Raspberry PI radio - rozložení součástí v krabičce, zadní část

    V zadním panelu jsou umístěny cinche, já jich tam mám šest. Dva slouží jako stereovstup a čtyři jako výstupy. Do výstupu jde buď signál z Raspberry Pi rádia, nebo z toho cinchového vstupu. O přepínání se starají dvě miniaturní relé, cívky mají připojené přímo ke zdroji. Řeším tím nedostatek vstupů na mé mikrověži, když je Raspberry rádio zapnuté, relé přitáhnou a na výstup jde signál z raspberry rádia, když je rádio vypnuté, relé odpadnou a propojí výstupy se vstupem. Velmi jednoduché řešení, ale ušetří mi to věčné "přepichování" kabelů.
    Do panelu je vyveden jeden USB port, který slouží pro připojení klávesnice. Doporučuji vyvést tam i ten druhý pro wifi-kartu. Původně jsem wifi-kartu chtěl nechat zastrčenou přímo v Raspberry, ale měla tam slabý signál, tak jsem ji improvizovaně vyvedl tím šedým kabelem, protože jsem neměl dva ty černé panelové USB kablíky. Funguje to, tak už do toho nebudu vrtat. (Držím se zásady: co funguje, do toho je lepší nezasahovat).

    Raspberry PI radio - připojení napájení

    Neměl jsem po ruce mikro-USB kablík (pro proudy kolem 2 Ampér se mi stejně příliš nelíbí) a tak jsem přívodní kablíky od zdroje přiletoval přímo k Raspberry desce (červený je plus, černý minus).

    Chlazení:
    Na obrázcích je vidět, že jsem do krabičky vyvrtal ventilační otvory. Raspberry se totiž docela zahřívá, tak aby měl vzduch alespoň nějakou možnost cirkulovat. Otvory jsou ve dně a ve víku, krabička je na nožkách a mikrověž taky, takže nějaká možnost cirkulace tu je. Jako vrtací masku, aby byly ty otvory rozmístěné hezky pravidelně, jsem použil děrovaný plech ze stavebnice Merkur :) .
    Ještě jsem si dodatečně na Ebay z Číny objednal chladicí hliníkový profil, který jsem přilepil na procesor Raspberry. Sice jsem nepozoroval nějaké problémy s přehříváním, ale v horkých letních dnech by problémy díky špatné cirkulaci vzduchu mohly nastat.
    Kontrolu teploty čipu je možné provést příkazem /opt/vc/bin/vcgencmd measure_temp. Je to ve skutečnosti teplota grafické karty, ale protože je na jednom čipu s hlavním procesorem, liší se jenom minimálně. Skript na přímé měření teploty CPU jsem našel na http://raspberrypi.stackexchange.com/questions/9105/raspberry-pi-onboard-temp-sensors-in-raspbianwheezy, můžete si ho stáhnout z mého serveru, je obsažený v balíčku programů rádia (viz níže). Pojmenoval jsem ho teplota, spouští se ./teplota. Po přilepení chladicího profilu mi dlouhodobá teplota čipu nepřesáhne 60°C. Nenašel jsem oficiální údaj, kolik je maximální doporučená teplota jádra, ale údajně je to dlouhodobě 100°C, krátkodobě i více.

    SCHEMA

    Raspberry PI radio - schema zapojení LCD displeje a zpožděného vypínání

    Aby byly všechny informace pohromadě, přidávám zapojeni GPIO konektoru P1 pro Raspberry REV 2.0:

    Raspberry PI rev 2.0 zapojení konektoru P1

    Poznámka: kdybyste si chtěli stavět rádio s několika tlačítky předvoleb, tak vedle tohoto velkého konektoru je ještě druhý menší s označením P5, na kterém jsou vyvedeny další čtyři GPIO. Pokud byste je potřebovali, zagooglete, hledejte "raspberry GPIO P5". Ten konektor nemá osazené piny a je bohužel tak blízko konektoru P1, že by se jehly musely zapájet z druhé strany nebo šikmo. Vše najdete v Googlu.

    Programové vybavení.
  • Stáhl jsem si do PC ISO obraz Debianu (Raspbianu) Wheezy 2014-01-07-wheezy-raspbian.
  • Pomoci programu Win32 Disk Imager jsem v PC tu distribuci nahrál na SD kartu
  • Kartu jsem vložil do Raspberry Pi, připojil jsem monitor, klávesnici (myš není potřeba) a napájecí adaptér a začal jsem experimentovat.

    Ze začátku jsem měl problémy, nedařilo se mi zprovoznit wifi-kartu, chvílemi vypadávala klávesnice... Nakonec jsem zjistil, že napájecí adaptér z telefonu LG, který na sobě měl napsáno, že dokáže dodávat až 1A proudu, je příliš slabý. Jakmile jsem použil dvouampérový adaptér, mohl jsem začít pracovat.

  • Po prvním zapnutí se objevil Configuration tools (raspi-config). Tady jsem použil volbu 1 Expand filesystem a volbu 8 Advanced option / subvolbu A6 Audio, kde jsem nasměroval audio natvrdo na 3,5mm jack (nemínil jsem používat reproduktory v monitoru, ale zesilovač připojený přes jack konektor)
  • Po rebootu jsem se mohl poprvé přihlásit, defaultní jméno je pi, heslo je raspberry.
  • Jelikož jsem líný člověk, jako první věc jsem zrušil zadávání jména a hesla (nastavil autologin). Postupoval jsem podle návodu na stránce http://elinux.org/RPi_Debian_Auto_Login :
    sudo nano /etc/inittab
    V tomto souboru je potřeba najít řádek
    1:2345:respawn:/sbin/getty --noclear 38400 tty1
    a zakomentovat ho (napsat před něj dvojitý kříž):
    #1:2345:respawn:/sbin/getty --noclear 38400 tty1
    A pod tento řádek napište nový řádek:
    1:2345:respawn:/bin/login -f pi tty1 /dev/tty1 2>&1

    Důkladně si ten řádek zkontrolujte, jinak by se mohlo stát, že Raspbian nenaběhne vůbec...

    Ukončete editor nano pomocí kombinace CTRL+x, y a enter.
    Následuje ukončení linuxu:
    sudo reboot

    Poznámka: nikdy nevypínejte Raspberry pouhým odpojením napájení, pak se často stane, že se změny neuloží (změny zůstávají nějakou dobu pouze v operační paměti).

    Následně jsem si zprovoznil wifi-kartu. Pořídil jsem si levnou Edimax EW-7811Un, která používá čip od firmy Realtek. (Kupoval jsem ji v tsbohemia.cz, poštovné bylo zdarma.) Firmware pro Realteky už je defaultně nainstalované, tedy stačí zadat název sítě a šifrování:

    sudo nano /etc/wpa_supplicant/wpa_supplicant.conf

    Na konec souboru doplníme:
    network={
    ssid="your_ssid"
    scan_ssid=1
    key_mgmt=WPA-PSK
    psk="your_psk"
    }
    Místo your_ssid doplňte SSID sítě, ke které se budete připojovat (ve dvojitých uvozovkách), your_psk nahraďte vaším psk-heslem (taky ve dvojitých uvozovkách). Do tohoto konfigu se dá zadávat mnoho parametrů, ale i tento jednoduchý zápis mi fungoval pro mou síť chráněnou WPA2 šifrováním.

    Kontrola funkčnosti: odpojíme ethernetový kabel, pokud byl připojený, připojíme wifi-modul a provedeme restart:
    sudo reboot

    Po restartu můžeme vyzkoušet funkčnost internetu třeba pingem:
    ping 8.8.8.8

    Následuje velmi důležitý krok, aktualizace:
    sudo apt-get update

    Pro přehrávání rádia budeme používat vlc, tedy ho nainstalujeme:
    sudo apt-get install vlc

    Můžeme provést zkoušku. zadejte do příkazového řádku (vše na jden řádek):
    cvlc -A alsa,none --alsa-audio-device default http://icecast7.play.cz/casradioolomouc128.mp3

    Vyskáče několik červených chybových hlášení (má to co do činění s tím, že nejsme v grafickém režimu), ale po několika vteřinách, jindy to může trvat i minutu, by mělo začít hrát rádio.


    Problémy: pokud rádio hrát nezačne, je možné, že je nasměrované do HDMI portu. Hned na začátku v raspi-configu jsme ho směřovali do 3,5mm jacku, pokud jste na to zapomněli, jde to udělat i teď:

    sudo amixer cset numid=3 1
    sudo alsactl store 0

    Zdroj: http://www.raspberrypi.org/forums/viewtopic.php?t=29403&p=497185


    U distribuce Raspbianu Wheezy 2013-09-25-wheezy-raspbian.img se vyskytoval problém "Pulse audio server connection failure: connection refused". Pak pomůže:

    sudo apt-get --purge --reinstall install pulseaudio

    Zdroj: why-am-i-getting-this-connection-to-pulseaudio-failed-error



    Aktualizace 05/2019: Dostal jsem informaci, že v novějších distribucích Debianu už cvlc nefunguje vůbec.
    V takovém případě doporučuji zkusit použít mplayer. Instalace:
    sudo apt-get install mplayer

    Příklad přehrávání (mělo by to na otestování fungovat i přímo z příkazového řádku přes putty):
    mplayer -noconsolecontrols -really-quiet 2>/dev/null http://icecast7.play.cz/casradioolomouc128.mp3 &

    Ukončení přehrávání:
    killall mplayer

    Celý obraz mé karty se starším Debianem, funkčním cvlc a odladěnými skripty je k dispozici na uloz.to. Používám kartu Transcend 8GB, pomocí programu Win32Diskimager jde obraz nahrát na kartu stejné velikosti nebo větší. Odkaz na stažení: https://uloz.to/!GjXmAIlXHPS1/raspberry-pi-b-2-0-internetove-radio-zip. Upozornění: aby se wifi-karta připojila k vašemu routeru, bude nutné změnit v souboru /etc/wpa_supplicant/wpa_supplicant.conf přístupové údaje.


    Přehrávání rádia můžeme zastavit pomocí klávesové kombinace CTRL+C

    Dále je potřeba nainstalovat knihovnu GPIO, pomocí které můžeme ovládat GPIO piny. Stáhl jsem si z http://pypi.python.org/packages/source/R/RPi.GPIO v té době poslední knihovnu 0.5.5:

    sudo apt-get install python-dev
    wget http://pypi.python.org/packages/source/R/RPi.GPIO/RPi.GPIO-0.5.5.tar.gz
    tar zxf RPi.GPIO-0.5.5.tar.gz
    cd RPi.GPIO-0.5.5
    sudo python setup.py install

    Návod: http://sourceforge.net/p/raspberry-gpio-python/wiki/Examples/

    Instalace rádia:
    Stáhněte si hotové skripty z mého webu a rozbalte tar archiv
    wget https://it.cestuji.info/radio/radio_v2.tar
    tar xvf radio_v2.tar

    Dále je nutno zajistit spouštění skriptů: radio.py spouštíme jako uživatel pi, zobraz.py jako root. Do souboru /etc/rc.local přidáme před poslední exit 0 následující dva řádky:
    su -c "python /home/pi/radio.py &" - pi
    su -c "python /home/pi/zobraz.py &" - root
    (Editor za tímto účelem otevřete příkazem sudo nano /etc/rc.local)

    Po restartu (sudo reboot) by se napřed měla ozvat znělka (jingl), která se přehrává z .wav souborů, pak by mělo s určitým odstupem (někdy to trvá až nepříjemně dlouho) začít hrát rádio.
    Znělky (jingly) rádií jsem si stáhl ze stránek http://www.jingly.cz/ph/ph.html, ale můžete si je na PC nahrát ze živého vysílání, nebo si můžete namluvit do mikrofonu něco jako "Předvolba číslo jedna - rádio to a to" - záleží jenom na vás. (Musí to být WAV soubory, MP3 nefungují.) . Pojmenování souborů: pro předvolbu nula (jsou číslovány od nuly! Jestli se vám to nelíbí, přeprogramujte si to). P0.waw, pro předvolbu 1 P1.wav a tak dále, je nutno dodržet velká a malá písmena.

    Jak už jsem nakousnul, rádio používá dva skripty, radio.py a zobraz.py.
    Řídícím prvkem je skript zobraz.py (uvádím pro ilustraci, doporučuji stáhnout si ho přímo do raspberry (https://it.cestuji.info/radio/radio_v2.tar, viz výše) a změny dělat přímo v Raspberry Pi pomocí připojené klávesnice.

    #!/bin/sh
    
    import os.path
    import time
    import subprocess
    import RPi.GPIO as GPIO
    from Adafruit_CharLCD import Adafruit_CharLCD
    
    lcd = Adafruit_CharLCD()
    
    GPIO.setmode(GPIO.BCM)
    #def. GPIO2 (pin3) a GPIO3 (pin 5) jako vstupy, odpor na 3.3V 
    GPIO.setup(2, GPIO.IN, pull_up_down=GPIO.PUD_UP)
    GPIO.setup(3, GPIO.IN, pull_up_down=GPIO.PUD_UP)
    GPIO.setup(4, GPIO.OUT)
    GPIO.setup(7, GPIO.OUT)
    
    # vypneme blikajici LED a podsvitime displej
    GPIO.output(4, 1)
    # nahodime pridrzovaci rele zdroje
    GPIO.output(7, 1)
    
    #####################################################
    ############ TADY MENIT A PRIDAVAT STANICE ############
    #####################################################
    channels = [\
      ("http://icecast7.play.cz/casradioolomouc128.mp3", "Radio Cas", "   Olomouc"), \
      ("http://icecast4.play.cz/country128.mp3", "Country", "radio"), \
      ("http://icecast3.play.cz/frekvence1-128.mp3", "Frekvence 1", "") \
      ]
    ####################################################
    ####################################################
    
    f = open('/home/pi/posledniStaniceCislo', 'r')
    idx =int(f.readline())
    f.close()
    text1 = channels[idx][1]
    text2 = channels[idx][2]
    
    lcd.clear()
    lcd.message('P' + str(idx) + ' ' + text1 + '\n' + text2)
    
    while True:
      pocitadlo = 0
      v = int(GPIO.input(2))
      # Button pressed: zobrazime dalsi kanal
      if v <> 1:
        print "Tlacitko zmacknuto zacatek"
        test = os.path.exists('/home/pi/lock')
        # pokud jsem zacal znova mackat a radio 
        # jeste neprevzalo nastaveni, smazu lock
        if test == 1:
          os.remove('/home/pi/lock')
          while pocitadlo < 1:
            idx = idx + 1
            if idx >= len(channels):
              idx = 0
            url = channels[idx][0]
            text1 = channels[idx][1]
            text2 = channels[idx][2]
            lcd.clear()
            lcd.message('P' + str(idx) + ' ' + text1 + '\n' + text2)
            pocitadlo = pocitadlo + 1
            time.sleep(1)
            v2 = int(GPIO.input(2))
            #dokud drzime tlacitko, listujeme
            if v2 <> 1:
              pocitadlo = 0
              print "Tlacitko stale stisknuto, pokracuji v listovani"
            #skoncili jsme listovani, tedy ulozime posledni hodnotu
            f3 = open('/home/pi/posledniStaniceCislo', 'w')
            f3.write(str(idx))
            f3.close()
            f4 = open('/home/pi/posledniStanice', 'w')
            f4.write(url)
            f4.close()
            time.sleep(0.2)
            #a vytvorime lock soubor, aby si to nacetlo radio
            open('/home/pi/lock', 'a').close()
            #vyskocime z cyklu
            v = 1
          time.sleep(0.2)
          #otestujeme stisk vypinaciho kontaktu
          v3 = int(GPIO.input(3))
          if v3 <> 1:
               print "Stisknuto tlacitko pro vypnuti"
               # zapneme blikajici LED
               GPIO.output(4, 0)
               # vypneme Raspberry
               os.system("sudo shutdown -h now")


    Velmi stručný popis funkce:
    Na začátku skriptu definujeme, které piny mají funkci vstupu a které výstupu. (Pro displej se to definuje jinde, v souboru Adafruit_CharLCD.py, detaily viz drive-a-16x2-lcd-directly-with-a-raspberry-pi.pdf)
    Na GPIO4 nastavíme logickou jedničku. Tím přestane blikat samoblikací LED a podsvítí se displej. Na GPIO7 nastavíme taky logickou jedničku a tím sepne relé, které svým kontaktem paralelně k hlavnímu vypínači pouští 230V do zdroje. To nám později umožní provést zpožděné vypnutí, aby Raspberry měl čas regulérně ukončit chod.

    Následuje důležitá sekce, ve které je možné měnit a přidávat stanice. Počet stanic není omezený, ale pro přehlednost doporučuji to nepřehánět, přece jenom se listování bude provádět jedním tlačítkem.
    V tom řádku je v prvních uvozovkách URL stanice, tu si zjišťuji v PC pomocí programu URLSnooper 2 (free verze). V dalších uvozovkách je text pro první řádek displeje, a v posledních pro druhý řádek displeje. Před text na prvním řádku se ještě vkládá číslo předvolby P1 a mezera, text tedy začíná až na 4. znaku displeje a maximální zobrazitelná délka je 12 znaků.
    Následně si při prvním spuštění ze souboru PosledniStaniceCislo načteme číslo předvolby poslední hrané stanice a zobrazíme příslušný text na displeji.
    Dále už jenom nekonečným cyklem hlídáme, jestli nebylo stisknuto tlačítko pro změnu předvolby. Pokud ano, listujeme ve vteřinových intervalech stanice. V okamžiku, kdy je detekováno uvolnění tlačítka, uložíme do souboru posledniStanice URL, které se má přehrávat, do souboru posledniStaniceCislo cislo předvolby a vytvoříme soubor lock. Existence souboru lock ovládá skript radio.py, viz níže.
    Pokud bychom tlačítko změny stanice mačkali přerušovaně, tak soubor lock zase smažeme, pokud to už neudělal soubor radio.py, a pokračujeme v listování.
    Dále ještě kontrolujeme, jestli nebyl vypnut hlavní vypínač (pomocí pomocného kontaktu na hlavním vypínači). Pokud ano, vypne se pomocí GPIO4 podsvícení displeje a začne blikat červená LED-dioda, která signalizuje, že probíhá vypínání, ale že zdroj je ještě pod napětím. Raspberry PI vypneme pomocí příkazu shutdown -h now. Až se Raspberry vypne, zmizí na GPIO7 napětí a relé odpadne a tím se odpojí od elektřiny i zdroj a červená dioda přestane blikat.

    Druhou část rádia tvoří skript radio.py:

    #!/usr/bin/python
    
    import time
    import subprocess
    import os.path
    
    
    def play_channel(url):
          global radio_process
          if radio_process <> None:
                    radio_process.terminate()
    		print "Radio: Shazuji radio"
          f7=open('/home/pi/posledniStaniceCislo', 'r')	
          cislo=f7.readline()
          f7.close()
          znelka='/home/pi/P' + cislo + '.wav'
          time.sleep(2)
          subprocess.call(["/usr/bin/aplay", znelka])
          radio_process = subprocess.Popen(["/usr/bin/cvlc", 
    /"-A", "alsa,none", "--alsa-audio-device", "default", url])
    
    ####
    
    radio_process = None
    
    # pro jistotu smazeme lock soubor, kdyby tam byl
    test = os.path.exists('/home/pi/lock')
    if test == 1:
    	os.remove('/home/pi/lock')
    
    f3 = open('/home/pi/posledniStanice', 'r')
    url = f3.readline()
    f3.close()
    print "Radio: poustim stanici " + url
    play_channel(url)
    time.sleep(8)
    
    try:
            while True:
               test = os.path.exists('/home/pi/lock')
               if test == 1:
                   print "Radio: Nalezen lock"
                   f5 = open('/home/pi/posledniStanice', 'r')
                   url = f5.readline()
                   f5.close()
                   print "Radio: Nova stanice: " + url
                   os.remove('/home/pi/lock')
                   play_channel(url)
                   #dlouha pauza, protoze pri rychlem prepinani havaruje VLC
                    time.sleep(7)
                 # Poll interval.
                 time.sleep(0.5)
    except:
            # Keyboard interrupt or other stuff that causes termination -
            # clean up any running child process.
            if radio_process <> None:
                    radio_process.terminate()


    Skript radio.py při prvním spuštění načte soubor posledniStanice a posledniStaniceCislo, zahraje znělku (jingl) a spustí přehrávání URL zjištěné ze souboru posledniStanice.
    Pak už jenom v cyklu kontroluje existenci souboru lock, pokud existuje, načte soubor posledniStanice a posledniStaniceCislo, smaže soubor lock, zastaví přehrávání stávající stanice, zahraje nový jingl a spustí novou stanici. Po změně stanice tam je sedmivteřinová časová prodleva, než se znova začne kontrolovat existence souboru LOCK, to proto, že se Debianu nelíbí, když vypínáme VLC v době, kdy ještě plně nenaběhl.

    Poznámka: všiml jsem si, že když hraje rádio, nefunguje správně klávesnice (vynechává písmena nebo se naopak občas chová tak, jako bych držel klávesu trvale). V takovém případě je možné pomocí příkazu ps -ef zjistit PID procesu vlc (jeden z nejdelších řádků výpisu) a vlc sestřelit pomocí příkazu kill 1234, místo 1234 je nutno zadat skutečné PID. Pak už se dá normálně programovat, pokud chcete spustit rádio, stačí zmáčknout tlačítko pro změnu stanice nebo restartovat Raspberry.


    Celý obraz mé karty je k dispozici na uloz.to. Používám kartu Transcend 8GB, pomocí programu Win32Diskimager jde obraz nahrát na kartu stejné velikosti nebo větší. Odkaz na stažení: https://uloz.to/!GjXmAIlXHPS1/raspberry-pi-b-2-0-internetove-radio-zip . Upozornění: aby se wifi-karta připojila k vašemu routeru, bude nutné změnit v souboru /etc/wpa_supplicant/wpa_supplicant.conf přístupové údaje.

  • Na začátek stránky
    Zpět na Digitální střepiny

    Spřátelené stránky: Konstrukční kancelář ACR, Katalog katalogů