これまで、「NanoPi NEOとGPSモジュールでNTPサーバ 高精度PPS編」(2017年)や「NanoPi NEOでNTPサーバ再構築 (全まとめ)」(2019年)のように、NanoPi NEO(無印)を使ったNTPサーバを運用してきました。NanoPi NEO(無印)は、Allwinner H3プロセッサと512MBメモリを搭載した小型で非力なシングルボードコンピュータですが、NTPサーバとしては十分に機能していました。しかし、すでに7年が経過し、特にGPSモジュール用の廉価なパッチアンテナは数年で壊れやすいことが分かっています。今回も、NanoPi NEOがGPSモジュールとの通信ができなくなったため、NTPサーバ全体を交換することにしました。
2024年8月6日追記:
調査の結果、今回はGPSモジュールの問題ではなく、NanoPi NEO自体に不調があることが判明しました。ネットワークポートやGPIOへの電源供給が頻繁に途絶え、ネットワークポートのLEDが時々消えるほか、GPIOも長時間動作が途絶えている状態でした。見た目にはランドの浮きやチップの損傷といった異常は特に見られず、修理が難しそうです。NanoPi NEOにはこれまでいろいろと活躍してもらいましたが、今回で引退させることにしました。
4年前に購入したNanoPi NEO3は、RockChip RK3328プロセッサと1GBメモリ(2GBバリアントもあり)を搭載した、NanoPi NEO(無印)およびNanoPi NEO2の後継強化モデルです。最近まで、「NanoPi NEO3をv6プラスのルーターにする systemd-networkd + nftables」の通り、家庭用ブロードバンドルーターとして使用していました。しかし、今年になって「Seeed Studio LinkStar-H28Kで作る超小型OpenWRTルーター」に置き換えたため、NanoPi NEO3は使い道がなくなりました。
このボードはメモリが1GBしかなく、ディスプレイ出力がないヘッドレスモデルのため、他に適した用途が見つからなかったのです。しかし、NTPサーバの交換が必要になった際、NanoPi NEO3が最適だと考えました。以前、NanoPi NEO(無印)でNTPサーバを問題なく運用していた経験があるため、より性能の高いNanoPi NEO3であれば、さらに余裕を持って運用できるだろうと判断したのです。
このGPSアンテナは屋外用で、SMA端子付き、ケーブルは3mの長さがあります。直径12mm以上の穴が空いたL型アングルに固定するか、内径11mmのパイプにねじ込んで使用することができます。 このGPSモジュールは、u-blox製のGPS受信チップと互換性があるとされています。基板上にはパッチアンテナが搭載されておらず、代わりにSMAおよびIPEXのアンテナ端子が付属しています。中華製のGPSチップを使用しているため、品質が不安視される部分もありますが、過去に購入した新しい中華GPSモジュールとChronyで作るNTPサーバ (前編)と同一の製品です。価格は非常にリーズナブルでありながら、予想外に優れた性能を発揮しています。屋外用GPSアンテナの設置

上のAliExpressリンクの屋外用GPSアンテナを購入しました。
設置場所の都合でアンテナをパイプに接続するのではなくL型アングルを使用して固定しました。建物の間ですが、できるだけ空が広く見えて且つ建物の屋根からの雪の落下によるアンテナ破損が発生しないような位置にアンテナを設置しました。
NanoPi NEO3とGPSモジュールの接続

