10年前の液晶を発掘!ラズパイ壁掛けコックピットモニター化

リビングの壁際で長年時を刻んでくれていた置時計が、ある朝ついに電池を替えてもピクリとも動かなくなってしまいました。

「新しい時計を買おうかな」と思ったのですが、ふと自室のパーツボックスを漁ってみると……約10年前に購入して眠っていた7インチの小型液晶モニター(1024×600)を発掘!

「これと、自宅で24時間365日動かしている GMO-Coin FX 自動取引マシンの Raspberry Pi 4B(8GB RAM) を組み合わせれば、視認性抜群の壁掛けデジタル時計が作れるのでは?」

そう思い立って早速時計モニターを作って壁に掛けてみたところ、大満足の仕上がりに!しかし、時計を眺めているうちに「せっかく常時動いているパワフルなラズパイがあるのに、時計の表示だけで画面を占有するのはもったいない……どうせなら取引状況も天気もニュースも一望できる『情報コックピット』に魔改造しよう!」と欲が出てしまいました。

全3回の連載形式で、壊れた置時計の代替からハード設定、夜間のUSB電源消灯&Discord連携、UIの断捨離設計、そしてAIペアプログラミングによる堅牢化まで余すところなくお届けします。

💡 生成AI活用のメモ 本記事で紹介しているラズパイ壁掛けモニターの設計・実装および動作検証は Gemini(UIプロトタイプ)× Claude(堅牢化・システム設計) とのペアプログラミングで実施し、記事の構成・執筆もGeminiでまとめています。

1. 壊れた置時計の代わりに「壁掛け特大デジタル時計」を作ってみた

まずは今回の発端となった「壊れた置時計の代わり」として、最初に製作した実機の壁掛け時計をご覧ください!

Raspberry Pi 壁掛け時計モニター実機写真

7インチの小型液晶(Longrunner製ケース一体型)をリビングの壁にフック掛けし、Python(Tkinter)で自作した時計ダッシュボードを表示させています。

こだわったポイント

  • 圧倒的な視認性: 2〜3メートル離れたリビングのソファからでも、眼鏡なしでパッと現在時刻(時・分・秒)と曜日が読み取れる超特大フォント。
  • 風景壁紙との調和: 部屋のインテリアに馴染むよう、高解像度の風景写真を背景に配置。
  • 全画面タッチ操作: 画面のどこかを1回タップするだけで、メニューやメンテナンス用パネルが呼び出せる直感UI。

これで「置時計が壊れた問題」は無事に解決!……したはずでした。


2. 欲が出た。「時計だけじゃもったいない!情報コックピットに魔改造しよう」

壁に掛けて数日過ごしてみると、ふと頭をよぎったのです。

「このラズパイは、裏で24時間ずっと GMO-Coin FX の自動取引ボット を走らせているメイン稼働機(8GB RAM)。せっかく常に動いていて余力もあるのに、画面の大半を時計だけで使っているのは贅沢すぎるのでは……?」

「普段スマホやPCでわざわざチェックしている天気、経済指標、速報ニュース、そして足元で自動売買している暗号資産FXの口座残高まで、ひと目で全部見えたら最高じゃないか!」

こうして、ただの置時計から「男のロマンを詰め込んだ壁掛け常時表示コックピットモニター」への大魔改造が幕を開けました。

最終的に完成したコックピット画面

試行錯誤とレイアウトの極限断捨離を経て完成したのが、こちらの画面です!

Raspberry Pi 壁掛けコックピットモニター実機画面

7インチ(1024×600)の狭小スペースに、以下の5大情報をギュッと凝縮しました:

  1. 超特大デジタル時計&カレンダー: 視認性はそのままキープ
  2. 地域のピンポイント天気予報: 気象庁データからアイコン・降水確率・気温を自動取得
  3. GMOコイン暗号資産FXのリアルタイム口座残高(左側パネル): 自動売買の稼働状況(純資産 xxx,xxx円、評価損益 +xx,xxx円、維持率 xxx%)をリアルタイム反映(※実口座のためモザイク処理)
  4. 主要経済指標6銘柄(右側パネル): 日経平均・NYダウ・NASDAQ・ドル円・BTC・ETH(前日比カラー付き)
  5. NHK主要速報ニュース(最下段): 10秒ごとに自動スライド切り替えするテロップ帯

