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.

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)
# 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/