スマートフォン・ジン | Smartphone-Zine

引っ越し先→ https://smartphone-zine.com/

【ドラレコ】ラズパイで作るバイク用ドラレコ用のGPSで時刻合わせ【スマートバイク】

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の時計設定ができるようになりました。

今日はここまでです。