電子日めくりを作った話。

はじめに

筆者は2024年夏にこんな物を作りました。

この「電子日めくり」ができるまでをなんとなく書いたのがこのNOTEであります。


日めくりカレンダーについて

最近では日めくりカレンダーがないご家庭もあるかとは思いますが、ここで日めくりカレンダーの特長を確認しておきましょう。

  • 一目で日付がわかる
    日めくりである最大の特徴がここだと思います。
    なにせデカデカと日付が書かれているのですから分かりやすいことこの上ありません。
    「あれ、今日何日だっけ」となったときに、月めくりカレンダーでは曜日がわからない限り何日なのかわかりませんし、曜日がわかったとしても第何週なのかがわからなくて詰むこともあるでしょう。

  • 情報が多い
    日めくりカレンダーは「1ページに1日分の情報しかない」ということで、そのぶん月めくりカレンダーでは載せきれない多数の情報が掲載されることが多いです。
    最近のものだと毎日日替わりで有名人の名言を掲載したものなんかもありますね。

  • レトロ
    日めくりカレンダーも最近では有名人の名言や毎日の夜空をあしらったものなど様々ありますが、ここではトラッドな日めくりカレンダーを想定しています。
    このトラッドな日めくりカレンダー、かなり長い事デザインが変わっていない印象があり、最新のものでもどこか懐かしく感じます。筆者は特にこのタイプの数字書体が好きで好きでたまりません。

一方、日めくりカレンダーにも欠点はあります。

  • めくり忘れる
    日めくりカレンダーの最大の欠点です。
    日めくりカレンダーは毎日めくることが前提なので、めくり忘れるとその時点で日付がズレていきます。そして、この「めくり忘れる」というのは非常によくあることなのです。まして筆者のようなものぐさ者にはなおさらです。

  • 自作のコストが高い
    これは筆者にしか関係ない欠点だと思います。
    月めくりカレンダーなら13枚(作りようによっては7枚)印刷すればいいのですが、日めくりカレンダーの場合どう頑張っても400枚近いページを印刷する必要がありますし、それを製本するのも一苦労です。

以上の点から日めくりカレンダーの自作について悩んでいたある日、家電量販店でこんな物を見つけました。

これは最近良く見かける値札ですが、電子ペーパーが利用されており何度でも書き換えられるようになっています。この仕組みを利用すれば、「めくり忘れ」「印刷コスト」を一気に解決できるのではないか、と気づいたわけです。
ここから、「電子ペーパー」プロジェクトがスタートしました。

ハードウェアの選定

そうと決まればまずはハードウェア、特に電子ペーパーを選定する必要があります。
今回電子ペーパーを選ぶにあたって注目したのは以下の点です。


  • 「色」といっても電子ペーパーそのものの色ではなく、「何色表示できるか?」というところが論点です。

    • モノクロ
      ほとんどの場合白地に黒だけが表示できるものです。
      単純ですが、その分コストは低く抑えられます。

    • 3色
      多くのものは白地に黒と赤が表示できます。
      先程の値札もこのタイプの電子ペーパーが使用されています。

    • 4色
      3色に加えてもう1色別の色が表示できます。黄色が追加されるものがよく見られます。

    • 更に多色
      さらに多くの色が表示できるもので、フルカラーに近い表現が可能です。
      もちろんその分コストは掛かりますが、表現力が高いのが魅力です。

  • サイズ感
    市販されている電子ペーパーは値札などに使用できる小さいものからフォトスタンドとして使用できる大きいものまで様々あります。

  • 価格
    これも重要なポイントです。
    業務用のものはその分高価になりますが、民生用のものであれば数千円で購入できるものもいくつか見つかります。

  • 入手難易度
    当然のことながら業務用のものは個人で購入するのは困難です。
    そのため、通販で購入できるものや秋葉原の専門店などで購入できるものが候補として上がってきます。

  • 取り回し
    電子ペーパーは普通それ単品では動かすことができず、コンピュータと接続しプログラムを動かすことでようやく動かすことができます。したがって、その駆動系が使いやすいものであるかどうかも重要になってきます。

以上の点を勘案し、今回はこちらの電子ペーパーを使用することにしました。

この電子ペーパーを使用することにしたポイントは以下のとおりです。

  • 使用できる色が多い
    特に赤と青が使用できることがポイントでした。日めくりカレンダーとして、「日曜日は赤」「土曜日は青」で表示できることは非常に大きなアドバンテージです。

  • 入手が容易であり価格も手頃である
    Amazonでいつでも購入できるというのはかなり大きなメリットです。またこの性能で10000円前後というのはかなり格安です。

  • 取り回しがいい
    RaspberryPiに接続することで簡単に動かすことができることもメリットです。
    電子ペーパーに任意の画像を表示させるツールもメーカーから提供されていましたし、幸い我が家には未使用のRaspberryPiが眠っていましたのでこれも好都合でした。

