Softaradio Raspberry Pi:llä

Olen labraprojektina rakennellut softaradiota (SDR eli Software Defined Radio) pienellä Raspberry Pi -tietokoneella. Kunhan saan softan toimimaan, asennan laitteen autooni. Kirjoitan siitä sitten erillisen blogin. Tässä blogissa keskityn laitteiston ja ohjelmiston esittelyyn sekä asennusmuistiinpanoihin, joiden avulla asennuksen voi toistaa.

Olen labraprojektina rakennellut softaradiota (SDR eli Software Defined Radio) pienellä Raspberry Pi -tietokoneella.

Kuvia laitteistosta

Tavoitteena on rakentaa laite, joka osaa:

  • paikantaa itsensä satelliittipaikannuksella (GPS, Glonass, Galileo)
  • löytää kuuluvuusalueelta mielenkiintoiset radiosignaalit
  • tunnistaa löydetyt signaalit (FM-radio, AM-radio, Wifi, Bluetooth, jne..)
  • tunnistaa löydetyistä signaaleista lähettävän radion yksilöivät tiedot
  • tallentaa havainnot sijaintitiedon kera kevyttietokantaan (NoSQL, GraphDB)
  • nauhoittaa tietyt signaalit tarkempaa analyysiä varten
  • esittää havainnot ymmärrettävästi web-selaimeen latautuvalla kartalla

Kunhan saan softan toimimaan, asennan laitteen autooni. Kirjoitan siitä sitten erillisen blogin. Tässä blogissa keskityn laitteiston ja ohjelmiston esittelyyn sekä asennusmuistiinpanoihin, joiden avulla asennuksen voi toistaa.

Laitteisto

LaiteLinkki valmistajan sivuilleKäyttötarkoitus
Raspberry Pi 4 Model B 4 GBhttps://www.raspberrypi.org/products/raspberry-pi-4-model-b/Signaalinkäsittely
SanDisk Extreme Pro UHS-I microSDXC 64 GBhttps://www.sandisk.com/home/memory-cards/microsd-cards/extremepro-microsdKäyttöjärjestelmän ja ohjelmistojen tallennusmedia
HackRF Onehttps://greatscottgadgets.com/hackrf/one/Radiovastaanotin
LaCie Rugged USB-C 2TBhttps://www.lacie.com/gb/en/support/mobile-storage/rugged-usbc/Signaalien tallennusmedia

Ohjelmisto

Laitan taulukkoon vain keskeisimmät ohjelmistot. Asennusohjeesta voi halutessaan koostaa tarkan ohjelmistolistauksen.

OhjelmistoLinkki valmistajan sivuilleKäyttötarkoitus
Raspberry Pi OS 32-bit Litehttps://www.raspberrypi.org/downloads/raspberry-pi-os/

Raspberry Pi OS on mukautettu jakelu Debian-käyttöjärjestelmästä, jonka versio on asennushetkellä Buster.
Käyttöjärjestelmä
hackrfhttps://github.com/mossmann/hackrf/releases/HackRF One -ajurit ja apuohjelmat
gr-osmosdrhttps://osmocom.org/projects/gr-osmosdr/wikiHackRF One -ajurit GNU Radiolle
cubicsdrhttps://cubicsdr.comSoftaradio
qspectrumanalyzerhttps://pypi.org/project/QSpectrumAnalyzer/Spektrianalysaattori
gnss-sdrhttps://gnss-sdr.org/Satelliittipaikannus

Asennusohje

Asennusta varten tarvitset wifi-yhteyden, läppärin ja SD-muistikortinlukijan sekä Raspin perusasetusten tekoa varten USB-näppäimistön, micro-HDMI-kaapelin ja näytön, johon kaapelin voi kytkeä.

Käyttöjärjestelmä

Ihan ensimmäiseksi täytyy ladata Raspberry Pi OS muistikortille.

Lataa Raspberry Pi OS (32-bit) asennuspaketti täältä: https://downloads.raspberrypi.org/raspios_lite_armhf_latest

Kopioi paketin sisältö muistikortille tämän ohjeen mukaisesti: https://www.raspberrypi.org/documentation/installation/installing-images/README.md

Kun käyttöjärjestelmä on muistikortilla, voi Raspin käynnistää ensimmäistä kertaa perusasetusten tekoa varten.

