はじめるまえに
基本的なLinuxコマンド(ディレクトリの移動やテキストをいじれる位)の知識が必要です。
完成予定の物
1分おきにランダムなアイカツ格言と現在時刻を表示する、アイカツ格言時計的な物できた。 pic.twitter.com/VP2qTFtB2O
— ぬる (@_NU_RU_) May 1, 2019
今回の動機と目標
- AliExpressを見てたら、電子ペーパーのパーツを見つけた。
- 調べてたら、どうやら意外とRaspberry Piなどで簡単に動かせるようだった。
3万円する「アイカツ! × Smart Canvas」が、正直アレでこれに似たものなら作れるのではと思った。- Raspberry Piと電子ペーパーを使って、1分おきにランダムなアイカツ格言と、現在の日付・時間が表示される物を作る。
用意するもの
- Raspberry Pi WH
※ピンヘッダが使えて、Pythonが動けば他のモデルでも可(のはず) - Raspbian Stretch Lite
※今回は、4.14(2019-04-08)を使用。 - Waveshare 5.83inch e-Paper (B)
※AliExpressなどで購入可 (赤・黒・白を表示可能なモデル)
AliExpress - Waveshare 5.83inch E-Ink raw display red/black/white three-color e-paper SPI interface for Raspberry Pi/Arduino/STM32 600x448
※千石電商でも売ってるみたいです。
せんごくネット通販 - WaveShare 14597 5.83インチ 600×448 E-Ink 電子ペーパーモジュール for RaspberryPi - Waveshare e-Paper Driver HAT
※Raspberry Piと電子ペーパーを繋ぐ用の基板
AliExpress - Waveshare e-Paper Driver HAT for Universal e-Paper Raw Panels E-ink paper displays compatible with Raspberry Pi 2B/3B/3B+/Zero
※千石電商でも売ってるみたいです。
せんごくネット通販 - WaveShare 13512 Universal e-Paper Raw Panel Driver HAT - フォントファイル(TTF形式)
※今回は「Rounded-X M+」というフォントを使用
自家製フォント工房さんでダウンロードできます。 - アイカツ格言画像
※各自なんとかしてください。 - アイカツ格言時計用のPythonスクリプト
※KAKUGEN_WATCH.pyからダウンロードしてください。
※テキストファイルとして開かれてしまう場合は、ファイル名を指定して保存とかでダウンロードしてください。
セットアップと確認
とりあえず、Raspbian Stretch Liteが動作していて、SSHなどでコマンドが打てる状態にする。
※ここまでは、基本なはずなので解説しません。Pythonのバージョン確認
python -V
Python 2.7.13
Python2系が入ってたので、これで動かすのを目標にします。「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
ダウンロードしたファイルをリネーム
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
7zを解凍するための7zipをインストール(入ってない場合)
sudo apt-get install p7zip-full
7zを解凍したファイルを入れておくフォルダを作る。
mkdir 5.83inch_e-paper_hat_b_code
解凍するためにファイルをフォルダに移動
mv 5.83inch_e-paper_hat_b_code.7z 5.83inch_e-paper_hat_b_code
ダウンロードしたファイルを解凍
cd 5.83inch_e-paper_hat_b_code
7z x 5.83inch_e-paper_hat_b_code.7z
解凍が終わるとファイルが出来ている。
-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と電子ペーパーの接続
電子ペーパー接続作業のために、一旦電源を切る。
sudo shutdown -h now
※シャットダウン確認後、電源のmicro USBケーブルを抜くなどしてください。Raspberry Pi と Waveshare e-Paper Driver HATを繋ぐ。
Waveshare e-Paper Driver HAT と Waveshare 5.83inch e-Paper (B)を繋ぐ。
また電源を付ける。
Raspberry Piのセットアップ
- 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のモジュール関係のセットアップ
サンプルファイルがあるフォルダに移動
cd 5.83inch_e-paper_hat_b_code/RaspberryPi/python2/
サンプルの
main.py
を起動してみる
python main.py
恐らくエラーになる。
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
Pythonのモジュールに
spidev
が無いとの事なのでインストール
sudo apt-get install python-spidev
サンプルの
main.py
をまた起動してみる
python main.py
恐らくまたエラーになる。
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
Pythonのモジュールに
PIL
が無いとの事なのでインストール
sudo apt-get install python-imaging
サンプルの
main.py
をまた起動してみる
python main.py
※フォント指定関係を編集しないとうまい事起動しない。動いたらとりあえず終わり
アイカツ格言画像を用意
※この工程は、Raspberry Pi上じゃなくて良いです。
何かしらの方法で、表示したいアイカツ格言画像を用意
※この解説では157個
の画像を用意したとして進めています。1920x1080で画像を用意した場合、電子ペーパーの解像度の横幅である
600
に合わせて
600x338
にリサイズ。グレースケール化をしてください。
BMP形式にしてください。
ファイル名を
KAKUGEN_XXX.bmp
として、連番にしてください。
例 KAKUGEN_001.bmp ~~~ KAKUGEN_157.bmp
Raspberry Piに
KAKUGEN_IMG
というフォルダを作り、そこに画像をすべて入れてください。
※SambaやSFTPなど、何かしらの方法で転送してください。
アイカツ格言時計を動かしてみる。
必要なモジュールをインストール
pytzをインストールするためにpipが必要なので入ってない場合インストール
sudo apt-get install python-pip
pip install pytz
epd5in83b.py
などがあるフォルダにKAKUGEN_WATCH.py
を置くKAKUGEN_WATCH.py
と同じ場所にフォントファイルとKAKUGEN_IMG
フォルダを置きます。
※ここでは、フォントファイルとしてrounded-x-mplus-2p-heavy.ttf
を使用しています。実行してみる
python KAKUGEN_WATCH.py
画像と日付、現在時刻が表示されたら成功
定期的に実行させる
crontabを使用し1分おきに実行する。
まず
KAKUGEN_WATCH.py
を編集
nano KAKUGEN_WATCH.py
※コピーを取り、別ファイルをいじっても良いです。編集では、
画像ファイル
フォントファイル
へのパスを相対指定ではなく、絶対パスにします。主な編集
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)
※例なので、自分の環境に合わせていじってください。
crontabに登録
crontab -e
1分おきに実行されるようにする。
* * * * * python /home/pi/5.83inch_e-paper_hat_b_code/RaspberryPi/python2/KAKUGEN_WATCH_01.py
※実際に.py
ファイルを置いた場所を指定してください。登録したら、しばらく待ってみる。
※ちなみに00秒すぐに更新されないです。どうしてもタイムラグがあります。
※更新が始まるまでpi3だと10秒ほどZero WHだと30秒くらいになります。うまい事更新されたら、おわり。
コード解説
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で作ってみよう。