以前、LCD1602を用いて、液晶ディスプレイに文字を表示させた(下記事参照)
でも、これだとロジックレベルコンバータをかませたり、漢字、平仮名が表示できなくてイマイチ汎用性に欠ける。それで、有機EL(OLED)を使った128×32の表示器を試してみようと思って購入。
いつものことで、中国発送のを買ったけど、10日ほどで到着。最近早くなったw。3.3vでI2Cにいつも通りつなげるだけ。でも3.3vピン出力で電力が足りるのかな?
接続確認(いつでもいけますっ!!)
そして、表示するためにライブラリを準備。今回もいつものことながら下のライブラリを使わせてもらった。
1 |
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ファイルと同一のフォルダに入れておく。そして、簡単な稚拙テストクラスを
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
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と17pinの合計で50mAと書いてあるから、これを信じたいと思う。けど、これも他のGPIOの合計電流によって少なくなるようなので、128×32程度なら事足りる感じはするけど、128×64となら電流量が場合によっちゃオーバーしそう。
他にもいろいろセンサーや機器を取り付ける場合は、5V駆動させて、ロジックレベルコンバータでI2C接続したほうが、ラズパイの保護の観点からいいかもしれない。それだとLCDと変わらない感がw