見出し画像

「最高に心地良いカレンダー」を電子ペーパーで作った

在宅が始まる前から、少しずつ自分のデスクは成長していきました。

  • イケアで買った非常に広いデスク

  • アームで吊るされている REC709 100% カラーが出るモニターに、テンポラリで買ったとはいえ何だかんだで上位モデルへの買い替え時を失った Full HD の 27 インチモニター(こっちはアームで吊るされていない)

  • HHKB Pro と世界最高のトラックボールと信じて疑う余地のない SlimBlade

  • ゼンハイザーのヘッドホンに DTM 用のオーディオインターフェイス

  • CASIO の秒針が赤い壁掛けアナログ時計(この時計の愛はまた別の機会に語るとします)

  • 独身時代から使っているイトーキの椅子

そして、2L で印刷した最愛の娘と妻の写真が所狭しと壁を飾っています。見上げれば忙しさを忘れほっと一息付ける一瞬は、とても幸せです。

在宅ワークが始まった当初、会社のノートパソコンをモニターに繋ぐ「HDMI 端子付き USB-C ハブ」と「ノートパソコンスタンド」を買った以外、快適に過ごすことができました。

部屋に閉じ込もって周りから人の気配を消し、音楽もかけ放題で贅沢な装備で集中できる環境は何よりでした。
私自身、身内含め感染はせずとも、経済面・心身ともにコロナの影響を受け、今もどことなく疲弊を感じることは少なくありません。しかし、在宅ワークというエンジニアとしての最強の環境は、唯一、コロナ禍でもぎ取れた勝利だったかと感じております。

その後もなんだかんだでガジェットも増えていき、Anker のワイヤレス充電スタンドやその他様々な百均で買ったアイテムなどなど……、椅子も買い替えましたし、日々日々デスクは最強に快適へとなっていきました。

……なのに、なのに、

「不便だな」

と思うのは何とも欲深きことなのですが……、日々日々最強になっていく、否『最強を目指さなければならない』デスクにとってそれは打破すべき「課題」でした。
そしてその課題とは……「カレンダー」でした。

なかなかよいカレンダーはない

Windows 10 では、タスクバーの時計を押せばカレンダーが出てきます。しかし、このカレンダーには微妙なところがあり「祝日が分からない」という欠点があります。シンプルがゆえ、情報量があまりにも少ないのです。

どうしてここまで小ざっぱりなのか

オフィスに居た頃は、壁にかけてあるカレンダーへ首を動かして見てました。他社の営業さんから貰った、まあよくある……決してオシャレではないカレンダーです。
まあしかし見やすさはよいですし、祝日も分かります。情報量としては過多ですが不足はありません。

それが在宅ワークになって失われました。
同じように壁掛けカレンダーをかければいいのでは、と思うのですが、デザイン性に優れる好みなカレンダーはなかなかありません。最強のデスク回りスタイリッシュ空間を害するくらいなら、いっそ無いほうがいいのです。

そんなワガママが求めるカレンダーのポイントとしては以下でした。

  • スケジューラは Google Calendar と iCal そして iPhone のカレンダーアプリを使っているため、デスク周りのカレンダーに求めるのは「日付と曜日と休日を瞬時に認識できる」こと

  • コンパクトでミニマムなデザインであること

  • カラーリングは抑え目であること。3 色から 4 色に抑えられていること

  • 祝日が分かること(重要)

  • 日曜日と祝日はアクセントカラーになっていること

  • 可能であれば土曜日も(なお、今回作ったカレンダーでは実現できなかった)

  • 書き込みできる必要は全くない

世の中には紙のカレンダーなんてもの沢山あるわけですが、しかし「コレ!」と言ったものがなかなか見つかりませんでした……。
候補の次点としてはミドリさんの「MDカレンダー」でした。

「MDノート」は昔から使っていたため、紙の質や発色は十分評価できておりました。とてもよい質感の紙です。
そのミドリが手掛けた「MDカレンダー 1 ヶ月」の卓上カレンダーは、サイズ感もよく、休日が赤くなっていない点を除けばほぼ希望通りでした。カレンダーへの書き込みは考えておりませんでしたが、「字を書く」ということを悦びとする人に、気に入らない人はまずいないでしょう。
壁掛けカレンダーもやや大きいサイズ感でしたが、祝日や日曜日も赤くなっており、そっちもかなり好みでした。

