ラズパイはリアルタイムクロック(RTC)を持っていませんので、一度電源を落とすと時刻情報はリセットされ、次にネット接続されたときにNTPサーバから時刻情報を得るまで正しい時間を刻めません。
ラズパイが常にネットへ接続できる環境であれば問題ないですが、スタンドアロンで動かす場合で正確な時刻を得たいこともあるでしょう。
そこで登場するのがGPSです。GPSは今やスマホをはじめさまざまなデバイスに搭載されており、身近なのものになっています。GPSは位置情報の他、正確な時刻も得られます。
そこでラズパイとGPSを使っていろいろなことにチャレンジしていきましょう。まずはラズパイからGPSの状態を読むことに挑戦してみます。
GPSユニットはさまざまにありますが、今回使うのは外部アンテナが用意されている「GNSS(GPS・GLONASS・QZSS)受信機キット 1PPS出力 みちびき3機対応 アンテナセット付キット」(以下、GPSユニット)です。秋月電子通商で2680円(税込)で購入できます。外部アンテナがないモデルもありますが、アンテナを使えば本体と離れた場所で受信できるので、本体の設置場所に多少自由度が増します。
GPSはシリアル通信をしますので、ラズパイ側でシリアル通信を行えるように設定する必要があります。コンソール画面であれば「raspi-config」から設定します。
まずはraspi-configを起動しましょう。以下は最新のRaspberry Pi OSである「Bullseye」のものです。
$ sudo raspi-config
すると以下のような画面が表示されますので、「3.Interface Options」を選びます。次に「I6.Seriarl Port」を選びます。
続いて表示される「Would you like a login shell to be……」とあるところでは「いいえ」を、「Would you like the serial port……」では「はい」を選びます。
これでシリアルポートが有効になりました。
デスクトップからの設定は簡単です。左上のラズパイアイコンをクリックして表示させるメニューから「Raspberry Piの設定」を選び、「インタフェース」タブの「シリアルポート」を「有効」にすればOKです。
ではGPSユニットをラズパイに認識させるための準備をしましょう。全てコマンドラインから行います。まずはcmdline.txtを編集します。
$ sudo nano /boot/cmdline.txt
表示された内容の先頭行にコメントアウト「#」を入れて、次の内容に置き換えます。
#dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=PARTUUID=2924e30a-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
これがすでに記述されている内容です。先頭に「#」を入れます。そのあと下の内容を入力しましょう。
dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
続いて、先ほど1PPS出力をGPIO18に接続したので、その設定をします。「/boot/config.txt」に記述を加えます。
$ sudo nano /boot/config.txt
としてファイルを開いたら、最後の行へ以下のように入力します。
dtoverlay=pps-gpio,gpiopin=18,assert_falling_edge=true
1PPS(Pulse-per-second)出力とは、1秒間に1回だけ出る正確なパルス波のことを言います。GPSユニットからは1000ms(1秒)間隔で100ms(0.1秒)のパルス波が出力されるようになります。今回試用するGPSユニットは0.1秒ごとに立ち下がりのパルスが打たれますので、「assert_falling_edge=true」とする必要があります。
ここまできたらラズパイの電源を落とします。
続いてGPSユニットとラズパイを接続します。GPSユニットにある端子は、端子を右にした場合上から「VDD5V」(電源)、「GND」(GND)、「TXD」(データ出力端子)、「RXD」(データ入力端子)、「1PPS」(1PPS出力端子)と書かれているかと思います。これを順にVDD5Vはラズパイの5V端子(3番ピン)、GNDをGND(6番ピン)、TXDをGPIO15(10番ピン)、1PPSをGPIO18(12番ピン)へと接続します。GPSユニットのRXとラズパイを接続していませんが、ラズパイ側からGPSユニットへ特に指示を出しませんので接続しません。
ラズパイとGPSユニットを接続したら、ラズパイの電源を入れます。GPSユニットにある赤色のLEDが点灯します。GPSユニットの説明書には、点灯して40秒〜数十分すると測位されてLEDが1秒ごとに点滅するようになります。筆者が試したときには1分程度で3個以上のGPSをつかんで3次元測位(3D-Fix)ができるようになりました。
ではラズパイで衛星の位置情報などを得てみましょう。まずはコマンドラインからの操作方法です。以下のコマンドを入力して、GPS関係のツールをインストールします。
$ sudo apt install gpsd gpsd-clients pps-tools -y
続いて導入した「gpsd」の設定をします。「/etc/default/gpsd」を編集します。
$ sudo nano /etc/default/gpsd/
nanoでファイルを開いたら、最後の行に以下の内容を追記します。
START_DAEMON="true" DEVICES="/dev/ttyS0 /dev/pps0" GPSD_OPTIONS="-n"
続いて「gpsd.socket」を有効化します。
$ sudo systemctl enable gpsd.socket
ここまで設定できたら、ラズパイを再起動します。
再起動したら、信号を受信しているか「ppstest」で確認します。
$ sudo ppstest /dev/pps0
信号を受信していると、以下のように1秒おきに受信している内容を表示します。
trying PPS source "/dev/pps0" found PPS source "/dev/pps0" ok, found 1 source(s), now start fetching data... source 0 - assert 1645670541.000393424, sequence: 190 - clear 0.000000000, sequence: 0 source 0 - assert 1645670542.000385205, sequence: 191 - clear 0.000000000, sequence: 0 source 0 - assert 1645670543.000374884, sequence: 192 - clear 0.000000000, sequence: 0 source 0 - assert 1645670544.000365770, sequence: 193 - clear 0.000000000, sequence: 0 source 0 - assert 1645670545.000355041, sequence: 194 - clear 0.000000000, sequence: 0 ……
では受信している衛星や時刻、現在の距離を示してくれる「gpsmon」を起動してみましょう。
$ gpsmon
すると以下のような画面が表示されて、衛星の情報を表示してくれます。
上から現在の時刻とGPSが置かれている場所の緯度と経度が表示されており、画面の左下にある「GP」などが衛星の情報です。
同じようにテキストでGPS情報を見ることができるツールに「cgps」があります。以下のコマンドを入力すると、画面のように表示されます。左側が現在地点の情報、右にあるのが衛星の情報です。
$ cgps -s
なお、みちびきのWebサイトには、現在地付近にある衛星の位置を教えてくれる「GNSS VIEW」があります。これも参考にすると、どの衛星の電波を受信しているのか分かります。
上記の2コマンドはCUIのものでしたが、GUIでも表示できます。ラズパイのデスクトップからコンソールを起動し、以下のコマンドを入力します。
$ xgps
するとウィンドウが表示されて、衛星などの情報が分かります。
Copyright © ITmedia, Inc. All Rights Reserved.
Special
PR