動作中のbeagle bone green(BBG) をNTPサーバにしました。LAN内で完結するGPS/PPS信号による時刻合わせがしたかったのです。
目的は単純ですが手数がありますので以下覚書します。

ホスト用ボード・部品の構成

ホストのBBGは

name -a
Linux BeagleBone 5.10.168-ti-r77 #1bullseye SMP PREEMPT Wed Feb 28 21:05:58 UTC 2024 armv7l GNU/Linux

GPSモジュールはu-blox NEO-6MV2 と24C32(eeprom)搭載です。amazonではRen He GY-NEO-6MV2という商品名です。同様のmade in China製がいくつもあって、なんとなくこれを選びました。
電池なしモジュールとのことでしたが二次電池が付いていて容量抜けでした。充電不能でしたので、つまりは電池なしという商品説明通りです。ドローン用のセイコー MS621FE のようで現在注文中です。

同梱のパッシブアンテナはケーブルも10cmに満たないもので、アクティブアンテナを購入しました。3mケーブル付きの車載用アンテナ(多分)でSMA中継端子を使って2m足し5mとしました。
GPSモジュールにはアクティブアンテナ用LNA電源回路がついているのでつなぐだけでOKです。
ただし回路図と基板の抵抗値が違ってました。よくある話ですので気にしてません。

モジュールをbeagle bone 用のプロトタイプ基板にのせます。外部電源端子用に基板を使っていますのでスタック構成となります。余談ですがこの基板はしっかりしていて好きです。数枚手持があるので5段スタックとかにしたら目立つかもしれません。なんに使うんだということですが。

アンテナコネクタはhiroseのU.FLとかIPEXのMHFと商品名で呼ばれている極小の表面実装高周波部品です。ホチキスにもステイプラという一般名称があるんですが、このコネクタは共通規格名では呼ばれないようです。U.FLとMHFには互換性があるようですが、見た目一緒でも合わないコネクタもあるようです。難しいなあこういう部品は。
いずれにせよ外部アンテナにあわせてSMAコネクタに付け替えました。上記写真でいえば基板の裏側につけています。

配線は次の様です。

GPS信号用シリアル通信端子:UART1使用。P9.24(TXD)、P9.26(RXD)
PPS信号端子:GPIO_60(P9.12)
電源;モジュールは3.3Vレギュレーター付きなので5Vを加えます。SYS_5Vピン(P9.7,8)ではなく外部電源のVDD_5V(P9.5,6)に結線してます。

基板を組み終わったらUSBシリアル変換デバイスでモジュールとアンテナ動作を確かめます。

PPS信号LEDが点滅したら衛星捕捉していると判断します。GPS信号の確認はMac miniから cat /dev/シリアルデバイス名で行いました。わたしの環境ではアンテナは外に出さないと受信してくれないので、この段階で本記事末尾のようにベランダに置きました。

モジュールの動作確認が済んだら、基板をBBGに差し込み設定をはじめます。

設定手順概要

トラブル原因を切り分けるために、段階を区切って作業を進めました。

(1)ntp,gpsd,pps-toolsの3つをインストール。
(2)【ntp】上流のntpサーバから時刻取得できてるか、LAN内PCからの問い合わせに返答できているかの確認
(3)【gpsd】モジュール用シリアルデバイスの設定とGPSデータ取得確認。
(4)【pps】ppsデバイスの設定と信号確認。
(5)【pps/ntp】ntpにpps時刻同期設定を加えて動作確認。

設定はhttps://github.com/guycole/perky-janus を参考にさせていただいています。

なお以下はすべてrootないしはsudoでの作業です。

ntp,gpsd,pps-toolsのインストール

apt install ntp gpsd pps-tools でインストール。
ntpインストール時には、デフォルトで動作していた時刻同期プログラムsystemd-timesyncdはuninstallされます。

ntpの初期設定

nict.jpからの時刻同期とLAN内PCからの時刻問い合わせ同期の設定。

driftfile /var/lib/ntp/ntp.drift
leapfile /usr/share/zoneinfo/leap-seconds.list
statistics loopstats peerstats clockstats
filegen loopstats file loopstats type day enable
filegen peerstats file peerstats type day enable
filegen clockstats file clockstats type day enable
pool ntp.nict.jp iburst
restrict -4 default kod notrap nomodify nopeer noquery limited
restrict 127.0.0.1 nomodify
restrict source notrap nomodify noquery
restrict LANセグメントのIPs mask 255.255.255.0 nomodify notrap

systemctl restart ntp して、ntpq -p でntp.nict.jpとの時刻同期を確認します。
LAN内PCからは sntp -sS BBGのIPアドレス で同期できるかを確認します。

GPS用シリアルドライバの設定

GPS用シリアル端子UART1を有効化します。

ubootのデバイスツリー・オーバーレイ(以下DTO)機能を使います。インストール済みのdebianの/lib/firmawareには同機能用のDT blob O(dtbo)バイナリが存在していますので、次の行を/boot/uEnv.txtに加えてリブートするだけです。

uboot_overlay_addr4=/lib/firmware/BB-UART1-00A0.dtbo

addr?の部分は実際使っているDTOの数などによって適宜変更してください。
なおubootでのDTOを使うにはuEnv.txtにenable_uboot_overlays=1の行が記載されている必要があります。