ソフトウェアの構築

ハードウェアが確定したところで次に必要なのはソフトウェアの用意です。当然「日めくりカレンダーを自動で生成して電子ペーパーに表示させる」というソフトがそのへんに転がっているわけがありませんから、これを自作することになります。 先の機能のうち「電子ペーパーに表示させる」の部分はメーカーから提供されたソフトを利用できますから、実際に作成するのは「日めくりカレンダーを画像として生成する」の部分、ということになります。

言語選定

今回ソフトの作成にあたってはPHPを使用しました。選定のポイントは以下のとおりです。

  • 使い慣れている
    最も重要なポイントです。
    普段作成しているカレンダーもPHPによって作成されており、このときに使用している暦生成の関数がそのまま使用できる、というのも大きなメリットでした。

  • 画像を生成できる
    電子ペーパーに表示させるデータはPNG画像として用意することが必要ですが、PHPであればGDライブラリを使用することで生成が可能です。

  • RaspberryPiに導入が用意
    どんなに使いやすい言語であっても、RaspberryPiの上で動かない言語では意味がありません。
    その点、PHPであればaptを使用してRaspberryPiに用意に導入することができます。

  • 今後の展開(中央サーバ化)がしやすい
    電子日めくりを複数台で運用することになった場合、それぞれのマシンで別個に生成するよりも中央のサーバで生成した画像を取ってくるようにしたほうが諸々便利です。
    PHPであればApache経由で画像を配信することが簡単にできて便利です。

画像フォーマット

先述の通りカレンダーを電子ペーパーに表示させるためにはPNG画像を生成する必要になります。 このときサイズは横800×縦480(px)となりますが、今回は縦長で使用したいので「縦長の画像を生成して90°回転させる」という手順を踏むことになります。

表示項目の選定とレイアウトの検討

今回はトラッドな日めくりをベースとすることとし、必要があれば更に項目を追加することにしました。 具体的な導入項目は以下のとおりです。(★印は独自に追加したものです)

  • 日付・曜日

  • 旧暦

  • ★七十二候

  • 干支

  • 月の満ち欠け

  • 九星・六曜

  • 祝日・節気・雑節・選日・年中行事・記念日など

  • 二十八宿・十二直

  • ★暦注下段

  • ★天気予報

  • ことわざ・格言

これらの項目をうまいこと480×800のサイズの画像に入れ込んだ結果、このようなレイアウトになりました。 

使える色

