Raspberry Pi aikapalvelin

Lupailin joillekkin jo aikapäiviä sitten, että kirjoittaisin jutun Raspberry Pi:n päälle rakennetusta aikapalvelimesta. Sellainen minulla on jo jonkin aikaa ollut huolehtimassa tarkasta ajasta radioamatööriasemallani. Sen lisäksi, että kello on kiva olla ajassaan niin esimerkiksi joillakin digitaalisilla lähetelajeilla ja vaikkapa meteoriyhteyksissä on tarkka aika hyvinkin tarpeen. En tullut alkuperäistä asennusta dokumentoineeksi kunnolla, joten nyt kun ostin edellisessä kirjoituksessa mainitun uuden aloituspakkauksen niin ajattelin olevan sopiva hetki tehdä vastaava asennus puhtaalta pöydältä ja dokumentoida se paremmin. Aiheesta löytyy runsaasti tietoa englanniksi ja mahdollista lisätietoa kannattaakin tutkia mikäli haluaa tuunata aikapalvelimensa viimeisen päälle. Tähän olen kuitenkin koonnut perusasioita ihan suomeksi.

Tällaiset tarvikkeet tarvitsemme projektin toteuttamiseksi. Lisäksi tarvitsemme alkuun näppäimistön ja näytön, jotta saamme käyttöjärjestelmän ja SSH yhteyden asennettua. Nämä vaiheet tuli käsiteltyä edellisessä kirjoituksessa Raspberry Pi käyttöönotto. Tässä jatkamme siitä mihin aiemmassa kirjoituksessa jäimme.

Tuota GPS modulia saa samasta verkkokaupasta mistä aloituspakkauksenkin ostin. Mikä tahansa muukin GPS käy kunhan siinä on tarvittavat liitännät ja se puskee ulos NMEA dataa. Sarjaväylän lisäksi tarvitaan 1PPS ulostulo, jotta saamme ajoituksesta oikeasti tarkan.

Varsinaisessa aikapalvelimessani on toisen merkkinen GPS moduli ja se on sijoitettuna katon harjalle. Tämän kirjoituksen kannalta se on kuitenkin vastaava kuin tässä esimerkissä käyttämäni moduli.

Tähän tarkoitukseen riittäisi alkuperäinen 1. sukupolven Raspikin. Jos sinulla on sellainen joutilaana, niin voit tehdä tämän myös siitä ja säästää nelosen johonkin enemmän tehoja vaativaan käyttöön. Eroavaisuuksia on lähinnä sarjaportin määrittelyssä ja mainitsen näistä kirjoituksessa kyseisessä kohdassa. Oikeastaan pääset vanhalla Raspilla jopa hieman helpommalla. Tässä esimerkissä käytän nyt kuitenkin tuota nelosta.

Edellisessä kirjoituksessa asensimme Raspbian Liten ja muodostimme SSH yhteyden. Seuraavaksi on hyvä hetki asentaa päivitykset ja tehdä alkumäärittelyjä. Muistutan vielä tässä kohtaa mikäli et vaihtanut oletussalasanaa, niin tee se viimeistään nyt. Voit tehdä sen komentoriviltä passwd -komennolla tai samasta konfigurointisovelluksesta missä määrittelimme SSH yhteyden käyttöön.

Aloitetaan aikapalvelimen asennus tekemällä päivitykset. Syötä seuraavat komennot komentoriville:
sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade

Tehdään seuraavaksi hieman alkumäärittelyjä konfigurointiohjelmalla. Komentoriville komento:
sudo raspi-config

 

Vaihdetaan ensin raspin hostname. Valitse kohta 1 System Options.

Seuraavaksi kohta S1 Hostname. Ohjelma huomauttaa, että nimessä saa olla ainoastaan kirjaimia a-z ja numeroita 0-9. Ei muita merkkejä eikä siis myöskään ääkkösiä. Voit keksiä tähän mieleisesi nimen millä aikapalvelimesi näkyy verkossa. Minä pistin siihen vain yksinkertaisesti ”aikapalvelin”.

Asetetaan seuraavaksi sarjaportti käyttöön. Valitaan kohta 3 Interface Options.

Täältä otetaan P6 Serial Port.

”Would you like a login shell to be accessible over serial?” kohtaan vastataan kieltävästi eli ”No”.