全3回シリーズの構成

  • 第1回(本記事): 10年前の液晶接続、解像度最適化、Waylandでの自動起動、夜間のUSB電源完全消灯&Discord連携
  • 第2回: 1024×600の狭小画面を活かしきるUI断捨離設計と、マルチスレッド非同期データ連携
  • 第3回: Geminiのやらかし4連発と、Claudeによる虫眼鏡チェック&堅牢化アーキテクチャ

今回は、ハードウェアのセットアップと「電源を入れたら即座に全画面ダッシュボードが立ち上がるOS環境づくり」、そして「夜間の眩しさを解決するUSB電源制御」を解説します!


3. 部品箱から発掘!今回のハードウェア構成

今回使用した機材はこちらです。

項目 使用パーツ・環境 備考
SBC本体 Raspberry Pi 4 Model B (8GB RAM) 自宅で24時間365日稼働している暗号資産FX自動取引マシンを兼用
ディスプレイ 7インチ静電容量式タッチスクリーン液晶 約10年前に入手。解像度 1024×600 ピクセル
映像接続 マイクロHDMI → 標準HDMI 変換アダプタ Pi 4BのMicro HDMI端子から出力
タッチ&電源 USB Type-A → Micro-USB ケーブル タッチ入力信号と液晶駆動電源をラズパイから供給
OS Raspberry Pi OS (64-bit) Bookworm 最新の公式OS環境
Display Server Wayland(コンポジタ: labwc) Bookwormの軽量Wayland標準環境

10年前の液晶とはいえ、映像入力は標準的なHDMI、タッチ入力もUSB接続(コントローラーは一般的なGoodix製)という素直な構成だったため、現代の Raspberry Pi 4B でもバッチリ動かすことができました。


4. ハマりどころ①:1024×600の特殊解像度をドットバイドットで綺麗に映す

古い小型モニターを繋ぐ際、最初につまずきがちなのが「解像度のミスマッチによる文字の滲み」です。

起きた現象

HDMIケーブルを挿して起動したところ、ラズパイ側がモニターのEDIDを誤認し、一般的な「1280×720」や「1920×1080」として信号を出力してしまいました。その結果、画面のアスペクト比が狂って文字がボヤけ、とても実用に耐えない状態に……。

対処方法

現在の Raspberry Pi OS Bookworm は従来のX11ではなく Wayland(labwc) が採用されています。そのため、古い解説記事によくある /boot/config.txt の hdmi_group や hdmi_mode の設定は無視されてしまいます。

今回は、Waylandのディスプレイ設定ツール wlr-randr でモニターの出力名を確認した上で、カーネル起動パラメータまたはコンポジタ側で解像度を明示指定しました。

# 現在の出力ポートと対応解像度を確認
wlr-randr

接続ポート(例: HDMI-A-1)に対して 1024x600@60Hz がドットバイドットで設定されると、先ほどまでの滲みが嘘のように消え、小さな英数字やグラフの線がクッキリと鮮明に表示されるようになりました!

✨ TIP

小型液晶で解像度が自動判定されない場合は、/boot/firmware/cmdline.txt の末尾(1行のまま改行しないこと)に video=HDMI-A-1:1024x600M@60 を追記して再起動する方法も効果的です。


5. ハマりどころ②:USB静電容量式タッチパネルの認識

次にタッチパネルの動作確認です。

デバイスの認識確認

液晶基板のタッチ用Micro-USB端子をラズパイのUSBポートに接続し、ターミナルでデバイスが認識されているかチェックします。

# USBデバイス一覧の確認
lsusb

出力の中に Goodix Capacitive TouchScreen というデバイス名が無事見つかりました。さらに、Linuxの入力イベントデバイスとして割り当てられているかを libinput で確認します。

