RaspberryPi上のPythonから電子ペーパー(e-Paper)を制御する

# 概略
通常、液晶ディスプレイは電気を流し続けないと表示を維持できませんが、
電子ペーパーは、画面を書き換えするときにのみ電気を必要とし、電気が流れない場合は最後の表示が残るデバイスのことです。
今回、有識者ならば躓かないところと思う場所で、大変時間がかかってしまいました。
サンプルプログラムを実行するまでの道筋を残します。
興味のある方のお役に立てればと思います。

# 準備
今回用意した材料は以下の通りです。
・RaspberryPi Zero W    ※GPIOを半田付けしたくない方は、WHがおすすめです。
・e-Paper Module 1.52 inch 
・Raspbian(strtch) 4.14.xxの入ったSDカード(8GB)
・USB Keyboard & Mouse
・HDMI Display
Raspberry Pi ZeroにKeyboradとMouse、Displayを直接接続し、穴あけを実施しました。


# 手順
## 結線手順
e-Paper MoudleとRaspberry Piを接続します。


参照) https://www.waveshare.com/wiki/1.54inch_e-Paper_Module

Hardware connection
Here is the connection between Raspberry Pi 3B and E-paper.

| e-Paper       |       Raspberry Pi 3B | GPIO Port Number |
|:-----------------|:-----------------|:---------|
| 3.3V             |              3.3V |-|
| GND           |            GND |-|
| DIN             |              MOSI |GPIO10|
| CLK             |              SCLK |GPIO11|
| CS             |              CE01 |GPIO08|
| DC             |              Pin22 |GPIO25|
| RST             |              Pin11 |GPIO17|
| BUSY             |              Pin28 |GPIO24|

GPIO配置参照
https://elinux.org/RPi_Low-level_peripherals#Model_A.2B.2C_B.2B_and_B2