電子ペーパーは普段見慣れた液晶モニタと違い、中間色の表現があまり得意ではありません。 そのため、この画像では以下の7色のみを使用することにしました。

  • 白(#FFFFFF)

  • 黒(#000000)

  • 赤(#FF0000)

  • 橙(#FF8000)

  • 黄(#FFFF00)

  • 緑(#00FF00)

  • 青(#0000FF)

日のフォントを作った件

先述の通り、筆者はトラッドな日めくりカレンダーの数字書体が大好きなのです。 そのため、この書体(あるいはそれに近い書体)を探したのですが、ちょうどいい書体が見つかりませんでした。
そこで、「ないんだったら作ればいい」の精神で数字書体を作ることにしました。 いっそカレンダーの数字をトレースしても良かったのですが、何らかの権利関係があったら困るので全くのオリジナル書体としました。

作成したフォント

metafontの話

フォントを作るのにあたってまず使用したのはmetafontです。
TeXをよく使う方なら「聞いたことはあるけど使ったことはない」ソフトだと思いますが、これを利用してTeX用のフォントを作成しました。

fontforgeの話

TeX用のフォントはそのままでは使用できないのでfontforgeでPHPが読める形式のフォントファイルに変換しました。
参考:https://fontforge.org/docs/old/ja/MetaFont.html

bfd読み込み

今回のソフトではフォントファイルとしてbdfを使用しました。
PHPで画像に文字を入れる場合はttfを使用するのが一般的ですが、その場合エイリアスがかかってしまい中間色の苦手な電子ペーパーではきれいな文字が出せません。 大きいサイズの文字であればそれでもいいのですが、今回は10ドット程度の小さい文字を多用することになるためそれではいささか不安です。 そこで、昔ながらのビットマップフォントでドットを打っていくことで読みやすい文字を表示させることを目指しました。
bdfフォントについてはインターネット上に公開されている「jiskan24」「jiskan16」などを使用していますが、PHPでの処理がしやすいように文字コードをUTF-8に変換しています。また、一部表示できない文字を外字として作成しています。
なお、PHPでbdfを読み込むための機能が見つけられなかったため、その部分は関数を自作し対応しています。 ただし現在バグが見つかっているため当該関数の一般公開は見送っています。

祝日・節気・雑節・選日・年中行事・記念日など

日めくりカレンダーの醍醐味の一つが「その日はどういう日か」の情報です。
電子日めくりではこの欄をできる範囲で必要以上に充実させることを目指しました。

祝日

祝日の日付は官報で発表されるものが当然に正なわけですが、電子日めくりではこれを関数で算出できるようにしています。
ただし、官報での発表時にはそれと合致するかどうかの確認をしています。特に「春分の日」「秋分の日」については後述の節気が絡んでくるため慎重に確認を行っています。
また、祝日については日付のバックに赤丸を表示することで今日が祝日であることをわかりやすくしています。

節気・雑節

https://ja.wikipedia.org/wiki/%E4%BA%8C%E5%8D%81%E5%9B%9B%E7%AF%80%E6%B0%97

二十四節気や七十二候、雑節は太陽の位置から求められます。
電子日めくりでは太陽の位置を求める関数を導入してこれを求めています。この関数は「海上保安庁水路部(現・海洋情報部)の式」として知られるものを使用しています。この式はいささか古いものではありますが、最新の式を使用しようとするとどうしても随時パラメータを書き換える必要がでてきてしまう点、そして暦を計算するだけなら十分な精度が得られる点からこの式を採用しています。


選日

https://ja.wikipedia.org/wiki/%E9%81%B8%E6%97%A5

詳しくはWikipediaをご覧いただくこととして(なお後日私なりの解説noteを書くつもりです)、これらの日付も節気と日の干支(後述)があれば求められるものですので関数を作成して求めています。


年中行事・記念日

年中行事や記念日については関数で求められるものではないのであらかじめリストを作成しておき、その日に該当するものを選ぶ形式にしています。
ただし祝日や節気・選日などと合わせて5行分しか表示枠がないため、スペースに表示させるものを乱数により選定しています。したがって同じ日付でもプログラムを回すごとにこの部分の内容が変わることがあります。 また、年中行事や記念日についてはより重要(だと筆者が感じた)なものほど出やすくなるように勾配を与えています。
年中行事や記念日の中には「○月の第△日曜日」や「旧暦の○月×日」のように特殊な定義を持つものもあります。これらについては別途日付判定のロジックを用意しました。

旧暦

https://eco.mtk.nao.ac.jp/koyomi/wiki/C2C0B1A2C2C0CDDBCEF1.html

改暦から150年以上が経った現代においても、旧暦で日程が決まる行事は数多くあります。そのため、多くの日めくりカレンダーには旧暦の日付が明記されています。
旧暦を求めるのにあたっては、高野氏のスクリプト並びに上野氏のPerl移植を参考にしました。
http://www.vector.co.jp/soft/dos/personal/se016093.html#google_vignette (高野氏)

http://www3.biwako.ne.jp/~nobuaki/qreki/ (上野氏・リンク切れ)
ただし、太陽及び月の位置については前述の水路部式を使用するようにしています。


月齢

一部のカレンダーには毎日の月の満ち欠けを図形で表現したものがあります。電子日めくりにおいてもGDライブラリの描画機能を用いて月の満ち欠けを描いています。
月の満ち欠けは以下のような模式図で表すことができます。

月の満ち欠けの模式図


上図は黄道面(太陽の回転する平面)に鉛直な方向から見たもの、下図は地球から見た月を模したものです。
このとき、月と地球の距離が太陽と地球の距離に比べて十分に小さいことから、角θは太陽の黄経と月の黄経との差に近似することができます。
図中のlは図上の月の半径rを用いて l=r・sin(θ+90°) と表すことができますから、これを用いて半円と楕円を重ねて描画することで満ち欠けを表現しています。
当然この求め方は「おおよそ」であり正確ではありませんが、ドット数が少なくそもそも正確な描画が難しいためこれで十分だと判断しています。

干支・九星・六曜

干支 https://ja.wikipedia.org/wiki/%E5%B9%B2%E6%94%AF#%E5%B9%B2%E6%94%AF%E3%81%AB%E3%82%88%E3%82%8B%E7%B4%80%E6%97%A5

九星 https://ja.wikipedia.org/wiki/%E4%B9%9D%E6%98%9F#%E6%97%A5%E3%81%AE%E4%B9%9D%E6%98%9F%EF%BC%88%E6%97%A5%E5%AE%B6%E4%B9%9D%E6%98%9F%EF%BC%89

六曜 https://ja.wikipedia.org/wiki/%E5%85%AD%E6%9B%9C

干支・九星・六曜はいずれもカレンダーでたまに見かける項目です。とくに六曜については、全部とは言わないまでも大安だけが記載されているケースもあります。
これらについてはいずれも日付や旧暦の日付から求める関数を用意し、表示するようにしています。
また、干支については十二支のアイコンを作成して表示するようにしました。このアイコンはペイントで描いたものをbdfに変換し、絵文字として表示しています。また、一部の特殊な干支(甲子や庚申、あるいは夏の土用の丑の日など)については専用のアイコンを作成して表示しています。

干支のアイコン

二十八宿・十二直

二十八宿 https://ja.wikipedia.org/wiki/%E4%BA%8C%E5%8D%81%E5%85%AB%E5%AE%BF

十二直 https://ja.wikipedia.org/wiki/%E5%8D%81%E4%BA%8C%E7%9B%B4

二十八宿と十二直はいずれもその日の運勢を示すものであり、多くの日めくりカレンダーにはいずれか(あるいは両方)が表示されていることが多いです。
電子日めくりではそれらに加えてそれらの吉凶の説明文を加えました。日めくりでは二十八宿のみ説明があることが多いですが、電子日めくりでは両方の説明を記載しています。なお、この吉凶はどうやら流派によって多少のブレがあるらしく、敢えてしがらみのなさそうなWikipediaの説明を使うことにしました。



暦注下段

https://ja.wikipedia.org/wiki/%E6%9A%A6%E6%B3%A8%E4%B8%8B%E6%AE%B5

暦注下段は現代の暦に記載されることはほとんどありませんが、「天赦日」などは宝くじ売り場でたまに耳にするかもしれません。殆どが節気と干支から容易に算出できることから、「せっかくだし」ということで出せる範囲で網羅してみました。


天気予報

「カレンダーに天気予報?」とお思いになるかもしれませんが、一部の日めくりカレンダーには過去の統計から「その日なりやすい天気」を記載しているものがあります。
電子日めくりではインターネット環境が使えることを活かし、気象庁の公開しているAPIでもって天気予報を取得して表示しています。

なお、天気アイコンについてはjiskan16に収録されている絵文字を使用しています。

格言

日めくりカレンダーには、どういうわけか最下段に格言やことわざが記載されているものが多くあります。電子日めくりでもそれを再現すべく、ランダムで格言を表示する機能を追加しました。
ただし、せっかくの自作カレンダーですので、「普通の日めくりには載らなさそうなもの」を中心に選定しています。具体的には「漫画の名台詞」「人生の指針にならなそうなことわざ」「定食屋の壁になんか書いてあるアレ」などです。 この項目については追加したいフレーズを随時募集中です。

月表

以上で一通り出来上がったのですが、数ヶ月運用してみて「やはり月表(月めくりカレンダーのこと)もつけたい」と感じたため、あとから追加しました。
ただし後付なので、スペースの都合上非常に縦長のものとなってしまいました。

組み立て

ここまでを実装したものがこちらです。

ただしこれでは流石に不格好なので、100均のフォトスタンドに額装してみました。
このとき、家にあったボール紙でスペーサを作成し、適当な紙で目隠しをしています。

今後の展望

サーバ化

前述したとおり、中央のサーバで日めくりの画像を作成し、電子日めくりはその画像を取ってくるようにしたいと考えています。そうすることで、複数台に同時に修正を反映できるようになります。

星占い

節気などを算出するのに用いた水路部式は、木星や火星などの惑星の位置を求める式も存在しています。
これを利用し、毎日の星占いが計算できます。すでに計算する仕組みまではできていますが、如何せんすでに画面がギッチギチなのでどう表示したものか検討中です。

ケースを3Dプリンタで

現在は100均のフォトスタンドをケースとしていますが、そのせいでRaspberryPiが裏面にテープで貼り付けただけという貧相な状態になっています。しかもしょっちゅう剥がれ落ちます。
そのため、RaspberryPiを固定する部分を用意した専用のケースを3Dプリンタで作成できないか検討中です。

その他

電子日めくりはかなり自由度が高いのが特長です。そのため、アイディア次第ではまだまだいろいろなことができると思います。
皆様の中に「こんな事できないの」という案をお持ちの方がいらっしゃいましたらぜひお寄せいただければ幸いです。

こんなこともできます

終わりに

ここまでお読みいただきありがとうございます。
考えなしに書き始めたら思った以上に長くなってしまいました。
最後に宣伝ではありますが、boothにてほぼ同じデータを使用した月めくりカレンダーも頒布しております。もしよければお求めいただければ幸いです。

いいなと思ったら応援しよう!