ラズパイにて、有機ELディスプレイのサンプルコードを動かす

# お知らせ

- [2020.10.10]新しいラズパイイメージではエラーが出たため、参照先を変更しました。

# はじめに

ラズベリーパイにて、電子工作でよく使われる<br>[0.96インチ　128x64ドット有機ELディスプレイ]を動作させたいと思います。

![IMG_006.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559938/f9213ea9-3b2c-e9cc-d633-27aa706ed0c5.jpeg)

# 紹介する内容

- 128x64ドット有機ELディスプレイの概要
- ラズベリーパイ3+を使い、IPアドレスの表示（サンプルコード実行）

# 0.96インチ　128x64ドット有機ELディスプレイ - SSD1306

0.96インチ　128x64ドット有機ELディスプレイは、SSD1306が搭載されいている安価な表示モジュールです。<br>

SSD1306デバイスは、I2C通信(2線シリアル)とSPI通信(4線シリアル)の
2つの方式を対応していますが、販売されているものはどちらかになります。
今回は、私が秋月電子で購入したものは、I2C通信となります。

# 作業環境

- ラズベリーパイ3
    - Linux raspberrypi 4.14.79-v7+ #1159 SMP Sun Nov 4 17:50:20 GMT 2018 armv7l GNU/Linux
    - Python 3.6.6 (default, Jan 24 2019, 20:40:14) 

# 機材

※型名が購入先のリンクになっています。

|項目  |型名|備考  |
|---|---|---|
|ラズベリーパイ3        |指定なし   |  |
|有機ELディスプレイ     |[0.96inch 128x64ドット表示 I2C制御](http://akizukidenshi.com/catalog/g/gP-12031/)   | 秋月電子 |
|ブレッドボード  | 指定なし   |  |
|ジャンパーケーブル| 4本   |  |


# 接続図

　接続図は以下となります。

![001_rpi_oled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559938/046fa02e-fd2f-4baa-eda7-1b0fdec83436.png)


# 手順

- I2C接続を確認する
- 必要なモジュールをインストールする
- サンプルコードを実行する

## I2C接続を確認する

下記のコマンドでデバイスが接続されているかわかります。

```
$ i2cdetect -y 1
```
![003_i2cdetect.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559938/c4a99c8b-1fe8-20ed-f6e6-44ebea9222d2.png)

"3c"がI2Cアドレスとなります。

"3c"が"--"と表示される場合、接続が正しくないことが考えられます。
また、購入先によって、I2Cアドレスが異なる場合があります。
異なる場合は、サンプルプログラムにて、I2Cアドレスを指定することが必要です。

## 必要なモジュールをインストールする

サンプルプログラムは、
[Adafruit_CircuitPython_SSD1306](https://github.com/adafruit/Adafruit_CircuitPython_SSD1306)

を使わせていただきます。

ただし、上記のみをインストールしてもいろいろと足りないと怒られるので、
以下の手順で行いました。

### libjpeg-devのインストール

pillowのインストールで足りないと怒られるので、事前にインストール

```
$ sudo apt-get install libjpeg-dev
```

### venvによる環境管理

この手順は必須ではありませんが、環境を分けます。

```
$ python3 -m venv env
$ source env/bin/activate
(env) $ 
```

### Adafruit_SSD1306以外をインストール

```
(env) $ pip install pillow
(env) $ pip install RPi.GPIO
(env) $ pip install Adafruit-GPIO
```


### Adafruit_SSD1306をインストール

```
(env) $ pip install adafruit-circuitpython-ssd1306
(env) $ pip install pillow
(env) $ git clone https://github.com/adafruit/Adafruit_CircuitPython_SSD1306
```

## サンプルプログラムを実行する

### サンプルプログラムを修正する

サンプルプログラムは、下記に配置されています。

```
./Adafruit_CircuitPython_SSD1306/examples/ssd1306_stats.py
```

サンプルコードは、128x32ドット用のコードになっています。
初期化を128x64ドット用に置き換えます。


```変更前
disp = adafruit_ssd1306.SSD1306_I2C(128, 32, i2c)
```
↓

```変更後
disp = adafruit_ssd1306.SSD1306_I2C(128, 64, i2c)
```

### サンプルプログラムを実行する(ssd1306_stats.py)


```
(env) $ python ./Adafruit_CircuitPython_SSD1306/examples/ssd1306_stats.py 
```

ラズベリーパイのIPアドレス、CPU使用率、メモリ使用率、ディスク使用率が表示されます。

![IMG_006.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559938/f9213ea9-3b2c-e9cc-d633-27aa706ed0c5.jpeg)

### それ以外のサンプルの実行結果

```
(env) $ python ./Adafruit_CircuitPython_SSD1306/examples/ssd1306_pillow_animate.py
```
↓
![007_anime.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559938/e0b6be4a-e3a1-64e5-741f-6f17da229471.jpeg)

※文字がスクロールします。

---

```
(env) $ python ./Adafruit_CircuitPython_SSD1306/examples/ssd1306_bonnet_buttons.py
```
↓
![007_button.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559938/8158679e-7a00-ff51-9a13-1685a67271ae.jpeg)

---

```
(env) $ python ssd1306_pillow_images.py 
```
↓
![007_image.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559938/23052678-e669-39ca-2983-6e4644f3051f.jpeg)

---

# 参考

* [Adafruit_CircuitPython_SSD1306](https://github.com/adafruit/Adafruit_CircuitPython_SSD1306)
* [Adafruit Python SSD1306](https://github.com/adafruit/Adafruit_Python_SSD1306)