Raspberry Pi 3とLCDディスプレイを接続し文字を表示させてみる

#はじめに
- IoTが注目され始め、最近何かと話題のラズベリーパイをはじめてみようとRaspberryPi3と[Raspberry Piで学ぶ電子工作 専用 実験キット 基本部品セット スターターパック (電子部品関連)](https://www.amazon.co.jp/gp/product/B01AUN1JYW/ref=oh_aui_detailpage_o00_s00?ie=UTF8&psc=1)を購入しました。
- ラズパイの初期設定からLチカまでは簡単にできたのですが、LCDディスプレイの接続には結構苦労しました。購入したセットには説明書も付いておらず、ネットで色々調べ試すはめになりました。
- 私と同じ苦労をしなくて済むよう、現在ラズパイ-LCDディスプレイ接続で苦戦している人向けに本ページを書きました。少しでもお役に立てれば幸いです。

#LCDディスプレイ接続結果のイメージ

- 本ページでは以下画像のように文字を表示できるところまでを目標としています。

[ラズパイとLCDディスプレイを接続し文字を表示させた時の写真]
<img src="https://qiita-image-store.s3.amazonaws.com/0/144326/fa63880e-3ca8-51a6-6915-31a88e926f36.jpeg" width=70% />

#前提
- ラズパイの型番：Raspberry Pi 3 Model B Rev 1.2 
- LCDディスプレイ：[Raspberry Piで学ぶ電子工作 専用 実験キット 基本部品セット スターターパック (電子部品関連)](https://www.amazon.co.jp/gp/product/B01AUN1JYW/ref=oh_aui_detailpage_o00_s00?ie=UTF8&psc=1)に付属しているオソヨー製LCDモジュール
- ジャンパー線(メス-メス)×4本　※「ブレットボード×1個+ジャンパー線(オス-メス)×8本」で代用可能
- pythonコードでLCDディスプレイ接続し文字を表示させます。

#ラズパイとLCDディスプレイの配線の仕方
- ラズパイの２ピン・３ピン・５ピン・６ピンの４つを利用し以下写真のように配線します。配線する際は必ずラズパイの電源をオフ(USBケーブルを外した状態)にしておきます。
 - ２ピンはLCDディスプレイ裏側のVCCと書かれたピンをジャンパー線で接続<br/>
   ※写真では緑のジャンパー線
 - ３ピンはLCDディスプレイ裏側のSDAと書かれたピンをジャンパー線で接続<br/>
   ※写真では黄色のジャンパー線
 - ５ピンはLCDディスプレイ裏側のSCLと書かれたピンをジャンパー線で接続<br/>
   ※写真では橙色のジャンパー線
 - ６ピンはLCDディスプレイ裏側のGNDと書かれたピンをジャンパー線で接続<br/>
   ※写真では青色のジャンパー線

[ラズパイのピン配置拡大図]
![IMG_6185.jpg](https://qiita-image-store.s3.amazonaws.com/0/144326/0d4d5589-b29d-53ab-276a-dcb8ed386d33.jpeg)

[ラズパイとLCDディスプレイ配線写真]
![IMG_6188.JPG](https://qiita-image-store.s3.amazonaws.com/0/144326/22e6bf8b-0ac3-1fce-8e9a-a932008d1d36.jpeg)



#ラズパイ側の設定
- ラズパイとLCDディスプレイの接続にはI2C通信という技術を使います。そのためにはラズパイ側にI2C通信を有効化したり、必要なライブラリをインストールするなど諸々の設定が必要になります。

##I2C通信の有効化
- ラズパイのターミナルを起動し、以下コマンドを実行します。


```sh
sudo raspi-config
```
- 以下のような画面が立ち上がるので「5 Interfacing Options > P5 I2C」を選択します。その後ラズパイを再起動し、I2C通信を有効化します。※ラズパイのバージョンによってやり方が異なるようです。その場合は[こちらのサイト](http://www.neko.ne.jp/~freewing/raspberry_pi/raspberry_pi_3_gpio_enable_i2c/)が参考になると思います。
 
[Raspbianの設定ツール起動画面]
![image.png](https://qiita-image-store.s3.amazonaws.com/0/144326/ed9a4b93-7f2a-282b-9563-52f8a232a89a.png)

[5 Interfacing Options選択後の画面]
![image.png](https://qiita-image-store.s3.amazonaws.com/0/144326/bfd68bbc-8409-43e8-411a-590d3e24bf47.png)

[P5 I2C選択後の画面]
![image.png](https://qiita-image-store.s3.amazonaws.com/0/144326/39168660-28a1-d7c0-59b9-a15ad01019cb.png)
##モジュールファイルの設定
- ラズパイのターミナルにて以下コマンドを実行し、モジュールファイルに「i2c-bcm2708」、「i2c-dev」を追記します。

```sh
sudo vim /etc/modules
```
[モジュールファイルの編集結果]
![image.png](https://qiita-image-store.s3.amazonaws.com/0/144326/674e6f53-a0d1-7681-a200-f31bae4533cb.png)

##I2Cに必要なライブラリをインストール
- ラズパイのターミナルにて以下のコマンドを実行し、smbusとi2c python libraryのインストールします。

```sh
sudo apt-get install -y python-smbus i2c-tools
```

##ラズパイとLCDディスプレイの接続確認とI2C通信のアドレスを確認
- ラズパイのターミナルにて以下のコマンドのいずれかを実行します。

```sh
sudo i2cdetect -y 1
```

```sh
sudo i2cdetect -y 0
```
- 以下のような表示がされれば成功です。以下の結果の場合、LCDディスプレイのI2C通信アドレスは「0x3f」と読み取れます。 ※ハードウェアによっては、「0x27」の場合もあるようです。
- すべて「--」と表示される場合はLCDディスプレイとの接続に失敗しています。配線やこれまでのラズパイの設定に誤りが無いか再度確認してみてください。

[コマンド実行結果]
![image.png](https://qiita-image-store.s3.amazonaws.com/0/144326/612f99c8-e011-e723-5c02-ba9bdeec55af.png)

##pythonコードをインストール
- アドレスが「0x27」の場合は以下のコマンドを実行します。

```sh
wget http://osoyoo.com/driver/i2clcda.py
```
- アドレスが「0x3f」の場合は以下のコマンドを実行します。

```sh
wget http://osoyoo.com/driver/i2clcdb.py
```
※「i2clcda.py」と「i2clcdb.py」の差はI2C通信のアドレス(0x27か0x3f)しかなく、それ以外は同じコードのようです。

#LCDディスプレイに文字を表示させてみる
- ダウンロードしたpythonコードを以下のコマンドで実行すれば、LCDディスプレイに文字が表示されるはずです。※冒頭の「I2C LCDディスプレイ接続結果のイメージ」の写真の様になります。

```sh
sudo i2clcdb.py
```


#トラブルシューティング
- 設定や配線も間違えてない、pythonのエラーも出ていない、なのにディスプレイに文字が出てこない！！っという現象に遭遇した時はディスプレイの濃度を確認してみて下さい。ディスプレイの濃度が薄過ぎて既に表示されている文字が見えていないだけかもしれませんよ！

- LCDディスプレイの裏側に濃度を調整できる青いモジュールがあります。中心をドライバー等で回すとことで濃度の調整を行えます。※右に回すと濃く、左に回すと薄くなります。
私はこれに気づかず３日間を無駄にしてしまいました:sweat_smile:

[LCDディスプレイの濃淡調節のやり方]
![image.png](https://qiita-image-store.s3.amazonaws.com/0/144326/82752c9c-6207-19e4-2c09-8219ee7728d9.png)

#参考サイト
- [Raspberry Piでi2c LCDを作動する](http://osoyoo.com/ja/2016/06/01/drive-i2c-lcd-screen-with-raspberry-pi/)
- [Raspberry Pi 3で GPIO端子の I2C機能を有効化する方法](http://www.neko.ne.jp/~freewing/raspberry_pi/raspberry_pi_3_gpio_enable_i2c/)
- [I2C通信の使い方](http://www.picfun.com/c15.html)
- [Raspberry Pi で I2C を利用するための設定](https://www.qoosky.io/techs/2316d68b2e)

#あとがき
- 今回噂のラズパイに初挑戦し、電子工学、Linux、pythonの知識等、幅広いが必要であることがわかりました。
- 結構時間がかかってしまったため、pythonコードの中身を解読する気力が湧かず、さらっとスルーしています。ごめんなさい。:sob:　
- [こちらのサイト](https://qiita.com/jkawamoto/items/4f67779c13dfb34e5dbf)では、本ページのコードとは全く別ですがpythonコードについて解説されていました。気が向いたら、pythonコードを解読した上で、このページを更新できればと思っています。