30年前のPC-9801を蘇らせる - 買ってみた編

30年前のPC-9801を実用を目指して蘇らせる - ジャンク品を買ってみた編

「がとらぼ」の中の人が学生時代を過ごしていた頃、NECのPC98シリーズは「国民機」と呼ばれ、パソコンといえばPC98が主流でした。ほかにも富士通のFMRシリーズやFM-TOWNS、シャープのX68000などがありましたが、圧倒的にメジャーだったのはPC98でした。

ただし、PC98シリーズのパソコンは非常に高価でした。初代PC-9801の本体価格は定価298,000円で、その後のモデルもだいたい本体が40万円程度しました。PC-H98のハイグレードモデルでは、価格が200万円を超えるものもありました。さらに、モニターが数万円、ハードディスクが5〜10万円、プリンターが5万円以上と、周辺機器の価格も高額でした。加えて、OSも別売りのMS-DOSなどを購入する必要があり、一式揃えると実売価格で40〜60万円ほどかかりました。

そのため、バイトを始めたばかりの貧乏学生にとっては、PC98シリーズを手に入れるのは簡単ではありませんでした。「がとらぼ」の中の人が最初にバイトして自分で購入したのは、若干安いEPSONのPC98互換機であるPC-386Mでした。その後、FM-TOWNSやIBM-PC互換機に移行したため、NECのPC98シリーズとして所有したのは、(買い与えられた)初代PC-9801のみでした。

PC-98シリーズのパソコンは、現在では中古市場でしか手に入れることができません。そして、多くの場合、それらは正常に動作するかどうか不明です。動作しない場合は、部品取り用として活用し、動作する部品を組み合わせて1台の正常なPCを作るのが良い方法です。また、現在でもPC-98を取り扱っているショップや、修理を行っている業者も存在します。これらの場所で動作確認済みの本体や部品を入手するか、不動品を修理してもらって動作品にするのも一つの手段です。

私自身はPC-98に対して強いこだわりはありませんが、高級機であったPC-9801シリーズのモデルが欲しいと思い、PC-9821型番の98Mateシリーズや中国製の廉価型PC-9801である98Fellowシリーズは対象外としました。ただし、98Mateや98FellowではIDEのHDDやCD-ROMが採用されているため、それ以前のSCSI/SASIのHDDを使用するモデルに比べてストレージの入手が容易です。

V30 CPUでしか動作しないソフトウェアもあるため、ソフトウェアの互換性を重視する場合はV30搭載モデルを選ぶのが良いかもしれません。一方で、そこにこだわらなければ選択肢は広がり、VM以降のモデルの全てが視野に入ります。PC-9801の初期モデルはメモリの搭載可能量が少なく、CPUの処理速度も遅いため、性能面が気になる場合は1990年代のモデルを選ぶのが良いでしょう。

結果として、今回は98Fellowを除くPC-9801型番の最後のメジャーモデルであるPC-9801FAを選びました。このモデルはi486SX 16MHzのCPUを搭載し、メモリも14MBと限られていますが、HDDなしのバリアントでも当時の本体価格は約46万円と高級機でした。

今年のPC98の日、9月8日を目指してPC-9801FA一式を揃えることにしました。

30年前のPC-9801を蘇らせる - 買ってみた編 1
今回は主にヤフオクで必要なアイテムを調達しました。本体であるPC-9801FAは3,200円、ディスプレイはブラウン管が嫌だったので液晶タイプを1,000円で購入、キーボードが2,300円、マウスが800円、LANボードが1,500円でした。これらにはそれぞれ送料がかかりました。ヤフオクでは、新品での入手が難しい中古品やジャンク品を安く手に入れることが多いですが、ディスプレイやマウスを接続するための変換アダプタやフロッピーディスクのメディアなどは、新品をヨドバシ、駿河屋、地球館などの店舗で購入する方が安いこともあります。

30年前のPC-9801を蘇らせる - 買ってみた編 2
それでは、入手したPC-9801FA本体を詳しく見ていきましょう。
本体の前面下部には左から、リセットスイッチ、CPUの速度切り替えスイッチ、ボリューム、動作モードを切り替えるディップスイッチ、電源スイッチが並んでいます。このうち、速度切り替えスイッチ、ボリューム、ディップスイッチはカバーで隠すことができます。
ディップスイッチの上には「ファイルスロット」と呼ばれるドライブベイがあります。ここにはCD-ROMドライブやMOなどを取り付けることができ、現在のPCの5インチドライブベイに似ていますが、奥にコネクタがある点や、ドライブに専用のレールを取り付ける必要がある点が異なります。さらにその上には、フロッピーディスクドライブが配置されています。今回入手したモデルは3.5インチフロッピーディスクドライブを2台備えていますが、PC-9801FAには5インチフロッピーディスクモデルも存在します。

