Orange Pi Zero 3を買ってみた

Orange Pi Zero 3を買ってみた

LAN用のNTPサーバとして利用していたNano Pi NEO(無印)が寿命を迎えたので、新しいシングルボードコンピュータを購入することになりましたが、これまでADS-Bの受信用に利用していたRock Pi SをNTPサーバ用に流用し、ADS-B受信用に新しいものを用意することにしました。過去に利用したシングルボードコンピュータではOrange Pi Zero 2が手頃で十分な性能でしたが、ほほ販売を終了しているのでその後継モデルのOrange Pi Zero 3を購入することにしました。Orange Pi Zero 3は、Zero 2からいくつかの変更が加えられていますがマイナーチェンジといえます。

  • SoCの変更 Allwinner H616(4コア)からAllwinner H618(4コア)
  • オンボードストレージの増量 2MB SPI Flashから16MB SPI Flash
  • DDR3からLPDDR4メモリに変更
  • メモリ容量バリアントの増加 512MB/1GBから1GB/1.5GB/2GB/4GB
  • 基板サイズの変更 53x60mmから50x55mm

Micro HDMI端子搭載、USB-C端子搭載、Wi-Fi 5対応, BT5.0対応は変わっていません。
なお、Orange Pi Zero 3はローンチから1年以上経っているので新製品ではありません。

Orange Pi Zero 3のSOC Allwinner H618は超高温ではないもののそれなりの発熱があるのでヒートシンク付きのセットを買うのが良いでしょう。数百円の差ですが、自身で固定可能なヒートシンクを用意するとそれ以上の費用が発生すると思われます。

Orange Pi Zero 3を買ってみた 1
AliExpressで注文から1週間経たずに届きました。握りこぶし程度の小さなパッケージなので宛名ラベルでパッケージの半周が覆われています。

Orange Pi Zero 3を買ってみた 2
パッケージの反対側に製品のバーコードと製品名などが書かれています。注文したのは1GBメモリバージョンだった筈ですが、4GBメモリと書かれています。何かの間違いでしょうか?

Orange Pi Zero 3を買ってみた 3
外装のビニールを剥ぐと、2つの箱がプチプチに巻かれた状態で現れました。

Orange Pi Zero 3を買ってみた 4
左の無地の白箱にはプレート2枚とネジ、スペーサー、熱伝導パッドが入っていました。Orange piと書かれた箱にはOrange Pi Zero 3本体が入っていました。

Orange Pi Zero 3を買ってみた 5
凹凸のないプレートはOrange Pi Zero 3の背面側、フィンの付いたプレートはOrange Pi Zero 3の表側のH618チップがある側に取り付けます。

Orange Pi Zero 3を買ってみた 6
Orange Pi Zero 3の中央にはSoCのH618チップがあります。その右側がメモリ、左の黒いチップはYT8531CでGbEの有線LANのNIC、左下の銀色のチップはCdtech 20U5622と書かれていてWi-Fi 5 / Bluetooth 5.0用チップです。

Orange Pi Zero 3を買ってみた 7
基板の背面です。シールにOPi Zero3 1GBと書いてあります。 1GBメモリのバリアントを注文したので正しいです。右下はmicroSDカードのスロットです。バネを使った押し戻しロックタイプではありませんが、カードは抜けにくくなっているようです。

Orange Pi Zero 3を買ってみた 8
SoCとメモリチップ用のシリコンスポンジ熱伝導パッドが付属していたので、それをチップ上に貼り、自前のシリコン熱伝導パッドをWi-Fi用チップにも貼りました。Wi-Fiを使わないので不要ですが、手持ちの物を使いたくなってしまうのです。
そして、基板四隅のネジ穴に合わせてヒートシンクを嵌めます。ウラ面のプレートとヒートシンクのプレートを取り付ける際はそれぞれ付属のスペーサーを入れてからプレート/ヒートシンクを取り付けます。

Orange Pi Zero 3を買ってみた 9
ヒートシンクはピンやソケット類を除く全面を覆うのである程度の冷却はできるのでしょうが、ヒートシンクのフィンの高さが低いので放熱性が良いとは言えなさそうです。そもそもスポンジ熱伝導パッドを使っているのでチップからヒートシンクへの熱伝導性能は低そうです。放熱に気を使うなら銅プレートパッドと背が高めのフィンが付いたヒートシンクと冷却ファンを用意した方が良いでしょう。

Orange Pi Zero 3を買ってみた 10
左から、Micro-HDMI、USB-C、USB-A、RJ45です。このボードは小型ですが、HDMI出力があるのでヘッドレスではありません。ディスプレイを接続して使うことはありませんが。

Orange Pi Zero 3を買ってみた 11
横から見ると基板を上からはヒートシンク、下からはプレートでサンドイッチされた状態です。中に見える水色のものがシリコンスポンジの熱伝導パッドです。中央と右(3ピンの奥側に隠れています)がヒートシンクに付属の熱伝導パッド、左の少し色が濃い目の水色のパッドがストックを貼ったものです。

Orange Pi Zero 3を買ってみた 12
紙ペラが1枚付属しますが、取説のようなものではありません。初心者にはやさしくないようです。

H618はOrange Pi Zero 2に搭載されていたH616と大差ないようですが、価格もZero 2から変わらず安価なので気軽に購入できるシングルボードコンピュータです。OSとしてはOrange Pi OSの他にArmbianが利用できるので困ることは少なそうです。OpenWRTやAndroid OSも利用可能です。

当初の予定どおり、OSとしてArmbianのDebian BookWorm、ADS-B用にdump1090-faとFlightAwareをビルド/インストールして正常に稼働しています。

関連記事:

NanoPi NEO3にGPSモジュールを接続してNTPサーバとして使用する

NanoPi NEO3をNTPサーバとして使用する

これまで、「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アンテナの設置

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

NanoPi NEO3とGPSモジュールの接続

NanoPi NEO3をNTPサーバとして使用する 1
NanoPi NEO3とGPSモジュールはGPIOピンを利用して接続します。

  • ピン番号4: GPSモジュールVCCに接続します
  • ピン番号6: GPSモジュールGNDに接続します
  • ピン番号8: GPSモジュールRX(受信)に接続します (RXとTXを接続)
  • ピン番号10: GPSモジュールTX(送信)に接続します (RXとTXを接続)
  • ピン番号7: GPSモジュールPPSに接続します
USB端子の近くにデバッグUARTがありますが、これは迂闊に使うとNanoPi NEO3が正常に起動しません。

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用として設定する方法を作成しました。

# vim ~/pps-overlay.dts (新規作成)
 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サーバ再構築 (全まとめ)」の各記事で、設定方法やトラブルシューティングを詳しく解説しています。

関連記事:

Up