Kindleで電子ペーパーの卓上カレンダーを作ってみた

2024-01-12
2023-07-20

使っていない Kindle デバイスを利用して,電子ペーパー卓上カレンダーを作り直してみました.Googleカレンダーから予定を取得して表示する機能を継承したほか,気象庁の発表に基づいて今日・明日の天気予報を表示するようになりました.

kindle-calendar-2.jpg

仕様

Kindle 第8世代の仕様は以下のようになっています.

項目スペック
画面サイズ600x800 ドット(6 インチ)
解像度167ppi
色深度16 段階グレースケール

前提

使用する Kindle とそのファームウェアバージョンは,以下の通りです.

  • Kindle 第8世代(別名 Kindle Touch 3)
  • ファームウェアバージョン:5.14.2(JB 済)

JB の方法を詳しく記すのはグレーな気がしたので,リンクを貼るに留めます(自己責任).

導入済みのソフトウェアは以下の通りです.

  • MRPI
  • KUAL
  • KUAL Helper
  • Kterm
  • USBNetwork

SSH 有効化

USBNetwork 導入後,Toggle USBNetwork をオンにします.検索窓に ;un と入力してもオンになります.

Wi-Fi 経由で通信するには,はじめに USB 接続して設定ファイルをローカルに置く必要があります.

macOS の設定

Settings > Network > RNDIS/Ethernet Gadget から Mac の IP アドレスを設定します.

IP address: 192.168.15.201

設定が完了すると接続状態が有効になり,USB 経由での SSH 接続ができるようになります(パスワードはなし).

terminal

$ ssh root@192.168.15.244

SSH with identityfile

接続元 PC の公開鍵を Kindle に登録し,公開鍵認証で SSH 接続できるようにします.

terminal

$ ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.15.244

Connect with SSH over Wi-Fi

KUAL > USBNetwork > Allow SSH over WiFi を有効化しておきます.

検索窓に ;711 と入力するとネットワーク情報を取得でき,現在接続しているローカルネットワーク内での IP アドレスも確認できます.

しかし,私の場合は表示されなかったため,USB 経由で SSH 接続し,以下のコマンドを実行して確認しました.Kterm が使える場合は,Kindle 上でも確認できます.

terminal

$ ifconfig | grep inet

IP アドレスが確認できれば,Wi-Fi 経由で Kindle に接続できます.

terminal

$ ssh -i ~/.ssh/id_rsa root@<Kindle's IP>

ルータが DHCP を適用している場合は,リース期間が終わるまでにネットワークへの接続がないと IP アドレスの割り当てが変更されます.

ルータで固定 IP アドレスを割り振るように変更すれば気にする必要はありませんが,私の環境ではルータを操作する権限がないため,リース期間(おそらく 24H)が終了する前に通信を行うことで,同じ IP アドレスを利用し続けられるようにしています.

電子ペーパー周りのコマンド

Kindle には.E-ink 社製の電子ペーパーを搭載されていて,eips というプログラムで操作できます.

画像を表示するには,以下のコマンドを利用します.

terminal

$ eips -g|-b image_path [-w waveform -f -x xpos -y ypos -v]

オプションは以下の通りです.

  • -g for png|jpg, -b for bitmap
  • -w waveform can be gc16 gl16 or du, default is gc16
  • -f for full update, default is partial update
  • -x in units of pixels (does not work on K4)
  • -y in units of pixels (does not work on K4)
  • -v for inverted picture (does not work on K4)

参考:MobileRead Wiki - Eips

カレンダー画像の生成

Kindle のディスプレイに表示するカレンダー画像を生成します.詳細は,以下を参考にしてください.

https://blog.mktia.com/e-calendar

ただし,画像のファイル形式が bmp だと正しく表示されなかったため,今回は jpg にしています.

また,画像は 8bit,JPEG の品質は 95,解像度はディスプレイに合わせています.

天気予報の表示

以前,電子ペーパーカレンダーを作成した際には Google カレンダーとの連動のみを用意していましたが,天気も確認できるとなお良いということで表示を追加しました.

天気予報の情報は気象庁から取得しています.

https://blog.mktia.com/weather-data-from-japan-meteorological-agency

天気アイコンを表示する形式にしましたが,気象庁が用いている SVG アイコンはデザインが細かく,Kindle の dpi では表示しきれなかったため,公開されていた他のアイコンを利用しました.

気象庁の天気コードと対応して作られているようで,デザインもシンプルで素晴らしく最高です.

(気象庁の天気アイコン 308,406 に対応するアイコンはありませんが,強風時のデザインなので特に問題ありません)

参考:【無料 DL 可・28 種】天気予報アイコンセット - Seaeees のお店 - BOOTH

画像の変換

天気アイコンは PNG 画像がカラー,透過ありだったため,合成前にグレースケール 16 階調,透過なしの画像に変換しました.

terminal

