有機ELディスプレイ(晶门科技有限公司製)を使ってみた

raspberrypiで有機ELディスプレイを使ってみる
使用するディスプレイはaitendoで販売されている晶门科技有限公司製(型番M096P4W)を使う

ディスプレイを以下のように接続する

　　　　　raspberrypi  ディスプレイ
端子番号　　　　1---------VCC
　　　　　　　　3---------SDA
　　　　　　　　5---------SCK
　　　　　　　　6---------GND

I2Cのデバイスドライバの設定を行う
デフォルトではI2Cが無効になっている。そのためI2Cを有効に設定する
やり方はraspberrypiのbootフォルダ直下にあるconfig.txtの中身を変更することで設定できる
config.txtは編集するためには管理者権限が必要になる
端末から管理者権限でファイルを開くことで編集が可能になる

```shell-session
$sudo leafpad /boot/config.txt
```

ファイルが開かれたら「dtparam=i2c_arm=off」になっているところを探し「dtparam=i2c_arm=on」に変更する。そして上書き保存をする

これでI2Cの機能が有効になった。i2cが有効になっているか確認する
i2cが有効にっていればdevフォルダの中に「i2c-1」というファイルが自動で追加される。端末からdevフォルダの中にi2c-1があるか表示させてみる

```shell-session
$ls -l /dev/i2c-1  （末尾は数字のいちである)
```

と入力する
すると

```shell-session
crw-rw---- 1 root i2c 89, 1  2月  4 15:12 /dev/i2c-1
```


と表示されればファイルが自動で追加されていることが分かる
この意味はdevという名前のフォルダの中にi2c-1というファイルがあるかどうかを表示させた内容である

次はディスプレイと通信が出来ているか確認してみる
端末から

```shell-session
$ i2cdetect -y 1　(末尾は数字のいちである)
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- 3c -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --                         
```

ディスプレイのアドレスが「3c」であるため上のように3cが表示されているので通信は成功していることが分かった

ディスプレイに内蔵されているマイコンを制御するためのライブラリをダウンロードする。マイコンは晶门科技有限公司のSSD1306を使用している。このマイコンを制御するライブラリをAdafruit社(アメリカ)が作り無償公開している。それでは無償公開しているライブラリをダウンロードしてみる

```shell-session
$git clone https://github.com/adafruit/Adafruit_Python_SSD1306
Cloning into 'Adafruit_Python_SSD1306'...
remote: Counting objects: 112, done.
remote: Total 112 (delta 0), reused 0 (delta 0), pack-reused 112
Receiving objects: 100% (112/112), 34.60 KiB | 0 bytes/s, done.
Resolving deltas: 100% (57/57), done.
Checking connectivity... done.
```

次はライブラリをビルドする

```shell-session
$cd Adafruit_Python_SSD1306
$python setup.py build
running build
running build_py
creating build
creating build/lib.linux-armv7l-2.7
creating build/lib.linux-armv7l-2.7/Adafruit_SSD1306
copying Adafruit_SSD1306/SSD1306.py -> build/lib.linux-armv7l-2.7/Adafruit_SSD1306
copying Adafruit_SSD1306/__init__.py -> build/lib.linux-armv7l-2.7/Adafruit_SSD1306
```

ライブラリをインストールする