30年前のPC-9801を蘇らせる - 買ってみた編 3
PC-9801FAなどのこの時期のモデルでは、フロントパネルの左右にあるボタンを内側に押し込みながら、手前に引くことで、工具を使わずにフロントパネルを取り外すことができます。

30年前のPC-9801を蘇らせる - 買ってみた編 4
フロントパネルの内部には、手で回せるネジが4本あります。左側の黒いネジ1本は、メモリとCPUが格納されているエリアの蓋を固定しています。また、ファイルスロットの左右下部には白いネジが2本あり、右下にはHDDドライブベイの「かご」と呼ばれる箱を固定する黒いネジが1本あります。
左下にはキーボードとマウスのコネクタがあります。キーボードコネクタはPS/2タイプに似ていますが、PS/2キーボードは使用できません。マウスコネクタは9ピンのシリアルコネクタと同じ形状ですが、シリアルポートではなく、シリアルマウスも使用できません。98用バスマウスの角型を接続する必要があります。ただし、後にPC-98Mateや98Fellowシリーズで採用されたコンパクトな丸形コネクタのバスマウスも、変換アダプタを使えば利用可能です。

30年前のPC-9801を蘇らせる - 買ってみた編 5
次に、ファイルスロットの蓋を開けてみました。このモデルでは、ファイルスロットの奥に3つのスロットが見えます。1つはSCSIスロットのようですが、残りの2つが何のスロットかはわかりません。

30年前のPC-9801を蘇らせる - 買ってみた編 6
拡張メモリの格納用蓋を開けると、すでにメモリ拡張基板が刺さっており、そこには4枚のメモリモジュールが取り付けられていました。

30年前のPC-9801を蘇らせる - 買ってみた編 7
メモリ拡張基板を取り外しましたが、メモリスロットの変色やボードの汚れが目立ちます。

30年前のPC-9801を蘇らせる - 買ってみた編 8
こちらはメモリ拡張基板の裏面です。NEC純正品ではなくメルコ(BUFFALO)製でした。PC98シリーズ用のEMSメモリといえば、当時はメルコかI-O DATAが一般的だったため、特に珍しいことではありません。(初稿では「EMSメモリといえばメルコかバッファロー」という寝ぼけたことを書いてました。申し訳ありません。)

30年前のPC-9801を蘇らせる - 買ってみた編 9
メモリ拡張基板を外すと、その下にCPUが見えます。右側にはメインCPUのインテルの486SX 16MHzが搭載されていますが、本体の価格に対しては性能が低い印象です。海外ではすでにIBM-AT互換機に486DXの25MHzを搭載したモデルがエントリーモデルとしてPC-9801FAの3分の1以下の価格で販売されていたため、もしPC98シリーズでも早い段階で高性能なチップを採用して安価に販売していたならば、IBM-AT互換機に市場を一気に奪われるという事態は避けられたかもしれません。

左側にはコプロセッサやオーバードライブプロセッサ用のソケットがありますが、そこにはすでに何かが取り付けられています。通常のi487コプロセッサならシンプルな黒い板のような見た目になるはずですが、今回は何らかのオーバードライブプロセッサか486互換CPUが取り付けられていると考えられます。ただし、ヒートシンクがあるため、正確なチップの種類は確認できていません。この時代のコプロセッサやオーバードライブプロセッサは、多数のピンをソケットに差し込むタイプで、斜めからの取り外しや取り付けを繰り返すのはリスクがあります。この頃のCPUピンは太く硬めですが、斜めに作業をするとピンが曲がってしまう可能性があるためです。抜き差しをするなら、筐体の天板やその他のユニットを取り外し、真上から作業を進めたいところです。すべて分解して掃除をする予定なので、その際に詳細を確認する予定です。

30年前のPC-9801を蘇らせる - 買ってみた編 10
フロントの一番右にある「籠」と呼ばれるハードディスクのトレイを引き抜きました。手順は簡単で、黒いネジ1本を外し、トレイに付いている取っ手を持ってまっすぐ前に引き出すだけです。
トレイには「日本テクサ株式会社」と書かれたシールが貼られており、どうやらNEC純正のものではないようです。そもそも入手したPC9801-FA/U2はハードディスクのないフロッピーディスクバリアントなので、本来ならばトレイの代わりに蓋があるだけのはずです。このPCには拡張メモリ、オーバードライブプロセッサ、そしてハードディスクが追加されており、前のオーナーが非力なPC-9801FAを少しでも快適にしようと色々なパーツを取り付けたことがうかがえます。