”Would you like the serial port hardware to be enabled?” kysymykseen puolestaan vastataan ”Yes”.

Nyt kirjautuminen pitäisi olla disabled ja serial interface enabled.

Määritellään samalla myös lokalisaatio asetukset. Valitse kohta 5 Localisation Options.

Kohdasta L1 Locale saat asennettua tarvittavat kielet ja merkistöt, sekä määriteltyä vakiona käytettävän kielen. Vakiona pitäisi olla asennettuna ainakin en_US.UTF-8, ellet käyttöjärjestelmää asentaessasi valinnut jotain muuta. Lisäksi kannattaa asentaa mahdollisen tarpeen varalle seuraavat:
fi_FI ISO-8859-1
fi_FI.UTF-8
fi_FI@euro ISO-8859-15

Ohjelman kysyessä oletuskieltä kannattaa oletukseksi valita kuitenkin en_US.UTF-8 . Näillä ei sinänsä ole aikapalvelimen kannalta merkitystä, mutta muuten käytön kannalta on hyvä olla kunnossa.

Kohdasta L2 Timezone saat määriteltyä sijainnin ja aikavyöhykkeen. Tännekkin kannattaa käydä määrittelemässä Europe / Helsinki, tai jos olet jossain muualla kuin Suomessa niin sitten tietysti sen mukaan.

Varmista myös, että sinulla on suunnilleen oikea näppäimistöasettelu valittuna kohdasta L3 Keyboard.

WLAN kohdalla emme tarvitse tehdä mitään. Sen poistamme myöhemmässä vaiheessa kokonaan käytöstä.

Koska haluamme löytää palvelimemme aina samalla IP osoitteella, asetetaan Raspi käyttämään kiinteää IP osoitetta. Se tapahtuu muokkaamalla tiedostoa /etc/dhcpcd.conf .
sudo nano /etc/dhcpcd.conf

Lisäsin yllä olevassa kuvassa näkyvät rivit tiedoston loppuun. Tässä olen käyttänyt samaa IP osoitetta minkä saimme DHCP:lläkin. Varsinaisessa sovelluksessa sinun kannattaa kuitenkin laittaa sellainen kiinteä IP mitä lähiverkkosi DHCP ei jakele muille laitteille. Tai vaihtoehtoisesti voit asettaa reitittimesi asetuksista tietyn IP osoitteen varatuksi tähän käyttöön. Muuten tiedossa voi olla IP ristiriitoja mikäli jokin toinen laite sattuisikin saamaan saman IP osoitteen.

Tässä vaiheessa on hyvä tehdä uudelleenkäynnistys. Nyt voimme myös kytkeä GPS modulin Raspiin valmiiksi, joten sammutetaan Raspi hetkeksi kokonaan. Alasajo tapahtuu kirjoittamalla komentoriville:
sudo shutdown -h now

GPS moduli kytketään Raspin GPIO piikkirimaan seuraavasti

Raspberry Pi GPIO
GPS moduli
Pin 1 (3,3V) VCC
Pin 6 (GND) GND
Pin 8 (UART TXD / GPIO14) RX
Pin 10 (UART RXD / GPIO15) TX
Pin 12 (GPIO18) PPS

Nyt voit kytkeä Raspin takaisin virtoihin ja ottaa uudestaan SSH yhteyden (anna hetki aikaa Raspille käynnistyä ensin).

Seuraava toimenpide riippuu siitä mitä Raspberryn versiota ollaan käyttämässä. Alkuperäisessä Raspissa ja vielä sukupolvessa 2 oli UART0 ensisijainen sarjaväylä, joka näkyi käyttöjärjestelmässä laitetunnuksella ttyAMA0. Raspberry 3 & 4:ssä se on puolestaan oletuksena Bluetoothin käytössä mihin myös edellämainittu laitetunnus viittaa. Sarjaporttina taas oletuksena 3 & 4 versioissa toimii rajoittuneempi mini-UART ja se näkyy nimellä ttyS0. Aikapalvelimeen haluamme kuitenkin kunnollisen väylän GPS:ää varten. Tarkemmin aiheesta löydät halutessasi Raspberryn sivuilta: https://www.raspberrypi.org/documentation/configuration/uart.md