Kytke Raspi näyttöön HDMI-kaapelilla ja liitä USB-näppäimistö sen USB 2.0 -porttiin. Laita SD-kortti paikoilleen, liitä LaCie USB 3.0 -porttiin ja kytke Raspi virtalähteeseen. Katso näytöltä, että käynnistyy.

Kirjaudu sisään:
> login: pi
> password: raspberry

Tee Raspin perusasetukset. GPU:ta on tarkoitus hyödyntää signaalien käsittelyyn, joten siksi senkin asetuksiin kosketaan.

Aseta SSH-palvelin käynnistymään automaattisesti
> sudo su -
> echo ssh >/boot/ssh
> logout

Aseta muut perusasetukset 
> sudo raspi-config
  2 Network Options
    N2 Wireless LAN
      Country: FI
      SSID: <wifin nimi>
      passphrase: <wifin salasana>

    N3 Network interface names
      enable: yes

  4 Localisation Options
    I2 Time Zone
      Helsinki

    I3 Keyboard layout
      Generic 105-key PC (intl.)
      Finnish
      Right Alt (AltGr)
      Left Logo

  7 Advanced Options
    A3 Memory Split
      GPU Memory: 256

    A8 GL Driver
      G2 GL (Fake GMS)

    AA Pi 4 Video Output
      V1 Enable 4kp60 HDMI

Päivitä käyttöjärjestelmän ja Raspin ohjelmistot ajan tasalle.

> sudo apt update
> sudo apt upgrade
> sudo update-pciids
> sudo rpi-update

Poista turhat ohjelmistot

> sudo apt autoremove

Käynnistä Raspi uudelleen

> sudo reboot

En kuvaa vaiheita tähän, mutta virittele Raspille vielä wifi-verkkosi DNS-palvelimeen verkkonimi ja DHCP-palvelimeen kiinteä IP-osoite. Aseta sitä ennen Raspin wifille kiinteä MAC-osoite.

> sudo nano -w /etc/NetworkManager/NetworkManager.conf

Lisää loppuun seuraava osio

[device]
wifi.scan-rand-mac-address=no

Irroita USB-näppis ja jatka asennusta läppärillä SSH-yhteyden yli.

> ssh raspberrypi
> login: pi
> password: raspberry

Asenna graafinen Gnome-työpöytäympäristö, RDP-etätyöpöytäohjelmisto ja web-selain. Lähdekoodeista myöhemmin käännettävä gnuradio-companion toimii vain Gnomella, joten älä asenna muuta työpöytäympäristöä.

> sudo apt install gnome-core
> sudo apt install xrdp
> sudo apt install firefox-esr

Lisää vielä seuraavat loitsut, ettei Gnome kysele Administrator -salasanoja XRDP:llä kirjauduttaessa.

> sudo -w nano -w /etc/polkit-1/localauthority.conf.d/02-allow-colord.conf