30年前のPC-9801を蘇らせる - 買ってみた編 11
これが引き抜いたハードディスクのトレイです。内部には3.5インチのハードディスクドライブ(HDD)が見えます。HDDにはSCSIコネクタと電源コネクタがあり、それぞれがトレイの基板に接続されています。

30年前のPC-9801を蘇らせる - 買ってみた編 12
3.5インチHDDの上面には「Quantum(クァンタム/カンタム)ProDrive LPS」と書かれているので、これは松下寿電子工業が製造した240MBのSCSI 1ドライブです。ProDrive LPSはMacintoshなどにも搭載されていたことで有名です。QuantumはMaxtorに買収され、その後MaxtorはSeagateに買収されたのですが、90年代にはQuantumドライブをよく購入したものです。
とはいえ、このハードディスクは30年前のものですので、仮に動作したとしても今後の使用には不安が残ります。このProDrive LPSは動作テストを行った後、問答無用で退役させる予定です。

30年前のPC-9801を蘇らせる - 買ってみた編 13
こちらはPC-9801FAの背面です。PC-9801シリーズの多くのモデルにはデジタルRGB出力が備わっていますが、VM以降のモデルではアナログRGB出力も追加され、これが主なビデオ出力として使用されるようになりました。PC-9801FAもデジタルとアナログのRGBモニタ出力を備えていますが、今回入手したPC-9801FAのアナログRGB出力コネクタには、ケーブルがちぎれたオスコネクタと、折れた固定ネジが残ったままの状態でした。このような点がジャンク品たる所以かもしれません。

30年前のPC-9801を蘇らせる - 買ってみた編 14
オスコネクタの残骸を取り除いたところ、本体側のコネクタには問題がないようで、ひと安心です。

30年前のPC-9801を蘇らせる - 買ってみた編 15
これが取り外したコネクタの残骸です。短い方の固定ネジはラジオペンチで摘んで捻って取り外した際にどこかに飛んでいってしまいました。

30年前のPC-9801を蘇らせる - 買ってみた編 16
昨今では少ないものの、10年以上前にはPCとディスプレイを接続する際に広く利用されていた3列(3行)のアナログRGB(VGA)mini D-Sub15ピンと、PC-9801の2列(2行)のアナログRGB D-sub15ピンを変換するアダプタが、サンワサプライから新品で販売されています。2024年9月8日時点で、ヨドバシカメラでは1,250円で送料無料です。同じアダプタでサンワサプライのシールが貼られていないものがヤフオクでは1,000円ほど高く、さらに送料もかかるので注意が必要です。

30年前のPC-9801を蘇らせる - 買ってみた編 17
PC-9801本体のアナログD-Sub15ピンコネクタに変換アダプタを接続し、そこに3列コネクタの付いた(10年以上前によく使用されていた)PC用アナログディスプレイケーブルを接続します。後ろに大きく飛び出す形になるため少々不格好ですが、固定ネジでしっかり留めれば実用上は問題ありません。見た目が気になる方は、ヤフオクなどでmini D-Sub15ピン(3列)とD-Sub15ピン(2列)のコネクタが両端に付いたケーブルも販売されているので、それを購入するのも良いかもしれません。

30年前のPC-9801を蘇らせる - 買ってみた編 18
本体背面の左端です。
PC-9801FA/U2はHDDが搭載されていないバリアントで、本来なら本体背面の左端にはカバーがあるだけのはずですが、今回入手した本体の左端にはSCSIボードが装着されていました。おそらく、前面右端のHDD籠とセットで追加されたものと考えられます。なお、まだ分解していないためボードの品番は不明です。このSCSIボードが55互換ではなく92互換であれば、ハードディスクの代わりにSDカードを使用できる「BlueSCSI」をそのまま利用することが可能です。もし55互換のボードの場合は、92互換のSCSIボードを別途入手しなければならないかもしれません。

30年前のPC-9801を蘇らせる - 買ってみた編 19
本体背面の右半分です。
PC-9801の増設カードスロットとしておなじみのCバス拡張スロットが4本あります。このうち、最下段のスロットにはビデオアクセラレータかスーパーインポーズ機能を持つ映像系ボードが装着されていました。これも前のオーナーが追加したものであると思われますが、こちらもまだ分解していないため詳細は不明です。また、一番下にはデジタルRGB端子、音声のラインアウト、外付けFDDコネクタ、RS-232Cシリアルポート、プリンタコネクタが配置されています。

