車載PC/サーバーを試みた

車を買ったので車載 PC/サーバーができるかどうか試みたメモ。

まず、 PC としてはスティック PC を購入して使用することにした。大がかりな作業をしない前提の場合車内は基本的に場所がないのと、 USB PD 12V で電源供給できるのでシガーソケットから電源を供給しやすいのが理由。バッテリーの類は今回準備せずにシガーソケットに刺したアダプターからの USB 電源をそのまま使い、エンジンを切るとシステムが強制終了される問題は一旦無視することにした。

なお、夏場の車内に放置されることを想定し、分解して一応ボタン電池らしきパーツを撤去した。そのため給電されていない間は時計が動作しないが、 systemd-timesyncd は起動時に時刻を同期してくれるようだった。Windows 11 はそうもいかなかったが、昔懐かし桜時計をインストールして Windows のタスク起動機能からログイン時に特権起動するようにする(Windows 10で桜時計を自動起動させる : りんご便り)ことでログイン時に時刻を同期することにした(ログイン前に表示される時計はずれた状態になる)。

サーバー機能としてはせっかくなので自宅との VPN と直接繋がり、自身に保存されているデータはインターネットを通さず LAN 内完結で通信できる無線 LAN を準備することにした。そのため PC は内蔵のものと別途に USB ドングル型 WiFi アダプタを接続して計2つの Wifi アダプタを搭載し、片方は LTE を利用した車載用 WiFi に一旦接続し、もう片方で hostapd を利用して WiFi の電波を飛ばすことにした。今回購入したドングル型のアダプタ(TL-WN725N)はウェブ検索すると hostapd で使っている人もいるようなのだが(ラズパイを無線LAN 2つでルーター化(アクセスポイント化) – サイバーまめカンの電豆館無線LANのアクセスポイントをNetBSDとhostapdで構築してみる #AdventCalendar – Qiita) Ubuntu (Kubuntu) 24.04 標準の hostapd ではうまく認識させることができなかった。内蔵の Intel Wireless-AC 9560 は普通に設定を書いたら動作したので内蔵の方を AP とし、 USB ドングルの方を車載 WiFi への接続とした。Intel Wireless-AC 9560 の方も Kubuntu の GUI の NetworkManager 設定からだとパスフレーズありの AP をうまく立てることができないようだったが、 hostapd の設定を書けば問題なく動作した。

PC としても使えるようにするためや一応車内にあるものだけである程度の作業が行えるようにするため、車載ナビ(7型タッチパネル世代のマツダコネクト)への映像出力を行えるようにした。正直なところ車載 PC があるのって夢があるよね、程度ではあるのだが、一応実用的と思われる用途として常に首都高の渋滞情報等が画面に表示されるようにしておき必要に応じてすぐ参照できるようにすることは想定した。

今回はOttocast Car Tv Mate Max ( 第4世代 )という、 HDMI-in の映像を有線 Car Play プロトコルで車に流す治安の悪いアダプタを使用した。

ただし、そのままだと次の問題があった。

  • HDMI-in からの映像を表示した状態で HDMI に普通に PC を繋ぐと、 Kubuntu (おそらく素の Ubuntu でも同じ?)の場合 GRUB 時点では問題ないが起動までにカーオーディオが Car Play に切り替わってしまう(Car Tv Mate Max の HDMI-in は本来走行中に動画を再生するためのもののようなので、 HDMI-in からの映像を表示しておりさらに HDMI-in から音声信号が来ているならこの挙動は本来自然なのだが、ちょっと渋滞情報を見たいだけなのにオーディオソースを持っていかれてカーオーディオが止まっても困る)
  • Car Tv Mate Max が車の USB 端子に接続された時点で、マツダコネクトの画面が Car Tv Mate Max に切り替わってしまう(戻す操作は走行中であってもブロックされていないが、運転中にしたくない程度には煩雑)
  • では Car Tv Mate Max を必要な時だけ繋げば良いのかというと、ディスプレイが一つも接続されていない場合 Kubuntu (おそらく素の Ubuntu でも同じ?)はそもそも X が起動しないため、あとからディスプレイを接続しても X が起動しなかった
  • なお、 USB 側が接続されていない Car Tv Mate Max に HDMI だけ接続しても、ディスプレイは認識されなかった。

この問題を解決するため、以下のような方法をとった。

  • /etc/modprobe.d/ 以下で blacklist snd_hda_intel と指定し、起動時にサウンドデバイスが有効化されないようにする。これにより PC 画面に切り替えてもオーディオソースが持っていかれないようになった。
    • なお、起動後に PC からオーディオを利用したい場合は sudo modprobe snd_hda_intel を実施して音を流すことで PC からの音が車載オーディオから流れるようになった。
  • USB-A の接続の間に入って電源オンオフしてくれるスイッチ(今回はアイネックス ADV-111Bをヨドバシドットコムで購入)を設置し、 Car Tv Mate Max の接続オンオフを容易に行えるようにした
  • HDMI ダミープラグを本来のモニタと別途に接続し、モニタがあるように見せかけ、必要なモニタが接続された状態でミラーリングになるよう設定した(X の dummy driver も試したが本来のモニタが認識されなくなった)

これにより、スイッチを入れれば10秒程度で車載の画面に PC 画面が表示され、スイッチを切れば純正ナビに戻るようになった。

(2025/02/17 追記: キーボードに関してはAREA SD-KB24GBT (C)を購入し、バッテリーを外して使用することにした。バッテリーを外しても USB 給電があれば利用でき、 USB ドングルで使えば BIOS 画面や GRUB の操作もできるようだ。Car Tv Mate Max の USB ポートから電源を供給して利用できた。)

なお、冒頭に書いた通り電源は特に対策せずエンジンオフで強制終了されるままとしている。調べてみる限り、Mini-BOX M4-ATX-HVのように車載 PC に 12V 電源を供給することを目的とし ACC の他に常時電源を利用しつつ PC にエンジンオフを通知し電圧低下等で停止する機能がついた製品や、iCELL B6Aのように Li-ion より高い温度でも安全性の保たれるバッテリーを用いたドライブレコーダー用途の車載バッテリーもあるようなのだが、大掛かりになりそうなので一旦今回はなしとした。