Jos sinulla on Raspberry 1 tai 2, voit ohittaa seuraavan kohdan ja jatkaa tyytyväisenä eteenpäin. Jos sinulla kuitenkin on 3 tai 4, tee seuraavat toimenpiteet.

Avaa tiedosto /boot/config.txt esimerkiksi Nanolla:
sudo nano /boot/config.txt

Lisää tiedostoon rivi, joka ottaa Bluetoothin kokonaan pois käytöstä:
dtoverlay=disable-bt

Muista tallentaa muutokset.

Lisäksi pitää ajaa komentoriviltä seuraava komento:
sudo systemctl disable hciuart

Käynnistä tässä välissä Raspi uudelleen komennolla:
sudo reboot

Nyt GPS modulimme pitäisi löytyä laitteesta ttyAMA0.

Emme tarvitse myöskään WiFiä, vaan haluamme aikapalvelimemme piuhan perään. Toisaalta tuosta alumiinikotelosta se WiFi saattaisi hieman heikosti toimia muutenkaan. Laitetaan siis vielä se pois päältä lisäämällä /boot/config.txt tiedostoon seuraava rivi:
dtoverlay=disable-wifi

Asennetaan seuraavaksi GPSD ohjelmisto komennolla:
sudo apt-get install gpsd gpsd-clients

Määritellään asetukset:
sudo nano /etc/default/gpsd

Muuta asetukset yllä olevan kuvan mukaisesti.

Syötä tämän jälkeen komentoriville:
sudo ln -s /lib/systemd/system/gpsd.service /etc/systemd/system/multi-user.target.wants/

Käynnistetään välillä uudelleen:
sudo reboot

Tarkistetaan käynnistyikö GPSD palvelu:
sudo service gpsd status

Jos näet jotain ylläolevan kaltaista ja palvelu on active (running), niin kaikki pitäisi olla hyvin tähän asti.

Voit katsella GPS:ltä tulevaa dataa kirjoittamalla komentoriville:
gpsmon

Yllä olevassa kuvassa GPS ei ole vielä löytänyt ”fixiä”, joten status on vielä ”V” eikä latitudia ja longitudia näytetä. Kun GPS saa fixin, pitäisi statukseksi vaihtua ”A” ja koordinaattien tulla näkyviin. Taulukon alapuolella pitäisi myös juosta GPS:ltä tuleva NMEA data. Jos se näkyy, on luultavasti kaikki tällä erää kunnossa ja voimme jättää GPS:n hakemaan sateliitteja ja siirtyä eteenpäin. Huomaa myös, että GPS tarvitsee näkymän taivaalle löytääkseen sateliitit joten gps modulin on hyvä olla tässä vaiheessa ikkunan lähellä. Pääset poistumaan gpsmon ohjelmasta painamalla Ctrl + C.

Nyt meillä juoksee jo NMEA data GPS:ltä Raspberryyn. Seuraavaksi haluamme saada tarkat PPS pulssit, jotta tiedämme milloin sekunti oikeasti alkaa. Asennetaan tarvittavat työkalut komentoriviltä:
sudo apt-get install pps-tools

Lisätään /boot/config.txt tiedostoon seuraava rivi:
dtoverlay=pps-gpio

Sekä /etc/modules tiedostoon rivi:
pps-gpio

Käynnistetään uudelleen:
sudo reboot

Tarkistetaan, että kaikki asentui. Kirjoita komentoriville:
lsmod | grep pps

Tarkistetaa vielä, että Raspi saa PPS pulssia GPS:ltä. Komentoriville:
sudo ppstest /dev/pps0

Jos source löytyy ja pulssit tulevat näkyviin, kaikki ok. Pois pääset näppäinyhdistelmällä Ctrl + C.

Nyt meillä kulkee NMEA data ja PPS pulssit Raspiin. Tarvitsemme vielä itse NTP ohjelmiston. Se asennetaan komennolla:
sudo apt-get install ntp