30年前のPC-9801を蘇らせる - 買ってみた編 20
PC-9801用のマウスには、シリアルポートに接続するシリアルマウスと専用ポートに接続するバスマウスの2種類があります。シリアルマウスはPC-9801で使用すると反応が悪いと言われているため、選択肢から外しました。また、入手も非常に困難で、古いマイクロソフト製の黄ばんだシリアルマウス程度しか見つからないのが現状です。

バスマウスには、前期モデルで採用された角型のD-Sub9ピンコネクタのものと、後期モデルで採用された丸形のmini DIN9ピンコネクタのものがあります。コネクタ形状が異なるだけで、信号自体は同じため、変換コネクタを使えばどちらのコネクタのマウスでも利用可能です。現在は丸形コネクタのマウスが多く出回っているため、PC-9801FAで使用する場合は角型から丸形への変換アダプタも必要になります。

なお、PC-9801用の丸形マウスコネクタとIBM-PC互換機用のPS/2マウスコネクタは形状が似ていますが、信号が異なるため、PS/2マウスをPC-9801にそのまま接続して使うことはできません。ただし、PS/2マウスやUSBマウスをPC-9801に接続するための変換アダプタが販売されています。これらのアダプタは少し高価ですが、入手可能です(参考: クラシックPC研究会 や W341 連合※後者は2024年9月現在、欠品中)。

今回、ヤフオクで「未使用」として出品されていたマウスを入手しましたが、実際には「美品」相当の状態でした。外箱の透明な樹脂が変色して黄色っぽく見えますが、一応箱入りです。PC-9801用マウスで箱入りのものは珍しいと考えられます。ただし、エレコムの卵型マウスは当時よく流通していたため、このM-60Gマウス自体は特に珍しいものではありません。NEC純正にこだわる方もいるようですが、「がとらぼ」の人はそこまでこだわりはありません。

30年前のPC-9801を蘇らせる - 買ってみた編 21
外箱から取り出すと、マウス本体は綺麗でした。マウスケーブルには若干の汚れが見られましたが、拭けばきれいになる程度のものでした。

30年前のPC-9801を蘇らせる - 買ってみた編 22
マウスの底面です。
当時はボールマウスの時代だったため、このマウスもボールマウスです。机の天板やマウスパッドと擦れる部分(マウスソール)には若干のすり減りと小傷があり、このマウスが「未使用」でないことがわかります。ただし、マウスソールの傷や減りは問題ありません。
しかし、中古マウスではボタンのスイッチの使用状況が寿命に大きく影響するため、ボタンが酷使されていないことを祈るばかりです。そういった理由から、中古マウスは避けるのが良いかもしれません。同人販売のW341連合のUSBマウスコンバータが再頒布されることを期待しています。(価格が安めのため)

30年前のPC-9801を蘇らせる - 買ってみた編 23
今回はアクロスのANA505マウス変換アダプタを、地球館楽天市場店で新品で購入しました。価格は本体630円、送料が590円でした。マウス本体より高いですが、ヤフオクで購入するよりは安いです。アマゾンでは1,132円ですが、送料無料条件に合う買い物の際にはアマゾンの方が安くなりそうです。

30年前のPC-9801を蘇らせる - 買ってみた編 24
マウスの丸型コネクタをマウス変換アダプタに接続し、そのアダプタをPC98本体の角型ポートに挿します。場合によっては、マウス変換アダプタの方がフロントパネルの穴より大きいかもしれませんが、先にマウス変換アダプタを本体に挿してネジで固定し、その後にフロントパネルをはめてマウスを接続します。マウス変換アダプタは本体に接続しっぱなしで問題ないと思われます。

30年前のPC-9801を蘇らせる - 買ってみた編 25
PC98の初期モデルについては記憶がありませんが、中期以降のモデルではキーボードの「HELP」キーを押しながら電源を投入するか、リセットキーを押しながら「HELP」キーを押すことで「システムセットアップメニュー」が表示されます。これは、現在のPCのBIOS画面に似たものです。このメニューで、ディップスイッチ以外のモード変更が可能になります。

30年前のPC-9801を蘇らせる - 買ってみた編 26
同上

30年前のPC-9801を蘇らせる - 買ってみた編 27
同上