```shell-session
$sudo python setup.py install
running install
running bdist_egg
running egg_info
creating Adafruit_SSD1306.egg-info
writing requirements to Adafruit_SSD1306.egg-info/requires.txt
writing Adafruit_SSD1306.egg-info/PKG-INFO
writing top-level names to Adafruit_SSD1306.egg-info/top_level.txt
writing dependency_links to Adafruit_SSD1306.egg-info/dependency_links.txt
writing manifest file 'Adafruit_SSD1306.egg-info/SOURCES.txt'
reading manifest file 'Adafruit_SSD1306.egg-info/SOURCES.txt'
writing manifest file 'Adafruit_SSD1306.egg-info/SOURCES.txt'
installing library code to build/bdist.linux-armv7l/egg
running install_lib
running build_py
creating build/bdist.linux-armv7l
creating build/bdist.linux-armv7l/egg
creating build/bdist.linux-armv7l/egg/Adafruit_SSD1306
copying build/lib.linux-armv7l-2.7/Adafruit_SSD1306/SSD1306.py -> build/bdist.linux-armv7l/egg/Adafruit_SSD1306
copying build/lib.linux-armv7l-2.7/Adafruit_SSD1306/__init__.py -> build/bdist.linux-armv7l/egg/Adafruit_SSD1306
byte-compiling build/bdist.linux-armv7l/egg/Adafruit_SSD1306/SSD1306.py to SSD1306.pyc
byte-compiling build/bdist.linux-armv7l/egg/Adafruit_SSD1306/__init__.py to __init__.pyc
creating build/bdist.linux-armv7l/egg/EGG-INFO
copying Adafruit_SSD1306.egg-info/PKG-INFO -> build/bdist.linux-armv7l/egg/EGG-INFO
copying Adafruit_SSD1306.egg-info/SOURCES.txt -> build/bdist.linux-armv7l/egg/EGG-INFO
copying Adafruit_SSD1306.egg-info/dependency_links.txt -> build/bdist.linux-armv7l/egg/EGG-INFO
copying Adafruit_SSD1306.egg-info/requires.txt -> build/bdist.linux-armv7l/egg/EGG-INFO
copying Adafruit_SSD1306.egg-info/top_level.txt -> build/bdist.linux-armv7l/egg/EGG-INFO
zip_safe flag not set; analyzing archive contents...
creating dist
creating 'dist/Adafruit_SSD1306-1.6.1-py2.7.egg' and adding 'build/bdist.linux-armv7l/egg' to it
removing 'build/bdist.linux-armv7l/egg' (and everything under it)
Processing Adafruit_SSD1306-1.6.1-py2.7.egg
Copying Adafruit_SSD1306-1.6.1-py2.7.egg to /usr/local/lib/python2.7/dist-packages
Adding Adafruit-SSD1306 1.6.1 to easy-install.pth file

Installed /usr/local/lib/python2.7/dist-packages/Adafruit_SSD1306-1.6.1-py2.7.egg
Processing dependencies for Adafruit-SSD1306==1.6.1
Searching for Adafruit-GPIO==1.0.3
Best match: Adafruit-GPIO 1.0.3
Processing Adafruit_GPIO-1.0.3-py2.7.egg
Adafruit-GPIO 1.0.3 is already the active version in easy-install.pth

Using /usr/local/lib/python2.7/dist-packages/Adafruit_GPIO-1.0.3-py2.7.egg
Searching for spidev==3.3
Best match: spidev 3.3
Adding spidev 3.3 to easy-install.pth file

Using /usr/local/lib/python2.7/dist-packages
Searching for Adafruit-PureIO==0.2.1
Best match: Adafruit-PureIO 0.2.1
Processing Adafruit_PureIO-0.2.1-py2.7.egg
Adafruit-PureIO 0.2.1 is already the active version in easy-install.pth

Using /usr/local/lib/python2.7/dist-packages/Adafruit_PureIO-0.2.1-py2.7.egg
Finished processing dependencies for Adafruit-SSD1306==1.6.1
```

サンプル画像を表示させてみる

```shell-session
$cd examples
$python image.py
```

画像が表示されたと思うが引き伸ばされたようになっているのでimage.pyのソースを編集し32をコメントアウトし64を有効にする
![IMG_20180204_164703.jpg](https://qiita-image-store.s3.amazonaws.com/0/190551/584be694-7945-9001-479a-d637563319bb.jpeg)

日本語のサンプルを表示してみる
ソースコードはある雑誌のソースを参考にした
ソースを実行すると私の環境ではエラーが以下の通り出た

```shell-session
pi@raspberrypi:~/Downloads $ python oled_japanese.py
Traceback (most recent call last):
  File "oled_japanese.py", line 85, in <module>
    main()
  File "oled_japanese.py", line 82, in main
    do_disp(disp)
  File "oled_japanese.py", line 41, in do_disp
    encoding = 'unic')
  File "/usr/lib/python2.7/dist-packages/PIL/ImageFont.py", line 240, in truetype
    return FreeTypeFont(font, size, index, encoding)
  File "/usr/lib/python2.7/dist-packages/PIL/ImageFont.py", line 137, in __init__
    self.font = core.getfont(font, size, index, encoding)
IOError: cannot open resource
```

エラーの原因を調べたところフォントのデータがraspbianにインストールされていないことが分かった。データというのはNotoSansCJK-Thin.ttcのことである。これを次のサイトからダウンロードするとエラーが無くなった
サイトはhttps://www.google.com/get/noto/help/cjk
である

これを任意のフォルダ内に解凍しoled_japanese.pyのソースを以下の通り書き換える。当方はDownloads直下に解凍した

NG：
   # 日本語フォントの準備
    font     = ImageFont.truetype(
        font     = 'NotoSansCJK-Thin.ttc',
        size     = fontsize, 
        encoding = 'unic')
OK：
   font     = ImageFont.truetype('/home/pi/Downloads/NotoSansCJK-Thin.ttc', 12, encoding = 'unic')

当方はNotoSansCJK-Thin.ttcをDownloads直下に解凍したのでフォルダの絶対パスを上のように書き換えた。すると下図の通り表示された
![IMG_20180206_212705.jpg](https://qiita-image-store.s3.amazonaws.com/0/190551/34c43387-f125-ee8e-3255-0558939d6b89.jpeg)

めでたしめでたし