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 件のコメント:
コメントを投稿