システムセットアップメニューが表示されたことで、今回購入したモデルは電源もマザーボードも正常に動作していることが確認できました。また、ハードディスクも正常に動作しており、ハードディスクからOS (MS-DOS)が起動することが確認できました。ただし、元々インストールされていたMS-DOSはconfig.sysやautoexec.batにOS起動が完了しないようなトラップが仕掛けられていたため、MS-DOSが起動起動中の処理でループに陥り、その後の操作ができない状態でした。しかし、本体が正常に動作することは確認できたので、問題ありません。(次の動画)

N88 BASIC(DISK BASICではなくROM BASIC)を起動し、非常にシンプルな日時表示のプログラムを実行してみました(次の動画)。

ディスプレイについては触れていませんでしたが、PC98のノーマルモード (640x400ドット表示)を使うためには、ディスプレイが水平同期24MHz (24.83MHz)に対応している必要があります。現在販売されているディスプレイの多くは31MHz程度から対応しているため、PC98の画面を表示できないことがほとんどです。ただし、カタログでは31MHz以上の対応が記載されていても、実際には24MHzに対応している製品もあるようです。うちにあるディスプレイではBenQのBL2400というモデルはPC98の画面を表示することができました。ただし、BL2400は24インチディスプレイなので写真のパソコンラックでPC9801FAの上に置くと上の棚に当たって設置できませんでした。(パソコンラックは2,30年前風でPC-9801によく似合います。ちなみに、ジモティでの戴きものです。)

日本ブランドで販売されているスクエア型(4:3のアスペクト比)のディスプレイには、24MHzに対応している製品がいくつか存在します。今回購入したアイ・オー・データのTN液晶ディスプレイLCD-AD173SEWは、7年前に生産を終了した製品ですが、公式に24MHz対応とされていたため選びました。ただし、PC98のディスプレイのアスペクト非は16:10であるのに対してLCD-AD173SEWは4:3で、アスペクト比の調整ができないモデルのため想定より縦長に映ります。つまり、円を表示すると縦に引き伸ばされて表示されます。最近主流の横長画面のディスプレイは、16:9が多いため横に伸びて表示されます。つまり、円が横に引き伸ばされます。どちらもゲームをしないならあまり問題ないでしょう。アスペクト比を調整可能なディスプレイであれば、上下または左右のどちらかに使用されない帯が発生するものの正しいアスペクト比で表示することが可能です。
30年前のレトロPCを体験したいからといって、ブラウン管ディスプレイを使うのはちょっと…と思ったので、今回は液晶ディスプレイにしました。

今回は、入手したPC-9801FAが不動品ではなく、動作することを確認しました。今後は、このPC98を実用に耐えられる状態に整備していきます。また、見た目もきれいに仕上げたいと思います。

関連記事:

Rock Pi SとChronyでPPS付きNTPサーバを作る

Rock Pi SとChronyでPPS付きNTPサーバを作る

今回は、Rock Pi SにGPSモジュールを接続し、NTPd(またはNTPsec)ではなくChronyを使ってPPS付きのNTPサーバを作成します。最近のLinuxディストリビューションではChronyが標準搭載されることが増えており、ChronyはNTPd(やNTPsec)よりも積極的に補正を行い、精度が高いとされています。以前はNTPd(やNTPsec)の統計ログとChronyの形式が異なり不便なため、「がとらぼ」の人はChronyを避けていましたが、今回はLAN用のNTPサーバで統計ログを分析する予定はないのでChronyを選ぶことにしました。

Chronyについては過去に3回ほど取り上げており、今回も基本的には同じ手順です。
Rock Pi SでのUARTとPPSの利用に関しては、他のシングルボードコンピュータでも参考になる情報があるかと思います。
先月、NanoPi NEO3をNTPサーバにする際に購入した屋外用GPSアンテナです。このアンテナはSMA端子付きでケーブルが3mです。取り付けには直径12mm以上の穴が開いたL型アングルに固定するか、内径11mmのパイプにねじ込むことができます。
今回新しく購入した屋外用GPSアンテナは、コンパクトで高さが抑えられています。SMA端子付きでケーブルが3mです。取り付けには直径11mm以上の穴が開いたL型アングルに固定するか、内径10mmのパイプにねじ込むことができます。ネジの規格にご注意ください。
このGPSモジュールはu-bloxのGPS受信チップと互換性があり、基板上にはパッチアンテナが付いておらず、SMAとIPEXのアンテナ端子が装備されています。少し怪しい製品ではありますが、過去に「新しい中華GPSモジュールとChronyで作るNTPサーバ (前編)」で紹介したGPSモジュールと同じもので、安価ながら意外と良好な性能を発揮しています。

