2019年8月31日土曜日

10.3インチのe-paperをRaspberry Piで制御して日本語を表示してみた


背景

e-paperとは、電子ペーパーやe-inkとも呼ばれる電力供給をやめても情報を表示し続けてくれる表示板です。
電子書籍などに使われています。

Raspberry Piとは、5000円前後で変えるLinuxが動く小型のPCです。
Raspberry Piで使いやすくするための変換基板が付いた10.3インチe-paperのモジュールが発売されたので、試してみました。

備忘録を兼ねて、試したことを共有します。

以前に7.5インチのe-paperも試しているので、こちらの記事もよかったらどうぞ。
Raspberry Piで7.5インチのe-Paper(電子ペーパー)を動かして日本語を表示する方法

使ったもの


組み立て

Raspberry PiのGPIOにHatを接続し、Hatのコネクタとe-paperを平たいケーブルで接続します。




e-paperのWikiに従い、スイッチがOFF, ON, ONのSIP通信の状態であることを確認しました。


e-paperのドライバをインストールして、サンプルを実行

e-paperのWikiに従い、ドライバをインストールします。

参考として、gitprojectsにプログラムをダウンロードしてインストールするコマンドを共有します。
ドライバのバージョンは更新されると思うので、wgetでダウンロードするBcm2835のファイルはWikiから最新のurlを取得して利用するのが良いと思います。

mkdir ~/gitprojects
cd ~/gitprojects
mkdir bom2835
cd bom2835
wget https://www.waveshare.com/w/upload/9/97/Bcm2835-1.56.tar.gz
tar zxvf Bcm2835-1.56.tar.gz
cd bcm2835-1.56
./configure
make
sudo make install

cd ~/gitprojects
git clone https://github.com/waveshare/IT8951.git
cd IT8951
make clean
make
sudo ./IT8951 0 0 01.bmp

epaperモジュールの電圧の個体差をプログラムに指定するようwikiには書かれていますが、1.55vのモジュールを標準の1.50vの設定で動かしても画像は表示されました。
動作が不安定な場合は、e-paperのWikiに従い電圧を変更するのが良いかもしれません。

Raspberry Piとe-paperの接続ができていて、ドライバのインストールも成功していると、上記の最後のコマンドを実行することにより、矩形や柄が表示された後に01.bmpが表示されます。





自分で用意したbmp形式の画像データを表示

圧縮していない8ビット色のbmpファイルを用意すれば、先ほど実行したIT8951コマンドで画像をbmp形式の画像を表示できます。
imagemagicのconvertコマンドを利用すると「アルファチャンネル(透明色)付きpng画像」を「圧縮していないbmp画像」に変換できます。
例として、コワーキングスペースHaLakeのロゴを変換して表示してみます。

まず、imagemagickをRaspbianにインストールします。
sudo apt update
sudo apt install imagemagick

インストールできたらhalake.pngをこのように変換します。
(HaLakeのホームページが更新されたらwgetコマンドは動かなくなると思いますが、それ以外のコマンドはご自身の画像ファイルに対して適用できると思います。)
# 画像を取得
wget -O halake.png https://user-images.strikinglycdn.com/res/hrscywv4p/image/upload/c_limit,fl_lossy,h_300,w_300,f_auto,q_auto/224388/logo_adnol4.png
# 透明な部分を白に置き換え
convert -flatten halake.png halake_without_alpha.png
# png画像を圧縮していない8ビット色のbmp画像に変換
convert halake_without_alpha.png -depth 8 -compress NONE BMP3:halake.bmp

変換したbmp画像をIT8951コマンドで表示します。
sudo ~/gitprojects/IT8951/IT8951 0 0 halake.bmp

表示できました。


ちなみに、透明な部分を白に置き換えないと、濃いめの色が適用されます。


画像表示機能だけを使うために、ドライバのプログラムを変更

