Raspberry PiでI2C接続の128×64 OLEDに日本語を表示(美咲フォント)

先日のmbed nucleoでの128×64ピクセルOLEの駆動試験に続き、今年の冬の雷雲ガンマ線観測で使用するRaspberry Pi 3でも128×64ピクセルのOLED(Alibabaの販売サイト/Adafruitの販売サイト)をI2Cインタフェース経由で駆動してみました。画面そのものは小さいですが、16x2行のディスプレイよりも少ないインタフェース線数で、より多くの情報を表示することができます。みなさんも自分の電子工作で使ってみては。

【参考】雷雲プロジェクト - Thundercloud Project

概要

基本的にはAdafruitによるチュートリアル「SSD1306 OLED Displays with Raspberry Pi and BeagleBone Black」の手順通り。日本語フォントの読み込みと文字の表示のところだけ新規要素になります。

SSD1306というコントローラを搭載したディスプレイで使用できるAdafruitのPythonライブラリ(github)をつかうと、I2CもしくはSPIで接続したディスプレイに対して、テキストや図形の表示が簡単にできます。さらにTTF形式のフォントが読み込めてテキストごとにフォントを変更できるうえ、フォントサイズも簡単に指定できます。

美咲フォントのTTFファイルを読み込むことで、1文字8×8ピクセルの日本語(漢字も!)が表示できるようになります。ライブラリ製作元のAdafruitと美咲フォントの製作者の「門真 なむ」さんに感謝(懐かしいポケコンのプログラムなども公開されています)。

実行結果

以下のようになります。ちゃんと読めますよね!? 表示しているテキストは雷雲ガンマ線観測データを公開している「雷雲プロジェクト - Thundercloud Project」の冒頭部分(このディスプレイとは関係ないですが、thdr.infoでは皆さんも雷雲ガンマ線の観測データの解析に参加できるようになっています)。

最近の研究から、地球上のカミナリ雲でも電子が高いエネルギーにまで「加速」されている証拠が見つかってきました。加速された電子が大気分子と衝突することで生じるガンマ線がカミナリ雲からビーム状に放出されていることがわかったのです!
日本語フォントを利用して「雷雲プロジェクト」のイントロの文章を表示した例。[/caption]

配線とRaspberry Piの設定

ブレッドボードを使って以下のように配線しました。このディスプレイの消費電力は20-30mA程度なので、電源は3.3Vピンから供給すれば間に合います。 Raspberry PiはデフォルトではGPIOコネクタに出ているI2CインタフェースがI2Cとして使えないようになっているので、Raspberry Pi Configの画面からI2Cの利用を許可しておく必要があります(1回実施すればOK)。 ```shell # Raspberry Pi Configの画面を表示 sudo raspi-config # "8 Advenced Options" → "A7 I2C"を選択してI2Cを許可する。 ``` ディスプレイモジュールを接続して、以下の確認コマンドを実行すると、接続したディスプレイのアドレスのところにエントリが表示されるはずです(下の例では0x76がディスプレイのアドレス)。 ```shell # I2C関連のツールのインストール > sudo apt-get install i2c-tools # 接続されたデバイスの検索 > sudo /usr/sbin/i2cdetect -y 1 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- 76 -- ```

Pythonライブラリのインストール

以下のようにして、PythonからI2Cを利用できるようにします。 ```shell $ sudo apt-get update $ sudo apt-get install build-essential python-dev python-pip $ sudo pip install RPi.GPIO # 続いて、Adafruitのライブラリのインストール。 $ sudo apt-get install git $ git clone https://github.com/adafruit/Adafruit_Python_SSD1306.git $ cd Adafruit_Python_SSD1306 $ sudo python setup.py install ```

日本語フォントのダウンロード

以下のようにしてTTFファイルをダウンロードしてください。 ```shell $ cd /home/pi $ mkdir font/misakifont $ cd font/misakifont $ wget http://www.geocities.jp/littlimi/arc/misaki/misaki_ttf_2015-04-10.zip $ unzip misaki_ttf_2015-04-10.zip $ ls misaki.txt misaki_gothic.ttf  ←ゴシック体のフォント misaki_mincho.ttf ←明朝体のフォント readme.txt ```

Pythonスクリプトのソースコード

ソースコードはssd1306_japanese_font.pyとしてgistにアップロードしておきました 以下の行で、/home/pi/font/misakifont/にダウンロードした美咲フォントのTTFファイルを読み込んでいます。 ```python font = ImageFont.truetype('/home/pi/font/misakifont/misaki_gothic.ttf', 8, encoding='unic') ``` テキストの表示は、描画開始位置のx,y座標と、str変数に入れた文字列を与えて、text()メソッドで実行できます。日本語文字列はu'日本語のテキスト'のようにして、UTF指定で定義しています。 ```python draw.text((x,y), str, font=font, fill=255) ``` 実際にこのディスプレイを雷雲ガンマ線検出器の動作状況のモニタとして使用するときは、今回のスクリプトでtext()メソッドに文字列を渡すところを、ファイルから読み込むように変更します。表示プログラムとは別に、I2Cで接続した温湿度・耐気圧センサやGPSレシーバの時刻、データ取得ソフトウエアの出力などから画面表示データのテキストファイルを用意するプログラムを実行して、定期的に画面表示を更新します。

実行

上記のファイルをssd1306_japanese_font.pyというファイル名で保存して、以下のようにすると画面に文字が表示されるはずです。エラーが出る場合はこのページのコメント欄もしくは、gistのページのコメント欄で教えてください。 ```shell $ python ssd1306_japanese_font.py ```

セットアップの全体像

Raspberry Piと接続したときのサイズ感は以下の様な感じです。小さい!でも8×8ピクセルで文字が読めます。すごい。