Rock Pi SとChronyでPPS付きNTPサーバを作る 2
今回のアンテナは、自動車用のGPSアンテナよりも一回り大きい、比較的背の低いモデルです。

Rock Pi SとChronyでPPS付きNTPサーバを作る 3
アンテナの下部にはゴムカバーがありますが、このカバーは水が溜まりやすいため、使用しない方が良いでしょう。白い円盤は両面テープの保護シートです。黒いカバーを貼り付けることもできますが、10mm以上の穴があるプレートに固定することも可能です。さらに、内径10mmのパイプにねじ込んで固定することもできます。ただし、ケーブル穴の防水状態が不明なため、ゴム系接着剤を穴に流し込み固まった後にアンテナを設置するのが安全です。

Rock Pi SとChronyでPPS付きNTPサーバを作る 4
購入したGPSチップは左側の「ATGM332D」と書かれたものです。右側は「u-blox NEO-M8N」とされていますが、左側のGPSとほぼ同じ価格の1000円前後の安価な製品であるため、本物ではない可能性が高いです。シールも汚れており、信頼性に疑問があります。モジュールの基板自体は似ていますが、搭載されている部品は微妙に異なります。

右側の「NEO-M8N」と表示されたチップは、出力されるNMEAメッセージに異常があり、u-blox GPSチップ用のコマンドをシリアル通信で送信しても機能しません。もし本当にu-bloxチップであれば、u-blox用のPCアプリなどで制御できる可能性がありますが、まだ試していません。

Rock Pi SとGPSモジュールの接続

Rock Pi SとChronyでPPS付きNTPサーバを作る 1
Rock Pi SとGPSモジュールはGPIOピンを利用して接続します。

  • ピン番号17: GPSモジュールVCCに接続します
  • ピン番号20: GPSモジュールGNDに接続します
  • ピン番号23: GPSモジュールTX(送信)に接続します (RXとTXを接続)
  • ピン番号24: GPSモジュールRX(受信)に接続します (RXとTXを接続)
  • ピン番号13: GPSモジュールPPSに接続します

一般的なシングルボードコンピュータでは、右上のUART(このボードではUART0)を使用してシリアル通信を行います。しかし、Rock Pi SのUART0はデバッグ専用UARTであり、このピンにGPSモジュールなどを接続するとOSが起動しません。OSが起動した後にUART0に接続すれば通常のUARTとして使用できますが、これは不便ですし、瞬間的な停電などで再起動がかかると、OSが起動できずにダウンタイムが長引くことになります。そのため、素直にUART1(右下)などを使用するのが良いでしょう。

ArmbianのOSイメージ

8月中旬に最新のArmbianソースを使って、Rock Pi S用のDebian Bookworm OSイメージをビルドしました。PPSやタイマー周りは、これまで通りNTPサーバ向けの設定でビルドしています。OSイメージは以下で共有します。

置き場所(Google Drive):
Armbian-unofficial_24.8.0-trunk_Rockpi-s_bookworm_current_6.6.46.zip

PPSデバイスの有効化

Armbianでは、デバイスツリーによるデバイス周りの設定の追加や変更が比較的簡単に行えます。今回は、デバイスツリーソースでRock Pi SのGPIO0_C0 GPIO13番ピンをGPIO-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,rk3308";
    fragment@0 {
        target-path = "/";
        __overlay__ {
            pps: pps@0 {
                compatible = "pps-gpio";
                gpios = <&gpio0 16 0>;
                assert_falling_edge;
            };
        };
    };
};

重要なのは11行目です。今回はピン番号13を使用しますが、これはGPIO0のGPIO番号16番に対応しているため、このように記述します。もしピン番号15を使用する場合は、GPIO0のGPIO番号17番に対応するので、&gpio0 17 0のように記述します。対応表がないと理解しづらい部分です。

最近のArmbianには、デバイスツリーのソースを変換・配置・設定を自動で行うツールが含まれています。

# armbian-add-overlay ~/pps-overlay.dts

これにより、変換されたpps-overlay.dtboファイルがboot/overlay-userディレクトリに配置され、/boot/armbianEnv.txtに次の1行が追加されます。

user_overlays=pps-overlay

システムを再起動することでGPIO13番ピンに紐付いた/dev/pps0が生成されます。

