ラズベリーパイからOLED モニターを使う方法

ラズベリーパイやマイコンを使った電子工作の定番、OLED小型モニターの利用方法を解説します。

ラズベリーパイからOLED モニターを使う方法

ハードウェア

今回利用するのはSSD1306を利用したOLEDモニターです。このコントローラーを利用したOLEDモニターは比較的安価かつ入手性も良いためラズベリーパイやマイコンを利用した工作によく利用されています。

またこのモニターは、基本的に1色のみの表示でプログラムから色を変更することは出来ません。

カラー表示は?

画面の上下で色が違うタイプなどもありますが、基本的にはモニターによって白や青などと色が決まっています。

Amazon.co.jp: WayinTop 0.91インチ OLEDディスプレイ I2C SSD1306 OLED液晶ディスプレイ 128x32 3.3V~5V 3個入 (白) : 産業・研究開発用品
Amazon.co.jp: WayinTop 0.91インチ OLEDディスプレイ I2C SSD1306 OLED液晶ディスプレイ 128x32 3.3V~5V 3個入 (白) : 産業・研究開発用品
コントローラーとは

画面サイズ 128x32 のOLEDモニターを利用するためには、合計で4096個のLEDを制御する必要があります。これを直接ラズベリーパイから制御を行うのは非常に面倒で、効率が悪くなります。そのため通常はコントローラーと呼ばれるICに対してモニターの描画処理をまかせることになります。

この記事ではSSD1306というよく利用されているコントローラーを対象にしています。

OLEDはプログラムのステータス表示や、エラーが発生した場合に文字を表示することが可能であるため使えるようになっておくと便利です。

配線

OLEDモニターを動作させるためには4つのピンを接続する必要があります。

OLEDモニターによっては3v/GNDや、SCL/SDAピンの配置が異なる場合があるので適宜読み替えてください。

SCL(SCK)ピン
OLEDモニター側にSCLと書かれているピンが無く、代わりにSCKと書かれている場合があります。

なぜピンの名前すら統一されてないのか理解しがたい!

ブレッドボードで配線を行った例

またラズベリーパイ側のピンは以下のサイトが見やすいです。

Raspberry Pi GPIO Pinout
The comprehensive add-on boards & GPIO Pinout guide for the Raspberry Pi

ソフトウェア

OLEDモニターの利用には以下のライブラリを利用します。このライブラリはいくつかのコントローラーに対応しているため基本的には SSD1306 以外のコントローラーが利用されたモニターでも同じように操作を行うことが出来ます。

Luma.OLED: Display drivers for SSD1306 / SSD1309 / SSD1322 / SSD1325 / SSD1327 / SSD1331 / SSD1351 / SSD1362 / SH1106 — Luma.OLED: Display drivers for SSD1306, SSD1309, SSD1322, SSD1362, SSD1322_NHD, SSD1325, SSD1327, SSD1331, SSD1351, SH1106, WS0010, WINSTAR_WEH 3.8.1 documentation

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

ターミナルで以下のコマンドを実行します。

pip3 install luma.oled
pip3 install serial

サンプルプログラム

GitHub - kotamorishi/rpi-ssd1306-oled: Example of how to use SSD1306 based OLED monitor
Example of how to use SSD1306 based OLED monitor. Contribute to kotamorishi/rpi-ssd1306-oled development by creating an account on GitHub.

簡単な文字の表示やアニメーションを行うサンプルプログラムを用意したので、ターミナルから実行していきます。

git clone https://github.com/kotamorishi/rpi-ssd1306-oled

ディレクトリを移動し、サンプルプログラムを実行します。

cd rpi-ssd1306-oled
python3 draw_text.py
i2cを有効に
もしエラーとなってしまう場合は i2c が有効化されていませんので、ラズベリーパイのi2cを有効化する設定が必要です。有効化は以下のコマンドの interface > i2c > Enable とすることで有効化できます。
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)

このメッセージ部分に好きな文字をセットすると表示することができます。

こういうモニターはひとつあるだけで、状態がわかるので便利!

MEMO

日本語を表示する場合は、日本語フォントを利用する必要があります。

記事の内容は間違いが無いように気をつけていますが、私の認識違いや、ミスなどにより間違っている可能性もあります。もし発見された場合はお問い合わせフォームよりご連絡頂けると幸いです。