XIAO ESP32C6 の I2C を使って OLED に文字を表示してみよう
OLEDの説明
今回使う OLED(有機EL)ディスプレイは、I2Cという方式で制御する 128×64 ドットの小型画面 です。
中には SSD1306 というコントローラが入っていて、文字や図形を表示できます。
I2Cは GND・VCC・SCL・SDA の 4 本の線で複数の機器をつなげる仕組みです。
このうちの 1 つとして OLED を接続し、文字を表示してみましょう。
使用するディスプレイ(0.96インチ 128×64ドット 有機ELディスプレイ):
https://akizukidenshi.com/catalog/g/g112031/
準備:OLED の GND、VCC、SCL、SDA を接続
回路図
配線図
プログラム
まず、「パッケージを管理」で、ssd1306 をインストールしておきます。
# メッセージがスクロールして、ボールが跳ねるサンプル
from machine import Pin, I2C
from ssd1306 import SSD1306_I2C
import time
# ---------------------------------------------------------
# I2C を使うための初期設定 scl = クロック線、sda = データ線
# ---------------------------------------------------------
i2c = I2C(0, scl=Pin(23), sda=Pin(22))
# ---------------------------------------------------------
# OLEDディスプレイを 128×64 ドットとして初期化
# ---------------------------------------------------------
oled = SSD1306_I2C(128, 64, i2c)
# ---------------------------------------------------------
# ボールの初期位置(bx, by)と移動速度(dx, dy) 左上が (0,0)
# ---------------------------------------------------------
bx, by = 10, 10
dx, dy = 2, 2 # 毎フレーム2ドットずつ動く
# ---------------------------------------------------------
# スクロールさせるメッセージ. 1文字を8ドットとして、全体の幅を計算
# ---------------------------------------------------------
msg = "Hello Pcratch IoT!"
msg_width = len(msg) * 8
# メッセージの初期位置(画面右の外側からスタート)
mx = 128
# ---------------------------------------------------------
# メインループ(ずっと繰り返す)
# ---------------------------------------------------------
while True:
# 画面を真っ黒にクリア(毎フレーム描き直すため)
oled.fill(0)
# -----------------------------------------------------
# ボールを描画(x座標, y座標, 幅, 高さ, 色)
# -----------------------------------------------------
oled.fill_rect(bx, by, 6, 6, 1)
# -----------------------------------------------------
# メッセージを描画(文字列, x座標, y座標)
# mx を左に動かすことでスクロールして見える
# -----------------------------------------------------
oled.text(msg, mx, 50)
oled.show() # 描画内容をOLEDに反映
time.sleep(0.05) # 画面更新間隔(0.05秒 = 20FPS程度)
# -----------------------------------------------------
# ボールの位置を更新(移動)
# -----------------------------------------------------
bx += dx
by += dy
# -----------------------------------------------------
# ボールが画面端に当たったら跳ね返る
# 128×64 のうち、ボールの大きさ(6px)を引いた範囲で判定
# -----------------------------------------------------
if bx <= 0 or bx >= 122: # 128 - 6 = 122
dx = -dx # 進行方向を反転
if by <= 0 or by >= 58: # 64 - 6 = 58
dy = -dy
# -----------------------------------------------------
# メッセージのスクロール更新. 左に2ドットずつ移動
# -----------------------------------------------------
mx -= 2
# メッセージが画面の左側に完全に消えたら右端に戻す
if mx < -msg_width:
mx = 128