次に/etc/default/gpsdの設定をします。

# Start the gpsd daemon automatically at boot time
START_DAEMON="true"

# Use USB hotplugging to add new USB devices automatically to the daemon
USBAUTO="false"

# Devices gpsd should collect to at boot time.
# They need to be read/writeable, either by user gpsd or the group dialout.
DEVICES="/dev/ttyS1"

# Other options you want to pass to gpsd
GPSD_OPTIONS="-n"

gpsdがサービスに登録されていない場合は、systemctl enable gpsd;systemctl enable gpsd.socketとしておきます。

リブートします。

sudo cat /dev/ttyS1 でGPS信号が表示されれば動作確認となります。

ターミナル設定によってはGPTXT, NMEA unknown msgなどのような表示が出ることがありますので、そのさいは、

stty -F /dev/ttyS1 -echo

としてecho動作をオフにします。詳しくはubloxの次のフォーラム記事をご覧ください。わたしはrootのbashrcに上記コマンドを入れてます

sudo cgpsやsudo gpsmonコマンドで詳細を確かめます。


PPS用GPIOドライバの設定

pps用端子のdtboはデフォルトでは存在していないので自前で用意します。

UART1設定も含んだ https://github.com/guycole/perky-janus/blob/main/BB-UART1-GPS-00A0.dts からpps関係のみを抜き出し一部修正したものを使います。

UART1のdtboは上記設定で動作しており、必要がないからです。

/*
 *
 * Virtual cape for PPS on P9.12
 * 
 * Based on this thread:
 *   https://forum.beagleboard.org/t/beaglebone-black-gps-pps-and-chrony-for-time-sync/897/17
 */

/dts-v1/;
/plugin/;

#include <dt-bindings/board/am335x-bbw-bbb-base.h>
#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/pinctrl/am33xx.h>

/{
    compatible = "ti,beaglebone-black";

    part-nmumber = "BB-PPS";
    version = "00A0";

    exclusive-use = "P9.12";

    fragment@0 {
        target=<&ocp>;
        __overlay__ {
            P9_12_pinmux{status="disabled";};
        };
    };

    fragment@1 {
        target = <&am33xx_pinmux>;
        __overlay__ {
            bb_gps_pps_pins: pinmux_bb_gps_pps_pins {
                pinctrl-single,pins = <
                    BONE_P9_12 (PIN_INPUT_PULLDOWN | MUX_MODE7)	
                >;
            };
        };
    };

    fragment@2 {
        target-path = "/";
        __overlay__ {
            gps_pps {
                status = "okay";
                compatible = "pps-gpio";
                pinctrl-names = "default";
                pinctrl-0 = <&bb_gps_pps_pins>;
                gpios = <&gpio1 28 0>;
            }; 
        };
    };
};

上の記述を BB-PPS-00A0.dts という名前で保存します。

同ファイルをコンパイル・インストールします。

なお次の手順(install.shを動作させる)ですと既に存在しているものも再インストールされます。個別のコンパイルの場合のdtcオプションが能力的に今ひとつ飲み込めないのでこれでOKとしました。

git clone https://github.com/beagleboard/bb.org-overlays
cp BB-PPS-00A0.dts ./bb.org-overlays/src/arm
cd ./bb.org-overlays
sh ./install.sh

終了後/boot/uEnv.txtに次の一行を加えます。addr?の部分は自分の環境に合わせてください。

uboot_overlay_addr5=/lib/firmware/BB-PPS-00A0.dtbo

次に/etc/default/gpsdにppsデバイスを加えます。
DEVICES=”/dev/ttyS1″の行をDEVICES=”/dev/ttyS1 /dev/pps0″ とするだけです。

リブート・ログインして/dev/pps0 ができているのを確かめたうえで、sudo ppstest /dev/pps0 で確認します。
正常動作していれば次の様になるはずです。

ntpをgps/pps同期にする

最後にntpにppsへの同期を設定します。

/etc/ntp.confの最後の部分に次の行を加えるだけです。

# GPS PPS reference (NTP2)
server 127.127.28.2 prefer
fudge 127.127.28.2 refid PPS

systemctl restart ntpして、ntpq -pでpps経由の時刻同期を確認します。

preferキーワード記述をしているので、gpsdがshared memory(SHM)の2番(NTP 2)に割り当てているPPSが優先サーバ(プライマリークロック)としてアスタリスク付きで確認されるはずです。

余談:風雪に負けないGPSアンテナであってほしい

サイト名に凪日をつけるほど普段は強風の場所に住んでます

凪は祈りに近いです(笑)。雪も降るし風も吹く場所にGPSアンテナ設置するというのは結構面倒だと思っています。

一応雪の季節が終わったので、簡単な雨避け措置を施して、2Fベランダにおきました。
雨避は、小さな植木鉢とアクリル板で作ります。

テスト用に下の写真の場所に置きましたが、この頼りない佇まいは、風が強いと絶対吹き飛ばされると確信できるほどです。近々なんとかしなければなりません。どうすればいいですかね・・・

【2024-03-31追記】
ケースに入れてアンテナの外付け設置をしました

GPS+PPSによるNTPサーバの設定」への2件のフィードバック

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です