ラズベリーパイからOLED モニターを使う方法
ハードウェア
今回利用するのはSSD1306を利用したOLEDモニターです。このコントローラーを利用したOLEDモニターは比較的安価かつ入手性も良いためラズベリーパイやマイコンを利用した工作によく利用されています。
またこのモニターは、基本的に1色のみの表示でプログラムから色を変更することは出来ません。
画面の上下で色が違うタイプなどもありますが、基本的にはモニターによって白や青などと色が決まっています。
画面サイズ 128x32 のOLEDモニターを利用するためには、合計で4096個のLEDを制御する必要があります。これを直接ラズベリーパイから制御を行うのは非常に面倒で、効率が悪くなります。そのため通常はコントローラーと呼ばれるICに対してモニターの描画処理をまかせることになります。
この記事ではSSD1306というよく利用されているコントローラーを対象にしています。
OLEDはプログラムのステータス表示や、エラーが発生した場合に文字を表示することが可能であるため使えるようになっておくと便利です。
配線
OLEDモニターを動作させるためには4つのピンを接続する必要があります。
OLEDモニターによっては3v/GNDや、SCL/SDAピンの配置が異なる場合があるので適宜読み替えてください。
なぜピンの名前すら統一されてないのか理解しがたい!
またラズベリーパイ側のピンは以下のサイトが見やすいです。
ソフトウェア
OLEDモニターの利用には以下のライブラリを利用します。このライブラリはいくつかのコントローラーに対応しているため基本的には SSD1306 以外のコントローラーが利用されたモニターでも同じように操作を行うことが出来ます。
ライブラリのインストール
ターミナルで以下のコマンドを実行します。
pip3 install luma.oled
pip3 install serial
サンプルプログラム
簡単な文字の表示やアニメーションを行うサンプルプログラムを用意したので、ターミナルから実行していきます。
git clone https://github.com/kotamorishi/rpi-ssd1306-oled
ディレクトリを移動し、サンプルプログラムを実行します。
cd rpi-ssd1306-oled
python3 draw_text.py
sudo raspi-config
ちょっとした解説
全体のコードは以下のようになっています。
# -*- coding: utf-8 -*-
from luma.core.interface.serial import i2c
from luma.core.render import canvas
from luma.oled.device import ssd1306
from PIL import Image, ImageFont, ImageDraw, ImageOps
import time
import os
class ssd1306_oled(object):
def __init__(self, i2c_address=0x3C):
self.serial = i2c(port=1, address=i2c_address)
self.device = ssd1306(self.serial)
self.ttf = '/usr/share/fonts/truetype/noto/NotoMono-Regular.ttf'
self.font = ImageFont.truetype(self.ttf, 32)
def drawMessage(self, message):
print(message)
with canvas(self.device) as drawUpdate:
drawUpdate.text((7, 2), message , font=self.font, fill=100)
monitor = ssd1306_oled()
monitor.drawMessage("Hey")
time.sleep(3)
重要なのはこの部分
ここでOLEDモニターへ書き込みする画像に対して文字列を書き込んでいます。
with canvas(self.device) as drawUpdate:
drawUpdate.text((7, 2), message , font=self.font, fill=100)
このメッセージ部分に好きな文字をセットすると表示することができます。
こういうモニターはひとつあるだけで、状態がわかるので便利!
日本語を表示する場合は、日本語フォントを利用する必要があります。