Raspberry Piと電子ペーパーで「アイカツ格言時計」を作ってみる

はじめるまえに

基本的なLinuxコマンド(ディレクトリの移動やテキストをいじれる位)の知識が必要です。

完成予定の物

今回の動機と目標

  • AliExpressを見てたら、電子ペーパーのパーツを見つけた。
  • 調べてたら、どうやら意外とRaspberry Piなどで簡単に動かせるようだった。
  • 3万円する「アイカツ! × Smart Canvas」が、正直アレでこれに似たものなら作れるのではと思った。
  • Raspberry Piと電子ペーパーを使って、1分おきにランダムなアイカツ格言と、現在の日付・時間が表示される物を作る。

用意するもの

セットアップと確認

  1. とりあえず、Raspbian Stretch Liteが動作していて、SSHなどでコマンドが打てる状態にする。
    ※ここまでは、基本なはずなので解説しません。

  2. Pythonのバージョン確認
    python -V
    Python 2.7.13
    Python2系が入ってたので、これで動かすのを目標にします。

  3. 「Waveshare e-Paper」を使えるようにするためのサンプルファイルをダウンロード
    https://www.waveshare.com/wiki/5.83inch_e-PaperHAT(B)
    DemoCodeから
    20190327094622!5.83inch_e-paper_hat_b_code.7z
    をダウンロード。(07:12, 28 November 2018 の物です。)
    ダウンロード例コマンド
    wget https://www.waveshare.com/w/upload/archive/b/b4/20190327094622%215.83inch_e-paper_hat_b_code.7z

  4. ダウンロードしたファイルをリネーム
    20190327094622!5.83inch_e-paper_hat_b_code.7z

    5.83inch_e-paper_hat_b_code.7z
    にリネーム。
    mv 20190327094622\!5.83inch_e-paper_hat_b_code.7z 5.83inch_e-paper_hat_b_code.7z

  5. 7zを解凍するための7zipをインストール(入ってない場合)
    sudo apt-get install p7zip-full

  6. 7zを解凍したファイルを入れておくフォルダを作る。
    mkdir 5.83inch_e-paper_hat_b_code

  7. 解凍するためにファイルをフォルダに移動
    mv 5.83inch_e-paper_hat_b_code.7z 5.83inch_e-paper_hat_b_code

  8. ダウンロードしたファイルを解凍
    cd 5.83inch_e-paper_hat_b_code
    7z x 5.83inch_e-paper_hat_b_code.7z

  9. 解凍が終わるとファイルが出来ている。

    -rw-r--r-- 1 pi pi 4178939 Mar 27 09:46 5.83inch_e-paper_hat_b_code.7z
    drwx------ 3 pi pi    4096 Jul 14  2018 arduino         ←解凍されたフォルダ
    drwx------ 6 pi pi    4096 Nov 20 10:20 RaspberryPi     ←解凍されたフォルダ
    drwx------ 3 pi pi    4096 Nov 20 10:20 STM32           ←解凍されたフォルダ

    ※ちなみにarduino STM32フォルダは今回使わないので消しても良い。

Raspberry Piと電子ペーパーの接続

  1. 電子ペーパー接続作業のために、一旦電源を切る。
    sudo shutdown -h now
    ※シャットダウン確認後、電源のmicro USBケーブルを抜くなどしてください。

  2. Raspberry Pi と Waveshare e-Paper Driver HATを繋ぐ。

  3. Waveshare e-Paper Driver HAT と Waveshare 5.83inch e-Paper (B)を繋ぐ。

  4. また電源を付ける。

Raspberry Piのセットアップ

  1. Raspberry Pi のSPIを有効にする。
    ※Raspberry PiとWaveshare e-Paper Driver HATを通信出来るようにするため。
    sudo raspi-config
    5 Interfacing Options → P4 SPI
    Would you like the SPI interface to be enabled?

    <Yes>を選択。
    The SPI interface is enabledが表示されたら終わり。

Pythonのモジュール関係のセットアップ

  1. サンプルファイルがあるフォルダに移動
    cd 5.83inch_e-paper_hat_b_code/RaspberryPi/python2/

  2. サンプルのmain.pyを起動してみる
    python main.py

  3. 恐らくエラーになる。

    Traceback (most recent call last):
    File "main.py", line 4, in <module>
    import epd5in83b
    File "/home/pi/5.83inch_e-paper_hat_b_code/RaspberryPi/python3/epd5in83b.py", line 51, in <module>
    import epdconfig
    File "/home/pi/5.83inch_e-paper_hat_b_code/RaspberryPi/python3/epdconfig.py", line 37, in <module>
    import spidev
    ImportError: No module named spidev
  4. Pythonのモジュールにspidevが無いとの事なのでインストール
    sudo apt-get install python-spidev

  5. サンプルのmain.pyをまた起動してみる
    python main.py

  6. 恐らくまたエラーになる。

    Traceback (most recent call last):
    File "main.py", line 4, in <module>
    import epd5in83b
    File "/home/pi/5.83inch_e-paper_hat_b_code/RaspberryPi/python3/epd5in83b.py", line 52, in <module>
    from PIL import Image
    ImportError: No module named PIL
  7. PythonのモジュールにPILが無いとの事なのでインストール
    sudo apt-get install python-imaging

  8. サンプルのmain.pyをまた起動してみる
    python main.py
    ※フォント指定関係を編集しないとうまい事起動しない。

  9. 動いたらとりあえず終わり