しかし、ここで最大の問題に気付きます。
購入に待ったをかける理由があったのです。
それは……、

「今は…… 8 月だ……!!」

そう、カレンダーを買うには遅きに徹してしまったのです
今年のカレンダーを買うにしても、残りは 5 ヶ月弱。今年のは諦め来年のカレンダーを買ったとしても、その 5 ヶ月はカレンダーが無い不便が続くわけです。
決して高くもない金額ですがなんとなく残り 5 ヶ月のカレンダーを買う気分にもなれず、来年の分も買わずして、いつしか不便を受け入れて 11 月となりました。

電子ペーパーを使った『二つ』のカレンダーとの出会い

「Magic Calendar」というプロジェクトがありました。

私の琴線に触れる「ミニマム」でありながら Google Calendar と連携できる「ガジェット」、そして完璧な「インテリア」であり、カラー電子ペーパーという液晶モニターとは違う視認性を持った「未来」でした。

同じようなものを Android タブレットで代用できるのではないか、と考えたこともありますが、それは電子ペーパーではなく「液晶モニター」です。LED が内蔵されている以上、そのバックライトは必要以上に光源となってしまいます。つまり、つけっぱなしにするには眩しく、つけっぱなしにしないとカレンダーを見たいときに見られないかもしれない、というジレンマがあります。

電子ペーパーの良いところは、空間の自然光に溶け込むことです。
電子ペーパー自体にはバックライトなどの光源は埋め込まれていません。手書きの字や印刷物と同じように目にやさしく、暗いところでは闇に溶けます。部屋の家具やアナログ機器と同じように、その文字は部屋の光と「調和する」のです。
だからこそ、Magic Calendar のコンセプトや電子ペーパーを使うというデザインには共感を覚えました。「LED を使っていない」ということがどこまで考慮されていたものか定かではありませんが、「ガジェット」でありながら「インテリア」である良さ、そして空間の他の光を邪魔しない、他と溶け合うことのできるカレンダーだったと思います。
残念ながら、プロジェクトは現在ディスコンになってしまったと思われますが、あれば間違いなく購入していたでしょう。

そんなある時、とある github プロジェクトを見つけました。

  • 白・黒・赤カラーの電子ペーパー

  • Raspberry Pi 駆動(しかもバッテリー駆動)

Magic Calendar より複数のカラーが使えるわけでもありません。ましてや、商品として売られているわけではないので自分で作らなければなりません。
しかし、当初より求めていたカレンダーが「電子ペーパーで作れそう」「これなら、8 月だろうがいつだろうが関係ない」という考えがよぎったとき、

「まあ、作ってみよう」

と思い至りました。

時は 8 月から数ヶ月がたち 11 月。
来年の「MDカレンダー」を Amazon のショッピングカートに入れようと思っていた、丁度そのときでした。

なにをすればいいのか

さて「物を作る」というプロジェクトです。ですので下調べと準備をしましょう。

何が必要なのか

  • 電子ペーパー

  • Raspberry Pi

電子ペーパーは、MagInkCal の github にも記載のあった Waveshare という会社の電子ペーパーに丁度よさそうなものがありました。

MagInkCal で使用されているものより小さい 7.5 インチの電子ペーパーです。Raspberry Pi の GPIO と接続できる HAT と呼ばれる部品を持ち、商品解説のページには Python のサンプルコードもありました。
ざっと見た感じ、ライブラリを使用すれば画像のオブジェクトをそのまま電子ペーパーに送ることができることが分かりましたので、「難易度は高くない」と見積りました。

Raspberry Pi は Zero か Pico かで悩みましたが、結局 Zero を購入しました。

  • Pico を使う場合 IronPython を使用すると思われるが、Python は標準ライブラリに日本の祝日の情報を持っていないため、祝日の情報を取得するためにインターネットに繋ぐ必要がある

  • Pico は Wifi/RJ-45 LAN モジュールがないとネットワークに接続することもできず、HTTP や TLS、DNS に NTP と、必要なプトロコルを喋らすのは非常に大変そう。つまり、インターネットへ通信をすること自体の難易度が高い

  • OS とデーモンが Pico では立ち上げができないので、cron みたいな定期的な処理をさせる方法が思いつかなかった