Tätä kirjoittaessa pakettienhallinta asentaa version 4.2.8p12. Jos haluat asentaa uudemman (tällä hetkellä uusin näyttäisi olevan 4.2.8p15), joudut hakemaan ja asentamaan sen käsin. Kannattaa kuitenkin asentaa ensin pakettienhallinnan tarjoama vaihtoehto, jotta myös kaikki riippuvuudet asentuvat oikein. En kuitenkaan tiedä onko uusimman version kohdalla jotain yhteensopivuusongelmia tai huomioitavaa, joten mennään tässä ohjeessa pakettienhallinnan tarjoamalla vaihtoehdolla mikä ainakin tätä kirjoittaessa varmuudella toimii niinkuin pitää. Jos aiot kuitenkin avata aikapalvelimellesi pääsyn muualta kuin lähiverkostasi, kannattaa tämäkin asia selvittää tarkemmin. Etenkin on syytä tarkistaa onko uudemmissa korjattu jotain kriittisiä tietoturvaongelmia, mitkä ovat tietenkin syy päivittää uudempaan. Nyt asentuneen version voit tarkistaa komennolla:
ntpq –version

Määritellään seuraavaksi asetukset /etc/ntp.conf tiedostoon:
sudo nano /etc/ntp.conf

Asetetaan NTP vastaanottamaan GPS:n aika ja PPS pulssi lisäämällä seuraavat rivit oheiseen kohtaan:

Lisätään myös muutama kotimainen palvelin listalle edellisten perään:

Palvelimien ei tarvitse olla nuo yllä mainitut. Ensimmäisenä on Mittatekniikan keskuksen julkinen aikapalvelu. Muut ovat palveluntarjoajien aikapalvelimia. Näiden tilalle kannattaa vaihtaa ainakin yksi oman palveluntarjoajasi aikapalvelin. Laita ainakin johonkin palvelimeen myös tuo prefer määrite.

Tehdään tässä välissä uudelleenkäynnistys, jotta kaikki tähän astinen varmasti päivittyy ja tarkastellaan seuraavaksi alammeko saamaan aikatietoa niinkuin pitää.
sudo reboot

Nyt voimme tarkistaa millaista aikaa palvelimemme vastaanottaa:
ntpq -p

Tässä vaiheessa näyttäisi olevan vielä aika iso ero offset arvossa GPS:n ja muiden palvelimien välillä. Kyseinen arvo on tässä millisekunteja. PPS kohta ei näytä vielä mitään, koska se ei ole lukittunut. Koska GPS:ltä tulevassa sarjadatassa on viivettä, niin säädetään asetuksista sitä hieman lähemmäksi ulkoisten palvelimien tarjoamaa aikaa. Avataan uudelleen /etc/ntp.conf tiedosto:
sudo nano /etc/ntp.conf

Lisätään GPS:n määritykseen lisämäärite time1 ja haluamamme arvo esimerkiksi seuraavasti:

Arvo on tässä asetettu sekunteina, eli tässä tapauksessa korjasin aikaa 354ms. (Huomaa, että aiemmassa listauksessa ajat olivat suoraan millisekunteina). Laita tämä arvo tietysti oman tilanteesi mukaan. Tätä voit vielä hienosäätää lisää myöhemmin. Tämän ei tarvitse olla absoluuttisen tarkka. Sekuntin alun määrittää PPS pulssi. NMEA data kertoo vain karkeasti millä sekuntilla ollaan menossa. Jos ero alkaa kuitenkin olla millisekuntien sijaan sekunteissa, voi jotain mutakin olla jo pielessä. Toisessa GPS modulissa huomasin kuitenkin datan tulevan vanhalla sekuntilla, joten tällöin arvo oli yli sekuntin (ei kuitenkaan kahta) ja se oli ihan ok. GPS:lle kannattaa tietysti antaa myös aikaa löytää itsensä kartalle ja NTP:lle samaten.

Hienosäädön jälkeen käynnistetään NTP uudelleen:
sudo service ntp restart

Katsotaan uudelleen miltä näyttää:
ntpq -p

Nyt erot ovat jo huomattavasti pienemmät. PPS pulssikin on saatu kartalle. Huomaa ° merkki nimen edessä, joka kertoo datan olevan ok. Samaten GPS:n datan edessä * kertoo kyseisen datan olevan ok. Jos jompi kumpi merkki puuttuu, kyseinen data ei syystä tai toisesta ole silloin kunnossa. Tästä ei kuitenkaan kannata heti hätääntyä, varsinkaan jos GPS modulisi on sisällä eikä välttämättä joka hetki näe kunnolla taivaalle. Palvelimen pitäisi tietää, ettei säädä kelloa epäkelvon datan perusteella.

