GPSとラズパイ接続
gpsdインストール
sudo apt install gpsd gpsd-clients pps-tools
シリアルコンソールを無効化
sudo vim /boot/cmdline.txt
既存の行をコメントアウトして無効化します。
新たに1行追加します。console=serial0,115200 を削除した行です。
#console=serial0,115200 console=tty1 root=PARTUUID=8d7b71ea-02 rootfstype=ext4 fsck.repair=yes rootwait console=tty1 root=PARTUUID=8d7b71ea-02 rootfstype=ext4 fsck.repair=yes rootwait
ついでに、logo.nologo quiteをつけておきます。
console=tty1 root=PARTUUID=8d7b71ea-02 rootfstype=ext4 fsck.repair=yes rootwait logo.nologo quite
Config編集
sudo vim /boot/config.txt
dtoverlay=vc4-kms-v3d は、コメントアウトしておきます。ディスプレイ関係です
max_framebuffers=2 は、Raspberry Pi 4のデュアルディスプレイ用。ディスプレイ1個しか繋がないなら不要なのでコメントアウト。
[all]以下を追記します。
#dtoverlay=vc4-kms-v3d #max_framebuffers=2 [all] dtoverlay=pps-gpio,gpiopin=18,assert_falling_edge=true dtoverlay=disable-bt enable_uart=1 core_freq=250
後に
マイクモジュールのSPH0645LM4Hが、gpiopin=18を使うことが分かったので
GPSのgpiopin=18をgpiopin=17に変更しました。
PPS信号(Pulse-per-second signal)を有効にする
1秒毎のパルス信号です。
GPIOでPPSを受けるモジュールを組み込み
/etc/modulesを編集し、pps-gpioを追加します。
sudo vim /etc/modules
次の一行を追加します
pps-gpio
設定反映のため再起動します
sudo reboot
gpsdの設定
sudo vim /etc/default/gpsd
gpsdが起動時に収集すべきデバイスを指定します。(それらはユーザー gpsd かグループ dialout が読み書きできるようにする必要があります)
その他gpsdに渡したいオプションでは、通信速度を115200に設定します。
gpsdctlによるUSB GPSデバイスの自動ホットアド/リムーバブル化はOFFにしておきます。
次のように変更
# Devices gpsd should collect to at boot time. # They need to be read/writeable, either by user gpsd or the group dialout. #DEVICES="" DEVICES="/dev/ttyAMA0 /dev/pps0" # Other options you want to pass to gpsd #GPSD_OPTIONS="" GPSD_OPTIONS="-n -s 115200" # Automatically hot add/remove USB GPS devices via gpsdctl #USBAUTO="true" USBAUTO="false" START_DAEMON="true"
sudo vim /lib/systemd/system/gpsd.socket
IPv6構成をOFFにします。
ListenStream=[::1]:2947
と
BindIPv6Only=yes
をコメントアウト
[Unit] Description=GPS (Global Positioning System) Daemon Sockets [Socket] ListenStream=/run/gpsd.sock #ListenStream=[::1]:2947 ListenStream=127.0.0.1:2947 # To allow gpsd remote access, start gpsd with the -G option and # uncomment the next two lines: # ListenStream=[::]:2947 # ListenStream=0.0.0.0:2947 SocketMode=0600 #BindIPv6Only=yes [Install] WantedBy=sockets.target
gpsdの自動起動設定
sudo systemctl daemon-reload sudo systemctl enable gpsd sudo systemctl start gpsd sudo systemctl enable gpsd.socket sudo systemctl start gpsd.socket
動作確認します。
信号を受信していると、以下のように1秒おきに受信している内容を表示します。
sudo ppstest /dev/pps0
OKです。念のためラズパイをを再起動してgpsmonコマンドで確認しておきましょう。
sudo gpsmon -n
GPSで受信しているデータから日時情報を得るスクリプト
gpsdata.sh
#!/bin/sh echo start at `/bin/date` GPSDATE="`/usr/bin/gpspipe -w | /usr/bin/head -10 | /bin/grep TPV | /bin/sed -r 's/.*"time":"([^"]*)".*/\1/' | /usr/bin/head -1`" echo $GPSDATE /bin/date -s "$GPSDATE" echo end at `/bin/date`
chmod 755 gpsdata.sh
crontabで定期実行
crontab -e
10分毎に実行されるように設定。
*/10 * * * * sudo bash /home/pi/gpsdata.sh
起動時に毎回実行されるように設定する場合はこうする。ログ出力付き。
@reboot sudo bash /home/pi/gpsdata.sh > /home/pi/gpsdata.log 2>&1
これで、ネットワークが無い状態でもGPSの時計からRaspberry Piの時計設定ができるようになりました。
今日はここまでです。