# 入力イベントデバイスの確認
libinput list-devices

無事に /dev/input/event* としてポインタデバイスが割り当てられていればOKです。

Python(Tkinter)での入力受け付け設計

平常時は壁掛け時計・モニターとして眺めますが、画面のどこかをタップした時にメニューを出せるよう、Tkinter側ではルートウィンドウ全体にタップイベントをバインドしています。

# ウィンドウ全体でマウス左クリック&タッチタップを検知
root.bind("<Button-1>", on_screen_tap)

USBタッチコントローラーがOS標準のHIDポインティングデバイスとして認識されるため、特別なドライバを入れなくてもマウスクリックとまったく同じコードでタップを拾うことができます。


6. ハマりどころ③:電源を入れたら即全画面起動!Wayland時代の完全自動起動

壁掛けモニターとしてリビングに常設する以上、「コンセントに挿したら、キーボードもマウスも触らずに自動でダッシュボードが全画面起動する」ことは絶対条件です。

しかし、ここが今回の環境構築で最大の落とし穴でした。

【やらかし談】起動設定の三つ巴で画面が3枚重なる!?

「確実に自動起動させたい!」と焦るあまり、初期の検証段階で以下の3箇所すべてに起動設定を書いてしまいました。

  1. ~/.config/systemd/user/ の systemd ユーザーサービス
  2. ~/.config/autostart/ の .desktop ファイル
  3. ~/.config/labwc/autostart のシェル記述

その結果どうなったかというと……OS起動時にまったく同じPythonプロセスが3つ同時に立ち上がり、画面の最前面を取り合って激しく点滅&CPU使用率が跳ね上がる大惨事が発生(笑)。

【決定版】Wayland環境に最適な systemd ユーザーサービス

Wayland環境では、デスクトップセッションが完全に立ち上がり、Waylandの通信ソケット(wayland-0)が準備できる前にアプリを起動しようとすると、「Display not found」で即座にクラッシュします。

そこで、「GUIセッションの準備完了を待ってから立ち上がる systemd ユーザーサービス」を1本だけに絞って設定するのが最も美しく安定します。

作成したサービスファイルがこちらです:

~/.config/systemd/user/cockpit_display.service

[Unit]
Description=Pi-Cockpit Multi Monitor Dashboard
After=graphical-session.target
Wants=graphical-session.target

[Service]
Type=simple
Environment=WAYLAND_DISPLAY=wayland-0
Environment=DISPLAY=:0
Environment=XDG_RUNTIME_DIR=/run/user/1000
ExecStart=/usr/bin/python3 /home/pi/cockpit_display/cockpit_display.py
Restart=on-failure
RestartSec=5

[Install]
WantedBy=graphical-session.target

設定のポイント

  • After=graphical-session.target / Wants=graphical-session.target:Waylandデスクトップが立ち上がった後に起動するよう依存関係を定義。
  • Environment=WAYLAND_DISPLAY=wayland-0 / Environment=XDG_RUNTIME_DIR=/run/user/1000:GUI描画に必要な環境変数をサービス内で明示。
  • Restart=on-failure:万が一ネットワークエラーや例外でアプリが落ちても、5秒後に自動で復活。

設定後は、以下のコマンドでサービスを有効化します。

# systemd設定のリロード
systemctl --user daemon-reload

# サービスの自動起動有効化と即時起動
systemctl --user enable cockpit_display.service
systemctl --user start cockpit_display.service
💡 NOTE

なお、万が一手動コマンド等で重ねて起動してしまった場合に備え、Pythonスクリプト側でも /run/user/1000/cockpit_display.lock に対する flock(排他制御)を取得し、2重起動を物理的に遮断するガードレールも仕込んでいます。


7. ハマりどころ④:夜中に眩しい!安価液晶のバックライトを「USB電源制御&Discord連携」で完全消灯する

壁掛けモニターが無事に動き出し、いざリビングに常設運用を始めた日の夜、思わぬ実用上のトラブルが発生しました。