polkit.addRule(function(action, subject) {
if ((action.id == “org.freedesktop.color-manager.create-device” || action.id == “org.freedesktop.color-manager.create-profile” || action.id == “org.freedesktop.color-manager.delete-device” || action.id == “org.$
{
return polkit.Result.YES;
}
}); 

Softaradio

Asenna HackRF-ajurit, softaradio ja spektrianalysaattori. Pythonia ja PIP:iä tarvitaan spektrianalysaattorin asentamiseen sekä myöhemmin satelliittipaikannuksen asentamiseen.

> sudo apt install hackrf gr-osmosdr soapysdr-tools soapyremote-server
> sudo apt install cubicsdr
> sudo apt install python3-pip python3-pyqt5 python3-numpy
> sudo pip3 install qspectrumanalyzer

Käynnistä uudelleen.

> sudo reboot

Testaa, että etätyöpöytäyhteys toimii.

Kytke HackRF Raspin USB3.0 -porttiin ja testaa CubicSDR-softaradiolla, että se toimii.

Valitse radioksi hackrf one ja paina start
ruudulle pitäisi ilmestyä graafia

Sammuta softaradio ja testaa vielä, että spektrianalysaattori QSpectrumAnalyzer toimii.

valitse lähteeksi hackrf_sweep
paina start ja ruudulle pitäisi ilmestyä graafia

Noin. Nyt Raspi ja HackRF toimivat todistetusti yhdessä. Sammuta spektrianalysaattori. Asennetaan seuraavaksi satelliittipaikannuksen vaatimat softat.

Satelliittipaikannus

Satelliittipaikannussofta gnss-sdr löytyy käyttöjärjestelmäjakelusta, mutta se on liian vanha toimiakseen HackRF:n kanssa oikein. Uusin versio täytyy kääntää lähdekoodeista. Samalla täytyy myös kääntää uusin versio gnuradiosta. Tämä ottaa Raspilla helposti usean tunnin.

Lähdekoodeja päivitetään aika ahkeraan, joten niissä voi olla käännöksen estäviä bugeja, jotka joutuu itse korjaamaan ellei halua odotella, että kehittäjät ne korjaisivat. Tämän ohjeen laadintahetkellä tällä ohjeella saatiin toimiva käännös aikaiseksi. Mikään ei takaa, että sama onnistuisi myöhemmin.

> sudo apt install git
> sudo pip3 install git+git://github.com/gnuradio/pybombs.git
> sudo pybombs auto-config
> sudo pybombs recipes add-defaults

Aktivoi OsmoSDR-tuki.

> sudo nano -w /root/.pybombs/recipes/gr-recipes/gnss-sdr.lwr

Lisää tiedoston loppuun rivit

vars:
config_opt: " -DENABLE_OSMOSDR=ON"

Käynnistä käännös.

> sudo pybombs prefix init /usr/share/gnuradio-latest -a gnuradio-latest -R gnuradio-default
Install gnuradio from source despite binary install available Y/[N]? Y

Jos käännös pysähtyy virheeseen UHD-moduulin kohdalla, muokkaa CMakeLists.txt -tiedostoa:

> sudo nano -w /usr/share/gnuradio-latest/src/uhd/host/lib/convert/CMakeLists.txt

Etsi tiedostosta seuraavat rivit:

LIBUHD_APPEND_SOURCES(
    ${CMAKE_CURRENT_SOURCE_DIR}/convert_with_neon.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/convert_neon.S
    )

Ja lisää niiden jälkeen, riville 83, seuraava:

SET ( CMAKE_CXX_FLAGS "-mfpu=neon" )

Jatka sitten käännöstä.

> sudo pybombs prefix init /usr/share/gnuradio-latest -a gnuradio-latest -R gnuradio-default
Continue using this path Y/[N]? Y
Alias `gnuradio-latest' already exists, overwrite Y/[N]? Y
Install gnuradio from source despite binary install available Y/[N]? Y

Käännä gnss-sdr.

> sudo pybombs -p /usr/share/gnuradio-latest install hackrf soapysdr soapyhackrf libosmocore osmo-sdr gr-fcdproplus gr-soapy gr-osmosdr gnss-sdr

Install hackrf from source despite binary install available Y/[N]? Y

Jos käännös pysähtyy ”Unknown argument –parallel 2”, etsi ja poista seuraavista kolmesta tiedostosta –parallel 2 argumentit.

> sudo nano -w /usr/share/gnuradio-latest/src/gnss-sdr/build/CMakeFiles/gflags-2.2.2.dir/build.make

> sudo nano -w /usr/share/gnuradio-latest/src/gnss-sdr/build/CMakeFiles/glog-0.4.0.dir/build.make

> sudo nano -w /usr/share/gnuradio-latest/src/gnss-sdr/build/CMakeFiles/pugixml-1.10.dir/build.make

Jatka sitten käännöstä.

> sudo pybombs -p /usr/share/gnuradio-latest install hackrf soapysdr soapyhackrf libosmocore osmo-sdr gr-soapy gr-osmosdr gnss-sdr

Käännä vielä kaikkien riippuvaisuudet: kirjastot ja sen sellaiset.

> sudo pybombs -v -p /usr/share/gnuradio-latest fetch --all --deps
> sudo pybombs -v -p /usr/share/gnuradio-latest install --update hackrf soapysdr soapyhackrf libosmocore osmo-sdr gnuradio gr-soapy gr-osmosdr gnss-sdr

Käännös ei välttämättä aina näytä edistyvän, vaikka oikeasti paljon tapahtuukin. Käännöksen edistymistä voi seurata terminaaliruudun lisäksi htop-komennolla toisessa ikkunassa.

Muodosta VOLK-profiilit (https://wiki.gnuradio.org/index.php/Volk) ja kopioi ne myös pi -käyttäjälle sekä /etc/skel -hakemistoon.

> sudo pybombs -p /usr/share/gnuradio-latest run volk_profile
> sudo pybombs -p /usr/share/gnuradio-latest run volk_gnsssdr_profile
> sudo cp -r /root/.volk /home/pi
> sudo cp -r /root/.volk /etc/skel
> sudo cp -r /root/.volk_gnsssdr /home/pi
> sudo cp -r /root/.volk_gnsssdr /etc/skel
> sudo chown -R pi:pi /home/pi/.volk*

Aseta gnuradion tarvitsemat ympäristömuuttujat kaikille käyttäjille. Tällä hetkellä gnuradiossa on bugi, joka jotenkin sotkee PYTHONPATH ja LD_LIBRARY_PATH -muuttujat. Nämä täytyy toistaiseksi asettaa käsin.

> sudo ln -s /usr/share/gnuradio-latest/setup_env.sh /etc/profile.d/gnuradio-latest-1.sh

> sudo nano -w /etc/profile.d/gnuradio-latest-2.sh

export PYTHONPATH=/usr/share/gnuradio-latest/lib/python3/dist-packages:/usr/local/lib/python3.7/dist-packages:/usr/share/gnuradio-latest/lib/python3.7/site-packages

> sudo nano -w /etc/ld.so.conf.d/gnuradio-latest.conf

usr/share/gnuradio-latest/lib

> sudo ldconfig -v

Kirjaudu ulos etätyöpöydältä (Gnome-työpöydältä Log Out) ja sitten takaisin sisään. Kokeile toimiiko gnuradio-companion.

Jos kaikki toimii niinkuin pitää, gnuradio-companion käynnistyy

Nyt vielä GPS-asetukset kohdalleen.

> sudo cp /usr/share/gnuradio-latest/share/gnss-sdr/conf/gnss-sdr_GPS_L1_LimeSDR.conf /usr/share/gnuradio-latest/share/gnss-sdr/conf/gnss-sdr_GPS_L1_HackRF.conf

> sudo nano -w /usr/share/gnuradio-latest/share/gnss-sdr/conf/gnss-sdr_GPS_L1_HackRF.conf

Etsi ja poista seuraavat rivit:

;# LimeSDR RX1 antennas: NONE,LNAH,LNAL,LNAW
SignalSource.antenna=LNAW

Etsi ja korvaa seuraavat rivit:

;# Next line enables the LimeSDR
SignalSource.osmosdr_args=driver=lime,soapy=0

Riveillä:

;# Next line enables the HackRF One
SignalSource.osmosdr_args=driver=hackrf,bias=0

Jos kaikki toimii niinkuin pitää, gnss-sdr saa vastaanotettua sijaintitietoja. HackRF:n antenni kannattaa sijoittaa niin, että vaikka ikkunasta on näkyvyys taivaalle.

> cd /tmp
> gnss-sdr --config_file=/usr/share/gnuradio-latest/share/gnss-sdr/conf/gnss-sdr_GPS_L1_HackRF.conf

Softien päivittäminen

Kannattaa määrävälein päivittää käyttöjärjestelmä ja koko softapaketti. Varaudu siihen, että päivittäminen kestää useita tunteja.

> sudo apt update
> sudo apt upgrade
> sudo apt full-upgrade
> sudo update-pciids
> sudo rpi-update
> sudo pip3 install --upgrade qspectrumanalyzer

Lähdekoodeista päivittäminen on pirullista hommaa, mutta kannattaa sekin määrävälein tehdä. Joudut todennäköisesti tekemään samoja bugifiksejä, kuin tuolla aiemmin, ehkä jopa korjaamaan uusiakin bugeja.

> sudo pybombs -v -p /usr/share/gnuradio-latest fetch --all --deps

Jos pysähtyy, niin korjaa bugit ja jatka päivitystä:

> sudo pybombs -v -p /usr/share/gnuradio-latest fetch --all --deps
> sudo pybombs -v -p /usr/share/gnuradio-latest install --update hackrf soapysdr soapyhackrf libosmocore osmo-sdr gnuradio gr-soapy gr-osmosdr gnss-sdr

Jos pysähtyy, niin korjaa bugit ja jatka päivitystä:

> sudo pybombs -v -p /usr/share/gnuradio-latest install --update hackrf soapysdr soapyhackrf libosmocore osmo-sdr gnuradio gr-soapy gr-osmosdr gnss-sdr

Käynnistä lopuksi Raspi uudestaan.

> sudo reboot

Kommentoi

Roskalta vaikuttavat kommentit tarkastetaan ennen julkaisua Akismetillä. Tutustu sen tietosuojaan.