# dmesg | grep pps
[    0.254397] pps_core: LinuxPPS API ver. 1 registered
[    0.254406] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <giometti@linux.it>
[    9.320594] pps pps0: new PPS source pps@0.-1
[    9.320742] pps pps0: Registered IRQ 44 as PPS source
[   23.940029] pps_ldisc: PPS line discipline registered


# lsmod
Module                  Size  Used by
pps_ldisc              16384  2
sunrpc                483328  1
8723ds               1327104  0
cfg80211              802816  1 8723ds
hci_uart              135168  0
btqca                  20480  1 hci_uart
btrtl                  28672  1 hci_uart
btintel                40960  1 hci_uart
btbcm                  20480  1 hci_uart
pps_gpio               12288  1
bluetooth             663552  6 btrtl,btqca,btintel,hci_uart,btbcm
rfkill                 24576  4 bluetooth,cfg80211
rockchip_rng           16384  0
rng_core               16384  1 rockchip_rng
cpufreq_dt             16384  0
lz4hc                  12288  0
lz4                    12288  0
zram                   32768  3
binfmt_misc            20480  1
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

lsmod コマンドを使って、pps_gpio モジュールが表示されることを確認します。なお、上記の lsmod の結果は、NTPサーバーの動作に不要なカーネルモジュールを /etc/modprobe.d/blacklist-rockpi-s.conf でブラックリストに登録済みの状態です。ブラックリストに登録していない場合は、表示されるモジュールがこれよりも多くなります。

# 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 1724375360.627367312, sequence: 120015 - clear  0.000000000, sequence: 0
source 0 - assert 1724375361.710659761, sequence: 120016 - clear  0.000000000, sequence: 0
source 0 - assert 1724375362.794035625, sequence: 120017 - clear  0.000000000, sequence: 0
source 0 - assert 1724375363.877368518, sequence: 120018 - clear  0.000000000, sequence: 0

次に、pps-tools をインストールし、/dev/pps0 をデバイスとして指定してテストを実行します。1秒ごとに1行ずつ表示され、問題がないことを確認したら、[Ctrl]+[C] で終了します。

シリアルポートUART1の有効化と設定

Rock Pi Sでは、UART0がデバッグUARTとして設定されており、UART0にGPSモジュールなどを接続した状態で電源を入れるかシステムを再起動すると、OSが起動しないことがあります。Armbianでは、UART0が ttyS0 として有効化されているのですが、このポートを使用するとOSが起動しないため、UART1(それ以降)をGPSモジュールとの通信用に使用するのが良いでしょう。今回はUART1を使用することにしますが、Rock Pi S用Armbian BookWormではUART1(ttyS1)が無効になっているため、これを有効化する必要があります。(次)

# vim ~/uart1-overlay.dts (新規作成)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
/dts-v1/;
/ {
    compatible = "rockchip,rk3308-uart\0snps,dw-apb-uart";
    fragment@0 {
        target-path = "/serial@ff0b0000";
        __overlay__ {
            status = "okay";
        };
    };
};
# armbian-add-overlay ~/uart1-overlay.dts

これにより、変換されたuart1-overlay.dtboファイルがboot/overlay-userディレクトリ下に配置され、/boot/armbianEnv.txtのuser_overlays行が次のようになります。

user_overlays=pps-overlay uart1-overlay

システムを再起動することでUART1の/dev/ttyS1が有効化されます。

# stty -F /dev/ttyS1 9600  ←RockPi Sのシリアル速度をGPSモジュールのシリアル速度に合わせる
# cat /dev/ttyS1

NMEAメッセージが表示され続けることを確認できれば成功です。[Ctrl]+[C]で終了します。

/dev/pps0と/dev/ttyS1を後述のgpsdとchronyが利用できるようにします。

# vim /etc/udev/rules.d/10-gps.rules (新規ファイル作成)
1
2
KERNEL=="ttyS1",MODE="0666"
KERNEL=="pps0",MODE="0666"
この設定はシステムを再起動しないと適用されません。
手動で即時有効にするのは
# chmod 0666 /dev/ttyS1
# chmod 0666 /dev/pps0

シリアルポートの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だけでも良いかもしれません。

gpsdのインストールと設定

chrony はGPSモジュールから送信されるNMEAメッセージを直接読み取ることができないため、gpsd を使って受信し、メモリ共有で chrony に日時を渡すようにします。そのために、gpsd と gpsd-clients をインストールします。

