背景
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(電子ペーパー)を動かして日本語を表示する方法
使ったもの
- 1872×1404, 10.3inch flexible E-Ink display HAT for Raspberry Pi
Raspberry Pi用のHatが付いたe-paper1872x1404 10.3インチのe-paperモジュールです。 - Raspberry Pi Zero + Raspbian stretch desktop (2019.07リリース版)
組み立て
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 Wikihttps://github.com/asukiaaa/raspi_spi_epaper
0 件のコメント :
コメントを投稿