接続例
![rpi_zero_2.jpg](https://qiita-image-store.s3.amazonaws.com/0/97875/24579bc5-56ca-6686-d873-8d9bc152f96d.jpeg)



## OS準備
・SDカードにRaspbian OSを入れ、Raspberry Piに指しこみ、電源を入れます。
・起動後、WiFiネットワークの設定を行います。
・キーボードを日本語に変更します。
(Preferences -> Mouse and Keyboard Settings -> Keyboardタブ -> Keyboard Layoutボタン -> Country = Japan / Variant = Japanese)
・アップデートを行います。

```shell:
$ sudo apt-get update
```

## パッケージインストール
Python用のライブラリと、ビルドツール、解凍ツールをインストールします。

```shell
$ sudo apt-get install python-dev
$ sudo apt-get install python-smbus
$ sudo apt-get install python-imaging
$ sudo apt-get install build-essential
$ sudo apt-get install p7zip-full
```

## 環境準備
### インタフェースの有効化
・Raspberry Pi 上から、SPIインタフェースを有効にします。
(Preferences -> Raspberry Pi Configuration -> Interfacesタブ -> SPI = Enabled)
設定変更後、再起動を行います。

```shell:
$ reboot
```

## サンプルアプリケーションのダウンロード
以下から最新のファイルをダウンロードします。
https://www.waveshare.com/wiki/File:1.54inch_e-Paper_Module_code.7z

例）

```shell

$ wget https://www.waveshare.com/w/upload/7/73/1.54inch_e-Paper_Module_code.7z
```

## ダウンロードしたファイルを解凍

```shell
$ cd
$ mkdir e-Paper
$ mv 1.54inch_e-Paper_Module_code.7z e-Paper
$ cd e-Paper
$ 7z x 1.54inch_e-Paper_Module_code.7z
```

フォルダを確認すると、以下のフォルダが作成されています。

```shell

$ ls
1.54inch_e-Paper_Module_code.7z
arduino
raspberrypi
stm32
```

今回は、RaspberryPiでe-Paperを扱うため、arduinoとstm32は気にしません。

## サンプルの実行

```shell

$ cd raspberrypi

$ ls
bcm2835
python
wiringpi
```

上記、３タイプありますが、全て同じデモンストレーションとなります。
bcm2835を使用する場合は、別途BCM2835のライブラリをインストールしてする必要があります。
今回はpython版を使用します。
raspberrpiフォルダ配下のmain.pyを実行します。

```shell:
$ cd python
$ python main.py
```

これを実行すると以下のような表示になりました。

![ePaper_Broke.jpg](https://qiita-image-store.s3.amazonaws.com/0/97875/7c17979e-38c7-d994-4b36-dd380db2d469.jpeg)

真ん中の表示部分に、四角が縦に２個表示されています。
液晶が壊れたか？と思い、BCM2835版やWiringio版を実行すると、正常に表示されました。
これは、Pythonのコード上に何か問題があるのでは？と考えました。

Drawした画像の回転系でおかしくなっているのではないか？と、色々パラメータを変更し確認して行くと、回転後の画像サイズが正しく伝わっていないようです。
rotateを調べると、画像回転後のサイズを変更する素敵なパラメータを発見し、以下の追加で動くことが確認できました。

```python:main.py
 L:82 epd.set_frame_memory(time_image.rotate(90),80,80) 

                    ↓

 L:82 epd.set_frame_memory(time_image.rotate(90,expand=True),80,80) 
```

![ePaper_Normal.jpg](https://qiita-image-store.s3.amazonaws.com/0/97875/7fd6778e-1a07-ff70-c04d-794b265266b0.jpeg)

この修正を行わない場合でも、動く環境がありました。
ライブラリのバージョンが影響している可能性があります。
まずはmain.pyを実行し、問題があれば上記の修正を行なってみてください。

> <それでも上記の表示にならない場合>
> Python上で使用しているImage,ImageDraw,ImageFontのライブラリをPillowに変更します。
>
> ①Pillowのインストール
> $ pip install Pillow
>
> ②main.pyの編集
> import行を以下の通り変更します
> from PIL import Image
> from PIL import ImageDraw
> from PIL import ImageFont
>


# Python以外の実行方法

## BCM2835版

BCM2835フォルダ配下でmakeを実行する前に、BCM2835をインストールします。
http://www.airspayce.com/mikem/bcm2835/

### BCM2835インストール手順
上記サイトのinstallation から抜粋
( 2018/07/08時点の最新バージョンは、1.56でした。1.xxを置き換えてください。 ) 

```shell
$ sudo wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.xx.tar.gz
$ tar zxvf bcm2835-1.xx.tar.gz
$ cd bcm2835-1.xx
$ ./configure
$ make
$ sudo make check
$ sudo make install
```

### BCM2835フォルダ配下でのmake

```shell
$ cd ~/e-Paper/raspberrypi/bcm2835
$ sudo make
$ ls
epd
(etc..)
```
epdが作成されていることを確認します。

### 実行

```shell
$ sudo ./epd
```
上記にて、e-Paperの画面が更新されます。


## Wiringpiでの実行方法

### Wiringpiのビルド

```shell

$ cd ~/e-Paper/raspberrypi/wiringpi
$ sudo make
$ ls
epd
(etc..)
```
epdが作成されていることを確認します。

### 実行

```shell
$ sudo ./epd
```
上記にて、e-Paperの画面が更新されます。


# 最後に
今回、電子ペーパーの導入から、サンプルを実行し、画面表示までを記載しました。
ここまでくれば、ソースコードを少し見直すだけで、なんでも表示できます！
お値段も、RaspberryPiZeroWHとe-Paper1.52インチを合わせても五千円程度です。
すごい時代が来たなぁ。。と実感しております。
こういう工作を子供の頃から学ばせたら、すごい時代がやってくると思います。


# 参考にさせていただいたサイト
https://www.waveshare.com/wiki/1.54inch_e-Paper_Module
https://macsbug.wordpress.com/2017/09/07/e-paper-with-esp32/
https://tomosoft.jp/design/?p=5252
https://www.waveshare.com/wiki/Pioneer600#Libraries_Installation_for_RPi
http://www.airspayce.com/mikem/bcm2835/
https://tool-lab.com/2013/12/raspi-gpio-controlling-command-2/
穴あけの際、記事を参考にさせていただきました。本当に勉強になります。ありがとうございます。

# 更新
2018/07/15 <それでも上記の表示にならない場合>を追記しました