hello (visible) world.

某庁の現業室にある時計を再現してみた

2025.05.27 · 2525 words · 6 minute read
この記事ではアフィリエイト広告を利用しています
dev , Raspberry Pi , Signage

某庁のオペレーションルーム(現業室)を見学した時、天井から吊るして設置されていた時計がカッコよかったので、余っていた小型横長液晶モニターで再現してみた。

オペレーションルームの時計なので opr-clock と命名した。何の捻りもない。

https://github.com/9SQ/opr-clock

仕組みとしては、上下2段の時計をPILでレンダリングしてnumpyで画像を回転&RGB565形式に変換し、フレームバッファに書き込んでいるだけ。

セグメントが非点灯の部分も薄らグレーで表現したり、現地見学と報道写真から は0パディングする事が分かっているので再現したり、というのがこだわりポイント。

Xで公開したところ、欲しいという声があったので作り方を以下にまとめておきます。

1. opr-clockの材料

Raspberry Pi Zero 2 Wとヒートシンク、MicroSDカード

  • Raspberry Pi Zero 2 W
    Raspberry Pi 3 A+Raspberry Pi 4 でも良いが、opr-clockだけを動かすならそんなにスペックは要らないので、余って転がってない限りは安い Raspberry Pi Zero 2 W で十分。
    ただし、有線LAN接続が必要な場合は、Raspberry Pi 3 B+ や Raspberry Pi 4 を使うしかない…

  • MicroSDカード
    32GB以上あれば余裕があるはず。今回はSanDiskのHigh Endurance(高耐久)64GBを選んだけれど、最後にOverlayfsにするので余程安くて怪しい物でなければ通常版でも良いはず。

  • ヒートシンク
    Raspberry Pi用の小さいヒートシンク。貼っておくことをお勧めする。

Wisecoco 8.8インチ小型モニター

  • 解像度480x1920pxの横長モニター
    私は以前買って家に転がしてた ツイ廃液晶Neo を使ったが、今は入手できないのでAmazonやAliexpressで似たものを調達する。
    今回は、検証用に新たに Wisecoco 8.8インチ小型モニター(8,500円)を購入したので、これを使って構築する。HDMI to Mini HDMIケーブル、USB Micro-B ケーブルがそれぞれ1本付いてくる。

  • HDMI to Mini HDMIケーブル
    モニターに (Full) HDMI to Mini HDMIケーブルが1本付いてくる場合は不要。

  • HDMI to Mini HDMI変換アダプタ
    Mini HDMI to Mini HDMIケーブルがあるなら変換アダプタは不要。U字になっている変換アダプタがあると、配線をモニタ裏に隠せて綺麗。

  • USB Micro-B ケーブル x2本
    モニターに1本付いてくる場合は1本不要。Raspberry Piとモニターの電源供給用。
    モニター用はU字になっているケーブルを使うと、裏に配線を隠す事ができる。

お好みでRaspberry Piのケースやモニターの固定具など、設置環境に応じて買い足してください。

2. Raspberry Piのイメージを焼く

昔はdd使ったりしてたけど、今は Raspberry Pi Imager があるので楽々。
ダウンロードしてインストールして起動したら、

  1. Raspberry Piデバイスは RASPBERRY PI ZERO 2 W を選択
  2. OSは RASPBERRY PI OS (LEGACY, 64-BIT) LITE を選択
  3. MicroSDカードをカードリーダー等に挿してストレージを選択して次へ

Raspberry Pi Imager

設定を編集するか聞かれるので、ここでホスト名ユーザー名/パスワード、そしてWi-Fiの設定SSHを有効化しておく。

ここで設定しなかった場合、Raspberry Piにキーボードを接続してCLIで諸々設定する羽目になるので要注意…

3. Raspberry Piの設定

3-1. 接続〜起動

イメージを焼いたMicroSDをRaspberry Piに挿し、HDMIケーブルを接続、USBケーブルで電源供給すると、デフォルトで以下のように縦方向のコンソールが表示されるはず。

初回起動時

この状態で、別の端末からSSHで接続して作業する。

まずはパッケージのアップデート

sudo apt update
sudo apt upgrade

念の為、fbsetを実行してモニターの情報をチェック。

