Python-koodien tutkiminen Raspberry Pi 4 -ympäristössä

Johdanto

Ammattikoulun (yto- eli yhteisten tutkinnonosien) pakolliset ja valinnaiset osaamistavoitteet annetaan ePerusteissa. Stadin ammattiopistossa Viestintä- ja vuorovaikutuskoriin kuuluvan paikallisen (tdy- eli toiminta digitaalisessa ympäristössä) yto-valinnaisen ’Ohjelmointi’ [1] osaamistavoitteita olen käyttänyt myös osana ’Virtapiirit ja robotiikka’ yto-valinnaisen tavoitteita. Kyseisessä valinnaisessa tutustutaan Arduinon ja C++ -kielen lisäksi Pythoniin Raspberry Pi 4 -ympäristössä. Arduinoon verrattuna RP4 on jo täysiverinen tietokone… mukaan kuvaan tulee graafinen ohjelmointi, josta esimerkkinä Tim Howlettin Python-kellokoodi [2]. Siinä graafisen kellotaulun taustalle pitäisi avautua nettiradiokanavan striimi, jota indikoidaan graafisella desibelimittarilla. Omasta versiostani poistin mittarin ja lisäsin sitä vastoin rivit, jotka avaavat nettiradion asemesta kotihakemistoon tallettamani wav-filen. Koodissa on siis alkeellinen (pyaudiolla toteutettu) wav-soitin, joka mahdollistaa kuvan ja äänen yhteensovittamisen ohjelmallisesti.

Python-kellokoodi käynnissä kahdella oppilaskoneella.

Toinen steppi on soitin, joka toistaa mp3:a (ilman että sitä konvertoidaan ensin waviksi). Kolmas steppi on url-audio, johon päästään tämän artikkelin lopuksi. Sitä varten tutkitaan kahta erillistä softaa, jotka ovat luonteeltaan api-sovelluksia (api-lyhenne tulee sanoista application programming interface ja tarkoittaa tässä tapauksessa kahta erilaista Python-VLC-linkkiä ja niitä käyttävää sovellusta). Radiokanavaan asti ei aivan päästä, mutta http-audion toistaminen onnistuu Soundcloud-suoratoistopalvelusta. VLC on ilmainen mediasoitinohjelmisto, joka löytyy RP4:n Debian-linuxista (sekä Bullseyesta että Bookwormista). Lisäosien asentaminen koulun ylläpidettäviin laitteisiin ei ole kuitenkaan aivan suoraviivaista ja niinpä Python-VLC-linkit on asennettava venv-virtuaaliympäristössä, jossa toinen käyttämäni mallisofta on myös ajettava konsolissa [3]. Jostain syystä kolmas artikkelissa esiteltävä mallisofta toimii paitsi konsolissa myös IDEssa, joka voi olla Mu tai Thonny (nämä löytyvät RP4:n vakioasennuksista). Senkin asennus on kuitenkin tehtävä virtuaaliympäristössä. 

Seuraavia steppejä voisivat olla a) soittimen pause – stop – seek jne. toiminnallisuuden koodaaminen, b) videoiden toistaminen, c) työaseman buuttaaminen www-sivuun. A-kohdasta totean, etten kyennyt konfiguroimaan raspin vakioasennettua VLC:tä esimerkissä [4] kuvatulla tavalla. Kuvaan artikkelissa pari muutakin haastetta, joita kohdataan koulussa ylläpidettävillä (vakioasennetuilla) RP4-laitteilla. Ensimmäisiä töitä Linuxin käyttöönotossa on näytönsäästäjän asentaminen ja konfigurointi; Linuxissa on tyypillisesti näyttävämmät näytönsäästäjät kuin Windowsissa. RP4-laitteilla ‘xscreensaverin’ käyttöön liittyy x11 käyttöönotto ‘raspi-config’ tilassa. 

Tulokset ja pohdinta

Aloitetaan Tim Howlettin Python-kellokoodista [2]. Lisäsin siihen alla näkyvät rivit, joista näkyy myös lisäyskohta rivin # Clock … ympäristössä.

pa = pyaudio.PyAudio()

wav_file = wave.open(’/home/pi1/Musiikki/WDT.wav’)

# Open audio stream
stream = pa.open(format = pa.get_format_from_width(wav_file.getsampwidth()),
            channels = wav_file.getnchannels(),
            rate = wav_file.getframerate(),
            output_device_index = 4,
            output = True,
            start = True,
            frames_per_buffer = 1024)

