2025年3月19日水曜日

ラズパイの時刻設定

Raspberry Pi 3B/4 にて定期的な時計合わせを行いたいと、GPT 君に教えを請いました。

  • 現在はインターネットにつながっており、chronyを使用中
  • ネットにつながらない時は GPS モジュールと gpsd + chrony を使う予定
  • RTCを組み込んで、起動時にRTCから本体の時刻を修正、定期的にRTCの時刻を修正
  • GPIOは他のモジュールに占用されており、RTC、GPSはUSB接続

このような条件です。

※RTC:東京デバイセズ TDPC0205

※WinSCP
ログイン画面の[設定]
[環境]->[シェル]
「シェル」が[デフォルト]から[sudo su -]に変更


1. GPS

1-1. update_time.sh のコピー

  • script フォルダをデスクトップに作成、書き込みパーミッションを与える
  • update_time.sh(及び test.sh)をコピー、実行パーミッションを与える
  • update_time.sh には、起動時に RTC からシステム時刻に書き込む設定、11分毎にシステム時刻をRTCへ書き込む設定(Chronyのrtcsyncに対応していないRTCの場合)を記載

1-2. gpsd および gpsd-clients の導入

  • USB 接続の GPS モジュール使用のため、以下の関連パッケージをインストール

sudo apt install gpsd gpsd-clients

1-3. gpsd の設定

  • VID/PIDの調査

lsusb→”aaaa:bbbb”

  • /etc/udev/rules.d/100-usb-GPS_RTC.rules ファイルを作成し、次の内容を記載

SUBSYSTEM=="tty", ATTRS{idVendor}=="aaaa", ATTRS{idProduct}=="bbbb", SYMLINK+="gps0"

  • 再起動後、NMEA 文($GPGGA, $GPRMC 等)が表示されるか確認

sudo cat /dev/gps0

  • GPS モジュールの接続先に合わせ、設定ファイルを編集
    /etc/default/gpsd の例

START_DAEMON="true"
GPSD_OPTIONS="-b -n"
DEVICES="/dev/gps0"
USBAUTO="false"

  • 設定後、サービスを再起動。

sudo systemctl restart gpsd

1-4. SHMから読み取る設定を追加(gpsdから取得)

  • /etc/chrony/chrony.confに追記

# SHM(shared memory)から読み取る設定
refclock SHM 0 refid GPS

  • 設定後、サービスの再起動を行う

sudo systemctl restart chrony chronyd


2.RTC

2-1. 東京デバイセズ制御プログラムのインストール

sudo apt install libusb-dev

  • scriptフォルダからターミナルを起動

git clone https://github.com/tokyodevices/td-usb
cd td-usb
make

2-2. 100-usb-GPS_RTC.rulesに追記

  • VID/PIDの調査

dmesg | grep TDPC0205

もしくは lsusb→”cccc:dddd”

  • /etc/udev/rules.d/100-usb-GPS_RTC.rules ファイル

SUBSYSTEM=="usb", ATTRS{idVendor}=="cccc", ATTRS{idProduct}=="dddd", MODE="0666"

2-3. 起動時:RTCから時刻設定

  • /etc/systemd/system/time_sync_RTC.serviceファイルを作成し、次の内容を記載

[Unit]
Description=起動時にRTCの時刻をシステム時刻に反映するサービス
After=network.target

[Service]
Type=oneshot
ExecStartPre=/bin/sleep 20
ExecStart=/home/pi/Desktop/script/update_time.sh boot

[Install]
WantedBy=multi-user.target

2-4. 有効化&起動

sudo systemctl daemon-reload
sudo systemctl enable time_sync_RTC.service


3. systemd タイマーによる定期実行

  • 11 分毎に時刻同期を行う場合、systemd の service と timer を利用して自動実行する

3-1. /etc/systemd/system/time_sync.service を作成

[Unit]
Description=時刻同期サービス

[Service]
Type=oneshot
ExecStart=/home/pi/Desktop/script/update_time.sh

3-2. /etc/systemd/system/time_sync.timer を作成

[Unit]
Description=11分ごとに時刻同期を実施するタイマー

[Timer]
OnBootSec=1min
OnUnitActiveSec=11min

[Install]
WantedBy=timers.target

3-3. タイマーを有効化&起動

sudo systemctl daemon-reload
sudo systemctl restart time_sync.service
sudo systemctl status time_sync.service

  • time_sync.timerの起動状況確認

sudo systemctl status time_sync.timer

※時刻関連の確認

  • Chrony は ntpd のような「fudge」コマンドによる時刻オフセット補正をサポートしていない
  • GPS が UTC で提供する時刻とシステム時刻(内部は通常 UTC)の整合性をシステムタイムゾーン設定で管理
  • システムのタイムゾーン確認

timedatectl

  • タイムゾーンを設定

sudo timedatectl set-timezone Asia/Tokyo

  • 設定変更後は、Chrony デーモンを再起動して反映

sudo systemctl restart chronyd

  • 接続確認

chronyc sources -v


***********************************************
20250326 RTC部分を追加、全体を修正

0 件のコメント:

コメントを投稿