mode "480x1920"
    geometry 480 1920 480 1920 16
    timings 0 0 0 0 0 0 0
    accel true
    rgba 5/11,6/5,5/0,0/0
endmode

480x1920だったらOK。

3-2. 画面の向きを設定

現状は縦向きなので横向きにして、起動中の出力も抑制する。

sudo nano /boot/cmdline.txt

初期状態で以下のような内容になっていると思う。(PARTUUIDはそれぞれ違うかも)

console=serial0,115200 console=tty1 root=PARTUUID=503ab566-02 rootfstype=ext4 fsck.repair=yes rootwait cfg80211.ieee80211_regdom=JP

rootwait の後ろに

logo.nologo quiet vt.global_cursor_default=0 video=HDMI-A-1:480x1920M@60,rotate=90

を追加して保存(Ctrl+XYEnter

この時点で一旦 sudo reboot すると、以下のように画面が横向きの状態で表示される。

横向きのログインコンソール

ちなみに、rotate=90の設定はフレームバッファの向きに影響しないので、入れても入れなくてもどちらでも良い。入れない場合は縦向きのままログインプロンプトが表示される。

3-3. NTPの設定

sudo nano /etc/systemd/timesyncd.conf

#NTP=のコメントアウトを外してNTPサーバを追加。

[Time]
NTP=ntp.nict.jp

NICTのNTPを利用しているが、お好みのものがあればそれでもOK。
保存して、NTPの同期を有効化、日時が正常に合っていることを確認。

sudo timedatectl set-ntp true
date

3-4. opr-clockのインストール

Gitをインストール

sudo apt install git

opr-clockのリポジトリをクローンしてフォントをダウンロードする。

git clone https://github.com/9SQ/opr-clock.git
cd opr-clock
mkdir fonts
cd fonts
wget https://github.com/googlefonts/kosugi-maru/raw/refs/heads/main/fonts/ttf/KosugiMaru-Regular.ttf
wget https://github.com/keshikan/DSEG/releases/download/v0.46/fonts-DSEG_v046.zip
unzip fonts-DSEG_v046.zip
cp fonts-DSEG_v046/DSEG7-Classic/DSEG7Classic-BoldItalic.ttf ./
cd ../

実行に必要なライブラリ(numpy等)はRaspberry Pi OSの場合、標準でインストールされているので、あとは実行するだけ。

python3 main.py

このように現在時刻の時計が表示されるはず。

opr-clock起動

止めてコンソールに戻る時は Ctrl+C

3-5. systemdで自動起動設定

opr-clockをサービス化して自動起動設定することで、Raspberry Piの起動時に自動的に表示される。

sudo nano opr-clock.service

以下の3箇所の pi2.Raspberry Piのイメージを焼く で設定したユーザー名に変更

ExecStart=/usr/bin/python3 /home/pi/opr-clock/main.py
WorkingDirectory=/home/pi/opr-clock
User=pi

保存してコピー、自動起動の有効化、サービスを開始。

sudo cp opr-clock.service /etc/systemd/system/
sudo systemctl enable opr-clock
sudo systemctl start opr-clock

モニターに時計が表示されていれば正常。

ここで sudo reboot すると、起動後も自動的に時計が表示される。
ちなみに、起動してWi-Fiを掴み、NTPサーバと同期するまで時刻がズレるが、これはRaspberry Pi Zero 2 WがRTC(とバッテリーバックアップ)を持っていない為だ。

3-6. Overlayfsで電源断の対策

突然電源が切れてもSDカードが死なないようにする。

sudo raspi-config
  1. 4 Performance Options Configure performance settings を選択
  2. P3 Overlay File System Enable/disable read-only file system を選択
  3. Would you like the overlay file system to be enabled?<Yes> を選択
  4. The overlay file system is enabled.<Ok>
  5. Would you like the boot partition to be write-protected?<Yes> を選択
  6. The boot partition is read-only.<Ok>
  7. キーで <Finish> を選択
  8. Would you like to reboot now?<Yes> を選択して再起動

4. 完成

opr-clock完成

冒頭のXに投稿した写真のように、縁が白のモニターだとよりそれっぽくなりますが国内での入手性が悪そう(Aliexpressで探すといくつか見つかった)。