それでも Pico を使いたかった理由がありました。それは「安価であること」「最近の半導体不足による Raspberry Pi シリーズの入手困難」があげられます。
Zero 一つで Pico が 4 つくらい購入できるという値段設定も魅力的ですが、そもそも昨今、Zero が市場に潤沢にないという状況です。
Pico はある程度どこのお店でも在庫はありますが、Zero にいたっては秋葉原の秋月商店以外には Amazon のマーケットプレースなどで高額で取引されているという、兎に角もう、入手が困難という状況です(その秋月にも、いつまで在庫があるかどうか……)。
万が一、壊すことを考えても替えが効く Pico を使いたかったのですが、OS がそのまま動く Zero 方が何をするにしても便利なため、結局そちらを選択しました。

何を作らなければならないのか

  • Python でカレンダーの画像を作り、それを GPIO で電子ペーパーに送信するプログラム

  • Raspberry Pi Zero の構築

  • 良い感じに部屋に飾る額

をこしらえなければなりません。

そもそも、Python でプログラムを書かなければなりません。なので、手元の環境である程度できてから Raspberry Pi や電子ペーパーを発注することにしました。普段、業務でも書くのはスクリプト程度で、カレンダーを作ったり画像を扱うようなプログラムは書いたことはありませんので、ちょっとチャレンジでした。

ですが……、Python の標準ライブラリには calendar というものがあり、年月と開始の曜日を指定すれば、その月の日付を配列で取得できるという恐ろしく便利な関数があります。
実際「めっちゃ甘やかされてんな……」と思いながら使いました。

>>> import calendar
>>> import pprint
>>> pprint.pprint(calendar.monthcalendar(202112))
[[0001234],    # 0 は空白
 [567891011],
 [12131415161718],
 [19202122232425],
 [2627282930310]]

これに加え、画像を作成するライブラリとして Pillow を使うことにしました。画像のオブジェクトに対し、線や円を書いたり、フォントを指定して文字を入れることができます。

Python は日本の祝日のデータは持っていないため、そのデータもどこからか調達しなければなりません。これは「Holidays JP API」を利用することにいたしました。
(なお、画像の 2021 年 12 月は祝日がなく、どういう表示になるか参考になりませんね……。大変失礼いたしました)

有志の方が Google から取得した祝日のデータを json に変換してくださったものです(本当は内閣府がそういう json や API を用意するべきでは、と公私ともに思っております。昔と違って syukujitsu.csv をパースするのは楽になったようですが、有志の方の json の方が扱いが楽なので……楽をしました)。

ということで、こんな感じのカレンダーの画像ができあがりました。

なかなか良い感じ

フォントは Tenor Sans を使用しました。

ほどよくウェイトがあり視認性がよく、それでいて数字にクセのある印象的なフォントを探していたところ見つかったものです。「SIL OPEN FONT LICENSE」であるため、使用に関しては制限がなく、こういう note を記事を書くにも都合が良いのも利点です。

さて、電子ペーパーにカレンダーを表示させる準備をしましょう。
電子ペーパーのライブラリに画像を処理させるときは、それぞれ「黒として表示させたい画像」「赤として表示させたい画像」をそれぞれ指定する必要があります。
すなわち、こんな感じです。

として表示させたい画像
として表示させたい画像

また、この画像はフォントにアンチエイリアスがかかってますが、今回使用する電子ペーパーは白・黒・赤の 3 色しか表示することができず、色の階調を処理できません。そのため、残念ながらアンチエイリアスが効かないです。

あとは画像のオブジェクトをライブラリを使って電子ペーパーに送信するだけです。

def write_to_epd(black_img, red_img):
    epd = epd_m.EPD()
    epd.init()
    epd.display(epd.getbuffer(black_img), epd.getbuffer(red_img))
    epd.sleep()

のんびり書き上がった最終的なソースコードがこちらです。CC0 としてます。

プログラムの目処がおおよそ立ってから Raspberry Pi と電子ペーパーを発注し、いよいよ手元にブツが届きました。
工業製品のサンプル品のようななかなか簡素なパッケージだったそれは想像以上に薄く、これが電子パーツとは思えぬほどでした。また、HAT コネクタの一部がぶつかったのか欠けていたので、それが動作に影響するか心配でした。一応、無事動きました。

その後は構築です。
Raspberry Pi Zero には Raspberry Pi OS を入れました。