NanoPi NEO3とGPSモジュールはGPIOピンを利用して接続します。
- ピン番号4: GPSモジュールVCCに接続します
- ピン番号6: GPSモジュールGNDに接続します
- ピン番号8: GPSモジュールRX(受信)に接続します (RXとTXを接続)
- ピン番号10: GPSモジュールTX(送信)に接続します (RXとTXを接続)
- ピン番号7: GPSモジュールPPSに接続します
ArmbianのOSイメージ
2024年7月上旬に、最新のArmbianソースを用いてNanoPi NEO3用のOSイメージをビルドしてみたところ、UARTが全く通信できないという問題が発生しました。さまざまな設定を試みましたが、全く動作せず、割り込みやアドレスに問題があるのではないかと推測しました。ArmbianのフォーラムやGitHubで情報を探しましたが、解決に繋がる有益な情報は見つかりませんでした。
そこで、NanoPi NEO3の製造元であるFriendlyElecが提供するOSイメージを試してみたところ、UARTは正常に動作し、GPSモジュールからNMEAメッセージを受信することができました。ただし、FriendlyElecのOSイメージでは、GPIO7番ピンを使ってGPIO-PPSデバイスを生成する方法が不明だったため、NTPサーバとしての利用は難しいと判断しました。
同年7月下旬、再びArmbianのGitHubを調査したところ、新たに追加されたパッチに関連しそうなものを見つけました(この記事の最初の画像を参照してください)。そこで、最新のソースを使ってDebian Bookwormを再度ビルドし、試してみたところ、以前の苦労が嘘のように、特に設定をすることなくUART(/dev/ttyS1)でGPSモジュールと問題なく通信できるようになりました。以下に、PPS用のビルド設定を追加して作成したOSイメージを共有します。
置き場所(Google Drive):
Armbian-unofficial_24.8.0-trunk_Nanopineo3_bookworm_current_6.6.42.7z
PPSデバイスの有効化
Armbianでは、デバイスツリーを使ってデバイス周りの設定を比較的簡単に追加・変更できます。以前、NanoPi NEO(無印)を使用していた際には、/boot/armbianEnv.txtに少し設定を追加するだけでPPSを簡単に使うことができました。しかし今回は、使用するGPIOピンの指定方法がわからず、設定に苦戦しました。
そのため、デバイスツリーソースでGPIO7番ピンをPPS用として設定する方法を作成しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | /dts-v1/; /plugin/; / { compatible = "rockchip,rk3328"; fragment@0 { target-path = "/"; __overlay__ { pps: pps@0 { compatible = "pps-gpio"; gpios = <&gpio2 2 0>; }; }; }; }; |
最近のArmbianにはデバイスツリーのソースを変換・配置・設定を自動で行うツール(コマンド)が入っています。
# armbian-add-overlay ~/pps-overlay.dts
これにより、pps-overlay.dtsから変換されたpps-overlay.dtboファイルが/boot/overlay-userディレクトリに配置され、/boot/armbianEnv.txtに次の1行が追加されます。
user_overlays=pps-overlay
システムを再起動すると、GPIO7番ピンに対応する/dev/pps0が生成されます。
# dmesg | grep pps [ 0.270694] pps_core: LinuxPPS API ver. 1 registered [ 0.270707] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <giometti@linux.it> [ 10.095572] pps pps0: new PPS source pps@0.-1 [ 10.095648] pps pps0: Registered IRQ 53 as PPS source # lsmod Module Size Used by rfkill 24576 1 sunrpc 483328 1 lz4hc 12288 0 lz4 12288 0 pps_gpio 12288 1 rk_crypto 28672 0 rng_core 16384 1 rk_crypto cpufreq_dt 16384 0 zram 32768 3 binfmt_misc 20480 1 g_serial 12288 0 libcomposite 65536 1 g_serial dm_mod 126976 0 ip_tables 28672 0 x_tables 36864 1 ip_tables autofs4 40960 2 realtek 32768 1 dwmac_rk 28672 0 stmmac_platform 20480 1 dwmac_rk stmmac 233472 3 stmmac_platform,dwmac_rk pcs_xpcs 20480 1 stmmac gpio_syscon 16384 0
# apt install pps-tools # ppstest /dev/pps0 trying PPS source "/dev/pps0" found PPS source "/dev/pps0" ok, found 1 source(s), now start fetching data... source 0 - assert 1722084702.000000773, sequence: 18977 - clear 0.000000000, sequence: 0 source 0 - assert 1722084703.000056099, sequence: 18978 - clear 0.000000000, sequence: 0 source 0 - assert 1722084703.999944679, sequence: 18979 - clear 0.000000000, sequence: 0 source 0 - assert 1722084705.000000189, sequence: 18980 - clear 0.000000000, sequence: 0
pps-toolsをインストールし、/dev/pps0を指定してテストを実行します。
テストでは、1秒ごとに1行ずつ結果が表示され、問題がなければ正常です。テストを終了する場合は、[Ctrl]+[C]を押します。
シリアルポートの動作確認と設定
# stty -F /dev/ttyS1 9600 ←シリアル速度をGPSモジュール(初期値)に合わせる # cat /dev/ttyS1
また、NMEAメッセージが継続して表示されれば、成功です。終了するには、[Ctrl]+[C]を使用してください。
今回使用するu-blox互換のGPSモジュールでは、専用のu-bloxコマンドを利用することができます。初期設定では、GPSモジュールのシリアル通信速度は9600bpsに設定されていますが、この速度では遅いと感じる場合があります。そこで、通信速度を115200bpsに変更することが推奨されます。このモジュールでは、9600bps(初期値)と115200bps(最大値)を選択できます。
# echo -e "\xB5\x62\x06\x00\x14\x00\x01\x00\x00\x00\xD0\x08\x00\x00\x00\xC2\x01\x00\x07\x00\x03\x00\x00\x00\x00\x00\xC0\x7E" > /dev/ttyS1 # /bin/stty -F /dev/ttyS1 115200 # cat /dev/ttyS1
通信速度の設定後、NMEAメッセージが正常に表示され続けるか確認します。表示が続いていれば設定は成功です。終了するには、[Ctrl]+[C]を押します。
もし、NMEAメッセージが文字化けする場合は、9600bpsに戻すなどして正しく表示されるように調整します。なお、1行目のコマンドはu-bloxチップ、またはその互換チップを搭載したGPSモジュールでのみ動作します。
/dev/ttyS1ではNTPdが正常にデータを読み取れないため、次の2行を実行して対応します。
# chmod 0666 /dev/ttyS1 # ln -s /dev/ttyS1 /dev/gps0
システムを再起動すると、/dev内のgps0が消えてしまい、pps0やttyS1のパーミッション(アクセス権)が元に戻るため、システム起動後に自動的に設定が行われるようにする必要があります。
# vim /etc/udev/rules.d/10-gps.rules (新規ファイル作成)
1 2 | KERNEL=="ttyS1",SYMLINK+="gps0",MODE="0666"
KERNEL=="pps0",MODE="0666"
|
シリアルポートのgettyを停止・無効化します。
# systemctl stop serial-getty@ttyS0.service # systemctl disable serial-getty@ttyS0.service # systemctl stop serial-getty@ttyS1.service # systemctl disable serial-getty@ttyS1.service # systemctl stop serial-getty@ttyS2.service # systemctl disable serial-getty@ttyS2.service # systemctl stop serial-getty@ttyS3.service # systemctl disable serial-getty@ttyS3.service # systemctl stop serial-getty@ttyS4.service # systemctl disable serial-getty@ttyS4.service # systemctl stop serial-getty@ttyS5.service # systemctl disable serial-getty@ttyS5.service # systemctl stop serial-getty@ttyS6.service # systemctl disable serial-getty@ttyS6.service # systemctl stop serial-getty@ttyS7.service # systemctl disable serial-getty@ttyS7.service実行は、GPSモジュールと通信するttyS1だけでも良いかもしれません。
NTPの設定
NTPサーバのソフトウェアとしては、多くの最新のLinuxディストリビューションでChronyがインストールされており、自動設定で動作していることが一般的です。以前は標準的にntpdが使用されていましたが、最近ではntpsecが使用されるケースが増えています。過去にntpdを使っていた場合は、その設定をそのまま利用できるntpsecを使用するとよいでしょう。
# apt install ntpsec
最近のArmbianでは、ntpsecパッケージをインストールするとChronyが自動的に停止・無効化され、ntpsecが有効化・開始される仕組みになっています。設定ファイルは、/etc/ntpsecフォルダ内のntp.confを編集することで調整可能です。
ntp.confのNMEAの設定では、GPSモジュールとの通信速度に合わせた設定が必要です。server 127.127.20.0 mode 17 minpoll 4 prefer #9600bpsの場合 server 127.127.20.0 mode 81 minpoll 4 prefer #115200bpsの場合
このmodeの数値の意味は、Generic NMEA GPS Receiverの中程を参照ください。
この記事には、これまでのNTP関連記事と重複する内容が含まれています。ntpd/ntpsecの設定ファイルであるntp.confについて詳しく知りたい方は、過去の記事を参考にしてください。「NanoPi NEOとGPSモジュールでNTPサーバ 高精度PPS編」「NanoPi NEOとGPSモジュールでNTPサーバ PPS解決編」、そして「NanoPi NEOでNTPサーバ再構築 (全まとめ)」の各記事で、設定方法やトラブルシューティングを詳しく解説しています。
関連記事:- Rock Pi SとChronyでPPS付きNTPサーバを作る
- NanoPi NEO3にGPSモジュールを接続してNTPサーバとして使用する ←いまここ
- 新しい中華GPSモジュールとChronyで作るNTPサーバ (後編)
- 新しい中華GPSモジュールとChronyで作るNTPサーバ (中編)
- 新しい中華GPSモジュールとChronyで作るNTPサーバ (前編)
- NanoPi NEOでNTPサーバ再構築 (全まとめ)
- NanoPi NEOとGPSモジュールでNTPサーバ PPS検証編
- NanoPi NEOとGPSモジュールでNTPサーバ PPS解決編
- NanoPi NEOの時刻のズレを直したい
- NanoPi NEOとGPSモジュールでNTPサーバ 高精度PPS編
- NanoPi NEOとGPSモジュールでNTPサーバ 簡易PPS編
- NanoPi NEOにGPSモジュールを繋いでNTPサーバ
- GPSモジュール
- GPSレシーバーでStratum 1なNTPサーバ
- NanoPi NEO3にGPSモジュールを接続してNTPサーバとして使用する
- アッチッチなNanoPi NEO3を冷やしたい パッド交換
- NanoPi NEO3冷却力強化後のUnixBench
- アッチッチなNanoPi NEO3を冷やしたい
- NTPサーバの時刻ソースに対するズレの調整
- NanoPi NEO3をv6プラスのルーターにする systemd-networkd + nftables
- NanoPi NEO3のUSB3.0ポートのネットワーク速度
- NanoPi NEO3でArmbian よきところでUnixBench
- NanoPi NEO3が届いた
- NanoPi NEOにRTCモジュールを付ける
- 新しい中華GPSモジュールとChronyで作るNTPサーバ (中編)
- 新しい中華GPSモジュールとChronyで作るNTPサーバ (前編)
- Prometheus2とGrafana6によるシステム監視 シングルボードコンピュータの温度表示
- NanoPi NEOでNTPサーバ再構築 (全まとめ)
- NanoPi NEO2をv6プラスのルーターにする 後編
- NanoPi NEO2をv6プラスのルーターにする 前編
- ELK Stackでシステム監視 FilebeatでNTP統計ログ取得 Logstashで加工
- NanoPi NEO2(arm64)用にFilebeatをビルド
- NanoPi NEO2を超コンパクトなアルミケースに入れる
- NanoPi NEO2用armbian 5.41 Debian 9 Stretch next 4.14.18
- NanoPi NEO2を100均の灰皿に入れてみた
- NanoPi NEO2のシステム監視 RPi-Monitorとnetdata
- NanoPi NEOとGPSモジュール用アルミケースを作る
- NanoPi NEO2 + DACで音楽プレーヤーVolumioを使う
- NanoPi NEO2にDACを接続
- NanoPi NEO2の最大クロック引き下げ後のUnixBench 再び
- NanoPi NEO2用armbian 5.32 Debian 9 Stretch 4.13.0-RC6
- NanoPi NEO2用armbian 5.32 Debian jessie 4.13.0-RC6
- NanoPi NEOをSIP電話機にする 後編 (その2)
- NanoPi NEO2とICカードリーダーでタイムレコーダーを作る(実用化編)


はじめまして、
NANOPI NEO3ユーザーです。
GIOPの操作に関しての情報を探しています。
例えば、DHT11, DHT22を接続しようとしてもRaspiなどと互換性がないため困窮しています。
具体的な方法ご存じてしたら是非とも公開ください。
温湿度計センサーには興味はあるのですが、まだ使ったことがありません。なのでお役に立てそうにありません。
センサーを利用するためのドライバ、ライブラリが利用するボードで利用できることを確認する必要があるのと、使用したいGPIOが本当に利用できることを確認しておく必要があります。
Armbianでは(更新により)頻繁にGPIOが利用できたり利用できなくなっていたりを繰り返しています。
(特定の)GPIOが利用できない状態のときにそのピンを使っていくら頑張っても機能しません。
Arduinoではセンサーの利用が容易そうなので、arduinoにセンサーを接続してUARTでNanoPi NEO3につなぐとか。