CircuitPython 10行プログラミング Step5 (7) Raspberry Pi PicoのI2C ① OLEDディスプレイ
I2Cが使えるライブラリが複数あります。最初は、実績のあるbusioモジュールを使います。
●OLEDディスプレイの配線
OLEDボードの端子 | Picoの端子(GPIO) | 名称 |
---|---|---|
GND | GND | GND |
Vcc | 3.3V | 3V3(OUT) |
SCL | GP21 | I2C0 SCL |
SDA | GP20 | I2C0 SDA |
●I2Cscan
利用できるI2Cバスは二つあります。そして、ピンの組み合わせは、
[GP1,GP0], [GP3,GP2], [GP5,GP4], [GP7,GP6], [GP9,GP8], [GP11,GP10], [GP13,GP12],[GP15,GP14], [GP17,GP16], [GP19,GP18], [GP21,GP20], [GP27,GP26]
があります。
from board import *
from busio import I2C
#[GP1,GP0], [GP3,GP2], [GP5,GP4], [GP7,GP6], [GP9,GP8], [GP11,GP10], [GP13,GP12],
#[GP15,GP14], [GP17,GP16], [GP19,GP18], [GP21,GP20], [GP27,GP26]
i2c = I2C(GP21, GP20)
while not i2c.try_lock():
pass
print('addr 0x{0:x}'.format(i2c.scan()[0]))
i2c.deinit()
実行結果です。0x3cを見つけてきました。
●bitbangioモジュール
busioモジュールは、Picoに内蔵されたI2Cモジュール(ハードウェア)を利用します。bitbangioモジュールでは、GPIOをソフトウェアでON/OFFさせ、SCL/SDA信号のタイミングを取ります。
from board import *
import bitbangio
#[GP1,GP0], [GP3,GP2], [GP5,GP4], [GP7,GP6], [GP9,GP8], [GP11,GP10], [GP13,GP12],
#[GP15,GP14], [GP17,GP16], [GP19,GP18], [GP21,GP20], [GP27,GP26]
i2c = bitbangio.I2C(GP21, GP20)
while not i2c.try_lock():
pass
print('addr 0x{0:x}'.format(i2c.scan()[0]))
i2c.deinit()
実行結果です。0x3cを見つけてきました。
●OLEDに文字を出す
アマゾン、Adafruitなどで小型のディスプレイにI2C接続のOLEDディスプレイがあり、多くがコントローラSSD1306を利用しています。
最新のダウンロードしたCircuitPython のライブラリには、adafruit_ssd1306.mpyがあります。このライブラリとadafruit_framebuf.mpyライブラリを、CIRCUITPYドライブのlibフォルダにコピーします。
すでに入っているのは、adafruit_bus_deviceフォルダとadafruit_registerフォルダです。
このディスプレイで使うフォントは、ダウンロードしたexamplesの中にfont5x8.binがあるので、CIRCUITPYドライブのルートにコピーします。
表示するのは、CPUの温度を2行目に表示します。また温度はあまり変化しないので、経過時間も1行目に表示します。
from board import *
import busio
import adafruit_ssd1306
import microcontroller
import time
i2c = busio.I2C(GP21, GP20)
display = adafruit_ssd1306.SSD1306_I2C(128, 64, i2c, addr=0x3c)
print('start')
t0 = time.monotonic()
while 1:
display.fill(0)
txt = 'CPU Temp is ' + str(round(microcontroller.cpu.temperature,1)) + 'C'
display.text(txt, 5, 10, 1)
display.text(str(int(time.monotonic() - t0)),1,0,1)
display.show()
time.sleep(3.14)
◆テキスト関連のコマンド
- fill(0) 黒色で塗りつぶす
- text('World', 0, 10) 文字列を、x,y座標から描画する。四つ目の「1=白色」は省略可
- invert(True) 白黒を反転する。Falseで戻す
- show() 表示
◆図形関連のコマンド
- pixel(0, 0, 1) x,y座標(左上が原点)と色(1は白色)でドットを描く
- rect(0,0,120,60,1) 左上の座標x,y、右下の座標x,y、色で四角形を描画する
- fill_rect() 塗りつぶす
- line(100,40,110,50,1) xの始点、yの始点、xの終点、yの終点、色で直線を描画する
- circle(24,40,20,1) 中心点のx、y、半径、色で円を描画する