$ magick original.png -colorspace Gray -colors 512 -alpha remove -alpha off new.png

デフォルトで背景画像を白にするオプションが有効になっています.元の画像が透過ありの場合は,透過を無効にするように指定しなければ,変換後も透過ありの画像になります.

Pillow で画像を貼り付けるとき,透過部分は黒色になってしまうため,透過部分を白色にする場合は変換時に透過をオフにすると良いです.

参考:imagemagick - Replace transparency in PNG image with white background - Stack Overflow

ImageMagick の環境がない場合,macOS なら Homebrew でインストールできます.

参考:ImageMagick – Download

画像生成・転送・画像表示の自動化

上記を踏まえると,画像生成から表示まで以下のようなフローになります.

  1. Python(Poetry 環境) で画像を生成
  2. 画像を Kindle に scp(または rsync)で転送
  3. SSH で Kindle に画像表示コマンドを転送・実行

terminal

$ poetry run python kt3w.py
$ scp -i ~/.ssh/id_rsa path/to/image.jpg root@<Kindle's IP>:/mnt/us
$ ssh -i ~/.ssh/id_rsa root@<Kindle's IP> '/usr/sbin/eips -f -g /mnt/us/image.jpg'

欲を言えば,Kindle でスタンドアローンな状態が望ましかったのですが,Kindle の OS がよくわかっていないので,Mac で生成した画像を定期的に送信して表示するようにしています.

(Linux ベースだが,カスタマイズの状況が不明)

kindle

# uname -a
Linux kindle 3.10.53-lab126 #2 PREEMPT Tue Feb 1 01:28:30 UTC 2022 armv7l GNU/Linux

自動化のため,上記のコマンドをスクリプトファイルにまとめて cron 実行します.

Mac での自動操作は crontab を利用しています.

https://blog.mktia.com/crontab-on-macos

crontab でシステムジョブとして実行していますが,PATH は反映されないため,スクリプトファイルの最初に宣言しておきます.

Kindle へのインターフェース追加

基本的に Kindle を操作することはありませんが,画面に表示されている内容は更新部分のみ上書きされるため,誤って触るとカレンダー表示が崩れます.

そのため,受信した最新のカレンダー画像を残しておき,手動で画像を表示できるようにします.

タッチ操作をオフにすることもできますが,この状態で外部からの操作を受け付けなくなってしまうと終わるので,有効にしたままで使っています.

kindle

# mkdir /mnt/us/extensions/custom

作成したディレクトリ内に各種ファイルを作成します.ファイル構成は,既存の extension が参考になります.

config.xml

<?xml version="1.0" encoding="UTF-8"?>
<extension>
  <information>
    <name>Custom commands</name>
    <version>1.0</version>
    <author>mktia</author>
    <id>customcommands</id>
  </information>
  <menus>
    <menu type="json" dynamic="true">menu.json</menu>
  </menus>
</extension>

menu.json

{
  "items": [
    {
      "name": "show",
      "priority": -998,
      "items": [
        {
          "name": "Show Calendar",
          "action": "./show.sh",
          "priority": -997,
          "exitmenu": true,
          "refresh": true
        }
      ]
    }
  ]
}

show.sh

#!/bin/sh
sleep 3;eips -f -g /mnt/us/image_600x800.jpg

メニュー操作した後に画面更新が入るため,eips で描画を開始する前に待機時間を設けています.

感想

作成した結果,以下のような感じになりました(スケジュールはダミー).

16 階調のため,アンチエイリアスが効いて綺麗に表示できます.ただし,色は少し薄いです.

kindle-calendar-1.jpg

前に作ったものはサイズが大きかったので,机の上に置くには無理がありましたが,Kindle サイズだと卓上にちょうど良い大きさ!ラズパイ制御ではないので常時給電は不要で,好きな位置に置けます.

kindle-calendar-2.jpg

どれくらいバッテリーがもつかは今後の確認事項です.電子ペーパーなので,ディスプレイ表示に関しては切り替え時にのみ電力を消費します.ただ,Kindle がスリープ状態になると SSH が繋がらないため,スクリーンセーバーを無効化していて,電力消費量は多いかもしれません.

インターフェース(時刻やバッテリー残量など)を無効化することもできますが,表示されていた方が充電のタイミングがわかりやすいので,あえて有効化したままにしています.

再度ですが,Jailbreak は自己責任で実行してください.参考サイトを貼っていますが,一筋縄ではいきません.自力で解決できる場合のみ実行してください(ニッチすぎて誰かの助力を得ることは無理ですし,乞わないべきです….私はこのためだけに古い Kindle を購入しました.).

(追記 2024.1.12)

電源が常時オンの状態だと,1日ちょっとでバッテリーが切れるとわかりました.ケーブルを繋ぎっぱなしだと動かしづらくなるので,偶然持っていたジャストサイズのモバイルバッテリーに接続して使うことにしました.

kindle-calendar-3.jpg

参考