アイカツ格言画像を用意

※この工程は、Raspberry Pi上じゃなくて良いです。

  1. 何かしらの方法で、表示したいアイカツ格言画像を用意
    ※この解説では157個の画像を用意したとして進めています。

  2. 1920x1080で画像を用意した場合、電子ペーパーの解像度の横幅である600に合わせて
    600x338にリサイズ。

  3. グレースケール化をしてください。

  4. BMP形式にしてください。

  5. ファイル名をKAKUGEN_XXX.bmpとして、連番にしてください。
    例 KAKUGEN_001.bmp ~~~ KAKUGEN_157.bmp

  6. Raspberry PiにKAKUGEN_IMGというフォルダを作り、そこに画像をすべて入れてください。
    ※SambaやSFTPなど、何かしらの方法で転送してください。

アイカツ格言時計を動かしてみる。

  1. 必要なモジュールをインストール
    pytzをインストールするためにpipが必要なので入ってない場合インストール
    sudo apt-get install python-pip
    pip install pytz

  2. epd5in83b.pyなどがあるフォルダにKAKUGEN_WATCH.pyを置く

  3. KAKUGEN_WATCH.pyと同じ場所にフォントファイルとKAKUGEN_IMGフォルダを置きます。
    ※ここでは、フォントファイルとしてrounded-x-mplus-2p-heavy.ttfを使用しています。

  4. 実行してみる
    python KAKUGEN_WATCH.py

  5. 画像と日付、現在時刻が表示されたら成功

定期的に実行させる

  1. crontabを使用し1分おきに実行する。

  2. まずKAKUGEN_WATCH.pyを編集
    nano KAKUGEN_WATCH.py
    ※コピーを取り、別ファイルをいじっても良いです。

  3. 編集では、画像ファイル フォントファイルへのパスを相対指定ではなく、絶対パスにします。

  4. 主な編集

    kakugen_img_path = "KAKUGEN_IMG/KAKUGEN_" + str(kakugen_img_num).zfill(3) + ".bmp"
    ↓
    kakugen_img_path = "/home/pi/5.83inch_e-paper_hat_b_code/RaspberryPi/python2/KAKUGEN_IMG/KAKUGEN_" + str(kakugen_img_num).zfill(3) + ".bmp"
    font = ImageFont.truetype('rounded-x-mplus-2p-heavy.ttf', 60)
    ↓
    font = ImageFont.truetype('/home/pi/5.83inch_e-paper_hat_b_code/RaspberryPi/python2/rounded-x-mplus-2p-heavy.ttf', 60)

    ※例なので、自分の環境に合わせていじってください。

  5. crontabに登録
    crontab -e

  6. 1分おきに実行されるようにする。
    * * * * * python /home/pi/5.83inch_e-paper_hat_b_code/RaspberryPi/python2/KAKUGEN_WATCH_01.py
    ※実際に.pyファイルを置いた場所を指定してください。

  7. 登録したら、しばらく待ってみる。
    ※ちなみに00秒すぐに更新されないです。どうしてもタイムラグがあります。
    ※更新が始まるまでpi3だと10秒ほどZero WHだと30秒くらいになります。

  8. うまい事更新されたら、おわり。

コード解説

0埋め

kakugen_img_num = random.randint(1,157)
kakugen_img_path = "KAKUGEN_IMG/KAKUGEN_" + str(kakugen_img_num).zfill(3) + ".bmp"
ここで、ランダムの数を作成し画像のパスを生成します。
1~157のランダム整数が生成されますが、0埋めされていないため0埋めしてから、変数に格納します。

画像統合

HBlackimage.paste(kakugenimage)
ここで、格言画像と時計の画像を統合させます。

画像回転

HBlackimage = HBlackimage.rotate(180)
上下反対に電子ペーパー設置する場合、画像が上下反対になってしまうので、
表示前に上下回転させている。
なので、上下反転させたくない場合は、ここを消してください。
ちなみにケーブルが出ている方が、下となっているみたいです。

おわりに

  • とりあえず目標としていたものはできた。
  • 今後の事を考えるとPython3系で動くものを作っといた方がよかった気もする。
  • 常設するにはケースなどがあったらいい気がするが、工作能力が無いのでそのまま置いている。
  • みなさんもご家庭に余っているRaspberry Piで作ってみよう。