cloneしてきたものをmakeしたIT8951は、サンプルの柄や模様が表示された後に画像が表示されます。
柄は模様は表示せず画像をすぐに表示してほしいので、main.cのExampleという名がつく関数をコメントアウト(文頭に//を追加)して、実行しないようにします。

main.cの17行目から20行目くらいに該当する記述があります。

viやnanoなどのエディタでコメントアウトするか、下記のsedコマンドでコメントアウトします。
cd ~/gitprojects/IT8951
sed -i -e "s/IT8951DisplayExample();/\/\/ IT8951DisplayExample();/g" main.c
sed -i -e "s/IT8951DisplayExample2();/\/\/ IT8951DisplayExample2();/g" main.c
sed -i -e "s/IT8951_GUI_Example();/\/\/ IT8951_GUI_Example();/g" main.c

コメントアウトしたらこうなります。


main.cの実行したくない関数をコメントアウトしたら、IT8951をmakeしなおして実行します。
cd ~/gitprojects/IT8951
make
sudo ./IT9851 0 0 01.bmp

柄や矩形が表示されていたときは画像が表示されるまで30秒くらいかかりましたが、余分な関数を実行しないことにより10秒くらいで画像が表示されるようになりました。

pygameからbmp画像を作成

画像をプログラマブルに作りたいので、pythonのpygameを利用してbmp画像を作ります。

関連ライブラリをインストール

python3-pipとライブラリ管理プログラムのpip3をインストールします。
sudo apt install pip3

pip3がインストールできたら、pygameをインストールします。
pip3 install pygame

日本語を表示したいのでnotoフォントをインストールします。
(300MBくらいダウンロードするので時間がかかります。)
sudo apt install fonts-noto

プログラムを作成

環境ができたので、プログラムを作ります。
この例では~/gitprojects/hello-sample/hello_in_jp.pyを作ります。

ディレクトリを作って、ファイルを作成します。
mkdir ~/gitprojects/hello-sample
cd ~/gitprojects/hello-sample
vi hello_in_japanese.py

自分がgithubで公開しているプログラムを動かすので良ければ、wgetで取得できます。
wget https://raw.githubusercontent.com/asukiaaa/image-creator-for-epaper10p3/master/hello_in_jp.py

hello_in_jp.py
# -*- coding: utf-8 -*-
import pygame

pygame.init()

BLACK = (  0,   0,   0)
WHITE = (255, 255, 255)

size = [1872,1404]
surface = pygame.Surface(size)
sysfont80 = pygame.font.SysFont('notosansmonocjksc', 80)
sysfont200 = pygame.font.SysFont('notosansmonocjksc', 200)

surface.fill(WHITE)

helloText = sysfont200.render(u'こんにちは。', False, BLACK)
surface.blit(helloText, (0, 0))

infoText = sysfont80.render(u'ePaperに出力しています。', False, BLACK)
surface.blit(infoText, (0, 270))

pygame.image.save(surface, 'hello_in_jp.bmp')

プログラムの概要を説明します。

epaperの大きさに合わせて1872x1404の大きさのsurfaceを定義し、白で塗りつぶして初期化しています。
import pygame

pygame.init()

WHITE = (255, 255, 255)

size = [1872,1404]
surface = pygame.Surface(size)

surface.fill(WHITE)

notosansmonocjkscの2種類の大きさのフォントを定義して、surfaceに黒い文字を書き込んでいます。
sysfont80 = pygame.font.SysFont('notosansmonocjksc', 80)
sysfont200 = pygame.font.SysFont('notosansmonocjksc', 200)

helloText = sysfont200.render(u'こんにちは。', False, BLACK)
surface.blit(helloText, (0, 0))

infoText = sysfont80.render(u'ePaperに出力しています。', False, BLACK)
surface.blit(infoText, (0, 270))

SysFontで呼び出せるフォントの種類は、この行を有効にする(行頭の#を消す)と実行時に表示できます。

編集が終わったら、bmpファイルを出力しています。
pygame.image.save(surface, 'hello_in_jp.bmp')

プログラムで作った画像をe-paperに表示

プログラムを動かして画像を作り、その情報をIT8951コマンドでe-paperに送信します。
cd ~/gitprojects/hello-sample
python hello_in_jp.py
sudo ~/gitprojects/IT8951/IT8951 0 0 hello_in_jp.bmp

表示できました。


まとめ

10.3インチのe-paperに日本語を表示できました。

都度bmpファイルに書き出しているため改善の余地はありますが、とりあえずやりたいことができました。
pygameで作ったデータをbmpファイルに書かずにe-paperに送信する仕組みを作った方がいらっしゃれば、共有していただけるととても嬉しいです。

参考

10.3inch e-Paper HAT (D) - Waveshare Wiki
https://github.com/asukiaaa/raspi_spi_epaper

0 件のコメント :