# Clock …
# Render the Surface objects that have the clock numbers written on them
clockNumSurfs = [fontObj.render(’
                 for i in [12] + list(range(1, 12))] # Put 12 at the front of the list since clocks start at 12, not 1.

while True: # Main application loop
    # Event handling loop for quit events
    output_audio = wav_file.readframes(1*wav_file.getframerate())
    stream.write(output_audio)

Kohdassa # Open audio stream luetellut parametrit pitävät huolen siitä, että wavistriimi kuuluu ilman, että kellon viisarin liikkeestä tulee pomppivaa tai että striimiin tulee viivettä, lagia. Bookworm-järjestelmäpäivityksessä kävi niin, että myös pyaudioon tuli muutoksia. Jouduin esim. muuttamaan output device indeksin arvoon 0 tai 1 (4 ei enää toiminut). Lisäksi frames per buffer = 1024 tuotti päivityksen jälkeen ääneen lagin. Ratkaisu äänen parantamiseksi oli nostaa frames per buffer arvoon 44100, joka on ‘frame rate’ laadukkaassa äänentoistossa! Tulokset ovat kokeellisia – tarkempi selvitys vaatisi pyaudion muutosten yksityiskohtaisen läpikäynnin. Näillä säädöillä kellokoodi kuitenkin toimii ja sen voi ajaa Mu tai Thonny Python-IDEssa RP4:ssä. 

Kotikoneellani (ja tätä vastaavalla ‘pönttökoneella’ koulussa) on Raspberry Pi Debian 11 (‘Bullseye’) i386 koneille. Siinä järjestelmän asennus poikkeaa RP4:stä ja Debian 12:sta (‘Bookwormista’) siten, että käyttäjä voi huoletta asentaa tarvitsemansa Pythonin lisäosat/kirjastot. Koulun koneilla taas (ylläpidettävän järjestelmän) pakettirakenteeseen kuulumattomat lisäosat on asennettava venv-virtuaaliympäristössä. Esittelen seuraavaksi siitä esimerkin. Tämä esimerkki lähti liikkeelle waviin liittyvistä hankaluuksista – halusin soittaa mp3-filen, vaikka niitä voikin konvertoida waviksi esim. CloudConvert palvelussa. Alla koodi, joka toimii ja jonka voin helposti ajaa kotikoneella Python-VLC linkin asennuksen jälkeen (asennus konsolissa: pip install python-vlc # or pip3 install python-vlc). [3] 

RP4-koneilla asennus vaatii venv-virtuaaliympäristön, jonka voit luoda seuraavalla komennolla: python –m venv env. Lisäksi sinun on ‘aktivoitava’ luomasi env-ympäristö: source env/bin/activate (env näkyy ‘hoputteessa’), ja vasta sitten em. asennus menee läpi. Asennuksen jälkeen allaoleva koodi toimii, kunhan sen ajaa konsolissa, venv-virtuaaliympäristössä (aktivoi venv ja aja konsolissa python3, jolloin hoputteeksi tulee >>>).

import vlc
import time  # To keep the script running during playback

# Create a VLC instance
instance = vlc.Instance()

# Create a media player object
player = instance.media_player_new()

# Path to your audio file (replace with your file path)
audio_path = ”/home/pi1/Musiikki/TNGHT.wav”  # e.g., ”C:/Music/song.mp3” (Windows) or ”/home/user/Music/song.mp3” (Linux)

# Create a media object from the file
media = instance.media_new(audio_path)

# Set the media object to the player
player.set_media(media)

# Parse the media (optional but helps with metadata/duration)
media.parse()

# Start playback
player.play()

# Keep the script alive while playing (adjust sleep time as needed)
# Alternatively, use input(”Press Enter to stop…”)
while player.is_playing():
    time.sleep(1)

Kolmantena esimerkkinä esitän koodin, joka vie VLC:n automatisoidun käytön uudelle tasolle (ja toimii sekä kotikoneella että koulussa). Asensin sitä varten Python-VLC-HTTP lisäosan; tämäkin asennus koulun koneilla on tehtävä venv-virtuaaliympäristössä. Koodi on lyhyt ja toimii paitsi konsolissa myös Mu tai Thonny Python-IDEssä. Tämä on esimerkki siitä miten kehittyneemmässä koodissa on kehittyneemmät kirjastot (kirjastojen yksityiskohtainen läpikäynti ei ole välttämätöntä aloittelevalla koodauksen harrastajalle). Se soittaa Soundcloud-audion suoraan url-osoitteesta [4]:

import time
from subprocess import Popen#Launch VLC and load [media file]
Popen([’vlc’,’https://soundcloud.com/efanuk/efan-dj-set-in-tokyo-club-asia’])time.sleep(3) #Wait 3 seconds for VLC to open

Tätä ajaessa VLC avautuu uuteen ikkunaan. Tällöin on käytettävissä sen omat kontrollipainikkeet. Viitteessä [4] annetaan työkalut VLC:n kontrollointiin ohjelmallisesti pythonissa. Tämä toiminnallisuus vaatisi kirjastojen asentamisen lisäksi VLC:n konfiguroinnin http-serveriksi. En osannut tehdä tätä ainakaan RP4:n vakioasennetulla VLC:llä. Oppilastyönä olen teettänyt RP4:n etäkäyttöä VNC:llä, mikä vaatii vain kevyen kirjautumisen. Raspberry Pi Connect [5] vaatii hieman raskaamman kirjautuminen laitteiden rekisteröinteineen. VNC on mukana RP4:n vakioasennuksessa. On siis useita tapoja mediaserverin pystytykseen, joista viitteessä [4] kuvattu ‘VLC-serveri’ on vain yksi tapa. Laajensin vielä em. Python-koodia alkuperäiseen tavoitteeseeni ‘Pi-Kioskista’, jossa yhteen ikkunaan avataan musiikkistriimi ja toiseen aika osoitteesta time.is. Videon toisto onnistuu mainiosti Chromium-selaimessa, jolloin VLC-ikkunan lisäksi tarvitaan selainikkuna. Lisäsin ‘Kioski’-ohjelmaani seuraavat rivit:

import webbrowser, os, sys

url = ”https://time.is/

chrome_path = ’/usr/lib/chromium/chromium’
webbrowser.get(chrome_path).open(url)

Viitteet:

[1] Perustutkintojen yhteiset tutkinnon osat (YTO) 2022 – ePerusteet

[2] https://forums.raspberrypi.com/viewtopic.php?p=934816&hilit=Clock+by+Tim+howlett#p934816

[3] https://linuxconfig.org/how-to-play-audio-with-vlc-in-python

[4] https://engineeringevening.com/controlling-vlc-player-on-raspberry-pi-via-api/

[5] https://www.raspberrypi.com/software/connect/

Kirjoittaja