[ラズパイ] 有機EL(OLED) SSD1306を使って文字・日本語を表示させる

以前、LCD1602を用いて、液晶ディスプレイに文字を表示させた(下記事参照)

でも、これだとロジックレベルコンバータをかませたり、漢字、平仮名が表示できなくてイマイチ汎用性に欠ける。それで、有機EL(OLED)を使った128×32の表示器を試してみようと思って購入。

いつものことで、中国発送のを買ったけど、10日ほどで到着。最近早くなったw。3.3vでI2Cにいつも通りつなげるだけ。でも3.3vピン出力で電力が足りるのかな?

接続確認(いつでもいけますっ!!)

そして、表示するためにライブラリを準備。今回もいつものことながら下のライブラリを使わせてもらった。

sudo pip3 install Adafruit-SSD1306

上のコマンドでインストール。

完了。ざっとライブラリの仕様を読んでいると、下の一文が・・・

Adafruit invests time and resources providing this open source code, please support Adafruit and open-source hardware by purchasing products from Adafruit!

ごめんなさい。今度からはAdafruit様から購入します今回だけは…

気を取り直して、早速examplesのstats.pyを実行してみると、ちゃんと表示される


文字小さくてよく見えねぇw。でもまず、ここまでは順調。

日本語を表示させる場合は、日本語フォントを用意しないといけない。フリーの日本語フォントを探す。


ここのIPAフォント(IPAゴシック・IPA Pゴシック)を使わせていただこうと思う。ダウンロードして解凍すると、 ttcファイル(ttfをまとめたもの)ができる。これを2つのttfに砕くのに以下のサイトを使った。


そうすると、2個のttfファイル(IPAGothic-01.ttf、IPAPGothic-02.ttf)ができるので、これを実行するpythonファイルと同一のフォルダに入れておく。そして、簡単な稚拙テストクラスを飲みながら作ってみた。テスト目的で、もーちょい汎用性を持たせたいんだけど時間が取れない・・・

import time

import Adafruit_GPIO.SPI as SPI
import Adafruit_SSD1306

from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont

import subprocess

class Text_ssd1306():
    def __init__(self,lines = 2):
        self.lines = lines
        
        self.RST = None 
        self.disp = Adafruit_SSD1306.SSD1306_128_32(rst=self.RST)
 
        self.disp.begin()
        self.disp.clear()
        self.disp.display()
        self.d_width = self.disp.width
        self.d_height = self.disp.height

        self.image = Image.new('1', (self.d_width, self.d_height))
        self.draw = ImageDraw.Draw(self.image)

        self.draw.rectangle((0,0,self.d_width,self.d_height), outline=0, fill=0)
    
        padding = -1
        self.d_top = padding
        self.d_bottom = self.d_height-padding
        
        self.font = ImageFont.load_default()
    
    def setFont(self,f_file = "",size = 0):
        if size<=0:
            self.font_size = self.d_height // self.lines
        else:
            self.font_size = size
        
        print("font_size = %d" % self.font_size)
        
        self.font = ImageFont.truetype(f_file, self.font_size)
        
    def textOut(self,text,line=1,top=0):
        if line<=0 or self.lines<line:
            raise Exception("行数エラー")
        text_size = self.font.getsize(text)
        self.draw.rectangle((0,self.d_top+text_size[1]*(line-1),self.d_width,self.d_top+text_size[1]*line), outline=0, fill=0)
        self.draw.text((top, self.d_top+text_size[1]*(line-1)),text,font=self.font,fill=255)
        self.disp.image(self.image)
        self.disp.display()
        
    def clear(self):
        self.draw.rectangle((0,0,self.d_width,self.d_height), outline=0, fill=0)
        self.disp.image(self.image)
        self.disp.display()
    

# サンプルコード

ts = Text_ssd1306(2)

ts.setFont('IPAGothic-01.ttf')
ts.textOut("ANDROIPHONE!",line = 1)
ts.textOut("IPAGothic-01",line = 2)
time.sleep(2)

ts.setFont('IPAPGothic-02.ttf')
ts.textOut("ANDROIPHONE!",line = 1)
ts.textOut("IPAPGothic-02",line = 2)
time.sleep(2)

ts.setFont('IPAGothic-01.ttf')

ts.textOut("魑魅魍魎・薔薇",line = 1)
ts.textOut("㌔㌧αβγ",line = 2)
time.sleep(2)

ts.textOut("①②③④⑤",line = 1)
time.sleep(2)

ts.clear()

for i in range(20):
    ts.textOut("気温 {}℃".format(10+i),line = 1)
    ts.textOut("湿度 {}%".format(23+i),line = 2)
    time.sleep(0.5)

ts.clear()

実際の動作の動画は下に掲載。描画スピードはさほど速くないが、きれいに表示され「魑魅魍魎」も2行でもつぶれることなく表示で来ている。LCDよりもこちらのほうが簡単にきれいに表示できると思う。ただ、やっぱり少し小さいかなぁ。。。

消費電力のこともすこし触れておく。全ピクセル点灯状態にして、テスターにて電流量を計測してみた。

全点灯状態で27~28mA程度。30mAに達することはなかった。文字のみを点灯させていると15~20mAだった。

ラズパイはGPIO01に3.3vにどれだけの電流を流せるのかというのは、1ピン当たりの16mAで制限されるのか、はたまたGPIO合計の50mAで制限されるのかはイマイチはっきりとしないけど

このwikiでは01pinと07pinの合計で50mAと書いてあるから、これを信じたいと思う。けど、これも他のGPIOの合計電流によって少なくなるようなので、128×32程度なら事足りる感じはするけど、128×64となら電流量が場合によっちゃオーバーしそう

他にもいろいろセンサーや機器を取り付ける場合は、5V駆動させて、ロジックレベルコンバータでI2C接続したほうが、ラズパイの保護の観点からいいかもしれない。それだとLCDと変わらない感がw

One thought on “[ラズパイ] 有機EL(OLED) SSD1306を使って文字・日本語を表示させる

Comments are closed.