2018年4月15日日曜日

Raspberry Piでe-Paper(電子ペーパー)を動かして日本語を表示する方法

 

背景

e-Paper(電子ペーパー)とは、電子書籍などに使われている、通電をやめても表示した内容を保持し続けるディスプレイです。
e-Inkなどとも呼ばれます。

SPIで制御できるe-Paperを手に入れたので、Raspberry Piで操作してみました。
ところどころ詰まる部分があったので、やった内容を共有します。

全体像

この順に共有します。
  1. 使ったもの
  2. Raspberry Piとe-Paperを接続
  3. 関連プログラムをインストール
  4. SPIを有効化
  5. e-Paperのサンプルプログラムを実行
  6. e-Paperに日本語と日本時間を表示
  7. 定期実行
  8. まとめ

使ったもの

  • SSH接続できる状態のRaspberry Pi
    Raspbian (Stretch 2018.03リリース版) をインストールしたRaspberry Piで動作確認しました。
  • 7.5インチの3色(赤、黒、白) e-Paper
    aliexpressで購入しました。
    Raspberry Piで利用する場合は、上記リンクのHat型のコネクタを使うと楽だと思います。
    記事で使用したのは上記のリンクとは違うコネクタですが、自分の確認した範囲では、利用する配線とプログラムは同じようでした。
    なお、3色版は情報の更新に30秒位かかるので、更新時間を短くしたい場合は、2色にする(7.5インチ 白黒 6秒)か、サイズを小さくする(2.13インチ 3色 15秒)のが良いと思います。
  • オスメスジャンパワイヤ(コネクタがRaspberry PiのHat型では無い場合)
    Hat型のコネクタなら、ジャンパワイヤが無くても接続できます。

Raspberry Piとe-Paperを接続

Hat型ではないコネクタは、e-paperの製品情報ページに従い、Raspberry Piとこのように接続します。

e-Paper Raspberry Pi
VDD 3.3
GND GND
DIN MOSI
CLK SCLK
CS CE0
D/C IO25
RES IO17
BUSY IO24




Hat型のコネクタの場合は、Raspberry Piに取り付ければ、上記の接続ができたことになります。


変更可能なコネクタのピンはこのようにしました。
J1: BS2 (4ピンでSPI通信)
J2: 3 (製品紹介ページに、今回使う7.5inchの製品は3を選択すると記されていました)
J3: 未使用


注意: e-Paperのフィルムは、通電面をコネクタの基板と反対側にして接続します。
(裏表逆にして接続していたため、動かずに時間を取られました。)


関連プログラムをインストール

ベースとして利用するサンプルプログラムがpythonというプログラミング言語で書かれていたので、pythonでプログラムを動かすために必要な関連プログラムをインストールします。

下記のコマンドで関連プログラムをインストールできます。
sudo apt install fonts-noto-cjk python-spidev python-pil python-tz

インストールしたものを順に説明します。

spidevは、pythonでspi通信するためにライブラリです。
e-Paperとspi通信するために必要です。

pilは、pythonで画像処理するためのライブラリです。
e-Paperに表示するデータの作成に利用します。

日本語の太文字ドフォントが欲しいので、fonts-noto-cjkをインストールしてNotoSansCJK-Boldを使える状態にします。

tz(pytz)とはタイムゾーン管理プログラムです。
日本時間の取得に利用します。

SPIを有効化

Raspberry PiのSPIはデフォルトでは無効になっているので、有効にします。

raspi-configを開きます。
sudo raspi-config

Interfaces -> SPI -> Yesを選択します。

raspi-configを終えて、再起動します。

e-Paperのサンプルプログラムを実行

自分が公開しているリポジトリのプログラムを利用する場合

e-Paperのドライバも含めて、今回作成したプログラムをgithubで公開しています。

asukiaaa/raspi_spi_epaper

上記のリポジトリは下記のような流れで実行できます。

gitというバージョン管理プログラムをインストールします。
sudo apt install git

gitをインストールしたら、このようなコマンドでサンプルプログラムを動かせます。
mkdri ~/gitprojects
cd ~/gitprojects
git clone https://github.com/asukiaaa/raspi_spi_epaper.git
cd raspi_spi_epaper
python main_original.py

サンプルプログラムは2種類の画像を表示します。

1つはこの画像です。
pythonのプログラムで作成したデータを表示しています。
白い「e-Paper demo」という文字は、小さいからか、にじんだように表示されています。


もう1つはこの画像です。
赤色の画像データと黒色の画像ーデータを読み込んで表示しています。
「℃」や「99+」が薄くなっているように、細かい表示はかすれてしまうようです。


プログラム上でデータを作成する仕組みをベースに、日本語表示プログラムを作成します。

メーカーのページから最新版をダウンロードして利用する場合

メーカーのページにある、利用しているe-Paper(7.5inch type B)のサンプルプログラム公開ページの最新のプログラムを利用します。
記事を書いている時点では「07:01, 13 April 2018」が最新なので、それの動かし方を説明します。