Arch Linux などの方が無駄なコンポーネントは入らないですが、逆に必須コンポーネントを調査するもの大変ですし、SPI 通信をすることを考えると公式の OS の方がいいと思い、楽をする方に決定しました。
GUI のない Lite を使用したのですが、アイドルのときメモリは 35MB 程度しか使わず、思ってたより省リソースだったのはよかったです。

pi ユーザのデフォルトパスワードの変更、Wifi に固定 IP アドレスを持たせ、SPI などを有効にし、ntp と SSH を有効にしてほぼ完成です。
そして、Raspberry Pi Zero に電子ペーパーの HAT のコネクタを挿し、いよいよ動作できる直前までやってきました。

額に飾る

百均で買える 2L の額縁が一番丁度よいサイズでした。微妙に左右に無駄な幅ができ、縦にも余分な空白ができますが、これを埋めるとなるとノコギリを使うなどして工作をしなければなりません。

「完璧」にはほど遠いと苦虫を噛みつつ、額に入れまして……、実際に動作させたのがこちらです。

2L だと微妙に余るのが非常に残念

なかなか良いでしょう。

日付が変わると共に cron でプログラムが動き、カレンダーの更新も自動で行われます。
Raspberry Pi Zero はオンボードで Wifi を持ち、電源のため USB ケーブルを差しておけば他に必要なものはないので、壁に貼り付けてもなかなかすっきりします。

参考にした MagInkCal は Raspberry Pi 用として販売されている RTC 付きバッテリーを使用し、必要なときだけ起動をする、電源ケーブルレスの構成となっておりました。
Raspberry Pi は CMOS 電池内蔵や内部時計(RTC)を持っていませんので、必要なときにだけ起動することが難しいです。ですが、そのバッテリーは両方を兼ねております。完全ケーブルレスにしたい場合、とても良い選択肢ですね。

ちなみに、色々とテストをしていた段階では、電子ペーパーの裏側に Raspberry Pi をマスキングテープで無理やり貼り付けてました。小学校低学年並の工作でした。現在はネジ止めしてます。

愛を語る

さて完成したこれを見ながら、このカレンダーの良さを語りたいと思います。

なにより、自分好みのデザインにできたということです。売られているカレンダーに揃った飾り気はほぼないに等しく、デザインの何を語ることができるのかと問われると不勉強の限りではありますが、必要な情報だけがシンプルに揃えられたというのは、とても良かったかと思います。

  • 祝日と日曜日は赤色のフォントで表示

  • 在宅ワークのおかげで失われた曜日感覚だったとしても、今日の日付を丸で囲むことで、今日がいつかすぐに分かる

黒色と赤色は色の階調がないため、近づいて見てみるとフォントがややギザギザしている印象を受けますが、普段デスクから見る分には何も感じません。
また「光らない」ガジェットであるため、他からの光源なしで文字を読むことができません。なので、とても「紙っぽい」カレンダーなのです。
部屋を邪魔することもなく、必要以上に主張はせず、それでいてなかなか「格好がいい」ではないでしょうか。

電子ペーパーなのでアナログ時計同様に暗闇によく馴染む

残念ながら、この電子ペーパーのリフレッシュタイムは 16 秒と非常に遅く、1 秒に一回画面を更新するといったことはできません。そのため、リアルタイム性を求められる描画はできません。Pomodoro Timer も作ってみようと思ったのですが断念しました。
しかし、その難点を避けられれば色々と表示できるのではないかと考えると期待が膨らみます。例えば Google Todo や Google Calendar の項目を表示することも、天気やニュースの項目をスクレイピングして表示させることもできます。
何せ「インターネットに繋がっているカレンダー」(電子ペーパー)ですから、そういう処理はお手の物です。

さらに難点を言えば、背景の白地はオフホワイトに近いであり、ややくすんだ印象を受けます。横に掛けられている CASIO のアナログ時計と比べると、なおさら灰色に見えてしまいます。Kindle を使っていてもそうなのですが、電子ペーパーで完全な白を出すのは難しいのではないか、と思っております。

まだまだ正直発展途上と言いますか、背面は基盤剥き出しで保護もできていないし、常時起動している Raspberry Pi が生かせていない、というのが正直なところです。ですが、自分なりに納得ができた「最高に心地良いカレンダー」を作ったのはよかったです。

また進化しましたら、進捗を共有したいと思います。


老後、奥さんと世界一周のための費用にします。