
これまでの流れ。
- 5000 円前後で大きめのデジタル時計が欲しい。 電波でも NTP でもいいから自動時刻合わせは欲しい。
- 良さそうなのがあっても時刻合わせ未対応だったり、Amazon の評価で 7 セグの輝度がすぐに落ちるとか、コントラスト重視なので黒背景の白文字がなかなかない。
- だったら 7 インチタブレットで HTML + CSS + Javascript で作ろう!
- 作った。
- 3 年ちょっとで液晶が壊れた。
- 8 インチタブレットに置き換えた。
- 消費電力が大きいのか、500mAh 供給ではバッテリーが無くなって落ちる。
- もう面倒くさい。 Raspberry Pi Zero W で作ろう。
- 作った!
てことで Raspberry Pi Zero W で置時計を作った。
制作予定だったけど破棄した仕様
背景画像を読み込み、時計の文字が背景画像に溶け込むのを防止するために時計の白文字に黒のばかした縁取りをしたが、800x480 の大きさの画像全体にガウスぼかし掛けると 5 秒もかかるので時計文字の縁取りは止めた。
時計の文字の配置を 年・月・日・時・分・秒 を個別に配置するようにしたため、少々時間が食うようになったのと、時計文字の縁取りは止めたため画像を表示すると見辛くなる。 また背景画像は機能上必須でも無いので背景画像を止めた。
仕様
制作は Perl で行った。 (Perl しか扱えないだけ。 今なら Python 使った方が楽かもしれません)
フレームバッファに書き出す。 xwindow で HTML 表示は見送った。
背景とかエフェクトとかリッチにいきたい。 (CPU パワーのが足りないので見送ったが、秒を表示しないのであれば、多少重たい処理も有りかと)
入手したもの。 (価格と送料含めた価格で、大雑把に四捨五入)
液晶パネル | 非接触 IC カードリーダからの抜き取り (250 円) |
LCD コントローラー | AliExpress (1600 円) |
HDMI ケーブル | AliExpress (140 円) |
Raspberry Pi Zero W | スイッチサイエンス (1450 円) |
ケース | ダイソーのフィギュアケース (330 円) |
micro SD カード 8GB | 家の中で転がってたもの (たぶん 500 円ぐらい) |
ネジ・スペーサー類 | 西川電子部品 (たぶん 100 円ぐらい) |
トータルで 4500 円程度だと思う。

液晶パネルは AliExpress だと 800 円ぐらいで、LCD コントローラは探せば 1300 円ぐらいからある。
LCD コントローラは VGA、コンポジット、VGA と 3 種類の入力があるが、最初に受け付けた入力を選択してくれるっぽいので、リモコンとか入力セレクトは必要無いかも。
とりあえず完成した段階では時計の文字作成に 180 ミリ秒もかかっており、秒の表示がカクつく場合があった。
必要としない余計な機能を削った結果、簡素化できる部分もかなり出てきたので修正したら時計の文字作成に 55 ミリ秒ほどになり、17 ~ 18 fps ほどのフレームレートになった。
ただ、ループでそのままぶん回すと CPU 使用率が 98% になり、精神的にあまりよろしくない。 フレームバッファに出力したあと 40 ミリ秒ほどのウェイトを入れると CPU 使用率は 60% 程度に落ちてフレームレートは 11 fps ほどになった。
ちょっと CPU に余裕が出てきたのと殺風景すぎるため、日付と時間の間に横に伸びる秒針的なものをテストで配置。
偶数分はバーが右に伸びて、奇数分は左に向かってバーが縮んでいく。 フレームレートが大きく落ち込むわけではないので、このまま採用。
夜間設定で、夜間指定した時間内は時計の文字の色を変更可能。 (#RRGGBB の形式で指定)
/etc/rc.local に制作した Perl スクリプトへの PATH を書いて、起動時に自動で時計が実行するようにして完了。
最終的な消費電力は 700mAh ほど。
今回得た経験値
PNG はファイルの中身は BGR の順に並んでいるため、PNG を読み込んだ後に赤チャンネルと青チャンネルを入れ替える必要がある。
赤と青のチャンネルを入れ替えずに表示するとおかしなことになる。

赤と青のチャンネルを入れ替えればちゃんと表示される。

フレームバッファは 1 ピクセル当たり 32bit (RGBA) 要求するため、Imager で画像を作る時は
channels => 4
とする必要がある。
channels => 3
で作った画像は、フレームバッファに書き込む前に
channels => 4
で作った画像に
$img->paste(src => $src)
の様にしてコピペすれば問題無い。
書き出す画像は毎フレーム初期化する必要があるが、fill と box で塗りつぶすよりも、
Imager->new()
する方がコストは低い。
フィルターでコントラスト弄る時は
channels => 3
で作った画像に対して行うと輝度調整っぽくできる。
今後の課題
もっとスマートなケースにしたい。
使用電力が 680mW ほどなので、倍の容量である 1.5A ぐらいのアダプタに変更したい。

HTML で時計を作った時は fonr-weight: bold; して太字にしてたが、今回はフォントの太さそのままなのでやや貧相。 極太なフォントに置き換えたい。
CPU 温度が 50 度を超えてたので、家の中で転がってた 10mm 四方のヒートシンクを PC で使ってた残り少ないグリスをほんの少しだけ塗布して付けただけで 5 度ほど CPU 温度が下がった。
しかしそれでも 45 度なので、夏が不安。
夏が不安と思ったところで、時計を設置してから数時間たった今温度を確認したら 50 度になってた。
夏どころか春ですら不安だ。