ダウンロードするファイルは7z形式で圧縮されているので、展開に利用する7zipをインストールします。
sudo apt install p7zip

ダウンロードして、展開して、Raspberry Pi向けのpythonプログラムがあるディレクトリに移動します。
wget https://www.waveshare.com/w/upload/0/01/7.5inch_e-paper_hat_b_code.7z
7zr x 7.5inch_e-paper_hat_b_code.7z
cd 7.5inch_e-paper_hat_b_code/raspberrypi/python/

ダウンロードしたファイルはImageに関するライブラリがなぜかそのままでは使えない状態なので、下記のようにPILから呼び出すように書き換えます。
main.py
# import Image
# import ImageDraw
# import ImageFont
from PIL import Image, ImageDraw, ImageFont
epd7in5b.py
# import Image
from PIL import Image

修正できたら、下記のコマンドでサンプルプログラムを実行できます。
python main.py

githubのプログラムを実行したのと同じように2種類の画像が表示されると思います。

e-Paperに日本語と日本時間を表示

自分が公開しているリポジトリのプログラムを実行する場合

先ほどの手順でダウンロードしたリポジトリに日本語表示プログラムも含まれているので、下記のようなコマンドで実行できます。
cd ~/gitprojects/raspi_spi_epaper
python main_show_jp.py


メーカーのページからダウンロードしたプログラムを編集する場合

下記のようにmain.pyを変更すると、日本語と日本時間を表示できます。

日本語を扱うために、main.pyの先頭に下記の行を追加して、文字コードとしてutf-8を定義します。
# encoding: utf-8

時間を扱うためのライブラリをインポートします。
import pytz
import datetime

日本語を含んでいるMotoSansCJK-Boldを利用するフォントとして読み込みます。
    # font = ImageFont.truetype('/usr/share/fonts/truetype/freefont/FreeMonoBold.ttf', 24)
    font = ImageFont.truetype('/usr/share/fonts/opentype/noto/NotoSansCJK-Bold.ttc', 45)

赤帯に「e-Paper demo」と表示していたえりあに、黒文字で「Hello, world. こんにちは。」と表示します。
注意すべきなのは、日本語を含む文字列はユニコードとして扱うため「"」の前に「u」を付けることです。
    # draw_red.rectangle((0, 6, 640, 40), fill = 0)
    # draw_red.text((200, 10), 'e-Paper demo', font = font, fill = 255)
    draw_black.text((15, 10), "Hello, world. " + u"こんにちは。", font = font, fill = 0)

display_framの前に、空いている画面下のスペースに日本時間を表示します。
pytzを利用してAsia/Tokyoの時間を取得し、strftimeで月、日、時、分を表示しています。
    jp_now = datetime.datetime.now(pytz.timezone('Asia/Tokyo'))
    draw_black.text((15, 300), jp_now.strftime('%m/%d %H:%M ') + u"表示", font = font, fill = 0)

画像ファイルの情報を表示する処理は不要なので、削除かコメントアウトします。
    # display images
    # frame_black = epd.get_frame_buffer(Image.open('black.bmp'))
    # frame_red = epd.get_frame_buffer(Image.open('red.bmp'))
    # epd.display_frame(frame_black, frame_red)

上記の変更ができたら、プログラムを実行します。
python main.py

成功すれば、自分が公開しているリポジトリのプログラムと同様の表示になると思います。

定期実行

pythonの実行コマンドをcrontabに登録することで、定期的に実行できます。

下記のコマンドでcrontabの編集モードになります。
crontab -e

下記の行を追加すると10分に1回、日本時間表示プログラムが実行されます。
*/10 * * * * python /home/pi/gitprojects/raspi_spi_epaper/main_show_jp.py

メーカーのページからダウンロードしたプログラムを利用する場合は、このような記述を追加します。
*/10 * * * * python [ダウンロードしたディレクトリのパス]/7.5inch_e-paper_hat_b_code/raspberrypi/python/main.py

まとめ

e-PaperをRaspberry Piで制御して、日本語と日本時間を表示できました。
細かい表示はかすれたり、にじんだように表示されてしまうので、文字をはっきり見せるせるにはボールド体で45位の文字サイズで表示するのが良いように思いました。

今回は7.5インチのe-Paperを利用しましたが、もっと大きなe-Paperを売っているところがあったら、教えていただけると嬉しいです。
(13インチ位のe-Paperが欲しいです。)

参考になれば嬉しいです。

参考

7.5 inch color e-paper display GDEW075Z09
Pythonの UTC ⇔ JST、文字列(UTC) ⇒ JST の変換とかのメモ

更新情報

2018.04.16
更新時間を短くしたい場合は2色にするか、サイズを小さくしたら良いという情報を、使ったものに追加しました。

2018.04.19
aptコマンドで必要なライブラリをインストールできたため、pipコマンドを削除しました。

2018.04.25
Hat型を手に入れたので、その写真を追加しました。

0 件のコメント :

コメントを投稿