Jos johonkin ulkoiseen palvelimeen (kuten tässä tuo ntp1.inet.fi) ei meinaa päästä kiinni, se joutaa luonnollisesti pois listalta. Lisäksi omasta konfiguraatiosta olin tässä vaiheessa kommentoinut pois poolit , joten sinä saatoit saada pidemmän listan palvelimia listaukseen. Seuraavassa kuvassa olen poistanut palvelimen mistä ei saatu dataa ja ottanut yhden poolin takaisin käyttöön. Poolit sisältävät joukon palvelimia, joista jokaisella kerralla arpoutuu satunnaiset palvelimet listalle mukaan. Muista käynnistää NTP palvelu uudelleen aina muutosten tekemisen jälkeen.

Käynnistetään palvelu uudelleen:
sudo service ntp restart

Odotellaan hetki ja tarkistetaan sitten tilanne:
ntpq -p

Hyvältä näyttää. PPS riviltä huomaamme myös, että palvelin alkaa olla tahdistunut hyvinkin tarkasti GPS:ltä tulevaan PPS pulssiin.

Nyt palvelimen pitäisi toimia ja alkaa säätämään itseään kohti tarkempaa aikaa. Tilannetta voit seurata tuolla ntpq -p komennolla ja GPS:n tilaa puolestaan tarkkailla gpsmon ohjelmalla. Nyt voimme myös laittaa esimerkiksi Windowsin kellon päivittämään aikansa Raspista. Jos haluat ajan päivittyvän mahdollisimman hyvin (esimerkiksi digitaalisia radioyhteyksiä varten), kannattaa Windowsiin asentaa esimerkiksi Dimension4 ohjelma ja syöttää tälle palvelimeksi Raspin IP osoite.

Näillä toimenpiteillä olemme siis saaneet aikaan toimivan aikapalvelimen. Joitakin asioita kannattaa kuitenkin huomioida:

  • Käytä Raspberryä aikapalvelimena ainoastaan harrastekäytössä. Vakavampaan käyttöön on syytä miettiä toisenlaisia ratkaisuja.
  • Raspissa ei ole varsinaista kelloa ja sille paristoa kuten tavallisessa tietokoneessa, joten kello pysähtyy aina kun katkaiset virran. Mikäli et halua näin käyvän, kannattaa tähän kehitellä jonkinlaista erillistä reaaliaikakelloa tai laittaa Raspi esimerkiksi akun varaan pysymään kokoajan sähköissä. Kello toki päivittyy kohdalleen, mutta käynnistyshetkellä se on siis jotain muuta kuin mitä pitäisi.
  • GPS modulissa on hyvä olla paristovarmennus, jotta saisit sieltä oikean ajan mahdollisimman nopeasti.
  • Jos aiot avata aikapalvelimeesi pääsyn lähiverkkosi ulkopuolelta, on syytä käydä asetukset tarkemmin läpi. Etenkin kaikki turvallisuuteen liittyvä.
  • Tässä ohjeessa on pysytty pitkälti perusasioissa, joilla aikapalvelin saadaan toimimaan. Asetuksia kannattaa kuitenkin tutkia ja palvelinta säätää paremmaksi ajan kanssa. Aiheesta löytyy runsaasti tietoa englanniksi internetistä. Myös ohjelmien (ja Raspberryn) omista dokumentaatioista selviää paljon asioita.
  • Käyttötarkoituksestasi riippuen voi joitakin asioita kannattaa tehdä eri tavallakin. Jos olet laittamassa Raspia radioiden kaveriksi portable käytössä ilman nettiyhteyttä, jäävät silloin ulkoiset palvelimet pois ja joudut miettimään millä varmistat oikean ajan ennenkuin GPS tarjoaa luotettavaa dataa.

Nyt pitäisi FT8 yhteydetkin lähteä tarkasti oikealla hetkellä eikä WSJT-X:n näyttämä DT -arvo pitäisi olla kovinkaan suuri (olettaen, että vasta-aseman kello on myös kohdallaan).

Jos huomaat tässä postauksessa virheitä tai jotakin seikkoja olisi hyvä tuoda esille, niin ota yhteyttä. Päivittelen postausta tarpeen mukaan.