# apt update
# apt install gpsd gpsd-clients
gpsdの設定ファイルは/etc/default/gpsdです。
1
2
3
4
START_DAEMON="true"
USBAUTO="false"
DEVICES="/dev/ttyS1"
GPSD_OPTIONS="-n -s 9600"
gpsdを再起動します。
$ sudo systemctl restart gpsd.socket
gpsdが正常に動作し、GPSモジュールから衛星データを受信しているか確認するには、 gpsmoncgps -s コマンドを実行します。表示される日時や座標が正しければ、正常に動作しています。

chronyの設定

最近のLinuxでは、NTPの標準としてChronyが採用されることが増えています。Chronyの設定ファイルは通常 /etc/chrony/chrony.conf にあります。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# NTP Servers (mfeed)
server ntp1.jst.mfeed.ad.jp
server ntp2.jst.mfeed.ad.jp
server ntp3.jst.mfeed.ad.jp
server ntp1.v6.mfeed.ad.jp
server ntp2.v6.mfeed.ad.jp
server ntp3.v6.mfeed.ad.jp

# Access loopback address
allow 127.0.0.1
allow ::1

# Allow access from your IPv4,IPv6 networks 
allow 192.168.0.0/24
allow 2001:xxxx:xxxx:xxxx::/64

# Allow mfeed servers but restrict their actions
allow 210.173.160.27
allow 210.173.160.57
allow 210.173.160.87
allow 2001:3a0:0:2001::27:123
allow 2001:3a0:0:2005::57:123
allow 2001:3a0:0:2006::87:123

# NMEA GPS 
refclock SHM 0 refid NMEA 

# PPS (Pulse Per Second)
refclock PPS /dev/pps0 refid PPS lock NMEA
chronyを再起動します。
$ sudo systemctl restart chrony
PPSを使う場合は、最初の時刻合わせに時間がかかるためchrony 起動後しばらく待ちます。
$ chronyc sources
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
#x NMEA                          0   4   377    22   +413ms[ +413ms] +/- 2700us
#* PPS                           0   4   370    72  +9308ns[  +13us] +/- 3294ns
^- ntp1.jst.mfeed.ad.jp          2  10   377   115  -1347us[-1332us] +/-   61ms
^- ntp2.jst.mfeed.ad.jp          2  10   377   788   -193us[ -246us] +/-   52ms
^- ntp3.jst.mfeed.ad.jp          2  10   377    53   -385us[ -385us] +/-   61ms
^- ntp1.v6.mfeed.ad.jp           2  10   377   498  -1075us[-1068us] +/-   55ms
^- ntp2.v6.mfeed.ad.jp           2  10   377   655  -1998us[-2029us] +/-   54ms
^- ntp3.v6.mfeed.ad.jp           2  10   377   785  -1297us[-1352us] +/-   75ms
$ chronyc tracking
Reference ID    : 50505300 (PPS)
Stratum         : 1
Ref time (UTC)  : Fri Aug 23 14:09:03 2024
System time     : 38248.757812500 seconds slow of NTP time
Last offset     : +0.000002095 seconds
RMS offset      : 0.000305083 seconds
Frequency       : 26.998 ppm fast
Residual freq   : +0.008 ppm
Skew            : 0.082 ppm
Root delay      : 0.000000001 seconds
Root dispersion : 0.000023679 seconds
Update interval : 16.0 seconds
Leap status     : Normal

このような表示になります。
GPSから時刻を取得しているため、最上位のStratum 1として表示されます。Stratumの数字が大きくなるほど、大本の時刻ソースからの間にホストが増えることを示します。これは、伝言ゲームのように、間に入る人が増えるほど伝言が不正確になるのと似ています。
PPS (パルスパーセカンド)での秒合わせにより、誤差はナノ秒単位に迫ります。

時刻の正確さが求められる環境では、GPSのPPS信号を利用して時刻合わせを行うNTPサーバがLAN内に1台は必須です。NTPサーバは、ネットワーク内の全てのデバイスが同じ正確な時刻を持つようにするための重要な役割を果たします。GPSのPPS信号は、高精度な時刻合わせを可能にし、ネットワーク全体の時刻のずれを最小限に抑えることができます。この記事のようにシングルボードコンピュータを使用すれば、GPSモジュールとPPS機能を搭載したNTPサーバのセットが、6〜7千円程度で手に入ります。この価格で一式を揃えることができるため、コストパフォーマンスに優れており、多くの企業や技術者にとって非常におすすめです。高精度な時刻同期が求められるシステムには、このようなNTPサーバの導入を検討してみる価値があります。

関連記事:
Up