ラズパイPicoでSSD1306ディスプレイを接続動かして見ましたので、今回はSSD1306スペックなどの説明は除き、接続方法や初歩的なライブラリーなどの使い方を解りやすく解説したいと思います。言語はMicroPython、開発環境はソニーです。
環境
● SSD1306
● ラズベリーパイピコ または(Pico-W)
● Windowsパソコン
接続
下図のよう、SCL-GP1,SDA-GP0に接続しました。
ライブラリーのインストール
CircuitPythonのライブラリーもありますが、今回はマイクロパイソで使えるssd1306のライブラリーを使いますので、インストールしてない方はインストールしてください。
また、ライブラリーの基本的な使い方はこちらのサイトに詳しく書いてありますので確認してください。
インストール方法です。
ツールクリック パッケージ管理
ssd1306入力 2をクリック 3をクリック
上記の方法でインストールできない場合
私は4月6日現在上記の方法でラズベリーパイピコWにSSD 1306ライブラリーがインストールできませんでしたので別の方法をご説明いたします。
ピコWをWindowsパソコンに接続した状態でソニーのIDを起動します。
次にピコWの本体の中にlibディレクトリーを作ります。
こちらgithubのページに行ってSSD1306.pyをコピーします。Thonnyにペーストしてssd1306.pyという名でlibディレクトリーの中に保存します。
下図のようになります。
これで問題なく使えるようになりまします。
プログラム
公式サイトの、基本的な使い方を中心に説明していきたいと思います。
ライブラリーを試してみる
公式サイトに書いてあるプログラムを試してみます。
今回のI2C接続は i2c = I2C(0, scl=Pin(1), sda=Pin(0)ですので下記のようになり、またfregも400khまで問題なく動きました。
from machine import Pin, I2C
import ssd1306
# using default address 0x3C
i2c = I2C(0, scl=Pin(1), sda=Pin(0), freq=200000)
display = ssd1306.SSD1306_I2C(128, 64, i2c)
display.text('Hello, World!', 0, 0, 1)
display.show()
上記のプログラムを実行して、先頭行に Hello World が表示されれば、正常に作動してるのが確認できます。
次に基本的な命令です。
display.fill(0) # スクリーン全体を colour=0 で埋める
display.pixel(0, 10) # x=0, y=10 のピクセルを取得
display.pixel(0, 10, 1) # x=0, y=10 のピクセルに colour=1 を設定
display.hline(0, 8, 4, 1) # x=0, y=8, width=4, colour=1 で水平線を描画
display.vline(0, 8, 4, 1) # x=0, y=8, height=4, colour=1 で垂直線を描画
display.line(0, 0, 127, 63, 1) # 0,0 から 127,63 に線を描画
display.rect(10, 10, 107, 43, 1) # 10,10 と 117,53 の間、colour=1 で長方形を描画
display.fill_rect(10, 10, 107, 43, 1) # 10,10 と 117,53 の間、colour=1 で塗り潰した長方形を描画
display.text('Hello World', 0, 0, 1) # x=0, y=0, colour=1 でテキストを描画
display.scroll(20, 0) # 20 ピクセルだけ右にスクロール
# 現在の FrameBuffer の上に、与えられた座標で別の FrameBuffer を描画
import framebuf
fbuf = framebuf.FrameBuffer(bytearray(8 * 8 * 1), 8, 8, framebuf.MONO_VLSB)
fbuf.line(0, 0, 7, 7, 1)
display.blit(fbuf, 10, 10, 0) # x=10, y=10, key=0 の上に描画
display.show()
上記が主な基本命令ですので、色々試してみてその挙動を確認してください。
この基本の命令だけだと少し使いずらいので、簡単な関数を幾つか作り使いやすくしてみました。
16行6列指定で表示する
ライブラリーssd1306の文字表示display.text(‘Hello World’, 0, 0, 1)は、8×8ドット単位で16行、8列、文字の表示は7×7ドットのようです。
下図
よって、行、列単位で指定できる関数作ります。
下の関数show_text(a,x,y)が、16行、8列単位で表示指定する簡単な関数です。
aは表示文字列、xは表示開始行、yは表示開始列で、上のイメージでは a=”abc12″ x=1 y=1となります。
def show_text(a,x,y):
x-=1
y-=1
display.text(a, x*8, y*8, 1) #aは表示文字、x*8, y*8は表示位置、1は白抜き
display.show()
show_text("abc12",1,1) #関数を呼び出すイメージの画面が表示されます
画像を表示する
下記がが画像を表示する関数プログラムです。方法はほかにもいろいあると思います。
def show_image(z,x,y):
for i,dd in enumerate(z):
for j,da in enumerate(dd):
display.pixel(x+j,y+i,da)
display.show()
show_image(b1,60,34) # b1は表示するイメージデータ,(60,34)は表示位置です
自分が作った2次元配列画像データpen_rogoを表示してみます。
from machine import Pin, I2C
import ssd1306
pen_logo=[[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1],
[1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0],
[1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0],
[1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0],
[1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1],
[1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1],
[0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]
# using default address 0x3C
i2c = I2C(0, scl=Pin(1), sda=Pin(0), freq=400000)
display = ssd1306.SSD1306_I2C(128, 64, i2c)
def show_image(z,x,y):
for i,dd in enumerate(z):
for j,da in enumerate(dd):
display.pixel(x+j,y+i,da)
display.show()
def show_text(a,x,y):
x-=1
y-=1
display.text(a, x*8, y*8, 1)
display.show()
show_text("Hello, World!",3,1)
show_image(pen_logo,5,15) # x=5 y=15 pixel からの位置で描画
pen_logoの2次元データは、自分のロゴ画像からpython のライブラリーCV2で作りました。
プログラムを一部変更
プログラムの見通しが良くなるように、pen_logoデータを別なファイルにおいてメインプログラムで呼び出して表示するように変更しました。
まずはデータファイルを作ります。
pen_logo=[[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1],
[1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0],
[1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0],
[1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0],
[1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1],
[1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1],
[0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]
上記のファイルを例えばThonnyでpenlogo.pyとして同じフォルダ内に保存します。
以下のようにして呼び出して使うと下のように画像が表示されます。
from machine import Pin, I2C
from penlogo import pen_logo
import ssd1306
# using default address 0x3C
i2c = I2C(0, scl=Pin(1), sda=Pin(0), freq=400000)
display = ssd1306.SSD1306_I2C(128, 64, i2c)
def show_image(z,x,y):
for i,dd in enumerate(z):
for j,da in enumerate(dd):
display.pixel(x+j,y+i,da)
display.show()
def show_text(a,x,y):
x-=1
y-=1
display.text(a, x*8, y*8, 1)
display.show()
show_text("Hello, World!",3,1)
show_image(pen_logo,5,15) # x=5 y=15 pixel からの位置で描画
三角関数表示(sin)
三角関数を表示してみました。
import math
from machine import Pin, I2C
import ssd1306
import time
i2c = I2C(0, scl=Pin(1), sda=Pin(0), freq=400000)
display = ssd1306.SSD1306_I2C(128, 64, i2c)
k1=0
display.hline(0,32,128, 1)
for i in range(0,500,4): # 角度 0~500 step 4
sin1 = math.sin(math.radians(i)) # sin 計算
aaa=int((sin1*100)/3.2) # 表示スケール調整
k1+=1
display.pixel(k1, 32-aaa, 1)
display.show()
三角関数(sin)画像です。
使った感想、文字が小さく見ずらいですが、キャラクターディスプレイよりは、色々な文字が表示できますので面白い事がができるかもしれません。
また自分で簡単なフォントも作ることが出来るようです。