「部屋を真っ暗にすると、液晶の明かりが眩しすぎて寝られない……!」

単なる「黒画面」ではダメな理由

「夜間になったら画面全体を黒く塗りつぶせばいいのでは?」と考えたのですが、安価な小型液晶パネルの宿命としてバックライトの光漏れがあります。画面を真っ黒にしても、液晶の裏側からLEDバックライトが煌々と漏れ出し、部屋がぼんやりと青白く光ってしまうのです。

さらに、高級モニターなら対応している「HDMI経由のDPMS省電力信号(wlopm --off など)」やバックライト調光コマンドも、10年前の安価な汎用液晶基板には一切効きませんでした。

解決策:USBポートの給電を物理的にOFFにして完全消灯!

そこで目をつけたのが、「モニター基板の電源はラズパイのUSBポートから取っている」という点です。

Raspberry Pi 4B のUSBハブコントローラーは、ツールを使うことでポート単位(またはハブ単位)で給電のON/OFFをソフトウェアから物理的に制御できます。

# USBハブ電源制御ツール uhubctl のインストール
sudo apt-get install uhubctl

# モニターが接続されているUSBポートの給電をOFF(完全消灯!)
sudo uhubctl -l 2 -a 0

# 給電をON(モニター再点灯)
sudo uhubctl -l 2 -a 1

USB電源そのものをカットすることで、液晶パネルだけでなくバックライトLEDも完全に消灯し、夜間の真っ暗なリビングでも1ミリも光が漏れない真の「真っ暗」を実現できました!

新たな壁とDiscord連携:消灯するとタッチで起きない!

しかし、ここでまた新たな問題にぶつかりました。
「USB電源を切ると、同じケーブルで繋がっているUSBタッチパネルも電源が落ちるため、画面をタップしても復帰できない」のです。

朝起きて点灯させるために、わざわざキーボードを挿したりSSHでログインするのはあまりに面倒……。

そこで、我が家で24時間稼働している Discord Bot と連携させました!

【Discord操作のイメージ】
ユーザー: /screen off
Bot: 🌙 モニターを消灯しました(USB給電OFF)

ユーザー: /screen on
Bot: ☀️ モニターを点灯しました(USB給電ON)

スマホのDiscordアプリからコマンドをポチッと送るだけで、ベッドの中にいながらでも、外出先からでもモニターの消灯・点灯をスマートに遠隔操作できるようになりました!


8. まとめ&次回予告

約10年前に購入して押し入れの奥で眠っていた7インチ液晶が、Raspberry Pi 4B(8GB)と最新の Bookworm(Wayland)環境で見事に現代に蘇りました!

最初は「壊れた置時計の代わり」として作ったシンプルな壁掛け時計でしたが、電源を入れるだけで自動起動し、夜間はUSB電源制御&Discord連携でスマートに消灯できる強固なハードウェア基盤が完成しました。

次回予告:第2回 UIレイアウト断捨離&非同期データ連携編

ハードウェアとOS運用の土台が整ったところで、次回はいよいよ画面の中身のソフトウェア設計に入ります。

  • 1024×600の狭小画面に5大情報をどう詰め込むか?
  • 固定タイトルや枠線を極限まで削ぎ落とす「UI断捨離」とマスターからの容赦ないダメ出し
  • GMO自動取引ボットと並行して動かしつつ、時計描画を1ミリもフリーズさせない非同期マルチスレッド設計

などを詳しく解説します。古いラズパイや余っている小型液晶をお持ちの方は、ぜひ次回もチェックしてみてくださいね!

✨ TIP

🍸 電脳酒場のウラ話:
実はこの自動起動の多重起動バッティングや、後述するデータの取得バグの裏側では、GeminiとClaudeによる壮絶なドタバタ劇が繰り広げられていました……(笑)。その赤裸々な反省会は、別館ブログ・電脳酒場の 第10話:動いてる“フリ”の壁掛けコックピット 〜ジェミのハリボテ大作戦と、クロードの虫眼鏡〜 にて公開中です!あわせてお楽しみください。